History

Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net

Cross-merge networking fixes after downstream PR (net-7.0-rc5). net/netfilter/nft_set_rbtree.c 598adea720b97 ("netfilter: revert nft_set_rbtree: validate open interval overlap") 3aea466a43998 ("netfilter: nft_set_rbtree: don't disable bh when acquiring tree lock") https://lore.kernel.org/abgaQBpeGstdN4oq@sirena.org.uk No adjacent changes.

Jakub Kicinski committed 8 months ago

Commit edab1ca2 parents 9ac76f3 a1d9d8e546 files · +5779 −3382Browse files

Unified · Split

546 files
  1. .mailmap +1 −0
  2. Documentation/admin-guide/kernel-parameters.txt +3 −0
  3. Documentation/dev-tools/kunit/run_wrapper.rst +2 −0
  4. Documentation/devicetree/bindings/display/msm/dp-controller.yaml +20 −1
  5. Documentation/devicetree/bindings/display/msm/qcom,glymur-mdss.yaml +10 −6
  6. Documentation/devicetree/bindings/display/msm/qcom,sm8750-mdss.yaml +1 −1
  7. Documentation/devicetree/bindings/i2c/snps,designware-i2c.yaml +1 −1
  8. Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml +24 −5
  9. Documentation/netlink/specs/net_shaper.yaml +6 −6
  10. Documentation/scheduler/sched-ext.rst +27 −3
  11. Documentation/virt/kvm/api.rst +117 −109
  12. Documentation/virt/kvm/locking.rst +2 −0
  13. MAINTAINERS +6 −7
  14. Makefile +5 −1
  15. arch/arm/configs/multi_v7_defconfig +0 −1
  16. arch/arm64/boot/dts/renesas/r8a78000.dtsi +8 −8
  17. arch/arm64/boot/dts/renesas/r9a09g057.dtsi +0 −30
  18. arch/arm64/boot/dts/renesas/r9a09g077.dtsi +2 −2
  19. arch/arm64/boot/dts/renesas/r9a09g087.dtsi +2 −2
  20. arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi +1 −1
  21. arch/arm64/boot/dts/renesas/rzt2h-n2h-evk-common.dtsi +1 −0
  22. arch/arm64/boot/dts/renesas/rzv2-evk-cn15-sd.dtso +1 −0
  23. arch/arm64/crypto/aes-neonbs-glue.c +23 −14
  24. arch/arm64/include/asm/kvm_host.h +3 −0
  25. arch/arm64/kernel/cpufeature.c +9 −0
  26. arch/arm64/kvm/at.c +0 −2
  27. arch/arm64/kvm/guest.c +2 −2
  28. arch/arm64/kvm/hyp/nvhe/mem_protect.c +1 −1
  29. arch/arm64/kvm/mmu.c +9 −5
  30. arch/arm64/kvm/nested.c +16 −11
  31. arch/arm64/kvm/vgic/vgic-init.c +16 −16
  32. arch/arm64/kvm/vgic/vgic-v2.c +2 −2
  33. arch/arm64/kvm/vgic/vgic-v3.c +6 −6
  34. arch/arm64/kvm/vgic/vgic.c +6 −0
  35. arch/loongarch/Kconfig +3 −0
  36. arch/loongarch/include/asm/cmpxchg.h +5 −0
  37. arch/loongarch/include/asm/uaccess.h +12 −2
  38. arch/loongarch/kernel/inst.c +25 −6
  39. arch/loongarch/kvm/vcpu.c +1 −1
  40. arch/loongarch/kvm/vm.c +3 −3
  41. arch/loongarch/net/bpf_jit.c +11 −0
  42. arch/mips/kvm/mips.c +2 −2
  43. arch/powerpc/include/asm/uaccess.h +45 −20
  44. arch/powerpc/kernel/iommu.c +1 −1
  45. arch/powerpc/kernel/setup-common.c +0 −10
  46. arch/powerpc/kvm/book3s.c +2 −2
  47. arch/powerpc/kvm/booke.c +2 −2
  48. arch/powerpc/kvm/e500.h +1 −5
  49. arch/powerpc/kvm/e500_mmu.c +2 −2
  50. arch/powerpc/kvm/e500_mmu_host.c +44 −47
  51. arch/powerpc/lib/copyuser_64.S +1 −0
  52. arch/powerpc/lib/copyuser_power7.S +15 −30
  53. arch/powerpc/lib/vmx-helper.c +2 −0
  54. arch/powerpc/mm/mem.c +14 −0
  55. arch/powerpc/perf/callchain.c +5 −0
  56. arch/powerpc/perf/callchain_32.c +0 −1
  57. arch/powerpc/perf/callchain_64.c +0 −1
  58. arch/riscv/boot/dts/microchip/mpfs.dtsi +2 −0
  59. arch/riscv/kvm/aia.c +13 −2
  60. arch/riscv/kvm/aia_aplic.c +12 −11
  61. arch/riscv/kvm/aia_device.c +14 −4
  62. arch/riscv/kvm/aia_imsic.c +4 −0
  63. arch/riscv/kvm/mmu.c +5 −1
  64. arch/riscv/kvm/vcpu.c +1 −1
  65. arch/riscv/kvm/vcpu_fp.c +13 −4
  66. arch/riscv/kvm/vcpu_onereg.c +36 −18
  67. arch/riscv/kvm/vcpu_pmu.c +12 −4
  68. arch/riscv/kvm/vm.c +1 −1
  69. arch/s390/kernel/irq.c +8 −6
  70. arch/s390/kvm/kvm-s390.c +2 −2
  71. arch/x86/include/asm/kvm_host.h +2 −1
  72. arch/x86/include/uapi/asm/kvm.h +1 −0
  73. arch/x86/kernel/apic/apic.c +6 −0
  74. arch/x86/kvm/cpuid.c +4 −1
  75. arch/x86/kvm/hyperv.c +5 −4
  76. arch/x86/kvm/ioapic.c +2 −1
  77. arch/x86/kvm/svm/avic.c +6 −3
  78. arch/x86/kvm/svm/nested.c +10 −2
  79. arch/x86/kvm/svm/svm.c +11 −6
  80. arch/x86/kvm/svm/svm.h +1 −0
  81. arch/x86/kvm/vmx/nested.c +45 −16
  82. arch/x86/kvm/vmx/nested.h +1 −0
  83. arch/x86/kvm/vmx/vmx.c +7 −3
  84. arch/x86/kvm/x86.c +2 −2
  85. drivers/accel/amdxdna/aie2_ctx.c +2 −12
  86. drivers/accel/amdxdna/amdxdna_ctx.c +10 −0
  87. drivers/accel/ivpu/ivpu_hw_40xx_reg.h +0 −6
  88. drivers/accel/ivpu/ivpu_hw_ip.c +0 −1
  89. drivers/acpi/Kconfig +1 −0
  90. drivers/acpi/acpi_platform.c +1 −1
  91. drivers/acpi/acpi_processor.c +8 −7
  92. drivers/acpi/acpi_video.c +22 −23
  93. drivers/acpi/acpica/acpredef.h +1 −1
  94. drivers/acpi/bus.c +0 −3
  95. drivers/acpi/osl.c +1 −1
  96. drivers/acpi/scan.c +45 −0
  97. drivers/android/binder/page_range.rs +64 −20
  98. drivers/android/binder/process.rs +2 −1
  99. drivers/android/binder/range_alloc/array.rs +33 −2
  100. drivers/android/binder/range_alloc/mod.rs +2 −2
  101. drivers/android/binder/range_alloc/tree.rs +9 −9
  102. drivers/android/binder/thread.rs +6 −11
  103. drivers/base/power/runtime.c +1 −0
  104. drivers/block/ublk_drv.c +12 −4
  105. drivers/bluetooth/btqca.c +2 −0
  106. drivers/cache/ax45mp_cache.c +2 −2
  107. drivers/cache/starfive_starlink_cache.c +2 −2
  108. drivers/cpuidle/cpuidle.c +0 −10
  109. drivers/crypto/ccp/sev-dev.c +1 −3
  110. drivers/crypto/padlock-sha.c +7 −0
  111. drivers/firewire/net.c +3 −2
  112. drivers/firmware/arm_ffa/driver.c +4 −4
  113. drivers/firmware/arm_scmi/notify.c +2 −2
  114. drivers/firmware/arm_scmi/protocols.h +2 −2
  115. drivers/firmware/arm_scpi.c +3 −2
  116. drivers/firmware/cirrus/cs_dsp.c +18 −6
  117. drivers/firmware/stratix10-rsu.c +2 −0
  118. drivers/firmware/stratix10-svc.c +126 −102
  119. drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c +4 −3
  120. drivers/gpu/drm/amd/amdgpu/amdgpu_device.c +13 −1
  121. drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c +1 −1
  122. drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h +8 −8
  123. drivers/gpu/drm/amd/amdgpu/mes_v12_0.c +4 −1
  124. drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c +1 −0
  125. drivers/gpu/drm/amd/display/dc/dccg/dcn20/dcn20_dccg.h +5 −1
  126. drivers/gpu/drm/amd/display/dc/dccg/dcn21/dcn21_dccg.c +20 −1
  127. drivers/gpu/drm/amd/display/dc/dccg/dcn301/dcn301_dccg.h +7 −1
  128. drivers/gpu/drm/amd/display/dc/dccg/dcn31/dcn31_dccg.h +4 −1
  129. drivers/gpu/drm/amd/display/dc/dccg/dcn314/dcn314_dccg.h +4 −1
  130. drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c +2 −1
  131. drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c +2 −1
  132. drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c +2 −1
  133. drivers/gpu/drm/bridge/ti-sn65dsi83.c +7 −6
  134. drivers/gpu/drm/gud/gud_drv.c +8 −1
  135. drivers/gpu/drm/gud/gud_internal.h +4 −0
  136. drivers/gpu/drm/gud/gud_pipe.c +36 −18
  137. drivers/gpu/drm/i915/display/intel_alpm.c +0 −6
  138. drivers/gpu/drm/i915/display/intel_display.c +0 −1
  139. drivers/gpu/drm/i915/display/intel_dp.c +7 −0
  140. drivers/gpu/drm/i915/display/intel_psr.c +48 −12
  141. drivers/gpu/drm/i915/display/intel_vdsc.c +23 −0
  142. drivers/gpu/drm/i915/display/intel_vdsc.h +3 −0
  143. drivers/gpu/drm/i915/display/intel_vdsc_regs.h +12 −0
  144. drivers/gpu/drm/i915/display/intel_vrr.c +14 −0
  145. drivers/gpu/drm/i915/gem/i915_gem_shmem.c +9 −3
  146. drivers/gpu/drm/msm/adreno/a2xx_gpummu.c +1 −1
  147. drivers/gpu/drm/msm/adreno/a6xx_catalog.c +1 −2
  148. drivers/gpu/drm/msm/adreno/a8xx_gpu.c +12 −2
  149. drivers/gpu/drm/msm/adreno/adreno_device.c +1 −0
  150. drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h +6 −6
  151. drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h +6 −6
  152. drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h +2 −2
  153. drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h +6 −6
  154. drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h +6 −6
  155. drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h +6 −6
  156. drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c +1 −1
  157. drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp_v13.c +3 −1
  158. drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c +14 −38
  159. drivers/gpu/drm/msm/dsi/dsi_host.c +31 −12
  160. drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c +11 −11
  161. drivers/gpu/drm/sitronix/st7586.c +6 −9
  162. drivers/gpu/nova-core/gsp.rs +24 −22
  163. drivers/gpu/nova-core/gsp/boot.rs +1 −1
  164. drivers/gpu/nova-core/gsp/cmdq.rs +33 −60
  165. drivers/gpu/nova-core/gsp/fw.rs +69 −32
  166. drivers/hid/bpf/hid_bpf_dispatch.c +2 −0
  167. drivers/hid/hid-appletb-kbd.c +3 −2
  168. drivers/hid/hid-asus.c +3 −0
  169. drivers/hid/hid-core.c +4 −3
  170. drivers/hid/hid-ids.h +1 −2
  171. drivers/hid/hid-input.c +11 −7
  172. drivers/hid/hid-logitech-hidpp.c +5 −1
  173. drivers/hid/hid-multitouch.c +7 −0
  174. drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-hid.c +1 −0
  175. drivers/hid/intel-thc-hid/intel-quickspi/quickspi-hid.c +1 −0
  176. drivers/hid/wacom_wac.c +10 −0
  177. drivers/hwmon/Kconfig +2 −4
  178. drivers/i3c/Kconfig +12 −0
  179. drivers/i3c/master/dw-i3c-master.c +4 −2
  180. drivers/i3c/master/mipi-i3c-hci/cmd.h +1 −0
  181. drivers/i3c/master/mipi-i3c-hci/cmd_v1.c +3 −5
  182. drivers/i3c/master/mipi-i3c-hci/cmd_v2.c +3 −5
  183. drivers/i3c/master/mipi-i3c-hci/core.c +90 −53
  184. drivers/i3c/master/mipi-i3c-hci/dma.c +84 −74
  185. drivers/i3c/master/mipi-i3c-hci/hci.h +5 −0
  186. drivers/i3c/master/mipi-i3c-hci/pio.c +5 −11
  187. drivers/iio/adc/ad7768-1.c +11 −2
  188. drivers/iio/chemical/bme680_core.c +1 −1
  189. drivers/iio/chemical/sps30_i2c.c +1 −1
  190. drivers/iio/chemical/sps30_serial.c +1 −1
  191. drivers/iio/dac/ds4424.c +1 −1
  192. drivers/iio/frequency/adf4377.c +1 −1
  193. drivers/iio/gyro/mpu3050-core.c +13 −5
  194. drivers/iio/gyro/mpu3050-i2c.c +1 −2
  195. drivers/iio/imu/adis.c +1 −1
  196. drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c +2 −0
  197. drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c +4 −0
  198. drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c +2 −0
  199. drivers/iio/imu/inv_icm45600/inv_icm45600.h +1 −1
  200. drivers/iio/imu/inv_icm45600/inv_icm45600_core.c +8 −3
  201. drivers/iio/imu/inv_mpu6050/inv_mpu_core.c +8 −0
  202. drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h +2 −0
  203. drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c +4 −1
  204. drivers/iio/industrialio-buffer.c +4 −2
  205. drivers/iio/light/bh1780.c +1 −1
  206. drivers/iio/magnetometer/Kconfig +1 −2
  207. drivers/iio/magnetometer/tlv493d.c +1 −1
  208. drivers/iio/potentiometer/mcp4131.c +1 −1
  209. drivers/iio/proximity/hx9023s.c +4 −2
  210. drivers/irqchip/irq-riscv-aplic-main.c +17 −4
  211. drivers/misc/amd-sbi/Kconfig +1 −2
  212. drivers/net/bonding/bond_debugfs.c +11 −5
  213. drivers/net/bonding/bond_main.c +5 −3
  214. drivers/net/dsa/bcm_sf2.c +6 −2
  215. drivers/net/ethernet/airoha/airoha_eth.c +0 −1
  216. drivers/net/ethernet/broadcom/bnxt/bnxt.c +2 −0
  217. drivers/net/ethernet/broadcom/bnxt/bnxt.h +1 −1
  218. drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c +1 −1
  219. drivers/net/ethernet/broadcom/tg3.c +11 −0
  220. drivers/net/ethernet/cadence/macb_main.c +22 −4
  221. drivers/net/ethernet/cadence/macb_ptp.c +3 −1
  222. drivers/net/ethernet/intel/iavf/iavf_main.c +6 −3
  223. drivers/net/ethernet/intel/igc/igc.h +2 −0
  224. drivers/net/ethernet/intel/igc/igc_main.c +9 −5
  225. drivers/net/ethernet/intel/igc/igc_ptp.c +33 −0
  226. drivers/net/ethernet/intel/libie/fwlog.c +36 −13
  227. drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c +2 −2
  228. drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h +1 −0
  229. drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c +22 −28
  230. drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c +9 −14
  231. drivers/net/ethernet/microsoft/mana/hw_channel.c +3 −3
  232. drivers/net/ethernet/ti/icssg/icssg_common.c +5 −0
  233. drivers/net/netdevsim/netdev.c +4 −1
  234. drivers/net/usb/aqc111.c +6 −6
  235. drivers/net/usb/cdc_ncm.c +6 −4
  236. drivers/net/wireless/ath/ath9k/channel.c +2 −4
  237. drivers/net/wireless/mediatek/mt76/scan.c +1 −3
  238. drivers/net/wireless/ti/wlcore/tx.c +1 −1
  239. drivers/net/wireless/virtual/mac80211_hwsim.c +1 −2
  240. drivers/nfc/nxp-nci/i2c.c +2 −2
  241. drivers/nvdimm/bus.c +3 −2
  242. drivers/nvme/host/core.c +1 −2
  243. drivers/nvme/host/pci.c +5 −3
  244. drivers/nvme/target/admin-cmd.c +1 −1
  245. drivers/nvme/target/core.c +12 −2
  246. drivers/nvme/target/nvmet.h +1 −0
  247. drivers/nvme/target/rdma.c +1 −0
  248. drivers/power/sequencing/pwrseq-pcie-m2.c +1 −1
  249. drivers/regulator/pca9450-regulator.c +10 −4
  250. drivers/reset/reset-rzg2l-usbphy-ctrl.c +3 −0
  251. drivers/s390/block/dasd_eckd.c +16 −0
  252. drivers/s390/crypto/zcrypt_ccamisc.c +7 −5
  253. drivers/s390/crypto/zcrypt_cex4.c +1 −2
  254. drivers/scsi/hisi_sas/hisi_sas_main.c +1 −1
  255. drivers/scsi/hisi_sas/hisi_sas_v3_hw.c +1 −1
  256. drivers/scsi/qla2xxx/qla_iocb.c +0 −2
  257. drivers/scsi/scsi_scan.c +2 −6
  258. drivers/soc/fsl/qbman/qman.c +22 −2
  259. drivers/soc/fsl/qe/qmc.c +2 −2
  260. drivers/soc/microchip/mpfs-sys-controller.c +9 −4
  261. drivers/soc/rockchip/grf.c +1 −0
  262. drivers/spi/spi-amlogic-spifc-a4.c +2 −3
  263. drivers/spi/spi-atcspi200.c +16 −22
  264. drivers/spi/spi-cadence-quadspi.c +6 −0
  265. drivers/spi/spi-intel-pci.c +1 −0
  266. drivers/spi/spi-rockchip-sfc.c +1 −1
  267. drivers/staging/rtl8723bs/core/rtw_ieee80211.c +10 −5
  268. drivers/staging/rtl8723bs/core/rtw_mlme.c +4 −1
  269. drivers/staging/sm750fb/sm750.c +1 −0
  270. drivers/staging/sm750fb/sm750_hw.c +11 −11
  271. drivers/tee/tee_shm.c +0 −27
  272. drivers/ufs/core/ufshcd.c +1 −1
  273. drivers/usb/class/cdc-acm.c +5 −0
  274. drivers/usb/class/cdc-acm.h +1 −0
  275. drivers/usb/class/cdc-wdm.c +3 −1
  276. drivers/usb/class/usbtmc.c +3 −3
  277. drivers/usb/core/config.c +5 −1
  278. drivers/usb/core/message.c +79 −21
  279. drivers/usb/core/phy.c +1 −7
  280. drivers/usb/core/quirks.c +21 −0
  281. drivers/usb/dwc3/dwc3-pci.c +2 −0
  282. drivers/usb/gadget/function/f_hid.c +4 −0
  283. drivers/usb/gadget/function/f_mass_storage.c +10 −2
  284. drivers/usb/gadget/function/f_ncm.c +80 −66
  285. drivers/usb/gadget/function/f_tcm.c +14 −0
  286. drivers/usb/gadget/function/u_ether.c +22 −45
  287. drivers/usb/gadget/function/u_ether.h +26 −30
  288. drivers/usb/gadget/function/u_ether_configfs.h +0 −177
  289. drivers/usb/gadget/function/u_ncm.h +1 −3
  290. drivers/usb/gadget/function/uvc_video.c +1 −1
  291. drivers/usb/host/xhci-debugfs.c +9 −1
  292. drivers/usb/host/xhci-ring.c +1 −0
  293. drivers/usb/host/xhci.c +2 −2
  294. drivers/usb/image/mdc800.c +4 −2
  295. drivers/usb/misc/uss720.c +1 −1
  296. drivers/usb/misc/yurex.c +1 −1
  297. drivers/usb/renesas_usbhs/common.c +9 −0
  298. drivers/usb/roles/class.c +6 −1
  299. drivers/usb/typec/altmodes/displayport.c +6 −1
  300. drivers/usb/typec/tcpm/tcpm.c +1 −1
  301. fs/btrfs/disk-io.c +6 −1
  302. fs/btrfs/extent_io.c +1 −0
  303. fs/btrfs/inode.c +19 −0
  304. fs/btrfs/ioctl.c +28 −4
  305. fs/btrfs/messages.h +0 −3
  306. fs/btrfs/print-tree.c +10 −0
  307. fs/btrfs/relocation.c +2 −0
  308. fs/btrfs/space-info.c +4 −1
  309. fs/btrfs/transaction.c +16 −0
  310. fs/btrfs/tree-checker.c +1 −1
  311. fs/btrfs/tree-log.c +6 −0
  312. fs/btrfs/uuid-tree.c +38 −0
  313. fs/btrfs/uuid-tree.h +2 −0
  314. fs/btrfs/volumes.c +1 −1
  315. fs/btrfs/zoned.c +4 −2
  316. fs/ceph/addr.c +0 −1
  317. fs/ceph/debugfs.c +2 −2
  318. fs/ceph/dir.c +15 −2
  319. fs/ceph/file.c +2 −2
  320. fs/ceph/inode.c +1 −1
  321. fs/ceph/mds_client.c +3 −0
  322. fs/nfs/Kconfig +2 −1
  323. fs/nfs/nfs3proc.c +6 −1
  324. fs/nfsd/export.c +54 −9
  325. fs/nfsd/export.h +5 −2
  326. fs/nfsd/nfs4xdr.c +7 −2
  327. fs/nfsd/nfsctl.c +19 −3
  328. fs/nfsd/state.h +12 −5
  329. fs/smb/client/cifsacl.c +1 −1
  330. fs/smb/client/cifsfs.c +1 −1
  331. fs/smb/client/cifsglob.h +17 −6
  332. fs/smb/client/cifsproto.h +22 −4
  333. fs/smb/client/dir.c +2 −2
  334. fs/smb/client/file.c +70 −61
  335. fs/smb/client/fs_context.c +1 −1
  336. fs/smb/client/inode.c +3 −3
  337. fs/smb/client/smb1ops.c +1 −1
  338. fs/smb/client/smb2inode.c +10 −12
  339. fs/smb/client/smb2maperror.c +6 −3
  340. fs/smb/client/smb2ops.c +14 −4
  341. fs/smb/client/smb2pdu.c +4 −1
  342. fs/xfs/libxfs/xfs_da_btree.c +2 −6
  343. fs/xfs/libxfs/xfs_defer.c +1 −1
  344. fs/xfs/xfs_bmap_item.c +1 −1
  345. fs/xfs/xfs_dquot.c +7 −1
  346. fs/xfs/xfs_healthmon.c +10 −7
  347. fs/xfs/xfs_icache.c +0 −1
  348. fs/xfs/xfs_log.c +2 −0
  349. fs/xfs/xfs_zone_gc.c +0 −2
  350. include/linux/build_bug.h +3 −1
  351. include/linux/etherdevice.h +2 −1
  352. include/linux/firmware/intel/stratix10-svc-client.h +4 −4
  353. include/linux/hid.h +1 −0
  354. include/linux/if_ether.h +2 −1
  355. include/linux/io_uring_types.h +1 −0
  356. include/linux/kvm_host.h +35 −48
  357. include/linux/netdevice.h +5 −4
  358. include/linux/nvme-auth.h +1 −1
  359. include/linux/rseq_types.h +5 −1
  360. include/linux/sched.h +0 −2
  361. include/linux/usb.h +6 −2
  362. include/linux/usb/quirks.h +3 −0
  363. include/net/ip_tunnels.h +23 −7
  364. include/net/mac80211.h +3 −1
  365. include/net/netfilter/nf_tables.h +2 −4
  366. include/net/sch_generic.h +33 −0
  367. include/net/udp_tunnel.h +1 −1
  368. include/uapi/linux/kvm.h +8 −0
  369. io_uring/bpf_filter.c +1 −1
  370. io_uring/eventfd.c +7 −3
  371. io_uring/io_uring.c +3 −1
  372. io_uring/kbuf.c +11 −2
  373. io_uring/register.c +13 −2
  374. io_uring/tw.c +20 −2
  375. kernel/cgroup/cgroup.c +6 −0
  376. kernel/cgroup/cpuset.c +31 −28
  377. kernel/crash_dump_dm_crypt.c +2 −2
  378. kernel/fork.c +1 −2
  379. kernel/kprobes.c +6 −2
  380. kernel/sched/core.c +28 −51
  381. kernel/sched/ext.c +11 −11
  382. kernel/sched/ext_internal.h +98 −16
  383. kernel/sched/idle.c +30 −9
  384. kernel/time/time.c +1 −1
  385. kernel/workqueue.c +28 −27
  386. kernel/workqueue_internal.h +1 −0
  387. lib/bootconfig.c +3 −3
  388. lib/crypto/Makefile +3 −0
  389. mm/huge_memory.c +2 −1
  390. mm/rmap.c +17 −4
  391. mm/slub.c +4 −7
  392. net/atm/lec.c +47 −25
  393. net/atm/lec.h +1 −1
  394. net/batman-adv/bat_iv_ogm.c +3 −0
  395. net/bluetooth/hci_conn.c +2 −2
  396. net/bluetooth/hci_sync.c +1 −1
  397. net/bluetooth/hidp/core.c +14 −2
  398. net/bluetooth/l2cap_core.c +31 −20
  399. net/bluetooth/mgmt.c +2 −5
  400. net/bluetooth/smp.c +1 −1
  401. net/bridge/br_cfm.c +2 −2
  402. net/ceph/auth.c +4 −2
  403. net/ceph/messenger_v2.c +21 −10
  404. net/ceph/mon_client.c +3 −3
  405. net/ethernet/eth.c +3 −6
  406. net/ipv4/icmp.c +3 −1
  407. net/ipv4/ip_gre.c +2 −1
  408. net/ipv6/exthdrs.c +4 −0
  409. net/ipv6/seg6_hmac.c +2 −0
  410. net/mac80211/cfg.c +6 −6
  411. net/mac80211/chan.c +4 −2
  412. net/mac80211/debugfs.c +5 −9
  413. net/mac80211/mesh.c +3 −0
  414. net/mac80211/sta_info.c +5 −2
  415. net/mac80211/tdls.c +1 −1
  416. net/mac80211/tx.c +3 −1
  417. net/mac802154/iface.c +3 −1
  418. net/mpls/af_mpls.c +1 −0
  419. net/mptcp/pm_kernel.c +1 −1
  420. net/netfilter/nf_bpf_link.c +1 −1
  421. net/netfilter/nf_conntrack_h323_asn1.c +4 −0
  422. net/netfilter/nf_conntrack_netlink.c +26 −2
  423. net/netfilter/nf_conntrack_proto_sctp.c +2 −1
  424. net/netfilter/nf_conntrack_sip.c +5 −1
  425. net/netfilter/nf_flow_table_ip.c +1 −0
  426. net/netfilter/nf_tables_api.c +7 −19
  427. net/netfilter/nfnetlink_osf.c +13 −0
  428. net/netfilter/nft_ct.c +4 −0
  429. net/netfilter/nft_dynset.c +9 −1
  430. net/netfilter/nft_set_rbtree.c +10 −61
  431. net/netfilter/xt_CT.c +4 −0
  432. net/netfilter/xt_time.c +2 −2
  433. net/phonet/af_phonet.c +4 −1
  434. net/rose/af_rose.c +5 −0
  435. net/sched/sch_generic.c +0 −27
  436. net/sched/sch_ingress.c +8 −6
  437. net/sched/sch_teql.c +2 −5
  438. net/shaper/shaper.c +93 −65
  439. net/shaper/shaper_nl_gen.c +6 −6
  440. net/shaper/shaper_nl_gen.h +5 −0
  441. net/smc/af_smc.c +17 −6
  442. net/smc/smc.h +5 −0
  443. net/smc/smc_close.c +1 −1
  444. net/sunrpc/cache.c +21 −5
  445. net/sunrpc/xprtrdma/verbs.c +4 −3
  446. net/unix/af_unix.c +2 −0
  447. net/unix/af_unix.h +1 −0
  448. net/unix/garbage.c +51 −28
  449. net/wireless/pmsr.c +1 −0
  450. rust/Makefile +5 −6
  451. rust/kernel/cpufreq.rs +1 −0
  452. rust/kernel/dma.rs +50 −64
  453. rust/kernel/lib.rs +4 −0
  454. rust/kernel/ptr.rs +29 −1
  455. rust/kernel/ptr/projection.rs +305 −0
  456. rust/kernel/str.rs +2 −2
  457. rust/pin-init/internal/src/init.rs +23 −46
  458. rust/pin-init/src/__internal.rs +24 −4
  459. samples/rust/rust_dma.rs +16 −14
  460. samples/workqueue/stall_detector/Makefile +1 −0
  461. samples/workqueue/stall_detector/wq_stall.c +98 −0
  462. scripts/Makefile.build +3 −1
  463. sound/core/pcm_native.c +16 −3
  464. sound/hda/codecs/realtek/alc269.c +3 −0
  465. sound/hda/codecs/realtek/alc662.c +9 −0
  466. sound/soc/amd/acp/acp-mach-common.c +14 −4
  467. sound/soc/amd/acp3x-rt5682-max9836.c +7 −2
  468. sound/soc/codecs/rt1011.c +1 −1
  469. sound/soc/generic/simple-card-utils.c +8 −4
  470. sound/soc/qcom/qdsp6/q6apm-dai.c +1 −0
  471. sound/soc/qcom/qdsp6/q6apm-lpass-dais.c +1 −0
  472. sound/soc/qcom/qdsp6/q6apm.c +1 −0
  473. sound/soc/soc-core.c +8 −3
  474. sound/soc/tegra/tegra_audio_graph_card.c +11 −0
  475. sound/usb/mixer_scarlett2.c +2 −0
  476. sound/usb/quirks.c +2 −0
  477. tools/arch/x86/include/asm/amd/ibs.h +1 −1
  478. tools/arch/x86/include/asm/cpufeatures.h +3 −1
  479. tools/arch/x86/include/asm/msr-index.h +6 −0
  480. tools/arch/x86/include/uapi/asm/kvm.h +6 −2
  481. tools/bootconfig/samples/bad-non-closed-brace.bconf +4 −0
  482. tools/bootconfig/samples/bad-over-max-brace.bconf +19 −0
  483. tools/bootconfig/samples/exp-good-nested-brace.bconf +1 −0
  484. tools/bootconfig/samples/good-nested-brace.bconf +18 −0
  485. tools/bootconfig/test-bootconfig.sh +9 −0
  486. tools/build/Build.include +9 −0
  487. tools/build/Makefile.build +4 −2
  488. tools/include/linux/coresight-pmu.h +0 −24
  489. tools/include/linux/gfp_types.h +7 −2
  490. tools/include/uapi/asm-generic/unistd.h +4 −1
  491. tools/include/uapi/linux/kvm.h +23 −1
  492. tools/include/uapi/linux/perf_event.h +1 −1
  493. tools/objtool/Makefile +1 −1
  494. tools/objtool/arch/x86/decode.c +23 −39
  495. tools/objtool/check.c +19 −5
  496. tools/objtool/elf.c +1 −1
  497. tools/objtool/include/objtool/warn.h +1 −1
  498. tools/objtool/klp-diff.c +26 −13
  499. tools/perf/Makefile.config +18 −0
  500. tools/perf/Makefile.perf +1 −1
  501. tools/perf/arch/arm/entry/syscalls/syscall.tbl +1 −0
  502. tools/perf/arch/arm/util/cs-etm.c +0 −14
  503. tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl +1 −0
  504. tools/perf/arch/powerpc/entry/syscalls/syscall.tbl +1 −0
  505. tools/perf/arch/s390/entry/syscalls/syscall.tbl +392 −467
  506. tools/perf/arch/sh/entry/syscalls/syscall.tbl +1 −0
  507. tools/perf/arch/sparc/entry/syscalls/syscall.tbl +2 −1
  508. tools/perf/arch/x86/entry/syscalls/syscall_32.tbl +1 −0
  509. tools/perf/arch/x86/entry/syscalls/syscall_64.tbl +1 −0
  510. tools/perf/arch/xtensa/entry/syscalls/syscall.tbl +1 −0
  511. tools/perf/builtin-ftrace.c +7 −2
  512. tools/perf/pmu-events/Build +2 −1
  513. tools/perf/trace/beauty/arch/x86/include/asm/irq_vectors.h +1 −0
  514. tools/perf/trace/beauty/include/uapi/linux/fs.h +1 −0
  515. tools/perf/trace/beauty/include/uapi/linux/mount.h +11 −2
  516. tools/perf/trace/beauty/include/uapi/linux/prctl.h +37 −0
  517. tools/perf/util/annotate-arch/annotate-loongarch.c +1 −1
  518. tools/perf/util/annotate.c +4 −1
  519. tools/perf/util/cs-etm-decoder/cs-etm-decoder.c +1 −1
  520. tools/perf/util/cs-etm.c +13 −23
  521. tools/perf/util/cs-etm.h +15 −0
  522. tools/perf/util/disasm.c +1 −1
  523. tools/perf/util/synthetic-events.c +5 −0
  524. tools/power/cpupower/cpupower-service.conf +5 −0
  525. tools/power/cpupower/cpupower.sh +6 −0
  526. tools/power/cpupower/utils/cpupower-set.c +5 −1
  527. tools/power/cpupower/utils/helpers/helpers.h +4 −1
  528. tools/power/cpupower/utils/helpers/misc.c +39 −2
  529. tools/power/cpupower/utils/powercap-info.c +2 −2
  530. tools/scripts/syscall.tbl +1 −0
  531. tools/testing/selftests/hid/progs/hid_bpf_helpers.h +12 −0
  532. tools/testing/selftests/kvm/Makefile.kvm +1 −0
  533. tools/testing/selftests/kvm/guest_memfd_test.c +1 −1
  534. tools/testing/selftests/kvm/include/x86/processor.h +23 −0
  535. tools/testing/selftests/kvm/include/x86/smm.h +17 −0
  536. tools/testing/selftests/kvm/lib/x86/processor.c +26 −0
  537. tools/testing/selftests/kvm/x86/evmcs_smm_controls_test.c +150 −0
  538. tools/testing/selftests/kvm/x86/sev_smoke_test.c +30 −0
  539. tools/testing/selftests/kvm/x86/smm_test.c +2 −25
  540. tools/testing/selftests/powerpc/copyloops/.gitignore +2 −2
  541. tools/testing/selftests/powerpc/copyloops/Makefile +8 −3
  542. tools/testing/selftests/powerpc/copyloops/stubs.S +0 −8
  543. tools/testing/selftests/powerpc/copyloops/validate.c +14 −1
  544. tools/testing/selftests/sched_ext/util.c +2 −2
  545. virt/kvm/binary_stats.c +1 −1
  546. virt/kvm/kvm_main.c +10 −10
.mailmap+1−0
@@ -327,6 +327,7 @@ Henrik Rydberg <rydberg@bitmath.org> · 326 unmodified lines
327327 Herbert Xu <herbert@gondor.apana.org.au>
328328 Huacai Chen <chenhuacai@kernel.org> <chenhc@lemote.com>
329329 Huacai Chen <chenhuacai@kernel.org> <chenhuacai@loongson.cn>
330+Ignat Korchagin <ignat@linux.win> <ignat@cloudflare.com>
330331 Ike Panhc <ikepanhc@gmail.com> <ike.pan@canonical.com>
331332 J. Bruce Fields <bfields@fieldses.org> <bfields@redhat.com>
332333 J. Bruce Fields <bfields@fieldses.org> <bfields@citi.umich.edu>
Documentation/admin-guide/kernel-parameters.txt+3−0
@@ -8196,6 +8196,9 @@ Kernel parameters · 8195 unmodified lines
81968196 p = USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT
81978197 (Reduce timeout of the SET_ADDRESS
81988198 request from 5000 ms to 500 ms);
8199+ q = USB_QUIRK_FORCE_ONE_CONFIG (Device
8200+ claims zero configurations,
8201+ forcing to 1);
81998202 Example: quirks=0781:5580:bk,0a5c:5834:gij
82008203
82018204 usbhid.mousepoll=
Documentation/dev-tools/kunit/run_wrapper.rst+2−0
@@ -336,6 +336,8 @@ command line arguments: · 335 unmodified lines
336336 - ``--list_tests_attr``: If set, lists all tests that will be run and all of their
337337 attributes.
338338
339+- ``--list_suites``: If set, lists all suites that will be run.
340+
339341 Command-line completion
340342 ==============================
341343
Documentation/devicetree/bindings/display/msm/dp-controller.yaml+20−1
@@ -253,7 +253,6 @@ allOf: · 252 unmodified lines
253253 enum:
254254 # these platforms support 2 streams MST on some interfaces,
255255 # others are SST only
256− - qcom,glymur-dp
257256 - qcom,sc8280xp-dp
258257 - qcom,x1e80100-dp
259258 then:
@@ -310,6 +309,26 @@ allOf: · 50 unmodified lines
310309 minItems: 6
311310 maxItems: 8
312311
312+ - if:
313+ properties:
314+ compatible:
315+ contains:
316+ enum:
317+ # these platforms support 2 streams MST on some interfaces,
318+ # others are SST only, but all controllers have 4 ports
319+ - qcom,glymur-dp
320+ then:
321+ properties:
322+ reg:
323+ minItems: 9
324+ maxItems: 9
325+ clocks:
326+ minItems: 5
327+ maxItems: 6
328+ clocks-names:
329+ minItems: 5
330+ maxItems: 6
331+
313332 unevaluatedProperties: false
314333
315334 examples:
Documentation/devicetree/bindings/display/msm/qcom,glymur-mdss.yaml+10−6
@@ -176,13 +176,17 @@ examples: · 175 unmodified lines
176176 };
177177 };
178178
179− displayport-controller@ae90000 {
179+ displayport-controller@af54000 {
180180 compatible = "qcom,glymur-dp";
181− reg = <0xae90000 0x200>,
182− <0xae90200 0x200>,
183− <0xae90400 0x600>,
184− <0xae91000 0x400>,
185− <0xae91400 0x400>;
181+ reg = <0xaf54000 0x200>,
182+ <0xaf54200 0x200>,
183+ <0xaf55000 0xc00>,
184+ <0xaf56000 0x400>,
185+ <0xaf57000 0x400>,
186+ <0xaf58000 0x400>,
187+ <0xaf59000 0x400>,
188+ <0xaf5a000 0x600>,
189+ <0xaf5b000 0x600>;
186190
187191 interrupt-parent = <&mdss>;
188192 interrupts = <12>;
Documentation/devicetree/bindings/display/msm/qcom,sm8750-mdss.yaml+1−1
@@ -10,7 +10,7 @@ maintainers: · 9 unmodified lines
1010 - Krzysztof Kozlowski <krzk@kernel.org>
1111
1212 description:
13− SM8650 MSM Mobile Display Subsystem(MDSS), which encapsulates sub-blocks like
13+ SM8750 MSM Mobile Display Subsystem(MDSS), which encapsulates sub-blocks like
1414 DPU display controller, DSI and DP interfaces etc.
1515
1616 $ref: /schemas/display/msm/mdss-common.yaml#
Documentation/devicetree/bindings/i2c/snps,designware-i2c.yaml+1−1
@@ -7,7 +7,7 @@ $schema: http://devicetree.org/meta-schemas/core.yaml# · 6 unmodified lines
77 title: Synopsys DesignWare APB I2C Controller
88
99 maintainers:
10− - Jarkko Nikula <jarkko.nikula@linux.intel.com>
10+ - Mika Westerberg <mika.westerberg@linux.intel.com>
1111
1212 allOf:
1313 - $ref: /schemas/i2c/i2c-controller.yaml#
Documentation/devicetree/bindings/spi/allwinner,sun6i-a31-spi.yaml+24−5
@@ -6,9 +6,6 @@ $schema: http://devicetree.org/meta-schemas/core.yaml# · 5 unmodified lines
66
77 title: Allwinner A31 SPI Controller
88
9−allOf:
10− - $ref: spi-controller.yaml
11−
129 maintainers:
1310 - Chen-Yu Tsai <wens@csie.org>
1411 - Maxime Ripard <mripard@kernel.org>
@@ -82,11 +79,11 @@ patternProperties: · 67 unmodified lines
8279
8380 spi-rx-bus-width:
8481 items:
85− - const: 1
82+ enum: [0, 1, 2, 4]
8683
8784 spi-tx-bus-width:
8885 items:
89− - const: 1
86+ enum: [0, 1, 2, 4]
9087
9188 required:
9289 - compatible
@@ -95,6 +92,28 @@ required: · 2 unmodified lines
9592 - clocks
9693 - clock-names
9794
95+allOf:
96+ - $ref: spi-controller.yaml
97+ - if:
98+ not:
99+ properties:
100+ compatible:
101+ contains:
102+ enum:
103+ - allwinner,sun50i-r329-spi
104+ - allwinner,sun55i-a523-spi
105+ then:
106+ patternProperties:
107+ "^.*@[0-9a-f]+":
108+ properties:
109+ spi-rx-bus-width:
110+ items:
111+ enum: [0, 1]
112+
113+ spi-tx-bus-width:
114+ items:
115+ enum: [0, 1]
116+
98117 unevaluatedProperties: false
99118
100119 examples:
Documentation/netlink/specs/net_shaper.yaml+6−6
@@ -247,8 +247,8 @@ operations: · 246 unmodified lines
247247 flags: [admin-perm]
248248
249249 do:
250− pre: net-shaper-nl-pre-doit
251− post: net-shaper-nl-post-doit
250+ pre: net-shaper-nl-pre-doit-write
251+ post: net-shaper-nl-post-doit-write
252252 request:
253253 attributes:
254254 - ifindex
@@ -278,8 +278,8 @@ operations: · 23 unmodified lines
278278 flags: [admin-perm]
279279
280280 do:
281− pre: net-shaper-nl-pre-doit
282− post: net-shaper-nl-post-doit
281+ pre: net-shaper-nl-pre-doit-write
282+ post: net-shaper-nl-post-doit-write
283283 request:
284284 attributes: *ns-binding
285285
@@ -309,8 +309,8 @@ operations: · 23 unmodified lines
309309 flags: [admin-perm]
310310
311311 do:
312− pre: net-shaper-nl-pre-doit
313− post: net-shaper-nl-post-doit
312+ pre: net-shaper-nl-pre-doit-write
313+ post: net-shaper-nl-post-doit-write
314314 request:
315315 attributes:
316316 - ifindex
Documentation/scheduler/sched-ext.rst+27−3
@@ -43,7 +43,6 @@ options should be enabled to use sched_ext: · 42 unmodified lines
4343 CONFIG_DEBUG_INFO_BTF=y
4444 CONFIG_BPF_JIT_ALWAYS_ON=y
4545 CONFIG_BPF_JIT_DEFAULT_ON=y
46− CONFIG_PAHOLE_HAS_BTF_TAG=y
4746
4847 sched_ext is used only when the BPF scheduler is loaded and running.
4948
@@ -58,7 +57,8 @@ in ``ops->flags``, all ``SCHED_NORMAL``, ``SCHED_BATCH``, ``SCHED_IDLE``, and · 8 unmodified lines
5857 However, when the BPF scheduler is loaded and ``SCX_OPS_SWITCH_PARTIAL`` is
5958 set in ``ops->flags``, only tasks with the ``SCHED_EXT`` policy are scheduled
6059 by sched_ext, while tasks with ``SCHED_NORMAL``, ``SCHED_BATCH`` and
61−``SCHED_IDLE`` policies are scheduled by the fair-class scheduler.
60+``SCHED_IDLE`` policies are scheduled by the fair-class scheduler which has
61+higher sched_class precedence than ``SCHED_EXT``.
6262
6363 Terminating the sched_ext scheduler program, triggering `SysRq-S`, or
6464 detection of any internal error including stalled runnable tasks aborts the
@@ -345,6 +345,8 @@ Where to Look · 280 unmodified lines
345345 The functions prefixed with ``scx_bpf_`` can be called from the BPF
346346 scheduler.
347347
348+* ``kernel/sched/ext_idle.c`` contains the built-in idle CPU selection policy.
349+
348350 * ``tools/sched_ext/`` hosts example BPF scheduler implementations.
349351
350352 * ``scx_simple[.bpf].c``: Minimal global FIFO scheduler example using a
@@ -353,13 +355,35 @@ Where to Look · 2 unmodified lines
353355 * ``scx_qmap[.bpf].c``: A multi-level FIFO scheduler supporting five
354356 levels of priority implemented with ``BPF_MAP_TYPE_QUEUE``.
355357
358+ * ``scx_central[.bpf].c``: A central FIFO scheduler where all scheduling
359+ decisions are made on one CPU, demonstrating ``LOCAL_ON`` dispatching,
360+ tickless operation, and kthread preemption.
361+
362+ * ``scx_cpu0[.bpf].c``: A scheduler that queues all tasks to a shared DSQ
363+ and only dispatches them on CPU0 in FIFO order. Useful for testing bypass
364+ behavior.
365+
366+ * ``scx_flatcg[.bpf].c``: A flattened cgroup hierarchy scheduler
367+ implementing hierarchical weight-based cgroup CPU control by compounding
368+ each cgroup's share at every level into a single flat scheduling layer.
369+
370+ * ``scx_pair[.bpf].c``: A core-scheduling example that always makes
371+ sibling CPU pairs execute tasks from the same CPU cgroup.
372+
373+ * ``scx_sdt[.bpf].c``: A variation of ``scx_simple`` demonstrating BPF
374+ arena memory management for per-task data.
375+
376+ * ``scx_userland[.bpf].c``: A minimal scheduler demonstrating user space
377+ scheduling. Tasks with CPU affinity are direct-dispatched in FIFO order;
378+ all others are scheduled in user space by a simple vruntime scheduler.
379+
356380 ABI Instability
357381 ===============
358382
359383 The APIs provided by sched_ext to BPF schedulers programs have no stability
360384 guarantees. This includes the ops table callbacks and constants defined in
361385 ``include/linux/sched/ext.h``, as well as the ``scx_bpf_`` kfuncs defined in
362−``kernel/sched/ext.c``.
386+``kernel/sched/ext.c`` and ``kernel/sched/ext_idle.c``.
363387
364388 While we will attempt to provide a relatively stable API surface when
365389 possible, they are subject to change without warning between kernel
Documentation/virt/kvm/api.rst+117−109
@@ -8435,115 +8435,123 @@ KVM_CHECK_EXTENSION. · 8434 unmodified lines
84358435
84368436 The valid bits in cap.args[0] are:
84378437
8438−=================================== ============================================
8439− KVM_X86_QUIRK_LINT0_REENABLED By default, the reset value for the LVT
8440− LINT0 register is 0x700 (APIC_MODE_EXTINT).
8441− When this quirk is disabled, the reset value
8442− is 0x10000 (APIC_LVT_MASKED).
8443−
8444− KVM_X86_QUIRK_CD_NW_CLEARED By default, KVM clears CR0.CD and CR0.NW on
8445− AMD CPUs to workaround buggy guest firmware
8446− that runs in perpetuity with CR0.CD, i.e.
8447− with caches in "no fill" mode.
8448−
8449− When this quirk is disabled, KVM does not
8450− change the value of CR0.CD and CR0.NW.
8451−
8452− KVM_X86_QUIRK_LAPIC_MMIO_HOLE By default, the MMIO LAPIC interface is
8453− available even when configured for x2APIC
8454− mode. When this quirk is disabled, KVM
8455− disables the MMIO LAPIC interface if the
8456− LAPIC is in x2APIC mode.
8457−
8458− KVM_X86_QUIRK_OUT_7E_INC_RIP By default, KVM pre-increments %rip before
8459− exiting to userspace for an OUT instruction
8460− to port 0x7e. When this quirk is disabled,
8461− KVM does not pre-increment %rip before
8462− exiting to userspace.
8463−
8464− KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT When this quirk is disabled, KVM sets
8465− CPUID.01H:ECX[bit 3] (MONITOR/MWAIT) if
8466− IA32_MISC_ENABLE[bit 18] (MWAIT) is set.
8467− Additionally, when this quirk is disabled,
8468− KVM clears CPUID.01H:ECX[bit 3] if
8469− IA32_MISC_ENABLE[bit 18] is cleared.
8470−
8471− KVM_X86_QUIRK_FIX_HYPERCALL_INSN By default, KVM rewrites guest
8472− VMMCALL/VMCALL instructions to match the
8473− vendor's hypercall instruction for the
8474− system. When this quirk is disabled, KVM
8475− will no longer rewrite invalid guest
8476− hypercall instructions. Executing the
8477− incorrect hypercall instruction will
8478− generate a #UD within the guest.
8479−
8480−KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS By default, KVM emulates MONITOR/MWAIT (if
8481− they are intercepted) as NOPs regardless of
8482− whether or not MONITOR/MWAIT are supported
8483− according to guest CPUID. When this quirk
8484− is disabled and KVM_X86_DISABLE_EXITS_MWAIT
8485− is not set (MONITOR/MWAIT are intercepted),
8486− KVM will inject a #UD on MONITOR/MWAIT if
8487− they're unsupported per guest CPUID. Note,
8488− KVM will modify MONITOR/MWAIT support in
8489− guest CPUID on writes to MISC_ENABLE if
8490− KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT is
8491− disabled.
8492−
8493−KVM_X86_QUIRK_SLOT_ZAP_ALL By default, for KVM_X86_DEFAULT_VM VMs, KVM
8494− invalidates all SPTEs in all memslots and
8495− address spaces when a memslot is deleted or
8496− moved. When this quirk is disabled (or the
8497− VM type isn't KVM_X86_DEFAULT_VM), KVM only
8498− ensures the backing memory of the deleted
8499− or moved memslot isn't reachable, i.e KVM
8500− _may_ invalidate only SPTEs related to the
8501− memslot.
8502−
8503−KVM_X86_QUIRK_STUFF_FEATURE_MSRS By default, at vCPU creation, KVM sets the
8504− vCPU's MSR_IA32_PERF_CAPABILITIES (0x345),
8505− MSR_IA32_ARCH_CAPABILITIES (0x10a),
8506− MSR_PLATFORM_INFO (0xce), and all VMX MSRs
8507− (0x480..0x492) to the maximal capabilities
8508− supported by KVM. KVM also sets
8509− MSR_IA32_UCODE_REV (0x8b) to an arbitrary
8510− value (which is different for Intel vs.
8511− AMD). Lastly, when guest CPUID is set (by
8512− userspace), KVM modifies select VMX MSR
8513− fields to force consistency between guest
8514− CPUID and L2's effective ISA. When this
8515− quirk is disabled, KVM zeroes the vCPU's MSR
8516− values (with two exceptions, see below),
8517− i.e. treats the feature MSRs like CPUID
8518− leaves and gives userspace full control of
8519− the vCPU model definition. This quirk does
8520− not affect VMX MSRs CR0/CR4_FIXED1 (0x487
8521− and 0x489), as KVM does now allow them to
8522− be set by userspace (KVM sets them based on
8523− guest CPUID, for safety purposes).
8524−
8525−KVM_X86_QUIRK_IGNORE_GUEST_PAT By default, on Intel platforms, KVM ignores
8526− guest PAT and forces the effective memory
8527− type to WB in EPT. The quirk is not available
8528− on Intel platforms which are incapable of
8529− safely honoring guest PAT (i.e., without CPU
8530− self-snoop, KVM always ignores guest PAT and
8531− forces effective memory type to WB). It is
8532− also ignored on AMD platforms or, on Intel,
8533− when a VM has non-coherent DMA devices
8534− assigned; KVM always honors guest PAT in
8535− such case. The quirk is needed to avoid
8536− slowdowns on certain Intel Xeon platforms
8537− (e.g. ICX, SPR) where self-snoop feature is
8538− supported but UC is slow enough to cause
8539− issues with some older guests that use
8540− UC instead of WC to map the video RAM.
8541− Userspace can disable the quirk to honor
8542− guest PAT if it knows that there is no such
8543− guest software, for example if it does not
8544− expose a bochs graphics device (which is
8545− known to have had a buggy driver).
8546−=================================== ============================================
8438+======================================== ================================================
8439+KVM_X86_QUIRK_LINT0_REENABLED By default, the reset value for the LVT
8440+ LINT0 register is 0x700 (APIC_MODE_EXTINT).
8441+ When this quirk is disabled, the reset value
8442+ is 0x10000 (APIC_LVT_MASKED).
8443+
8444+KVM_X86_QUIRK_CD_NW_CLEARED By default, KVM clears CR0.CD and CR0.NW on
8445+ AMD CPUs to workaround buggy guest firmware
8446+ that runs in perpetuity with CR0.CD, i.e.
8447+ with caches in "no fill" mode.
8448+
8449+ When this quirk is disabled, KVM does not
8450+ change the value of CR0.CD and CR0.NW.
8451+
8452+KVM_X86_QUIRK_LAPIC_MMIO_HOLE By default, the MMIO LAPIC interface is
8453+ available even when configured for x2APIC
8454+ mode. When this quirk is disabled, KVM
8455+ disables the MMIO LAPIC interface if the
8456+ LAPIC is in x2APIC mode.
8457+
8458+KVM_X86_QUIRK_OUT_7E_INC_RIP By default, KVM pre-increments %rip before
8459+ exiting to userspace for an OUT instruction
8460+ to port 0x7e. When this quirk is disabled,
8461+ KVM does not pre-increment %rip before
8462+ exiting to userspace.
8463+
8464+KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT When this quirk is disabled, KVM sets
8465+ CPUID.01H:ECX[bit 3] (MONITOR/MWAIT) if
8466+ IA32_MISC_ENABLE[bit 18] (MWAIT) is set.
8467+ Additionally, when this quirk is disabled,
8468+ KVM clears CPUID.01H:ECX[bit 3] if
8469+ IA32_MISC_ENABLE[bit 18] is cleared.
8470+
8471+KVM_X86_QUIRK_FIX_HYPERCALL_INSN By default, KVM rewrites guest
8472+ VMMCALL/VMCALL instructions to match the
8473+ vendor's hypercall instruction for the
8474+ system. When this quirk is disabled, KVM
8475+ will no longer rewrite invalid guest
8476+ hypercall instructions. Executing the
8477+ incorrect hypercall instruction will
8478+ generate a #UD within the guest.
8479+
8480+KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS By default, KVM emulates MONITOR/MWAIT (if
8481+ they are intercepted) as NOPs regardless of
8482+ whether or not MONITOR/MWAIT are supported
8483+ according to guest CPUID. When this quirk
8484+ is disabled and KVM_X86_DISABLE_EXITS_MWAIT
8485+ is not set (MONITOR/MWAIT are intercepted),
8486+ KVM will inject a #UD on MONITOR/MWAIT if
8487+ they're unsupported per guest CPUID. Note,
8488+ KVM will modify MONITOR/MWAIT support in
8489+ guest CPUID on writes to MISC_ENABLE if
8490+ KVM_X86_QUIRK_MISC_ENABLE_NO_MWAIT is
8491+ disabled.
8492+
8493+KVM_X86_QUIRK_SLOT_ZAP_ALL By default, for KVM_X86_DEFAULT_VM VMs, KVM
8494+ invalidates all SPTEs in all memslots and
8495+ address spaces when a memslot is deleted or
8496+ moved. When this quirk is disabled (or the
8497+ VM type isn't KVM_X86_DEFAULT_VM), KVM only
8498+ ensures the backing memory of the deleted
8499+ or moved memslot isn't reachable, i.e KVM
8500+ _may_ invalidate only SPTEs related to the
8501+ memslot.
8502+
8503+KVM_X86_QUIRK_STUFF_FEATURE_MSRS By default, at vCPU creation, KVM sets the
8504+ vCPU's MSR_IA32_PERF_CAPABILITIES (0x345),
8505+ MSR_IA32_ARCH_CAPABILITIES (0x10a),
8506+ MSR_PLATFORM_INFO (0xce), and all VMX MSRs
8507+ (0x480..0x492) to the maximal capabilities
8508+ supported by KVM. KVM also sets
8509+ MSR_IA32_UCODE_REV (0x8b) to an arbitrary
8510+ value (which is different for Intel vs.
8511+ AMD). Lastly, when guest CPUID is set (by
8512+ userspace), KVM modifies select VMX MSR
8513+ fields to force consistency between guest
8514+ CPUID and L2's effective ISA. When this
8515+ quirk is disabled, KVM zeroes the vCPU's MSR
8516+ values (with two exceptions, see below),
8517+ i.e. treats the feature MSRs like CPUID
8518+ leaves and gives userspace full control of
8519+ the vCPU model definition. This quirk does
8520+ not affect VMX MSRs CR0/CR4_FIXED1 (0x487
8521+ and 0x489), as KVM does now allow them to
8522+ be set by userspace (KVM sets them based on
8523+ guest CPUID, for safety purposes).
8524+
8525+KVM_X86_QUIRK_IGNORE_GUEST_PAT By default, on Intel platforms, KVM ignores
8526+ guest PAT and forces the effective memory
8527+ type to WB in EPT. The quirk is not available
8528+ on Intel platforms which are incapable of
8529+ safely honoring guest PAT (i.e., without CPU
8530+ self-snoop, KVM always ignores guest PAT and
8531+ forces effective memory type to WB). It is
8532+ also ignored on AMD platforms or, on Intel,
8533+ when a VM has non-coherent DMA devices
8534+ assigned; KVM always honors guest PAT in
8535+ such case. The quirk is needed to avoid
8536+ slowdowns on certain Intel Xeon platforms
8537+ (e.g. ICX, SPR) where self-snoop feature is
8538+ supported but UC is slow enough to cause
8539+ issues with some older guests that use
8540+ UC instead of WC to map the video RAM.
8541+ Userspace can disable the quirk to honor
8542+ guest PAT if it knows that there is no such
8543+ guest software, for example if it does not
8544+ expose a bochs graphics device (which is
8545+ known to have had a buggy driver).
8546+
8547+KVM_X86_QUIRK_VMCS12_ALLOW_FREEZE_IN_SMM By default, KVM relaxes the consistency
8548+ check for GUEST_IA32_DEBUGCTL in vmcs12
8549+ to allow FREEZE_IN_SMM to be set. When
8550+ this quirk is disabled, KVM requires this
8551+ bit to be cleared. Note that the vmcs02
8552+ bit is still completely controlled by the
8553+ host, regardless of the quirk setting.
8554+======================================== ================================================
85478555
85488556 7.32 KVM_CAP_MAX_VCPU_ID
85498557 ------------------------
Documentation/virt/kvm/locking.rst+2−0
@@ -17,6 +17,8 @@ The acquisition orders for mutexes are as follows: · 16 unmodified lines
1717
1818 - kvm->lock is taken outside kvm->slots_lock and kvm->irq_lock
1919
20+- vcpu->mutex is taken outside kvm->slots_lock and kvm->slots_arch_lock
21+
2022 - kvm->slots_lock is taken outside kvm->irq_lock, though acquiring
2123 them together is quite rare.
2224
MAINTAINERS+6−7
@@ -4022,7 +4022,7 @@ F: drivers/hwmon/asus_wmi_sensors.c · 4021 unmodified lines
40224022 ASYMMETRIC KEYS
40234023 M: David Howells <dhowells@redhat.com>
40244024 M: Lukas Wunner <lukas@wunner.de>
4025−M: Ignat Korchagin <ignat@cloudflare.com>
4025+M: Ignat Korchagin <ignat@linux.win>
40264026 L: keyrings@vger.kernel.org
40274027 L: linux-crypto@vger.kernel.org
40284028 S: Maintained
@@ -4035,7 +4035,7 @@ F: include/linux/verification.h · 6 unmodified lines
40354035
40364036 ASYMMETRIC KEYS - ECDSA
40374037 M: Lukas Wunner <lukas@wunner.de>
4038−M: Ignat Korchagin <ignat@cloudflare.com>
4038+M: Ignat Korchagin <ignat@linux.win>
40394039 R: Stefan Berger <stefanb@linux.ibm.com>
40404040 L: linux-crypto@vger.kernel.org
40414041 S: Maintained
@@ -4045,14 +4045,14 @@ F: include/crypto/ecc* · 3 unmodified lines
40454045
40464046 ASYMMETRIC KEYS - GOST
40474047 M: Lukas Wunner <lukas@wunner.de>
4048−M: Ignat Korchagin <ignat@cloudflare.com>
4048+M: Ignat Korchagin <ignat@linux.win>
40494049 L: linux-crypto@vger.kernel.org
40504050 S: Odd fixes
40514051 F: crypto/ecrdsa*
40524052
40534053 ASYMMETRIC KEYS - RSA
40544054 M: Lukas Wunner <lukas@wunner.de>
4055−M: Ignat Korchagin <ignat@cloudflare.com>
4055+M: Ignat Korchagin <ignat@linux.win>
40564056 L: linux-crypto@vger.kernel.org
40574057 S: Maintained
40584058 F: crypto/rsa*
@@ -8626,9 +8626,8 @@ F: drivers/gpu/drm/lima/ · 4567 unmodified lines
86268626 F: include/uapi/drm/lima_drm.h
86278627
86288628 DRM DRIVERS FOR LOONGSON
8629−M: Sui Jingfeng <suijingfeng@loongson.cn>
86308629 L: dri-devel@lists.freedesktop.org
8631−S: Supported
8630+S: Orphan
86328631 T: git https://gitlab.freedesktop.org/drm/misc/kernel.git
86338632 F: drivers/gpu/drm/loongson/
86348633
@@ -21935,7 +21934,7 @@ F: drivers/media/radio/radio-tea5777.c · 13300 unmodified lines
2193521934
2193621935 RADOS BLOCK DEVICE (RBD)
2193721936 M: Ilya Dryomov <idryomov@gmail.com>
21938−R: Dongsheng Yang <dongsheng.yang@easystack.cn>
21937+R: Dongsheng Yang <dongsheng.yang@linux.dev>
2193921938 L: ceph-devel@vger.kernel.org
2194021939 S: Supported
2194121940 W: http://ceph.com/
Makefile+5−1
@@ -2,7 +2,7 @@ · 1 unmodified line
22 VERSION = 7
33 PATCHLEVEL = 0
44 SUBLEVEL = 0
5−EXTRAVERSION = -rc3
5+EXTRAVERSION = -rc4
66 NAME = Baby Opossum Posse
77
88 # *DOCUMENTATION*
@@ -476,6 +476,7 @@ KBUILD_USERLDFLAGS := $(USERLDFLAGS) · 467 unmodified lines
476476 export rust_common_flags := --edition=2021 \
477477 -Zbinary_dep_depinfo=y \
478478 -Astable_features \
479+ -Aunused_features \
479480 -Dnon_ascii_idents \
480481 -Dunsafe_op_in_unsafe_fn \
481482 -Wmissing_docs \
@@ -1113,6 +1114,9 @@ KBUILD_CFLAGS += -fno-builtin-wcslen · 631 unmodified lines
11131114 # change __FILE__ to the relative path to the source directory
11141115 ifdef building_out_of_srctree
11151116 KBUILD_CPPFLAGS += -fmacro-prefix-map=$(srcroot)/=
1117+ifeq ($(call rustc-option-yn, --remap-path-scope=macro),y)
1118+KBUILD_RUSTFLAGS += --remap-path-prefix=$(srcroot)/= --remap-path-scope=macro
1119+endif
11161120 endif
11171121
11181122 # include additional Makefiles when needed
arch/arm/configs/multi_v7_defconfig+0−1
@@ -279,7 +279,6 @@ CONFIG_TI_CPSW_SWITCHDEV=y · 278 unmodified lines
279279 CONFIG_TI_CPTS=y
280280 CONFIG_TI_KEYSTONE_NETCP=y
281281 CONFIG_TI_KEYSTONE_NETCP_ETHSS=y
282−CONFIG_TI_PRUSS=m
283282 CONFIG_TI_PRUETH=m
284283 CONFIG_XILINX_EMACLITE=y
285284 CONFIG_SFP=m
arch/arm64/boot/dts/renesas/r8a78000.dtsi+8−8
@@ -698,7 +698,7 @@ · 697 unmodified lines
698698 compatible = "renesas,scif-r8a78000",
699699 "renesas,rcar-gen5-scif", "renesas,scif";
700700 reg = <0 0xc0700000 0 0x40>;
701− interrupts = <GIC_SPI 4074 IRQ_TYPE_LEVEL_HIGH>;
701+ interrupts = <GIC_ESPI 10 IRQ_TYPE_LEVEL_HIGH>;
702702 clocks = <&dummy_clk_sgasyncd16>, <&dummy_clk_sgasyncd16>, <&scif_clk>;
703703 clock-names = "fck", "brg_int", "scif_clk";
704704 status = "disabled";
@@ -708,7 +708,7 @@ · 3 unmodified lines
708708 compatible = "renesas,scif-r8a78000",
709709 "renesas,rcar-gen5-scif", "renesas,scif";
710710 reg = <0 0xc0704000 0 0x40>;
711− interrupts = <GIC_SPI 4075 IRQ_TYPE_LEVEL_HIGH>;
711+ interrupts = <GIC_ESPI 11 IRQ_TYPE_LEVEL_HIGH>;
712712 clocks = <&dummy_clk_sgasyncd16>, <&dummy_clk_sgasyncd16>, <&scif_clk>;
713713 clock-names = "fck", "brg_int", "scif_clk";
714714 status = "disabled";
@@ -718,7 +718,7 @@ · 3 unmodified lines
718718 compatible = "renesas,scif-r8a78000",
719719 "renesas,rcar-gen5-scif", "renesas,scif";
720720 reg = <0 0xc0708000 0 0x40>;
721− interrupts = <GIC_SPI 4076 IRQ_TYPE_LEVEL_HIGH>;
721+ interrupts = <GIC_ESPI 12 IRQ_TYPE_LEVEL_HIGH>;
722722 clocks = <&dummy_clk_sgasyncd16>, <&dummy_clk_sgasyncd16>, <&scif_clk>;
723723 clock-names = "fck", "brg_int", "scif_clk";
724724 status = "disabled";
@@ -728,7 +728,7 @@ · 3 unmodified lines
728728 compatible = "renesas,scif-r8a78000",
729729 "renesas,rcar-gen5-scif", "renesas,scif";
730730 reg = <0 0xc070c000 0 0x40>;
731− interrupts = <GIC_SPI 4077 IRQ_TYPE_LEVEL_HIGH>;
731+ interrupts = <GIC_ESPI 13 IRQ_TYPE_LEVEL_HIGH>;
732732 clocks = <&dummy_clk_sgasyncd16>, <&dummy_clk_sgasyncd16>, <&scif_clk>;
733733 clock-names = "fck", "brg_int", "scif_clk";
734734 status = "disabled";
@@ -738,7 +738,7 @@ · 3 unmodified lines
738738 compatible = "renesas,hscif-r8a78000",
739739 "renesas,rcar-gen5-hscif", "renesas,hscif";
740740 reg = <0 0xc0710000 0 0x60>;
741− interrupts = <GIC_SPI 4078 IRQ_TYPE_LEVEL_HIGH>;
741+ interrupts = <GIC_ESPI 14 IRQ_TYPE_LEVEL_HIGH>;
742742 clocks = <&dummy_clk_sgasyncd4>, <&dummy_clk_sgasyncd4>, <&scif_clk>;
743743 clock-names = "fck", "brg_int", "scif_clk";
744744 status = "disabled";
@@ -748,7 +748,7 @@ · 3 unmodified lines
748748 compatible = "renesas,hscif-r8a78000",
749749 "renesas,rcar-gen5-hscif", "renesas,hscif";
750750 reg = <0 0xc0714000 0 0x60>;
751− interrupts = <GIC_SPI 4079 IRQ_TYPE_LEVEL_HIGH>;
751+ interrupts = <GIC_ESPI 15 IRQ_TYPE_LEVEL_HIGH>;
752752 clocks = <&dummy_clk_sgasyncd4>, <&dummy_clk_sgasyncd4>, <&scif_clk>;
753753 clock-names = "fck", "brg_int", "scif_clk";
754754 status = "disabled";
@@ -758,7 +758,7 @@ · 3 unmodified lines
758758 compatible = "renesas,hscif-r8a78000",
759759 "renesas,rcar-gen5-hscif", "renesas,hscif";
760760 reg = <0 0xc0718000 0 0x60>;
761− interrupts = <GIC_SPI 4080 IRQ_TYPE_LEVEL_HIGH>;
761+ interrupts = <GIC_ESPI 16 IRQ_TYPE_LEVEL_HIGH>;
762762 clocks = <&dummy_clk_sgasyncd4>, <&dummy_clk_sgasyncd4>, <&scif_clk>;
763763 clock-names = "fck", "brg_int", "scif_clk";
764764 status = "disabled";
@@ -768,7 +768,7 @@ · 3 unmodified lines
768768 compatible = "renesas,hscif-r8a78000",
769769 "renesas,rcar-gen5-hscif", "renesas,hscif";
770770 reg = <0 0xc071c000 0 0x60>;
771− interrupts = <GIC_SPI 4081 IRQ_TYPE_LEVEL_HIGH>;
771+ interrupts = <GIC_ESPI 17 IRQ_TYPE_LEVEL_HIGH>;
772772 clocks = <&dummy_clk_sgasyncd4>, <&dummy_clk_sgasyncd4>, <&scif_clk>;
773773 clock-names = "fck", "brg_int", "scif_clk";
774774 status = "disabled";
arch/arm64/boot/dts/renesas/r9a09g057.dtsi+0−30
@@ -581,16 +581,6 @@ · 580 unmodified lines
581581 status = "disabled";
582582 };
583583
584− wdt0: watchdog@11c00400 {
585− compatible = "renesas,r9a09g057-wdt";
586− reg = <0 0x11c00400 0 0x400>;
587− clocks = <&cpg CPG_MOD 0x4b>, <&cpg CPG_MOD 0x4c>;
588− clock-names = "pclk", "oscclk";
589− resets = <&cpg 0x75>;
590− power-domains = <&cpg>;
591− status = "disabled";
592− };
593−
594584 wdt1: watchdog@14400000 {
595585 compatible = "renesas,r9a09g057-wdt";
596586 reg = <0 0x14400000 0 0x400>;
@@ -601,26 +591,6 @@ · 4 unmodified lines
601591 status = "disabled";
602592 };
603593
604− wdt2: watchdog@13000000 {
605− compatible = "renesas,r9a09g057-wdt";
606− reg = <0 0x13000000 0 0x400>;
607− clocks = <&cpg CPG_MOD 0x4f>, <&cpg CPG_MOD 0x50>;
608− clock-names = "pclk", "oscclk";
609− resets = <&cpg 0x77>;
610− power-domains = <&cpg>;
611− status = "disabled";
612− };
613−
614− wdt3: watchdog@13000400 {
615− compatible = "renesas,r9a09g057-wdt";
616− reg = <0 0x13000400 0 0x400>;
617− clocks = <&cpg CPG_MOD 0x51>, <&cpg CPG_MOD 0x52>;
618− clock-names = "pclk", "oscclk";
619− resets = <&cpg 0x78>;
620− power-domains = <&cpg>;
621− status = "disabled";
622− };
623−
624594 rtc: rtc@11c00800 {
625595 compatible = "renesas,r9a09g057-rtca3", "renesas,rz-rtca3";
626596 reg = <0 0x11c00800 0 0x400>;
arch/arm64/boot/dts/renesas/r9a09g077.dtsi+2−2
@@ -974,8 +974,8 @@ · 973 unmodified lines
974974
975975 cpg: clock-controller@80280000 {
976976 compatible = "renesas,r9a09g077-cpg-mssr";
977− reg = <0 0x80280000 0 0x1000>,
978− <0 0x81280000 0 0x9000>;
977+ reg = <0 0x80280000 0 0x10000>,
978+ <0 0x81280000 0 0x10000>;
979979 clocks = <&extal_clk>;
980980 clock-names = "extal";
981981 #clock-cells = <2>;
arch/arm64/boot/dts/renesas/r9a09g087.dtsi+2−2
@@ -977,8 +977,8 @@ · 976 unmodified lines
977977
978978 cpg: clock-controller@80280000 {
979979 compatible = "renesas,r9a09g087-cpg-mssr";
980− reg = <0 0x80280000 0 0x1000>,
981− <0 0x81280000 0 0x9000>;
980+ reg = <0 0x80280000 0 0x10000>,
981+ <0 0x81280000 0 0x10000>;
982982 clocks = <&extal_clk>;
983983 clock-names = "extal";
984984 #clock-cells = <2>;
arch/arm64/boot/dts/renesas/rzg3s-smarc-som.dtsi+1−1
@@ -162,7 +162,7 @@ · 161 unmodified lines
162162 <100000000>;
163163 renesas,settings = [
164164 80 00 11 19 4c 42 dc 2f 06 7d 20 1a 5f 1e f2 27
165− 00 40 00 00 00 00 00 00 06 0c 19 02 3f f0 90 86
165+ 00 40 00 00 00 00 00 00 06 0c 19 02 3b f0 90 86
166166 a0 80 30 30 9c
167167 ];
168168 };
arch/arm64/boot/dts/renesas/rzt2h-n2h-evk-common.dtsi+1−0
@@ -53,6 +53,7 @@ · 52 unmodified lines
5353 regulator-max-microvolt = <3300000>;
5454 gpios-states = <0>;
5555 states = <3300000 0>, <1800000 1>;
56+ regulator-ramp-delay = <60>;
5657 };
5758 #endif
5859
arch/arm64/boot/dts/renesas/rzv2-evk-cn15-sd.dtso+1−0
@@ -25,6 +25,7 @@ · 24 unmodified lines
2525 regulator-max-microvolt = <3300000>;
2626 gpios-states = <0>;
2727 states = <3300000 0>, <1800000 1>;
28+ regulator-ramp-delay = <60>;
2829 };
2930 };
3031
arch/arm64/crypto/aes-neonbs-glue.c+23−14
@@ -76,19 +76,24 @@ static int aesbs_setkey(struct crypto_skcipher *tfm, const u8 *in_key, · 75 unmodified lines
7676 unsigned int key_len)
7777 {
7878 struct aesbs_ctx *ctx = crypto_skcipher_ctx(tfm);
79− struct crypto_aes_ctx rk;
79+ struct crypto_aes_ctx *rk;
8080 int err;
8181
82− err = aes_expandkey(&rk, in_key, key_len);
82+ rk = kmalloc(sizeof(*rk), GFP_KERNEL);
83+ if (!rk)
84+ return -ENOMEM;
85+
86+ err = aes_expandkey(rk, in_key, key_len);
8387 if (err)
84− return err;
88+ goto out;
8589
8690 ctx->rounds = 6 + key_len / 4;
8791
8892 scoped_ksimd()
89− aesbs_convert_key(ctx->rk, rk.key_enc, ctx->rounds);
90−
91− return 0;
93+ aesbs_convert_key(ctx->rk, rk->key_enc, ctx->rounds);
94+out:
95+ kfree_sensitive(rk);
96+ return err;
9297 }
9398
9499 static int __ecb_crypt(struct skcipher_request *req,
@@ -133,22 +138,26 @@ static int aesbs_cbc_ctr_setkey(struct crypto_skcipher *tfm, const u8 *in_key, · 38 unmodified lines
133138 unsigned int key_len)
134139 {
135140 struct aesbs_cbc_ctr_ctx *ctx = crypto_skcipher_ctx(tfm);
136− struct crypto_aes_ctx rk;
141+ struct crypto_aes_ctx *rk;
137142 int err;
138143
139− err = aes_expandkey(&rk, in_key, key_len);
144+ rk = kmalloc(sizeof(*rk), GFP_KERNEL);
145+ if (!rk)
146+ return -ENOMEM;
147+
148+ err = aes_expandkey(rk, in_key, key_len);
140149 if (err)
141− return err;
150+ goto out;
142151
143152 ctx->key.rounds = 6 + key_len / 4;
144153
145− memcpy(ctx->enc, rk.key_enc, sizeof(ctx->enc));
154+ memcpy(ctx->enc, rk->key_enc, sizeof(ctx->enc));
146155
147156 scoped_ksimd()
148− aesbs_convert_key(ctx->key.rk, rk.key_enc, ctx->key.rounds);
149− memzero_explicit(&rk, sizeof(rk));
150−
151− return 0;
157+ aesbs_convert_key(ctx->key.rk, rk->key_enc, ctx->key.rounds);
158+out:
159+ kfree_sensitive(rk);
160+ return err;
152161 }
153162
154163 static int cbc_encrypt(struct skcipher_request *req)
arch/arm64/include/asm/kvm_host.h+3−0
@@ -784,6 +784,9 @@ struct kvm_host_data { · 783 unmodified lines
784784 /* Number of debug breakpoints/watchpoints for this CPU (minus 1) */
785785 unsigned int debug_brps;
786786 unsigned int debug_wrps;
787+
788+ /* Last vgic_irq part of the AP list recorded in an LR */
789+ struct vgic_irq *last_lr_irq;
787790 };
788791
789792 struct kvm_host_psci_config {
arch/arm64/kernel/cpufeature.c+9−0
@@ -2345,6 +2345,15 @@ static bool can_trap_icv_dir_el1(const struct arm64_cpu_capabilities *entry, · 2344 unmodified lines
23452345 !is_midr_in_range_list(has_vgic_v3))
23462346 return false;
23472347
2348+ /*
2349+ * pKVM prevents late onlining of CPUs. This means that whatever
2350+ * state the capability is in after deprivilege cannot be affected
2351+ * by a new CPU booting -- this is garanteed to be a CPU we have
2352+ * already seen, and the cap is therefore unchanged.
2353+ */
2354+ if (system_capabilities_finalized() && is_protected_kvm_enabled())
2355+ return cpus_have_final_cap(ARM64_HAS_ICH_HCR_EL2_TDIR);
2356+
23482357 if (is_kernel_in_hyp_mode())
23492358 res.a1 = read_sysreg_s(SYS_ICH_VTR_EL2);
23502359 else
arch/arm64/kvm/at.c+0−2
@@ -1504,8 +1504,6 @@ int __kvm_at_s1e2(struct kvm_vcpu *vcpu, u32 op, u64 vaddr) · 1503 unmodified lines
15041504 fail = true;
15051505 }
15061506
1507− isb();
1508−
15091507 if (!fail)
15101508 par = read_sysreg_par();
15111509
arch/arm64/kvm/guest.c+2−2
@@ -29,7 +29,7 @@ · 28 unmodified lines
2929
3030 #include "trace.h"
3131
32−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
32+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
3333 KVM_GENERIC_VM_STATS()
3434 };
3535
@@ -42,7 +42,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 6 unmodified lines
4242 sizeof(kvm_vm_stats_desc),
4343 };
4444
45−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
45+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
4646 KVM_GENERIC_VCPU_STATS(),
4747 STATS_DESC_COUNTER(VCPU, hvc_exit_stat),
4848 STATS_DESC_COUNTER(VCPU, wfe_exit_stat),
arch/arm64/kvm/hyp/nvhe/mem_protect.c+1−1
@@ -518,7 +518,7 @@ static int host_stage2_adjust_range(u64 addr, struct kvm_mem_range *range) · 517 unmodified lines
518518 granule = kvm_granule_size(level);
519519 cur.start = ALIGN_DOWN(addr, granule);
520520 cur.end = cur.start + granule;
521− if (!range_included(&cur, range))
521+ if (!range_included(&cur, range) && level < KVM_PGTABLE_LAST_LEVEL)
522522 continue;
523523 *range = cur;
524524 return 0;
arch/arm64/kvm/mmu.c+9−5
@@ -1751,6 +1751,7 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, · 1750 unmodified lines
17511751
17521752 force_pte = (max_map_size == PAGE_SIZE);
17531753 vma_pagesize = min_t(long, vma_pagesize, max_map_size);
1754+ vma_shift = __ffs(vma_pagesize);
17541755 }
17551756
17561757 /*
@@ -1837,10 +1838,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, · 80 unmodified lines
18371838 if (exec_fault && s2_force_noncacheable)
18381839 ret = -ENOEXEC;
18391840
1840− if (ret) {
1841− kvm_release_page_unused(page);
1842− return ret;
1843− }
1841+ if (ret)
1842+ goto out_put_page;
18441843
18451844 /*
18461845 * Guest performs atomic/exclusive operations on memory with unsupported
@@ -1850,7 +1849,8 @@ static int user_mem_abort(struct kvm_vcpu *vcpu, phys_addr_t fault_ipa, · 3 unmodified lines
18501849 */
18511850 if (esr_fsc_is_excl_atomic_fault(kvm_vcpu_get_esr(vcpu))) {
18521851 kvm_inject_dabt_excl_atomic(vcpu, kvm_vcpu_get_hfar(vcpu));
1853− return 1;
1852+ ret = 1;
1853+ goto out_put_page;
18541854 }
18551855
18561856 if (nested)
@@ -1936,6 +1936,10 @@ out_unlock: · 79 unmodified lines
19361936 mark_page_dirty_in_slot(kvm, memslot, gfn);
19371937
19381938 return ret != -EAGAIN ? ret : 0;
1939+
1940+out_put_page:
1941+ kvm_release_page_unused(page);
1942+ return ret;
19391943 }
19401944
19411945 /* Resolve the access fault by making the page young again. */
arch/arm64/kvm/nested.c+16−11
@@ -152,31 +152,31 @@ static int get_ia_size(struct s2_walk_info *wi) · 151 unmodified lines
152152 return 64 - wi->t0sz;
153153 }
154154
155−static int check_base_s2_limits(struct s2_walk_info *wi,
155+static int check_base_s2_limits(struct kvm_vcpu *vcpu, struct s2_walk_info *wi,
156156 int level, int input_size, int stride)
157157 {
158− int start_size, ia_size;
158+ int start_size, pa_max;
159159
160− ia_size = get_ia_size(wi);
160+ pa_max = kvm_get_pa_bits(vcpu->kvm);
161161
162162 /* Check translation limits */
163163 switch (BIT(wi->pgshift)) {
164164 case SZ_64K:
165− if (level == 0 || (level == 1 && ia_size <= 42))
165+ if (level == 0 || (level == 1 && pa_max <= 42))
166166 return -EFAULT;
167167 break;
168168 case SZ_16K:
169− if (level == 0 || (level == 1 && ia_size <= 40))
169+ if (level == 0 || (level == 1 && pa_max <= 40))
170170 return -EFAULT;
171171 break;
172172 case SZ_4K:
173− if (level < 0 || (level == 0 && ia_size <= 42))
173+ if (level < 0 || (level == 0 && pa_max <= 42))
174174 return -EFAULT;
175175 break;
176176 }
177177
178178 /* Check input size limits */
179− if (input_size > ia_size)
179+ if (input_size > pa_max)
180180 return -EFAULT;
181181
182182 /* Check number of entries in starting level table */
@@ -269,16 +269,19 @@ static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, phys_addr_t ipa, · 86 unmodified lines
269269 if (input_size > 48 || input_size < 25)
270270 return -EFAULT;
271271
272− ret = check_base_s2_limits(wi, level, input_size, stride);
273− if (WARN_ON(ret))
272+ ret = check_base_s2_limits(vcpu, wi, level, input_size, stride);
273+ if (WARN_ON(ret)) {
274+ out->esr = compute_fsc(0, ESR_ELx_FSC_FAULT);
274275 return ret;
276+ }
275277
276278 base_lower_bound = 3 + input_size - ((3 - level) * stride +
277279 wi->pgshift);
278280 base_addr = wi->baddr & GENMASK_ULL(47, base_lower_bound);
279281
280282 if (check_output_size(wi, base_addr)) {
281− out->esr = compute_fsc(level, ESR_ELx_FSC_ADDRSZ);
283+ /* R_BFHQH */
284+ out->esr = compute_fsc(0, ESR_ELx_FSC_ADDRSZ);
282285 return 1;
283286 }
284287
@@ -293,8 +296,10 @@ static int walk_nested_s2_pgd(struct kvm_vcpu *vcpu, phys_addr_t ipa, · 8 unmodified lines
293296
294297 paddr = base_addr | index;
295298 ret = read_guest_s2_desc(vcpu, paddr, &desc, wi);
296− if (ret < 0)
299+ if (ret < 0) {
300+ out->esr = ESR_ELx_FSC_SEA_TTW(level);
297301 return ret;
302+ }
298303
299304 new_desc = desc;
300305
arch/arm64/kvm/vgic/vgic-init.c+16−16
@@ -143,6 +143,21 @@ int kvm_vgic_create(struct kvm *kvm, u32 type) · 142 unmodified lines
143143 kvm->arch.vgic.in_kernel = true;
144144 kvm->arch.vgic.vgic_model = type;
145145 kvm->arch.vgic.implementation_rev = KVM_VGIC_IMP_REV_LATEST;
146+ kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
147+
148+ aa64pfr0 = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1) & ~ID_AA64PFR0_EL1_GIC;
149+ pfr1 = kvm_read_vm_id_reg(kvm, SYS_ID_PFR1_EL1) & ~ID_PFR1_EL1_GIC;
150+
151+ if (type == KVM_DEV_TYPE_ARM_VGIC_V2) {
152+ kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF;
153+ } else {
154+ INIT_LIST_HEAD(&kvm->arch.vgic.rd_regions);
155+ aa64pfr0 |= SYS_FIELD_PREP_ENUM(ID_AA64PFR0_EL1, GIC, IMP);
156+ pfr1 |= SYS_FIELD_PREP_ENUM(ID_PFR1_EL1, GIC, GICv3);
157+ }
158+
159+ kvm_set_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1, aa64pfr0);
160+ kvm_set_vm_id_reg(kvm, SYS_ID_PFR1_EL1, pfr1);
146161
147162 kvm_for_each_vcpu(i, vcpu, kvm) {
148163 ret = vgic_allocate_private_irqs_locked(vcpu, type);
@@ -157,25 +172,10 @@ int kvm_vgic_create(struct kvm *kvm, u32 type) · 8 unmodified lines
157172 vgic_cpu->private_irqs = NULL;
158173 }
159174
175+ kvm->arch.vgic.vgic_model = 0;
160176 goto out_unlock;
161177 }
162178
163− kvm->arch.vgic.vgic_dist_base = VGIC_ADDR_UNDEF;
164−
165− aa64pfr0 = kvm_read_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1) & ~ID_AA64PFR0_EL1_GIC;
166− pfr1 = kvm_read_vm_id_reg(kvm, SYS_ID_PFR1_EL1) & ~ID_PFR1_EL1_GIC;
167−
168− if (type == KVM_DEV_TYPE_ARM_VGIC_V2) {
169− kvm->arch.vgic.vgic_cpu_base = VGIC_ADDR_UNDEF;
170− } else {
171− INIT_LIST_HEAD(&kvm->arch.vgic.rd_regions);
172− aa64pfr0 |= SYS_FIELD_PREP_ENUM(ID_AA64PFR0_EL1, GIC, IMP);
173− pfr1 |= SYS_FIELD_PREP_ENUM(ID_PFR1_EL1, GIC, GICv3);
174− }
175−
176− kvm_set_vm_id_reg(kvm, SYS_ID_AA64PFR0_EL1, aa64pfr0);
177− kvm_set_vm_id_reg(kvm, SYS_ID_PFR1_EL1, pfr1);
178−
179179 if (type == KVM_DEV_TYPE_ARM_VGIC_V3)
180180 kvm->arch.vgic.nassgicap = system_supports_direct_sgis();
181181
arch/arm64/kvm/vgic/vgic-v2.c+2−2
@@ -115,7 +115,7 @@ void vgic_v2_fold_lr_state(struct kvm_vcpu *vcpu) · 114 unmodified lines
115115 struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
116116 struct vgic_v2_cpu_if *cpuif = &vgic_cpu->vgic_v2;
117117 u32 eoicount = FIELD_GET(GICH_HCR_EOICOUNT, cpuif->vgic_hcr);
118− struct vgic_irq *irq;
118+ struct vgic_irq *irq = *host_data_ptr(last_lr_irq);
119119
120120 DEBUG_SPINLOCK_BUG_ON(!irqs_disabled());
121121
@@ -123,7 +123,7 @@ void vgic_v2_fold_lr_state(struct kvm_vcpu *vcpu) · 1 unmodified line
123123 vgic_v2_fold_lr(vcpu, cpuif->vgic_lr[lr]);
124124
125125 /* See the GICv3 equivalent for the EOIcount handling rationale */
126− list_for_each_entry(irq, &vgic_cpu->ap_list_head, ap_list) {
126+ list_for_each_entry_continue(irq, &vgic_cpu->ap_list_head, ap_list) {
127127 u32 lr;
128128
129129 if (!eoicount) {
arch/arm64/kvm/vgic/vgic-v3.c+6−6
@@ -148,7 +148,7 @@ void vgic_v3_fold_lr_state(struct kvm_vcpu *vcpu) · 147 unmodified lines
148148 struct vgic_cpu *vgic_cpu = &vcpu->arch.vgic_cpu;
149149 struct vgic_v3_cpu_if *cpuif = &vgic_cpu->vgic_v3;
150150 u32 eoicount = FIELD_GET(ICH_HCR_EL2_EOIcount, cpuif->vgic_hcr);
151− struct vgic_irq *irq;
151+ struct vgic_irq *irq = *host_data_ptr(last_lr_irq);
152152
153153 DEBUG_SPINLOCK_BUG_ON(!irqs_disabled());
154154
@@ -158,12 +158,12 @@ void vgic_v3_fold_lr_state(struct kvm_vcpu *vcpu) · 3 unmodified lines
158158 /*
159159 * EOIMode=0: use EOIcount to emulate deactivation. We are
160160 * guaranteed to deactivate in reverse order of the activation, so
161− * just pick one active interrupt after the other in the ap_list,
162− * and replay the deactivation as if the CPU was doing it. We also
163− * rely on priority drop to have taken place, and the list to be
164− * sorted by priority.
161+ * just pick one active interrupt after the other in the tail part
162+ * of the ap_list, past the LRs, and replay the deactivation as if
163+ * the CPU was doing it. We also rely on priority drop to have taken
164+ * place, and the list to be sorted by priority.
165165 */
166− list_for_each_entry(irq, &vgic_cpu->ap_list_head, ap_list) {
166+ list_for_each_entry_continue(irq, &vgic_cpu->ap_list_head, ap_list) {
167167 u64 lr;
168168
169169 /*
arch/arm64/kvm/vgic/vgic.c+6−0
@@ -814,6 +814,9 @@ retry: · 813 unmodified lines
814814
815815 static inline void vgic_fold_lr_state(struct kvm_vcpu *vcpu)
816816 {
817+ if (!*host_data_ptr(last_lr_irq))
818+ return;
819+
817820 if (kvm_vgic_global_state.type == VGIC_V2)
818821 vgic_v2_fold_lr_state(vcpu);
819822 else
@@ -960,10 +963,13 @@ static void vgic_flush_lr_state(struct kvm_vcpu *vcpu) · 140 unmodified lines
960963 if (irqs_outside_lrs(&als))
961964 vgic_sort_ap_list(vcpu);
962965
966+ *host_data_ptr(last_lr_irq) = NULL;
967+
963968 list_for_each_entry(irq, &vgic_cpu->ap_list_head, ap_list) {
964969 scoped_guard(raw_spinlock, &irq->irq_lock) {
965970 if (likely(vgic_target_oracle(irq) == vcpu)) {
966971 vgic_populate_lr(vcpu, irq, count++);
972+ *host_data_ptr(last_lr_irq) = irq;
967973 }
968974 }
969975
arch/loongarch/Kconfig+3−0
@@ -304,6 +304,9 @@ config AS_HAS_LBT_EXTENSION · 303 unmodified lines
304304 config AS_HAS_LVZ_EXTENSION
305305 def_bool $(as-instr,hvcl 0)
306306
307+config AS_HAS_SCQ_EXTENSION
308+ def_bool $(as-instr,sc.q \$t0$(comma)\$t1$(comma)\$t2)
309+
307310 config CC_HAS_ANNOTATE_TABLEJUMP
308311 def_bool $(cc-option,-mannotate-tablejump)
309312
arch/loongarch/include/asm/cmpxchg.h+5−0
@@ -238,6 +238,8 @@ __cmpxchg(volatile void *ptr, unsigned long old, unsigned long new, unsigned int · 237 unmodified lines
238238 arch_cmpxchg((ptr), (o), (n)); \
239239 })
240240
241+#ifdef CONFIG_AS_HAS_SCQ_EXTENSION
242+
241243 union __u128_halves {
242244 u128 full;
243245 struct {
@@ -290,6 +292,9 @@ union __u128_halves { · 46 unmodified lines
290292 BUILD_BUG_ON(sizeof(*(ptr)) != 16); \
291293 __arch_cmpxchg128(ptr, o, n, ""); \
292294 })
295+
296+#endif /* CONFIG_AS_HAS_SCQ_EXTENSION */
297+
293298 #else
294299 #include <asm-generic/cmpxchg-local.h>
295300 #define arch_cmpxchg64_local(ptr, o, n) __generic_cmpxchg64_local((ptr), (o), (n))
arch/loongarch/include/asm/uaccess.h+12−2
@@ -253,8 +253,13 @@ do { \ · 252 unmodified lines
253253 \
254254 __get_kernel_common(*((type *)(dst)), sizeof(type), \
255255 (__force type *)(src)); \
256− if (unlikely(__gu_err)) \
256+ if (unlikely(__gu_err)) { \
257+ pr_info("%s: memory access failed, ecode 0x%x\n", \
258+ __func__, read_csr_excode()); \
259+ pr_info("%s: the caller is %pS\n", \
260+ __func__, __builtin_return_address(0)); \
257261 goto err_label; \
262+ } \
258263 } while (0)
259264
260265 #define __put_kernel_nofault(dst, src, type, err_label) \
@@ -264,8 +269,13 @@ do { \ · 3 unmodified lines
264269 \
265270 __pu_val = *(__force type *)(src); \
266271 __put_kernel_common(((type *)(dst)), sizeof(type)); \
267− if (unlikely(__pu_err)) \
272+ if (unlikely(__pu_err)) { \
273+ pr_info("%s: memory access failed, ecode 0x%x\n", \
274+ __func__, read_csr_excode()); \
275+ pr_info("%s: the caller is %pS\n", \
276+ __func__, __builtin_return_address(0)); \
268277 goto err_label; \
278+ } \
269279 } while (0)
270280
271281 extern unsigned long __copy_user(void *to, const void *from, __kernel_size_t n);
arch/loongarch/kernel/inst.c+25−6
@@ -246,32 +246,51 @@ static int text_copy_cb(void *data) · 245 unmodified lines
246246
247247 if (smp_processor_id() == copy->cpu) {
248248 ret = copy_to_kernel_nofault(copy->dst, copy->src, copy->len);
249− if (ret)
249+ if (ret) {
250250 pr_err("%s: operation failed\n", __func__);
251+ return ret;
252+ }
251253 }
252254
253255 flush_icache_range((unsigned long)copy->dst, (unsigned long)copy->dst + copy->len);
254256
255− return ret;
257+ return 0;
256258 }
257259
258260 int larch_insn_text_copy(void *dst, void *src, size_t len)
259261 {
260262 int ret = 0;
263+ int err = 0;
261264 size_t start, end;
262265 struct insn_copy copy = {
263266 .dst = dst,
264267 .src = src,
265268 .len = len,
266− .cpu = smp_processor_id(),
269+ .cpu = raw_smp_processor_id(),
267270 };
268271
272+ /*
273+ * Ensure copy.cpu won't be hot removed before stop_machine.
274+ * If it is removed nobody will really update the text.
275+ */
276+ lockdep_assert_cpus_held();
277+
269278 start = round_down((size_t)dst, PAGE_SIZE);
270279 end = round_up((size_t)dst + len, PAGE_SIZE);
271280
272− set_memory_rw(start, (end - start) / PAGE_SIZE);
273− ret = stop_machine(text_copy_cb, &copy, cpu_online_mask);
274− set_memory_rox(start, (end - start) / PAGE_SIZE);
281+ err = set_memory_rw(start, (end - start) / PAGE_SIZE);
282+ if (err) {
283+ pr_info("%s: set_memory_rw() failed\n", __func__);
284+ return err;
285+ }
286+
287+ ret = stop_machine_cpuslocked(text_copy_cb, &copy, cpu_online_mask);
288+
289+ err = set_memory_rox(start, (end - start) / PAGE_SIZE);
290+ if (err) {
291+ pr_info("%s: set_memory_rox() failed\n", __func__);
292+ return err;
293+ }
275294
276295 return ret;
277296 }
arch/loongarch/kvm/vcpu.c+1−1
@@ -14,7 +14,7 @@ · 13 unmodified lines
1414 #define CREATE_TRACE_POINTS
1515 #include "trace.h"
1616
17−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
17+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
1818 KVM_GENERIC_VCPU_STATS(),
1919 STATS_DESC_COUNTER(VCPU, int_exits),
2020 STATS_DESC_COUNTER(VCPU, idle_exits),
arch/loongarch/kvm/vm.c+3−3
@@ -10,7 +10,7 @@ · 9 unmodified lines
1010 #include <asm/kvm_eiointc.h>
1111 #include <asm/kvm_pch_pic.h>
1212
13−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
13+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
1414 KVM_GENERIC_VM_STATS(),
1515 STATS_DESC_ICOUNTER(VM, pages),
1616 STATS_DESC_ICOUNTER(VM, hugepages),
@@ -49,8 +49,8 @@ static void kvm_vm_init_features(struct kvm *kvm) · 32 unmodified lines
4949 kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_PMU);
5050
5151 /* Enable all PV features by default */
52− kvm->arch.pv_features = BIT(KVM_FEATURE_IPI);
53− kvm->arch.kvm_features = BIT(KVM_LOONGARCH_VM_FEAT_PV_IPI);
52+ kvm->arch.pv_features |= BIT(KVM_FEATURE_IPI);
53+ kvm->arch.kvm_features |= BIT(KVM_LOONGARCH_VM_FEAT_PV_IPI);
5454 if (kvm_pvtime_supported()) {
5555 kvm->arch.pv_features |= BIT(KVM_FEATURE_PREEMPT);
5656 kvm->arch.pv_features |= BIT(KVM_FEATURE_STEAL_TIME);
arch/loongarch/net/bpf_jit.c+11−0
@@ -1379,9 +1379,11 @@ void *bpf_arch_text_copy(void *dst, void *src, size_t len) · 1378 unmodified lines
13791379 {
13801380 int ret;
13811381
1382+ cpus_read_lock();
13821383 mutex_lock(&text_mutex);
13831384 ret = larch_insn_text_copy(dst, src, len);
13841385 mutex_unlock(&text_mutex);
1386+ cpus_read_unlock();
13851387
13861388 return ret ? ERR_PTR(-EINVAL) : dst;
13871389 }
@@ -1429,10 +1431,12 @@ int bpf_arch_text_poke(void *ip, enum bpf_text_poke_type old_t, · 41 unmodified lines
14291431 if (ret)
14301432 return ret;
14311433
1434+ cpus_read_lock();
14321435 mutex_lock(&text_mutex);
14331436 if (memcmp(ip, new_insns, LOONGARCH_LONG_JUMP_NBYTES))
14341437 ret = larch_insn_text_copy(ip, new_insns, LOONGARCH_LONG_JUMP_NBYTES);
14351438 mutex_unlock(&text_mutex);
1439+ cpus_read_unlock();
14361440
14371441 return ret;
14381442 }
@@ -1450,10 +1454,12 @@ int bpf_arch_text_invalidate(void *dst, size_t len) · 11 unmodified lines
14501454 for (i = 0; i < (len / sizeof(u32)); i++)
14511455 inst[i] = INSN_BREAK;
14521456
1457+ cpus_read_lock();
14531458 mutex_lock(&text_mutex);
14541459 if (larch_insn_text_copy(dst, inst, len))
14551460 ret = -EINVAL;
14561461 mutex_unlock(&text_mutex);
1462+ cpus_read_unlock();
14571463
14581464 kvfree(inst);
14591465
@@ -1568,6 +1574,11 @@ void arch_free_bpf_trampoline(void *image, unsigned int size) · 108 unmodified lines
15681574 bpf_prog_pack_free(image, size);
15691575 }
15701576
1577+int arch_protect_bpf_trampoline(void *image, unsigned int size)
1578+{
1579+ return 0;
1580+}
1581+
15711582 /*
15721583 * Sign-extend the register if necessary
15731584 */
arch/mips/kvm/mips.c+2−2
@@ -38,7 +38,7 @@ · 37 unmodified lines
3838 #define VECTORSPACING 0x100 /* for EI/VI mode */
3939 #endif
4040
41−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
41+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
4242 KVM_GENERIC_VM_STATS()
4343 };
4444
@@ -51,7 +51,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 6 unmodified lines
5151 sizeof(kvm_vm_stats_desc),
5252 };
5353
54−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
54+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
5555 KVM_GENERIC_VCPU_STATS(),
5656 STATS_DESC_COUNTER(VCPU, wait_exits),
5757 STATS_DESC_COUNTER(VCPU, cache_exits),
arch/powerpc/include/asm/uaccess.h+45−20
@@ -15,6 +15,9 @@ · 14 unmodified lines
1515 #define TASK_SIZE_MAX TASK_SIZE_USER64
1616 #endif
1717
18+/* Threshold above which VMX copy path is used */
19+#define VMX_COPY_THRESHOLD 3328
20+
1821 #include <asm-generic/access_ok.h>
1922
2023 /*
@@ -326,40 +329,62 @@ do { \ · 305 unmodified lines
326329 extern unsigned long __copy_tofrom_user(void __user *to,
327330 const void __user *from, unsigned long size);
328331
329−#ifdef __powerpc64__
330−static inline unsigned long
331−raw_copy_in_user(void __user *to, const void __user *from, unsigned long n)
332+unsigned long __copy_tofrom_user_base(void __user *to,
333+ const void __user *from, unsigned long size);
334+
335+unsigned long __copy_tofrom_user_power7_vmx(void __user *to,
336+ const void __user *from, unsigned long size);
337+
338+static __always_inline bool will_use_vmx(unsigned long n)
339+{
340+ return IS_ENABLED(CONFIG_ALTIVEC) && cpu_has_feature(CPU_FTR_VMX_COPY) &&
341+ n > VMX_COPY_THRESHOLD;
342+}
343+
344+static __always_inline unsigned long
345+raw_copy_tofrom_user(void __user *to, const void __user *from,
346+ unsigned long n, unsigned long dir)
332347 {
333348 unsigned long ret;
334349
335− barrier_nospec();
336− allow_user_access(to, KUAP_READ_WRITE);
350+ if (will_use_vmx(n) && enter_vmx_usercopy()) {
351+ allow_user_access(to, dir);
352+ ret = __copy_tofrom_user_power7_vmx(to, from, n);
353+ prevent_user_access(dir);
354+ exit_vmx_usercopy();
355+
356+ if (unlikely(ret)) {
357+ allow_user_access(to, dir);
358+ ret = __copy_tofrom_user_base(to, from, n);
359+ prevent_user_access(dir);
360+ }
361+ return ret;
362+ }
363+
364+ allow_user_access(to, dir);
337365 ret = __copy_tofrom_user(to, from, n);
338− prevent_user_access(KUAP_READ_WRITE);
366+ prevent_user_access(dir);
339367 return ret;
340368 }
341−#endif /* __powerpc64__ */
342369
343−static inline unsigned long raw_copy_from_user(void *to,
344− const void __user *from, unsigned long n)
370+#ifdef CONFIG_PPC64
371+static inline unsigned long
372+raw_copy_in_user(void __user *to, const void __user *from, unsigned long n)
345373 {
346− unsigned long ret;
374+ barrier_nospec();
375+ return raw_copy_tofrom_user(to, from, n, KUAP_READ_WRITE);
376+}
377+#endif /* CONFIG_PPC64 */
347378
348− allow_user_access(NULL, KUAP_READ);
349− ret = __copy_tofrom_user((__force void __user *)to, from, n);
350− prevent_user_access(KUAP_READ);
351− return ret;
379+static inline unsigned long raw_copy_from_user(void *to, const void __user *from, unsigned long n)
380+{
381+ return raw_copy_tofrom_user((__force void __user *)to, from, n, KUAP_READ);
352382 }
353383
354384 static inline unsigned long
355385 raw_copy_to_user(void __user *to, const void *from, unsigned long n)
356386 {
357− unsigned long ret;
358−
359− allow_user_access(to, KUAP_WRITE);
360− ret = __copy_tofrom_user(to, (__force const void __user *)from, n);
361− prevent_user_access(KUAP_WRITE);
362− return ret;
387+ return raw_copy_tofrom_user(to, (__force const void __user *)from, n, KUAP_WRITE);
363388 }
364389
365390 unsigned long __arch_clear_user(void __user *addr, unsigned long size);
arch/powerpc/kernel/iommu.c+1−1
@@ -1159,7 +1159,7 @@ spapr_tce_platform_iommu_attach_dev(struct iommu_domain *platform_domain, · 1158 unmodified lines
11591159 struct device *dev,
11601160 struct iommu_domain *old)
11611161 {
1162− struct iommu_domain *domain = iommu_get_domain_for_dev(dev);
1162+ struct iommu_domain *domain = iommu_driver_get_domain_for_dev(dev);
11631163 struct iommu_table_group *table_group;
11641164 struct iommu_group *grp;
11651165
arch/powerpc/kernel/setup-common.c+0−10
@@ -35,7 +35,6 @@ · 34 unmodified lines
3535 #include <linux/of_irq.h>
3636 #include <linux/hugetlb.h>
3737 #include <linux/pgtable.h>
38−#include <asm/kexec.h>
3938 #include <asm/io.h>
4039 #include <asm/paca.h>
4140 #include <asm/processor.h>
@@ -995,15 +994,6 @@ void __init setup_arch(char **cmdline_p) · 953 unmodified lines
995994
996995 initmem_init();
997996
998− /*
999− * Reserve large chunks of memory for use by CMA for kdump, fadump, KVM and
1000− * hugetlb. These must be called after initmem_init(), so that
1001− * pageblock_order is initialised.
1002− */
1003− fadump_cma_init();
1004− kdump_cma_reserve();
1005− kvm_cma_reserve();
1006−
1007997 early_memtest(min_low_pfn << PAGE_SHIFT, max_low_pfn << PAGE_SHIFT);
1008998
1009999 if (ppc_md.setup_arch)
arch/powerpc/kvm/book3s.c+2−2
@@ -38,7 +38,7 @@ · 37 unmodified lines
3838
3939 /* #define EXIT_DEBUG */
4040
41−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
41+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
4242 KVM_GENERIC_VM_STATS(),
4343 STATS_DESC_ICOUNTER(VM, num_2M_pages),
4444 STATS_DESC_ICOUNTER(VM, num_1G_pages)
@@ -53,7 +53,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 8 unmodified lines
5353 sizeof(kvm_vm_stats_desc),
5454 };
5555
56−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
56+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
5757 KVM_GENERIC_VCPU_STATS(),
5858 STATS_DESC_COUNTER(VCPU, sum_exits),
5959 STATS_DESC_COUNTER(VCPU, mmio_exits),
arch/powerpc/kvm/booke.c+2−2
@@ -36,7 +36,7 @@ · 35 unmodified lines
3636
3737 unsigned long kvmppc_booke_handlers;
3838
39−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
39+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
4040 KVM_GENERIC_VM_STATS(),
4141 STATS_DESC_ICOUNTER(VM, num_2M_pages),
4242 STATS_DESC_ICOUNTER(VM, num_1G_pages)
@@ -51,7 +51,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 8 unmodified lines
5151 sizeof(kvm_vm_stats_desc),
5252 };
5353
54−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
54+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
5555 KVM_GENERIC_VCPU_STATS(),
5656 STATS_DESC_COUNTER(VCPU, sum_exits),
5757 STATS_DESC_COUNTER(VCPU, mmio_exits),
arch/powerpc/kvm/e500.h+1−5
@@ -39,15 +39,11 @@ enum vcpu_ftr { · 38 unmodified lines
3939 /* bits [6-5] MAS2_X1 and MAS2_X0 and [4-0] bits for WIMGE */
4040 #define E500_TLB_MAS2_ATTR (0x7f)
4141
42−struct tlbe_ref {
42+struct tlbe_priv {
4343 kvm_pfn_t pfn; /* valid only for TLB0, except briefly */
4444 unsigned int flags; /* E500_TLB_* */
4545 };
4646
47−struct tlbe_priv {
48− struct tlbe_ref ref;
49−};
50−
5147 #ifdef CONFIG_KVM_E500V2
5248 struct vcpu_id_table;
5349 #endif
arch/powerpc/kvm/e500_mmu.c+2−2
@@ -920,12 +920,12 @@ int kvmppc_e500_tlb_init(struct kvmppc_vcpu_e500 *vcpu_e500) · 919 unmodified lines
920920 vcpu_e500->gtlb_offset[0] = 0;
921921 vcpu_e500->gtlb_offset[1] = KVM_E500_TLB0_SIZE;
922922
923− vcpu_e500->gtlb_priv[0] = kzalloc_objs(struct tlbe_ref,
923+ vcpu_e500->gtlb_priv[0] = kzalloc_objs(struct tlbe_priv,
924924 vcpu_e500->gtlb_params[0].entries);
925925 if (!vcpu_e500->gtlb_priv[0])
926926 goto free_vcpu;
927927
928− vcpu_e500->gtlb_priv[1] = kzalloc_objs(struct tlbe_ref,
928+ vcpu_e500->gtlb_priv[1] = kzalloc_objs(struct tlbe_priv,
929929 vcpu_e500->gtlb_params[1].entries);
930930 if (!vcpu_e500->gtlb_priv[1])
931931 goto free_vcpu;
arch/powerpc/kvm/e500_mmu_host.c+44−47
@@ -189,16 +189,16 @@ void inval_gtlbe_on_host(struct kvmppc_vcpu_e500 *vcpu_e500, int tlbsel, · 188 unmodified lines
189189 {
190190 struct kvm_book3e_206_tlb_entry *gtlbe =
191191 get_entry(vcpu_e500, tlbsel, esel);
192− struct tlbe_ref *ref = &vcpu_e500->gtlb_priv[tlbsel][esel].ref;
192+ struct tlbe_priv *tlbe = &vcpu_e500->gtlb_priv[tlbsel][esel];
193193
194194 /* Don't bother with unmapped entries */
195− if (!(ref->flags & E500_TLB_VALID)) {
196− WARN(ref->flags & (E500_TLB_BITMAP | E500_TLB_TLB0),
197− "%s: flags %x\n", __func__, ref->flags);
195+ if (!(tlbe->flags & E500_TLB_VALID)) {
196+ WARN(tlbe->flags & (E500_TLB_BITMAP | E500_TLB_TLB0),
197+ "%s: flags %x\n", __func__, tlbe->flags);
198198 WARN_ON(tlbsel == 1 && vcpu_e500->g2h_tlb1_map[esel]);
199199 }
200200
201− if (tlbsel == 1 && ref->flags & E500_TLB_BITMAP) {
201+ if (tlbsel == 1 && tlbe->flags & E500_TLB_BITMAP) {
202202 u64 tmp = vcpu_e500->g2h_tlb1_map[esel];
203203 int hw_tlb_indx;
204204 unsigned long flags;
@@ -216,28 +216,28 @@ void inval_gtlbe_on_host(struct kvmppc_vcpu_e500 *vcpu_e500, int tlbsel, · 11 unmodified lines
216216 }
217217 mb();
218218 vcpu_e500->g2h_tlb1_map[esel] = 0;
219− ref->flags &= ~(E500_TLB_BITMAP | E500_TLB_VALID);
219+ tlbe->flags &= ~(E500_TLB_BITMAP | E500_TLB_VALID);
220220 local_irq_restore(flags);
221221 }
222222
223− if (tlbsel == 1 && ref->flags & E500_TLB_TLB0) {
223+ if (tlbsel == 1 && tlbe->flags & E500_TLB_TLB0) {
224224 /*
225225 * TLB1 entry is backed by 4k pages. This should happen
226226 * rarely and is not worth optimizing. Invalidate everything.
227227 */
228228 kvmppc_e500_tlbil_all(vcpu_e500);
229− ref->flags &= ~(E500_TLB_TLB0 | E500_TLB_VALID);
229+ tlbe->flags &= ~(E500_TLB_TLB0 | E500_TLB_VALID);
230230 }
231231
232232 /*
233233 * If TLB entry is still valid then it's a TLB0 entry, and thus
234234 * backed by at most one host tlbe per shadow pid
235235 */
236− if (ref->flags & E500_TLB_VALID)
236+ if (tlbe->flags & E500_TLB_VALID)
237237 kvmppc_e500_tlbil_one(vcpu_e500, gtlbe);
238238
239239 /* Mark the TLB as not backed by the host anymore */
240− ref->flags = 0;
240+ tlbe->flags = 0;
241241 }
242242
243243 static inline int tlbe_is_writable(struct kvm_book3e_206_tlb_entry *tlbe)
@@ -245,26 +245,26 @@ static inline int tlbe_is_writable(struct kvm_book3e_206_tlb_entry *tlbe) · 1 unmodified line
245245 return tlbe->mas7_3 & (MAS3_SW|MAS3_UW);
246246 }
247247
248−static inline void kvmppc_e500_ref_setup(struct tlbe_ref *ref,
249− struct kvm_book3e_206_tlb_entry *gtlbe,
250− kvm_pfn_t pfn, unsigned int wimg,
251− bool writable)
248+static inline void kvmppc_e500_tlbe_setup(struct tlbe_priv *tlbe,
249+ struct kvm_book3e_206_tlb_entry *gtlbe,
250+ kvm_pfn_t pfn, unsigned int wimg,
251+ bool writable)
252252 {
253− ref->pfn = pfn;
254− ref->flags = E500_TLB_VALID;
253+ tlbe->pfn = pfn;
254+ tlbe->flags = E500_TLB_VALID;
255255 if (writable)
256− ref->flags |= E500_TLB_WRITABLE;
256+ tlbe->flags |= E500_TLB_WRITABLE;
257257
258258 /* Use guest supplied MAS2_G and MAS2_E */
259− ref->flags |= (gtlbe->mas2 & MAS2_ATTRIB_MASK) | wimg;
259+ tlbe->flags |= (gtlbe->mas2 & MAS2_ATTRIB_MASK) | wimg;
260260 }
261261
262−static inline void kvmppc_e500_ref_release(struct tlbe_ref *ref)
262+static inline void kvmppc_e500_tlbe_release(struct tlbe_priv *tlbe)
263263 {
264− if (ref->flags & E500_TLB_VALID) {
264+ if (tlbe->flags & E500_TLB_VALID) {
265265 /* FIXME: don't log bogus pfn for TLB1 */
266− trace_kvm_booke206_ref_release(ref->pfn, ref->flags);
267− ref->flags = 0;
266+ trace_kvm_booke206_ref_release(tlbe->pfn, tlbe->flags);
267+ tlbe->flags = 0;
268268 }
269269 }
270270
@@ -284,11 +284,8 @@ static void clear_tlb_privs(struct kvmppc_vcpu_e500 *vcpu_e500) · 13 unmodified lines
284284 int i;
285285
286286 for (tlbsel = 0; tlbsel <= 1; tlbsel++) {
287− for (i = 0; i < vcpu_e500->gtlb_params[tlbsel].entries; i++) {
288− struct tlbe_ref *ref =
289− &vcpu_e500->gtlb_priv[tlbsel][i].ref;
290− kvmppc_e500_ref_release(ref);
291− }
287+ for (i = 0; i < vcpu_e500->gtlb_params[tlbsel].entries; i++)
288+ kvmppc_e500_tlbe_release(&vcpu_e500->gtlb_priv[tlbsel][i]);
292289 }
293290 }
294291
@@ -304,18 +301,18 @@ void kvmppc_core_flush_tlb(struct kvm_vcpu *vcpu) · 9 unmodified lines
304301 static void kvmppc_e500_setup_stlbe(
305302 struct kvm_vcpu *vcpu,
306303 struct kvm_book3e_206_tlb_entry *gtlbe,
307− int tsize, struct tlbe_ref *ref, u64 gvaddr,
304+ int tsize, struct tlbe_priv *tlbe, u64 gvaddr,
308305 struct kvm_book3e_206_tlb_entry *stlbe)
309306 {
310− kvm_pfn_t pfn = ref->pfn;
307+ kvm_pfn_t pfn = tlbe->pfn;
311308 u32 pr = vcpu->arch.shared->msr & MSR_PR;
312− bool writable = !!(ref->flags & E500_TLB_WRITABLE);
309+ bool writable = !!(tlbe->flags & E500_TLB_WRITABLE);
313310
314− BUG_ON(!(ref->flags & E500_TLB_VALID));
311+ BUG_ON(!(tlbe->flags & E500_TLB_VALID));
315312
316313 /* Force IPROT=0 for all guest mappings. */
317314 stlbe->mas1 = MAS1_TSIZE(tsize) | get_tlb_sts(gtlbe) | MAS1_VALID;
318− stlbe->mas2 = (gvaddr & MAS2_EPN) | (ref->flags & E500_TLB_MAS2_ATTR);
315+ stlbe->mas2 = (gvaddr & MAS2_EPN) | (tlbe->flags & E500_TLB_MAS2_ATTR);
319316 stlbe->mas7_3 = ((u64)pfn << PAGE_SHIFT) |
320317 e500_shadow_mas3_attrib(gtlbe->mas7_3, writable, pr);
321318 }
@@ -323,7 +320,7 @@ static void kvmppc_e500_setup_stlbe( · 1 unmodified line
323320 static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500,
324321 u64 gvaddr, gfn_t gfn, struct kvm_book3e_206_tlb_entry *gtlbe,
325322 int tlbsel, struct kvm_book3e_206_tlb_entry *stlbe,
326− struct tlbe_ref *ref)
323+ struct tlbe_priv *tlbe)
327324 {
328325 struct kvm_memory_slot *slot;
329326 unsigned int psize;
@@ -455,9 +452,9 @@ static inline int kvmppc_e500_shadow_map(struct kvmppc_vcpu_e500 *vcpu_e500, · 125 unmodified lines
455452 }
456453 }
457454
458− kvmppc_e500_ref_setup(ref, gtlbe, pfn, wimg, writable);
455+ kvmppc_e500_tlbe_setup(tlbe, gtlbe, pfn, wimg, writable);
459456 kvmppc_e500_setup_stlbe(&vcpu_e500->vcpu, gtlbe, tsize,
460− ref, gvaddr, stlbe);
457+ tlbe, gvaddr, stlbe);
461458 writable = tlbe_is_writable(stlbe);
462459
463460 /* Clear i-cache for new pages */
@@ -474,17 +471,17 @@ static int kvmppc_e500_tlb0_map(struct kvmppc_vcpu_e500 *vcpu_e500, int esel, · 10 unmodified lines
474471 struct kvm_book3e_206_tlb_entry *stlbe)
475472 {
476473 struct kvm_book3e_206_tlb_entry *gtlbe;
477− struct tlbe_ref *ref;
474+ struct tlbe_priv *tlbe;
478475 int stlbsel = 0;
479476 int sesel = 0;
480477 int r;
481478
482479 gtlbe = get_entry(vcpu_e500, 0, esel);
483− ref = &vcpu_e500->gtlb_priv[0][esel].ref;
480+ tlbe = &vcpu_e500->gtlb_priv[0][esel];
484481
485482 r = kvmppc_e500_shadow_map(vcpu_e500, get_tlb_eaddr(gtlbe),
486483 get_tlb_raddr(gtlbe) >> PAGE_SHIFT,
487− gtlbe, 0, stlbe, ref);
484+ gtlbe, 0, stlbe, tlbe);
488485 if (r)
489486 return r;
490487
@@ -494,7 +491,7 @@ static int kvmppc_e500_tlb0_map(struct kvmppc_vcpu_e500 *vcpu_e500, int esel, · 3 unmodified lines
494491 }
495492
496493 static int kvmppc_e500_tlb1_map_tlb1(struct kvmppc_vcpu_e500 *vcpu_e500,
497− struct tlbe_ref *ref,
494+ struct tlbe_priv *tlbe,
498495 int esel)
499496 {
500497 unsigned int sesel = vcpu_e500->host_tlb1_nv++;
@@ -507,10 +504,10 @@ static int kvmppc_e500_tlb1_map_tlb1(struct kvmppc_vcpu_e500 *vcpu_e500, · 6 unmodified lines
507504 vcpu_e500->g2h_tlb1_map[idx] &= ~(1ULL << sesel);
508505 }
509506
510− vcpu_e500->gtlb_priv[1][esel].ref.flags |= E500_TLB_BITMAP;
507+ vcpu_e500->gtlb_priv[1][esel].flags |= E500_TLB_BITMAP;
511508 vcpu_e500->g2h_tlb1_map[esel] |= (u64)1 << sesel;
512509 vcpu_e500->h2g_tlb1_rmap[sesel] = esel + 1;
513− WARN_ON(!(ref->flags & E500_TLB_VALID));
510+ WARN_ON(!(tlbe->flags & E500_TLB_VALID));
514511
515512 return sesel;
516513 }
@@ -522,24 +519,24 @@ static int kvmppc_e500_tlb1_map(struct kvmppc_vcpu_e500 *vcpu_e500, · 5 unmodified lines
522519 u64 gvaddr, gfn_t gfn, struct kvm_book3e_206_tlb_entry *gtlbe,
523520 struct kvm_book3e_206_tlb_entry *stlbe, int esel)
524521 {
525− struct tlbe_ref *ref = &vcpu_e500->gtlb_priv[1][esel].ref;
522+ struct tlbe_priv *tlbe = &vcpu_e500->gtlb_priv[1][esel];
526523 int sesel;
527524 int r;
528525
529526 r = kvmppc_e500_shadow_map(vcpu_e500, gvaddr, gfn, gtlbe, 1, stlbe,
530− ref);
527+ tlbe);
531528 if (r)
532529 return r;
533530
534531 /* Use TLB0 when we can only map a page with 4k */
535532 if (get_tlb_tsize(stlbe) == BOOK3E_PAGESZ_4K) {
536− vcpu_e500->gtlb_priv[1][esel].ref.flags |= E500_TLB_TLB0;
533+ vcpu_e500->gtlb_priv[1][esel].flags |= E500_TLB_TLB0;
537534 write_stlbe(vcpu_e500, gtlbe, stlbe, 0, 0);
538535 return 0;
539536 }
540537
541538 /* Otherwise map into TLB1 */
542− sesel = kvmppc_e500_tlb1_map_tlb1(vcpu_e500, ref, esel);
539+ sesel = kvmppc_e500_tlb1_map_tlb1(vcpu_e500, tlbe, esel);
543540 write_stlbe(vcpu_e500, gtlbe, stlbe, 1, sesel);
544541
545542 return 0;
@@ -561,11 +558,11 @@ void kvmppc_mmu_map(struct kvm_vcpu *vcpu, u64 eaddr, gpa_t gpaddr, · 15 unmodified lines
561558 priv = &vcpu_e500->gtlb_priv[tlbsel][esel];
562559
563560 /* Triggers after clear_tlb_privs or on initial mapping */
564− if (!(priv->ref.flags & E500_TLB_VALID)) {
561+ if (!(priv->flags & E500_TLB_VALID)) {
565562 kvmppc_e500_tlb0_map(vcpu_e500, esel, &stlbe);
566563 } else {
567564 kvmppc_e500_setup_stlbe(vcpu, gtlbe, BOOK3E_PAGESZ_4K,
568− &priv->ref, eaddr, &stlbe);
565+ priv, eaddr, &stlbe);
569566 write_stlbe(vcpu_e500, gtlbe, &stlbe, 0, 0);
570567 }
571568 break;
arch/powerpc/lib/copyuser_64.S+1−0
@@ -562,3 +562,4 @@ exc; std r10,32(3) · 561 unmodified lines
562562 li r5,4096
563563 b .Ldst_aligned
564564 EXPORT_SYMBOL(__copy_tofrom_user)
565+EXPORT_SYMBOL(__copy_tofrom_user_base)
arch/powerpc/lib/copyuser_power7.S+15−30
@@ -5,13 +5,9 @@ · 4 unmodified lines
55 *
66 * Author: Anton Blanchard <anton@au.ibm.com>
77 */
8+#include <linux/export.h>
89 #include <asm/ppc_asm.h>
910
10−#ifndef SELFTEST_CASE
11−/* 0 == don't use VMX, 1 == use VMX */
12−#define SELFTEST_CASE 0
13−#endif
14−
1511 #ifdef __BIG_ENDIAN__
1612 #define LVS(VRT,RA,RB) lvsl VRT,RA,RB
1713 #define VPERM(VRT,VRA,VRB,VRC) vperm VRT,VRA,VRB,VRC
@@ -47,10 +43,14 @@ · 29 unmodified lines
4743 ld r15,STK_REG(R15)(r1)
4844 ld r14,STK_REG(R14)(r1)
4945 .Ldo_err3:
50− bl CFUNC(exit_vmx_usercopy)
46+ ld r6,STK_REG(R31)(r1) /* original destination pointer */
47+ ld r5,STK_REG(R29)(r1) /* original number of bytes */
48+ subf r7,r6,r3 /* #bytes copied */
49+ subf r3,r7,r5 /* #bytes not copied in r3 */
5150 ld r0,STACKFRAMESIZE+16(r1)
5251 mtlr r0
53− b .Lexit
52+ addi r1,r1,STACKFRAMESIZE
53+ blr
5454 #endif /* CONFIG_ALTIVEC */
5555
5656 .Ldo_err2:
@@ -74,7 +74,6 @@ · 17 unmodified lines
7474
7575 _GLOBAL(__copy_tofrom_user_power7)
7676 cmpldi r5,16
77− cmpldi cr1,r5,3328
7877
7978 std r3,-STACKFRAMESIZE+STK_REG(R31)(r1)
8079 std r4,-STACKFRAMESIZE+STK_REG(R30)(r1)
@@ -82,12 +81,6 @@ _GLOBAL(__copy_tofrom_user_power7) · 1 unmodified line
8281
8382 blt .Lshort_copy
8483
85−#ifdef CONFIG_ALTIVEC
86−test_feature = SELFTEST_CASE
87−BEGIN_FTR_SECTION
88− bgt cr1,.Lvmx_copy
89−END_FTR_SECTION_IFSET(CPU_FTR_ALTIVEC)
90−#endif
9184
9285 .Lnonvmx_copy:
9386 /* Get the source 8B aligned */
@@ -263,23 +256,14 @@ err1; stb r0,0(r3) · 169 unmodified lines
263256 15: li r3,0
264257 blr
265258
266−.Lunwind_stack_nonvmx_copy:
267− addi r1,r1,STACKFRAMESIZE
268− b .Lnonvmx_copy
269−
270−.Lvmx_copy:
271259 #ifdef CONFIG_ALTIVEC
260+_GLOBAL(__copy_tofrom_user_power7_vmx)
272261 mflr r0
273262 std r0,16(r1)
274263 stdu r1,-STACKFRAMESIZE(r1)
275− bl CFUNC(enter_vmx_usercopy)
276− cmpwi cr1,r3,0
277− ld r0,STACKFRAMESIZE+16(r1)
278− ld r3,STK_REG(R31)(r1)
279− ld r4,STK_REG(R30)(r1)
280− ld r5,STK_REG(R29)(r1)
281− mtlr r0
282264
265+ std r3,STK_REG(R31)(r1)
266+ std r5,STK_REG(R29)(r1)
283267 /*
284268 * We prefetch both the source and destination using enhanced touch
285269 * instructions. We use a stream ID of 0 for the load side and
@@ -300,8 +284,6 @@ err1; stb r0,0(r3) · 14 unmodified lines
300284
301285 DCBT_SETUP_STREAMS(r6, r7, r9, r10, r8)
302286
303− beq cr1,.Lunwind_stack_nonvmx_copy
304−
305287 /*
306288 * If source and destination are not relatively aligned we use a
307289 * slower permute loop.
@@ -478,7 +460,8 @@ err3; lbz r0,0(r4) · 170 unmodified lines
478460 err3; stb r0,0(r3)
479461
480462 15: addi r1,r1,STACKFRAMESIZE
481− b CFUNC(exit_vmx_usercopy) /* tail call optimise */
463+ li r3,0
464+ blr
482465
483466 .Lvmx_unaligned_copy:
484467 /* Get the destination 16B aligned */
@@ -681,5 +664,7 @@ err3; lbz r0,0(r4) · 196 unmodified lines
681664 err3; stb r0,0(r3)
682665
683666 15: addi r1,r1,STACKFRAMESIZE
684− b CFUNC(exit_vmx_usercopy) /* tail call optimise */
667+ li r3,0
668+ blr
669+EXPORT_SYMBOL(__copy_tofrom_user_power7_vmx)
685670 #endif /* CONFIG_ALTIVEC */
arch/powerpc/lib/vmx-helper.c+2−0
@@ -27,6 +27,7 @@ int enter_vmx_usercopy(void) · 26 unmodified lines
2727
2828 return 1;
2929 }
30+EXPORT_SYMBOL(enter_vmx_usercopy);
3031
3132 /*
3233 * This function must return 0 because we tail call optimise when calling
@@ -49,6 +50,7 @@ int exit_vmx_usercopy(void) · 16 unmodified lines
4950 set_dec(1);
5051 return 0;
5152 }
53+EXPORT_SYMBOL(exit_vmx_usercopy);
5254
5355 int enter_vmx_ops(void)
5456 {
arch/powerpc/mm/mem.c+14−0
@@ -30,6 +30,10 @@ · 29 unmodified lines
3030 #include <asm/setup.h>
3131 #include <asm/fixmap.h>
3232
33+#include <asm/fadump.h>
34+#include <asm/kexec.h>
35+#include <asm/kvm_ppc.h>
36+
3337 #include <mm/mmu_decl.h>
3438
3539 unsigned long long memory_limit __initdata;
@@ -268,6 +272,16 @@ void __init paging_init(void) · 232 unmodified lines
268272
269273 void __init arch_mm_preinit(void)
270274 {
275+
276+ /*
277+ * Reserve large chunks of memory for use by CMA for kdump, fadump, KVM
278+ * and hugetlb. These must be called after pageblock_order is
279+ * initialised.
280+ */
281+ fadump_cma_init();
282+ kdump_cma_reserve();
283+ kvm_cma_reserve();
284+
271285 /*
272286 * book3s is limited to 16 page sizes due to encoding this in
273287 * a 4-bit field for slices.
arch/powerpc/perf/callchain.c+5−0
@@ -103,6 +103,11 @@ perf_callchain_kernel(struct perf_callchain_entry_ctx *entry, struct pt_regs *re · 102 unmodified lines
103103 void
104104 perf_callchain_user(struct perf_callchain_entry_ctx *entry, struct pt_regs *regs)
105105 {
106+ perf_callchain_store(entry, perf_arch_instruction_pointer(regs));
107+
108+ if (!current->mm)
109+ return;
110+
106111 if (!is_32bit_task())
107112 perf_callchain_user_64(entry, regs);
108113 else
arch/powerpc/perf/callchain_32.c+0−1
@@ -142,7 +142,6 @@ void perf_callchain_user_32(struct perf_callchain_entry_ctx *entry, · 141 unmodified lines
142142 next_ip = perf_arch_instruction_pointer(regs);
143143 lr = regs->link;
144144 sp = regs->gpr[1];
145− perf_callchain_store(entry, next_ip);
146145
147146 while (entry->nr < entry->max_stack) {
148147 fp = (unsigned int __user *) (unsigned long) sp;
arch/powerpc/perf/callchain_64.c+0−1
@@ -77,7 +77,6 @@ void perf_callchain_user_64(struct perf_callchain_entry_ctx *entry, · 76 unmodified lines
7777 next_ip = perf_arch_instruction_pointer(regs);
7878 lr = regs->link;
7979 sp = regs->gpr[1];
80− perf_callchain_store(entry, next_ip);
8180
8281 while (entry->nr < entry->max_stack) {
8382 fp = (unsigned long __user *) sp;
arch/riscv/boot/dts/microchip/mpfs.dtsi+2−0
@@ -428,6 +428,7 @@ · 427 unmodified lines
428428 clocks = <&clkcfg CLK_CAN0>, <&clkcfg CLK_MSSPLL3>;
429429 interrupt-parent = <&plic>;
430430 interrupts = <56>;
431+ resets = <&mss_top_sysreg CLK_CAN0>;
431432 status = "disabled";
432433 };
433434
@@ -437,6 +438,7 @@ · 3 unmodified lines
437438 clocks = <&clkcfg CLK_CAN1>, <&clkcfg CLK_MSSPLL3>;
438439 interrupt-parent = <&plic>;
439440 interrupts = <57>;
441+ resets = <&mss_top_sysreg CLK_CAN1>;
440442 status = "disabled";
441443 };
442444
arch/riscv/kvm/aia.c+13−2
@@ -13,6 +13,7 @@ · 12 unmodified lines
1313 #include <linux/irqchip/riscv-imsic.h>
1414 #include <linux/irqdomain.h>
1515 #include <linux/kvm_host.h>
16+#include <linux/nospec.h>
1617 #include <linux/percpu.h>
1718 #include <linux/spinlock.h>
1819 #include <asm/cpufeature.h>
@@ -182,9 +183,14 @@ int kvm_riscv_vcpu_aia_get_csr(struct kvm_vcpu *vcpu, · 163 unmodified lines
182183 unsigned long *out_val)
183184 {
184185 struct kvm_vcpu_aia_csr *csr = &vcpu->arch.aia_context.guest_csr;
186+ unsigned long regs_max = sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
185187
186− if (reg_num >= sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long))
188+ if (!riscv_isa_extension_available(vcpu->arch.isa, SSAIA))
187189 return -ENOENT;
190+ if (reg_num >= regs_max)
191+ return -ENOENT;
192+
193+ reg_num = array_index_nospec(reg_num, regs_max);
188194
189195 *out_val = 0;
190196 if (kvm_riscv_aia_available())
@@ -198,9 +204,14 @@ int kvm_riscv_vcpu_aia_set_csr(struct kvm_vcpu *vcpu, · 7 unmodified lines
198204 unsigned long val)
199205 {
200206 struct kvm_vcpu_aia_csr *csr = &vcpu->arch.aia_context.guest_csr;
207+ unsigned long regs_max = sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long);
201208
202− if (reg_num >= sizeof(struct kvm_riscv_aia_csr) / sizeof(unsigned long))
209+ if (!riscv_isa_extension_available(vcpu->arch.isa, SSAIA))
203210 return -ENOENT;
211+ if (reg_num >= regs_max)
212+ return -ENOENT;
213+
214+ reg_num = array_index_nospec(reg_num, regs_max);
204215
205216 if (kvm_riscv_aia_available()) {
206217 ((unsigned long *)csr)[reg_num] = val;
arch/riscv/kvm/aia_aplic.c+12−11
@@ -10,6 +10,7 @@ · 9 unmodified lines
1010 #include <linux/irqchip/riscv-aplic.h>
1111 #include <linux/kvm_host.h>
1212 #include <linux/math.h>
13+#include <linux/nospec.h>
1314 #include <linux/spinlock.h>
1415 #include <linux/swab.h>
1516 #include <kvm/iodev.h>
@@ -45,7 +46,7 @@ static u32 aplic_read_sourcecfg(struct aplic *aplic, u32 irq) · 29 unmodified lines
4546
4647 if (!irq || aplic->nr_irqs <= irq)
4748 return 0;
48− irqd = &aplic->irqs[irq];
49+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
4950
5051 raw_spin_lock_irqsave(&irqd->lock, flags);
5152 ret = irqd->sourcecfg;
@@ -61,7 +62,7 @@ static void aplic_write_sourcecfg(struct aplic *aplic, u32 irq, u32 val) · 9 unmodified lines
6162
6263 if (!irq || aplic->nr_irqs <= irq)
6364 return;
64− irqd = &aplic->irqs[irq];
65+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
6566
6667 if (val & APLIC_SOURCECFG_D)
6768 val = 0;
@@ -81,7 +82,7 @@ static u32 aplic_read_target(struct aplic *aplic, u32 irq) · 13 unmodified lines
8182
8283 if (!irq || aplic->nr_irqs <= irq)
8384 return 0;
84− irqd = &aplic->irqs[irq];
85+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
8586
8687 raw_spin_lock_irqsave(&irqd->lock, flags);
8788 ret = irqd->target;
@@ -97,7 +98,7 @@ static void aplic_write_target(struct aplic *aplic, u32 irq, u32 val) · 9 unmodified lines
9798
9899 if (!irq || aplic->nr_irqs <= irq)
99100 return;
100− irqd = &aplic->irqs[irq];
101+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
101102
102103 val &= APLIC_TARGET_EIID_MASK |
103104 (APLIC_TARGET_HART_IDX_MASK << APLIC_TARGET_HART_IDX_SHIFT) |
@@ -116,7 +117,7 @@ static bool aplic_read_pending(struct aplic *aplic, u32 irq) · 12 unmodified lines
116117
117118 if (!irq || aplic->nr_irqs <= irq)
118119 return false;
119− irqd = &aplic->irqs[irq];
120+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
120121
121122 raw_spin_lock_irqsave(&irqd->lock, flags);
122123 ret = (irqd->state & APLIC_IRQ_STATE_PENDING) ? true : false;
@@ -132,7 +133,7 @@ static void aplic_write_pending(struct aplic *aplic, u32 irq, bool pending) · 9 unmodified lines
132133
133134 if (!irq || aplic->nr_irqs <= irq)
134135 return;
135− irqd = &aplic->irqs[irq];
136+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
136137
137138 raw_spin_lock_irqsave(&irqd->lock, flags);
138139
@@ -170,7 +171,7 @@ static bool aplic_read_enabled(struct aplic *aplic, u32 irq) · 31 unmodified lines
170171
171172 if (!irq || aplic->nr_irqs <= irq)
172173 return false;
173− irqd = &aplic->irqs[irq];
174+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
174175
175176 raw_spin_lock_irqsave(&irqd->lock, flags);
176177 ret = (irqd->state & APLIC_IRQ_STATE_ENABLED) ? true : false;
@@ -186,7 +187,7 @@ static void aplic_write_enabled(struct aplic *aplic, u32 irq, bool enabled) · 9 unmodified lines
186187
187188 if (!irq || aplic->nr_irqs <= irq)
188189 return;
189− irqd = &aplic->irqs[irq];
190+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
190191
191192 raw_spin_lock_irqsave(&irqd->lock, flags);
192193 if (enabled)
@@ -205,7 +206,7 @@ static bool aplic_read_input(struct aplic *aplic, u32 irq) · 12 unmodified lines
205206
206207 if (!irq || aplic->nr_irqs <= irq)
207208 return false;
208− irqd = &aplic->irqs[irq];
209+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
209210
210211 raw_spin_lock_irqsave(&irqd->lock, flags);
211212
@@ -254,7 +255,7 @@ static void aplic_update_irq_range(struct kvm *kvm, u32 first, u32 last) · 42 unmodified lines
254255 for (irq = first; irq <= last; irq++) {
255256 if (!irq || aplic->nr_irqs <= irq)
256257 continue;
257− irqd = &aplic->irqs[irq];
258+ irqd = &aplic->irqs[array_index_nospec(irq, aplic->nr_irqs)];
258259
259260 raw_spin_lock_irqsave(&irqd->lock, flags);
260261
@@ -283,7 +284,7 @@ int kvm_riscv_aia_aplic_inject(struct kvm *kvm, u32 source, bool level) · 22 unmodified lines
283284
284285 if (!aplic || !source || (aplic->nr_irqs <= source))
285286 return -ENODEV;
286− irqd = &aplic->irqs[source];
287+ irqd = &aplic->irqs[array_index_nospec(source, aplic->nr_irqs)];
287288 ie = (aplic->domaincfg & APLIC_DOMAINCFG_IE) ? true : false;
288289
289290 raw_spin_lock_irqsave(&irqd->lock, flags);
arch/riscv/kvm/aia_device.c+14−4
@@ -11,6 +11,7 @@ · 10 unmodified lines
1111 #include <linux/irqchip/riscv-imsic.h>
1212 #include <linux/kvm_host.h>
1313 #include <linux/uaccess.h>
14+#include <linux/cpufeature.h>
1415
1516 static int aia_create(struct kvm_device *dev, u32 type)
1617 {
@@ -22,6 +23,9 @@ static int aia_create(struct kvm_device *dev, u32 type) · 5 unmodified lines
2223 if (irqchip_in_kernel(kvm))
2324 return -EEXIST;
2425
26+ if (!riscv_isa_extension_available(NULL, SSAIA))
27+ return -ENODEV;
28+
2529 ret = -EBUSY;
2630 if (kvm_trylock_all_vcpus(kvm))
2731 return ret;
@@ -437,7 +441,7 @@ static int aia_get_attr(struct kvm_device *dev, struct kvm_device_attr *attr) · 409 unmodified lines
437441
438442 static int aia_has_attr(struct kvm_device *dev, struct kvm_device_attr *attr)
439443 {
440− int nr_vcpus;
444+ int nr_vcpus, r = -ENXIO;
441445
442446 switch (attr->group) {
443447 case KVM_DEV_RISCV_AIA_GRP_CONFIG:
@@ -466,12 +470,18 @@ static int aia_has_attr(struct kvm_device *dev, struct kvm_device_attr *attr) · 22 unmodified lines
466470 }
467471 break;
468472 case KVM_DEV_RISCV_AIA_GRP_APLIC:
469− return kvm_riscv_aia_aplic_has_attr(dev->kvm, attr->attr);
473+ mutex_lock(&dev->kvm->lock);
474+ r = kvm_riscv_aia_aplic_has_attr(dev->kvm, attr->attr);
475+ mutex_unlock(&dev->kvm->lock);
476+ break;
470477 case KVM_DEV_RISCV_AIA_GRP_IMSIC:
471− return kvm_riscv_aia_imsic_has_attr(dev->kvm, attr->attr);
478+ mutex_lock(&dev->kvm->lock);
479+ r = kvm_riscv_aia_imsic_has_attr(dev->kvm, attr->attr);
480+ mutex_unlock(&dev->kvm->lock);
481+ break;
472482 }
473483
474− return -ENXIO;
484+ return r;
475485 }
476486
477487 struct kvm_device_ops kvm_riscv_aia_device_ops = {
arch/riscv/kvm/aia_imsic.c+4−0
@@ -908,6 +908,10 @@ int kvm_riscv_vcpu_aia_imsic_rmw(struct kvm_vcpu *vcpu, unsigned long isel, · 907 unmodified lines
908908 int r, rc = KVM_INSN_CONTINUE_NEXT_SEPC;
909909 struct imsic *imsic = vcpu->arch.aia_context.imsic_state;
910910
911+ /* If IMSIC vCPU state not initialized then forward to user space */
912+ if (!imsic)
913+ return KVM_INSN_EXIT_TO_USER_SPACE;
914+
911915 if (isel == KVM_RISCV_AIA_IMSIC_TOPEI) {
912916 /* Read pending and enabled interrupt with highest priority */
913917 topei = imsic_mrif_topei(imsic->swfile, imsic->nr_eix,
arch/riscv/kvm/mmu.c+5−1
@@ -245,6 +245,7 @@ out: · 244 unmodified lines
245245 bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range)
246246 {
247247 struct kvm_gstage gstage;
248+ bool mmu_locked;
248249
249250 if (!kvm->arch.pgd)
250251 return false;
@@ -253,9 +254,12 @@ bool kvm_unmap_gfn_range(struct kvm *kvm, struct kvm_gfn_range *range) · 2 unmodified lines
253254 gstage.flags = 0;
254255 gstage.vmid = READ_ONCE(kvm->arch.vmid.vmid);
255256 gstage.pgd = kvm->arch.pgd;
257+ mmu_locked = spin_trylock(&kvm->mmu_lock);
256258 kvm_riscv_gstage_unmap_range(&gstage, range->start << PAGE_SHIFT,
257259 (range->end - range->start) << PAGE_SHIFT,
258260 range->may_block);
261+ if (mmu_locked)
262+ spin_unlock(&kvm->mmu_lock);
259263 return false;
260264 }
261265
@@ -535,7 +539,7 @@ int kvm_riscv_mmu_map(struct kvm_vcpu *vcpu, struct kvm_memory_slot *memslot, · 273 unmodified lines
535539 goto out_unlock;
536540
537541 /* Check if we are backed by a THP and thus use block mapping if possible */
538− if (vma_pagesize == PAGE_SIZE)
542+ if (!logging && (vma_pagesize == PAGE_SIZE))
539543 vma_pagesize = transparent_hugepage_adjust(kvm, memslot, hva, &hfn, &gpa);
540544
541545 if (writable) {
arch/riscv/kvm/vcpu.c+1−1
@@ -24,7 +24,7 @@ · 23 unmodified lines
2424 #define CREATE_TRACE_POINTS
2525 #include "trace.h"
2626
27−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
27+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
2828 KVM_GENERIC_VCPU_STATS(),
2929 STATS_DESC_COUNTER(VCPU, ecall_exit_stat),
3030 STATS_DESC_COUNTER(VCPU, wfi_exit_stat),
arch/riscv/kvm/vcpu_fp.c+13−4
@@ -10,6 +10,7 @@ · 9 unmodified lines
1010 #include <linux/errno.h>
1111 #include <linux/err.h>
1212 #include <linux/kvm_host.h>
13+#include <linux/nospec.h>
1314 #include <linux/uaccess.h>
1415 #include <asm/cpufeature.h>
1516
@@ -93,9 +94,11 @@ int kvm_riscv_vcpu_get_reg_fp(struct kvm_vcpu *vcpu, · 77 unmodified lines
9394 if (reg_num == KVM_REG_RISCV_FP_F_REG(fcsr))
9495 reg_val = &cntx->fp.f.fcsr;
9596 else if ((KVM_REG_RISCV_FP_F_REG(f[0]) <= reg_num) &&
96− reg_num <= KVM_REG_RISCV_FP_F_REG(f[31]))
97+ reg_num <= KVM_REG_RISCV_FP_F_REG(f[31])) {
98+ reg_num = array_index_nospec(reg_num,
99+ ARRAY_SIZE(cntx->fp.f.f));
97100 reg_val = &cntx->fp.f.f[reg_num];
98− else
101+ } else
99102 return -ENOENT;
100103 } else if ((rtype == KVM_REG_RISCV_FP_D) &&
101104 riscv_isa_extension_available(vcpu->arch.isa, d)) {
@@ -107,6 +110,8 @@ int kvm_riscv_vcpu_get_reg_fp(struct kvm_vcpu *vcpu, · 5 unmodified lines
107110 reg_num <= KVM_REG_RISCV_FP_D_REG(f[31])) {
108111 if (KVM_REG_SIZE(reg->id) != sizeof(u64))
109112 return -EINVAL;
113+ reg_num = array_index_nospec(reg_num,
114+ ARRAY_SIZE(cntx->fp.d.f));
110115 reg_val = &cntx->fp.d.f[reg_num];
111116 } else
112117 return -ENOENT;
@@ -138,9 +143,11 @@ int kvm_riscv_vcpu_set_reg_fp(struct kvm_vcpu *vcpu, · 25 unmodified lines
138143 if (reg_num == KVM_REG_RISCV_FP_F_REG(fcsr))
139144 reg_val = &cntx->fp.f.fcsr;
140145 else if ((KVM_REG_RISCV_FP_F_REG(f[0]) <= reg_num) &&
141− reg_num <= KVM_REG_RISCV_FP_F_REG(f[31]))
146+ reg_num <= KVM_REG_RISCV_FP_F_REG(f[31])) {
147+ reg_num = array_index_nospec(reg_num,
148+ ARRAY_SIZE(cntx->fp.f.f));
142149 reg_val = &cntx->fp.f.f[reg_num];
143− else
150+ } else
144151 return -ENOENT;
145152 } else if ((rtype == KVM_REG_RISCV_FP_D) &&
146153 riscv_isa_extension_available(vcpu->arch.isa, d)) {
@@ -152,6 +159,8 @@ int kvm_riscv_vcpu_set_reg_fp(struct kvm_vcpu *vcpu, · 5 unmodified lines
152159 reg_num <= KVM_REG_RISCV_FP_D_REG(f[31])) {
153160 if (KVM_REG_SIZE(reg->id) != sizeof(u64))
154161 return -EINVAL;
162+ reg_num = array_index_nospec(reg_num,
163+ ARRAY_SIZE(cntx->fp.d.f));
155164 reg_val = &cntx->fp.d.f[reg_num];
156165 } else
157166 return -ENOENT;
arch/riscv/kvm/vcpu_onereg.c+36−18
@@ -10,6 +10,7 @@ · 9 unmodified lines
1010 #include <linux/bitops.h>
1111 #include <linux/errno.h>
1212 #include <linux/err.h>
13+#include <linux/nospec.h>
1314 #include <linux/uaccess.h>
1415 #include <linux/kvm_host.h>
1516 #include <asm/cacheflush.h>
@@ -127,6 +128,7 @@ static int kvm_riscv_vcpu_isa_check_host(unsigned long kvm_ext, unsigned long *g · 111 unmodified lines
127128 kvm_ext >= ARRAY_SIZE(kvm_isa_ext_arr))
128129 return -ENOENT;
129130
131+ kvm_ext = array_index_nospec(kvm_ext, ARRAY_SIZE(kvm_isa_ext_arr));
130132 *guest_ext = kvm_isa_ext_arr[kvm_ext];
131133 switch (*guest_ext) {
132134 case RISCV_ISA_EXT_SMNPM:
@@ -443,13 +445,16 @@ static int kvm_riscv_vcpu_get_reg_core(struct kvm_vcpu *vcpu, · 310 unmodified lines
443445 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
444446 KVM_REG_SIZE_MASK |
445447 KVM_REG_RISCV_CORE);
448+ unsigned long regs_max = sizeof(struct kvm_riscv_core) / sizeof(unsigned long);
446449 unsigned long reg_val;
447450
448451 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
449452 return -EINVAL;
450− if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
453+ if (reg_num >= regs_max)
451454 return -ENOENT;
452455
456+ reg_num = array_index_nospec(reg_num, regs_max);
457+
453458 if (reg_num == KVM_REG_RISCV_CORE_REG(regs.pc))
454459 reg_val = cntx->sepc;
455460 else if (KVM_REG_RISCV_CORE_REG(regs.pc) < reg_num &&
@@ -476,13 +481,16 @@ static int kvm_riscv_vcpu_set_reg_core(struct kvm_vcpu *vcpu, · 20 unmodified lines
476481 unsigned long reg_num = reg->id & ~(KVM_REG_ARCH_MASK |
477482 KVM_REG_SIZE_MASK |
478483 KVM_REG_RISCV_CORE);
484+ unsigned long regs_max = sizeof(struct kvm_riscv_core) / sizeof(unsigned long);
479485 unsigned long reg_val;
480486
481487 if (KVM_REG_SIZE(reg->id) != sizeof(unsigned long))
482488 return -EINVAL;
483− if (reg_num >= sizeof(struct kvm_riscv_core) / sizeof(unsigned long))
489+ if (reg_num >= regs_max)
484490 return -ENOENT;
485491
492+ reg_num = array_index_nospec(reg_num, regs_max);
493+
486494 if (copy_from_user(&reg_val, uaddr, KVM_REG_SIZE(reg->id)))
487495 return -EFAULT;
488496
@@ -507,10 +515,13 @@ static int kvm_riscv_vcpu_general_get_csr(struct kvm_vcpu *vcpu, · 18 unmodified lines
507515 unsigned long *out_val)
508516 {
509517 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
518+ unsigned long regs_max = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
510519
511− if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
520+ if (reg_num >= regs_max)
512521 return -ENOENT;
513522
523+ reg_num = array_index_nospec(reg_num, regs_max);
524+
514525 if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
515526 kvm_riscv_vcpu_flush_interrupts(vcpu);
516527 *out_val = (csr->hvip >> VSIP_TO_HVIP_SHIFT) & VSIP_VALID_MASK;
@@ -526,10 +537,13 @@ static int kvm_riscv_vcpu_general_set_csr(struct kvm_vcpu *vcpu, · 9 unmodified lines
526537 unsigned long reg_val)
527538 {
528539 struct kvm_vcpu_csr *csr = &vcpu->arch.guest_csr;
540+ unsigned long regs_max = sizeof(struct kvm_riscv_csr) / sizeof(unsigned long);
529541
530− if (reg_num >= sizeof(struct kvm_riscv_csr) / sizeof(unsigned long))
542+ if (reg_num >= regs_max)
531543 return -ENOENT;
532544
545+ reg_num = array_index_nospec(reg_num, regs_max);
546+
533547 if (reg_num == KVM_REG_RISCV_CSR_REG(sip)) {
534548 reg_val &= VSIP_VALID_MASK;
535549 reg_val <<= VSIP_TO_HVIP_SHIFT;
@@ -548,10 +562,15 @@ static inline int kvm_riscv_vcpu_smstateen_set_csr(struct kvm_vcpu *vcpu, · 12 unmodified lines
548562 unsigned long reg_val)
549563 {
550564 struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
565+ unsigned long regs_max = sizeof(struct kvm_riscv_smstateen_csr) /
566+ sizeof(unsigned long);
551567
552− if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
553− sizeof(unsigned long))
554− return -EINVAL;
568+ if (!riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN))
569+ return -ENOENT;
570+ if (reg_num >= regs_max)
571+ return -ENOENT;
572+
573+ reg_num = array_index_nospec(reg_num, regs_max);
555574
556575 ((unsigned long *)csr)[reg_num] = reg_val;
557576 return 0;
@@ -562,10 +581,15 @@ static int kvm_riscv_vcpu_smstateen_get_csr(struct kvm_vcpu *vcpu, · 4 unmodified lines
562581 unsigned long *out_val)
563582 {
564583 struct kvm_vcpu_smstateen_csr *csr = &vcpu->arch.smstateen_csr;
584+ unsigned long regs_max = sizeof(struct kvm_riscv_smstateen_csr) /
585+ sizeof(unsigned long);
565586
566− if (reg_num >= sizeof(struct kvm_riscv_smstateen_csr) /
567− sizeof(unsigned long))
568− return -EINVAL;
587+ if (!riscv_isa_extension_available(vcpu->arch.isa, SMSTATEEN))
588+ return -ENOENT;
589+ if (reg_num >= regs_max)
590+ return -ENOENT;
591+
592+ reg_num = array_index_nospec(reg_num, regs_max);
569593
570594 *out_val = ((unsigned long *)csr)[reg_num];
571595 return 0;
@@ -595,10 +619,7 @@ static int kvm_riscv_vcpu_get_reg_csr(struct kvm_vcpu *vcpu, · 23 unmodified lines
595619 rc = kvm_riscv_vcpu_aia_get_csr(vcpu, reg_num, &reg_val);
596620 break;
597621 case KVM_REG_RISCV_CSR_SMSTATEEN:
598− rc = -EINVAL;
599− if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
600− rc = kvm_riscv_vcpu_smstateen_get_csr(vcpu, reg_num,
601− &reg_val);
622+ rc = kvm_riscv_vcpu_smstateen_get_csr(vcpu, reg_num, &reg_val);
602623 break;
603624 default:
604625 rc = -ENOENT;
@@ -640,10 +661,7 @@ static int kvm_riscv_vcpu_set_reg_csr(struct kvm_vcpu *vcpu, · 35 unmodified lines
640661 rc = kvm_riscv_vcpu_aia_set_csr(vcpu, reg_num, reg_val);
641662 break;
642663 case KVM_REG_RISCV_CSR_SMSTATEEN:
643− rc = -EINVAL;
644− if (riscv_has_extension_unlikely(RISCV_ISA_EXT_SMSTATEEN))
645− rc = kvm_riscv_vcpu_smstateen_set_csr(vcpu, reg_num,
646− reg_val);
664+ rc = kvm_riscv_vcpu_smstateen_set_csr(vcpu, reg_num, reg_val);
647665 break;
648666 default:
649667 rc = -ENOENT;
arch/riscv/kvm/vcpu_pmu.c+12−4
@@ -10,6 +10,7 @@ · 9 unmodified lines
1010 #include <linux/errno.h>
1111 #include <linux/err.h>
1212 #include <linux/kvm_host.h>
13+#include <linux/nospec.h>
1314 #include <linux/perf/riscv_pmu.h>
1415 #include <asm/csr.h>
1516 #include <asm/kvm_vcpu_sbi.h>
@@ -87,7 +88,8 @@ static void kvm_pmu_release_perf_event(struct kvm_pmc *pmc) · 71 unmodified lines
8788
8889 static u64 kvm_pmu_get_perf_event_hw_config(u32 sbi_event_code)
8990 {
90− return hw_event_perf_map[sbi_event_code];
91+ return hw_event_perf_map[array_index_nospec(sbi_event_code,
92+ SBI_PMU_HW_GENERAL_MAX)];
9193 }
9294
9395 static u64 kvm_pmu_get_perf_event_cache_config(u32 sbi_event_code)
@@ -218,6 +220,7 @@ static int pmu_fw_ctr_read_hi(struct kvm_vcpu *vcpu, unsigned long cidx, · 124 unmodified lines
218220 return -EINVAL;
219221 }
220222
223+ cidx = array_index_nospec(cidx, RISCV_KVM_MAX_COUNTERS);
221224 pmc = &kvpmu->pmc[cidx];
222225
223226 if (pmc->cinfo.type != SBI_PMU_CTR_TYPE_FW)
@@ -244,6 +247,7 @@ static int pmu_ctr_read(struct kvm_vcpu *vcpu, unsigned long cidx, · 20 unmodified lines
244247 return -EINVAL;
245248 }
246249
250+ cidx = array_index_nospec(cidx, RISCV_KVM_MAX_COUNTERS);
247251 pmc = &kvpmu->pmc[cidx];
248252
249253 if (pmc->cinfo.type == SBI_PMU_CTR_TYPE_FW) {
@@ -520,11 +524,12 @@ int kvm_riscv_vcpu_pmu_ctr_info(struct kvm_vcpu *vcpu, unsigned long cidx, · 270 unmodified lines
520524 {
521525 struct kvm_pmu *kvpmu = vcpu_to_pmu(vcpu);
522526
523− if (cidx > RISCV_KVM_MAX_COUNTERS || cidx == 1) {
527+ if (cidx >= RISCV_KVM_MAX_COUNTERS || cidx == 1) {
524528 retdata->err_val = SBI_ERR_INVALID_PARAM;
525529 return 0;
526530 }
527531
532+ cidx = array_index_nospec(cidx, RISCV_KVM_MAX_COUNTERS);
528533 retdata->out_val = kvpmu->pmc[cidx].cinfo.value;
529534
530535 return 0;
@@ -559,7 +564,8 @@ int kvm_riscv_vcpu_pmu_ctr_start(struct kvm_vcpu *vcpu, unsigned long ctr_base, · 28 unmodified lines
559564 }
560565 /* Start the counters that have been configured and requested by the guest */
561566 for_each_set_bit(i, &ctr_mask, RISCV_MAX_COUNTERS) {
562− pmc_index = i + ctr_base;
567+ pmc_index = array_index_nospec(i + ctr_base,
568+ RISCV_KVM_MAX_COUNTERS);
563569 if (!test_bit(pmc_index, kvpmu->pmc_in_use))
564570 continue;
565571 /* The guest started the counter again. Reset the overflow status */
@@ -630,7 +636,8 @@ int kvm_riscv_vcpu_pmu_ctr_stop(struct kvm_vcpu *vcpu, unsigned long ctr_base, · 64 unmodified lines
630636
631637 /* Stop the counters that have been configured and requested by the guest */
632638 for_each_set_bit(i, &ctr_mask, RISCV_MAX_COUNTERS) {
633− pmc_index = i + ctr_base;
639+ pmc_index = array_index_nospec(i + ctr_base,
640+ RISCV_KVM_MAX_COUNTERS);
634641 if (!test_bit(pmc_index, kvpmu->pmc_in_use))
635642 continue;
636643 pmc = &kvpmu->pmc[pmc_index];
@@ -761,6 +768,7 @@ int kvm_riscv_vcpu_pmu_ctr_cfg_match(struct kvm_vcpu *vcpu, unsigned long ctr_ba · 124 unmodified lines
761768 }
762769 }
763770
771+ ctr_idx = array_index_nospec(ctr_idx, RISCV_KVM_MAX_COUNTERS);
764772 pmc = &kvpmu->pmc[ctr_idx];
765773 pmc->idx = ctr_idx;
766774
arch/riscv/kvm/vm.c+1−1
@@ -13,7 +13,7 @@ · 12 unmodified lines
1313 #include <linux/kvm_host.h>
1414 #include <asm/kvm_mmu.h>
1515
16−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
16+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
1717 KVM_GENERIC_VM_STATS()
1818 };
1919 static_assert(ARRAY_SIZE(kvm_vm_stats_desc) ==
arch/s390/kernel/irq.c+8−6
@@ -147,10 +147,8 @@ void noinstr do_io_irq(struct pt_regs *regs) · 146 unmodified lines
147147 bool from_idle;
148148
149149 from_idle = test_and_clear_cpu_flag(CIF_ENABLED_WAIT);
150− if (from_idle) {
150+ if (from_idle)
151151 update_timer_idle();
152− regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT);
153− }
154152
155153 irq_enter_rcu();
156154
@@ -176,6 +174,9 @@ void noinstr do_io_irq(struct pt_regs *regs) · 19 unmodified lines
176174
177175 set_irq_regs(old_regs);
178176 irqentry_exit(regs, state);
177+
178+ if (from_idle)
179+ regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT);
179180 }
180181
181182 void noinstr do_ext_irq(struct pt_regs *regs)
@@ -185,10 +186,8 @@ void noinstr do_ext_irq(struct pt_regs *regs) · 3 unmodified lines
185186 bool from_idle;
186187
187188 from_idle = test_and_clear_cpu_flag(CIF_ENABLED_WAIT);
188− if (from_idle) {
189+ if (from_idle)
189190 update_timer_idle();
190− regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT);
191− }
192191
193192 irq_enter_rcu();
194193
@@ -210,6 +209,9 @@ void noinstr do_ext_irq(struct pt_regs *regs) · 15 unmodified lines
210209 irq_exit_rcu();
211210 set_irq_regs(old_regs);
212211 irqentry_exit(regs, state);
212+
213+ if (from_idle)
214+ regs->psw.mask &= ~(PSW_MASK_EXT | PSW_MASK_IO | PSW_MASK_WAIT);
213215 }
214216
215217 static void show_msi_interrupt(struct seq_file *p, int irq)
arch/s390/kvm/kvm-s390.c+2−2
@@ -65,7 +65,7 @@ · 64 unmodified lines
6565 #define VCPU_IRQS_MAX_BUF (sizeof(struct kvm_s390_irq) * \
6666 (KVM_MAX_VCPUS + LOCAL_IRQS))
6767
68−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
68+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
6969 KVM_GENERIC_VM_STATS(),
7070 STATS_DESC_COUNTER(VM, inject_io),
7171 STATS_DESC_COUNTER(VM, inject_float_mchk),
@@ -91,7 +91,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 19 unmodified lines
9191 sizeof(kvm_vm_stats_desc),
9292 };
9393
94−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
94+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
9595 KVM_GENERIC_VCPU_STATS(),
9696 STATS_DESC_COUNTER(VCPU, exit_userspace),
9797 STATS_DESC_COUNTER(VCPU, exit_null),
arch/x86/include/asm/kvm_host.h+2−1
@@ -2485,7 +2485,8 @@ int memslot_rmap_alloc(struct kvm_memory_slot *slot, unsigned long npages); · 2484 unmodified lines
24852485 KVM_X86_QUIRK_MWAIT_NEVER_UD_FAULTS | \
24862486 KVM_X86_QUIRK_SLOT_ZAP_ALL | \
24872487 KVM_X86_QUIRK_STUFF_FEATURE_MSRS | \
2488− KVM_X86_QUIRK_IGNORE_GUEST_PAT)
2488+ KVM_X86_QUIRK_IGNORE_GUEST_PAT | \
2489+ KVM_X86_QUIRK_VMCS12_ALLOW_FREEZE_IN_SMM)
24892490
24902491 #define KVM_X86_CONDITIONAL_QUIRKS \
24912492 (KVM_X86_QUIRK_CD_NW_CLEARED | \
arch/x86/include/uapi/asm/kvm.h+1−0
@@ -476,6 +476,7 @@ struct kvm_sync_regs { · 475 unmodified lines
476476 #define KVM_X86_QUIRK_SLOT_ZAP_ALL (1 << 7)
477477 #define KVM_X86_QUIRK_STUFF_FEATURE_MSRS (1 << 8)
478478 #define KVM_X86_QUIRK_IGNORE_GUEST_PAT (1 << 9)
479+#define KVM_X86_QUIRK_VMCS12_ALLOW_FREEZE_IN_SMM (1 << 10)
479480
480481 #define KVM_STATE_NESTED_FORMAT_VMX 0
481482 #define KVM_STATE_NESTED_FORMAT_SVM 1
arch/x86/kernel/apic/apic.c+6−0
@@ -1894,6 +1894,7 @@ void __init check_x2apic(void) · 1893 unmodified lines
18941894
18951895 static inline void try_to_enable_x2apic(int remap_mode) { }
18961896 static inline void __x2apic_enable(void) { }
1897+static inline void __x2apic_disable(void) { }
18971898 #endif /* !CONFIG_X86_X2APIC */
18981899
18991900 void __init enable_IR_x2apic(void)
@@ -2456,6 +2457,11 @@ static void lapic_resume(void *data) · 556 unmodified lines
24562457 if (x2apic_mode) {
24572458 __x2apic_enable();
24582459 } else {
2460+ if (x2apic_enabled()) {
2461+ pr_warn_once("x2apic: re-enabled by firmware during resume. Disabling\n");
2462+ __x2apic_disable();
2463+ }
2464+
24592465 /*
24602466 * Make sure the APICBASE points to the right address
24612467 *
arch/x86/kvm/cpuid.c+4−1
@@ -776,7 +776,10 @@ do { \ · 775 unmodified lines
776776 #define SYNTHESIZED_F(name) \
777777 ({ \
778778 kvm_cpu_cap_synthesized |= feature_bit(name); \
779− F(name); \
779+ \
780+ BUILD_BUG_ON(X86_FEATURE_##name >= MAX_CPU_FEATURES); \
781+ if (boot_cpu_has(X86_FEATURE_##name)) \
782+ F(name); \
780783 })
781784
782785 /*
arch/x86/kvm/hyperv.c+5−4
@@ -1981,16 +1981,17 @@ int kvm_hv_vcpu_flush_tlb(struct kvm_vcpu *vcpu) · 1980 unmodified lines
19811981 if (entries[i] == KVM_HV_TLB_FLUSHALL_ENTRY)
19821982 goto out_flush_all;
19831983
1984− if (is_noncanonical_invlpg_address(entries[i], vcpu))
1985− continue;
1986−
19871984 /*
19881985 * Lower 12 bits of 'address' encode the number of additional
19891986 * pages to flush.
19901987 */
19911988 gva = entries[i] & PAGE_MASK;
1992− for (j = 0; j < (entries[i] & ~PAGE_MASK) + 1; j++)
1989+ for (j = 0; j < (entries[i] & ~PAGE_MASK) + 1; j++) {
1990+ if (is_noncanonical_invlpg_address(gva + j * PAGE_SIZE, vcpu))
1991+ continue;
1992+
19931993 kvm_x86_call(flush_tlb_gva)(vcpu, gva + j * PAGE_SIZE);
1994+ }
19941995
19951996 ++vcpu->stat.tlb_flush;
19961997 }
arch/x86/kvm/ioapic.c+2−1
@@ -321,7 +321,8 @@ void kvm_fire_mask_notifiers(struct kvm *kvm, unsigned irqchip, unsigned pin, · 320 unmodified lines
321321 idx = srcu_read_lock(&kvm->irq_srcu);
322322 gsi = kvm_irq_map_chip_pin(kvm, irqchip, pin);
323323 if (gsi != -1)
324− hlist_for_each_entry_rcu(kimn, &ioapic->mask_notifier_list, link)
324+ hlist_for_each_entry_srcu(kimn, &ioapic->mask_notifier_list, link,
325+ srcu_read_lock_held(&kvm->irq_srcu))
325326 if (kimn->irq == gsi)
326327 kimn->func(kimn, mask);
327328 srcu_read_unlock(&kvm->irq_srcu, idx);
arch/x86/kvm/svm/avic.c+6−3
@@ -189,12 +189,12 @@ static void avic_activate_vmcb(struct vcpu_svm *svm) · 188 unmodified lines
189189 struct kvm_vcpu *vcpu = &svm->vcpu;
190190
191191 vmcb->control.int_ctl &= ~(AVIC_ENABLE_MASK | X2APIC_MODE_MASK);
192−
193192 vmcb->control.avic_physical_id &= ~AVIC_PHYSICAL_MAX_INDEX_MASK;
194193 vmcb->control.avic_physical_id |= avic_get_max_physical_id(vcpu);
195−
196194 vmcb->control.int_ctl |= AVIC_ENABLE_MASK;
197195
196+ svm_clr_intercept(svm, INTERCEPT_CR8_WRITE);
197+
198198 /*
199199 * Note: KVM supports hybrid-AVIC mode, where KVM emulates x2APIC MSR
200200 * accesses, while interrupt injection to a running vCPU can be
@@ -226,6 +226,9 @@ static void avic_deactivate_vmcb(struct vcpu_svm *svm) · 25 unmodified lines
226226 vmcb->control.int_ctl &= ~(AVIC_ENABLE_MASK | X2APIC_MODE_MASK);
227227 vmcb->control.avic_physical_id &= ~AVIC_PHYSICAL_MAX_INDEX_MASK;
228228
229+ if (!sev_es_guest(svm->vcpu.kvm))
230+ svm_set_intercept(svm, INTERCEPT_CR8_WRITE);
231+
229232 /*
230233 * If running nested and the guest uses its own MSR bitmap, there
231234 * is no need to update L0's msr bitmap
@@ -368,7 +371,7 @@ void avic_init_vmcb(struct vcpu_svm *svm, struct vmcb *vmcb) · 136 unmodified lines
368371 vmcb->control.avic_physical_id = __sme_set(__pa(kvm_svm->avic_physical_id_table));
369372 vmcb->control.avic_vapic_bar = APIC_DEFAULT_PHYS_BASE;
370373
371− if (kvm_apicv_activated(svm->vcpu.kvm))
374+ if (kvm_vcpu_apicv_active(&svm->vcpu))
372375 avic_activate_vmcb(svm);
373376 else
374377 avic_deactivate_vmcb(svm);
arch/x86/kvm/svm/nested.c+10−2
@@ -418,6 +418,15 @@ static bool nested_vmcb_check_controls(struct kvm_vcpu *vcpu) · 417 unmodified lines
418418 return __nested_vmcb_check_controls(vcpu, ctl);
419419 }
420420
421+int nested_svm_check_cached_vmcb12(struct kvm_vcpu *vcpu)
422+{
423+ if (!nested_vmcb_check_save(vcpu) ||
424+ !nested_vmcb_check_controls(vcpu))
425+ return -EINVAL;
426+
427+ return 0;
428+}
429+
421430 /*
422431 * If a feature is not advertised to L1, clear the corresponding vmcb12
423432 * intercept.
@@ -1028,8 +1037,7 @@ int nested_svm_vmrun(struct kvm_vcpu *vcpu) · 604 unmodified lines
10281037 nested_copy_vmcb_control_to_cache(svm, &vmcb12->control);
10291038 nested_copy_vmcb_save_to_cache(svm, &vmcb12->save);
10301039
1031− if (!nested_vmcb_check_save(vcpu) ||
1032− !nested_vmcb_check_controls(vcpu)) {
1040+ if (nested_svm_check_cached_vmcb12(vcpu) < 0) {
10331041 vmcb12->control.exit_code = SVM_EXIT_ERR;
10341042 vmcb12->control.exit_info_1 = 0;
10351043 vmcb12->control.exit_info_2 = 0;
arch/x86/kvm/svm/svm.c+11−6
@@ -1077,8 +1077,7 @@ static void init_vmcb(struct kvm_vcpu *vcpu, bool init_event) · 1076 unmodified lines
10771077 svm_set_intercept(svm, INTERCEPT_CR0_WRITE);
10781078 svm_set_intercept(svm, INTERCEPT_CR3_WRITE);
10791079 svm_set_intercept(svm, INTERCEPT_CR4_WRITE);
1080− if (!kvm_vcpu_apicv_active(vcpu))
1081− svm_set_intercept(svm, INTERCEPT_CR8_WRITE);
1080+ svm_set_intercept(svm, INTERCEPT_CR8_WRITE);
10821081
10831082 set_dr_intercepts(svm);
10841083
@@ -1189,7 +1188,7 @@ static void init_vmcb(struct kvm_vcpu *vcpu, bool init_event) · 104 unmodified lines
11891188 if (guest_cpu_cap_has(vcpu, X86_FEATURE_ERAPS))
11901189 svm->vmcb->control.erap_ctl |= ERAP_CONTROL_ALLOW_LARGER_RAP;
11911190
1192− if (kvm_vcpu_apicv_active(vcpu))
1191+ if (enable_apicv && irqchip_in_kernel(vcpu->kvm))
11931192 avic_init_vmcb(svm, vmcb);
11941193
11951194 if (vnmi)
@@ -2674,9 +2673,11 @@ static int dr_interception(struct kvm_vcpu *vcpu) · 1478 unmodified lines
26742673
26752674 static int cr8_write_interception(struct kvm_vcpu *vcpu)
26762675 {
2676+ u8 cr8_prev = kvm_get_cr8(vcpu);
26772677 int r;
26782678
2679− u8 cr8_prev = kvm_get_cr8(vcpu);
2679+ WARN_ON_ONCE(kvm_vcpu_apicv_active(vcpu));
2680+
26802681 /* instruction emulation calls kvm_set_cr8() */
26812682 r = cr_interception(vcpu);
26822683 if (lapic_in_kernel(vcpu))
@@ -4879,11 +4880,15 @@ static int svm_leave_smm(struct kvm_vcpu *vcpu, const union kvm_smram *smram) · 2196 unmodified lines
48794880 vmcb12 = map.hva;
48804881 nested_copy_vmcb_control_to_cache(svm, &vmcb12->control);
48814882 nested_copy_vmcb_save_to_cache(svm, &vmcb12->save);
4882− ret = enter_svm_guest_mode(vcpu, smram64->svm_guest_vmcb_gpa, vmcb12, false);
48834883
4884− if (ret)
4884+ if (nested_svm_check_cached_vmcb12(vcpu) < 0)
4885+ goto unmap_save;
4886+
4887+ if (enter_svm_guest_mode(vcpu, smram64->svm_guest_vmcb_gpa,
4888+ vmcb12, false) != 0)
48854889 goto unmap_save;
48864890
4891+ ret = 0;
48874892 svm->nested.nested_run_pending = 1;
48884893
48894894 unmap_save:
arch/x86/kvm/svm/svm.h+1−0
@@ -797,6 +797,7 @@ static inline int nested_svm_simple_vmexit(struct vcpu_svm *svm, u32 exit_code) · 796 unmodified lines
797797
798798 int nested_svm_exit_handled(struct vcpu_svm *svm);
799799 int nested_svm_check_permissions(struct kvm_vcpu *vcpu);
800+int nested_svm_check_cached_vmcb12(struct kvm_vcpu *vcpu);
800801 int nested_svm_check_exception(struct vcpu_svm *svm, unsigned nr,
801802 bool has_error_code, u32 error_code);
802803 int nested_svm_exit_special(struct vcpu_svm *svm);
arch/x86/kvm/vmx/nested.c+45−16
@@ -3300,10 +3300,24 @@ static int nested_vmx_check_guest_state(struct kvm_vcpu *vcpu, · 3299 unmodified lines
33003300 if (CC(vmcs12->guest_cr4 & X86_CR4_CET && !(vmcs12->guest_cr0 & X86_CR0_WP)))
33013301 return -EINVAL;
33023302
3303− if ((vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS) &&
3304− (CC(!kvm_dr7_valid(vmcs12->guest_dr7)) ||
3305− CC(!vmx_is_valid_debugctl(vcpu, vmcs12->guest_ia32_debugctl, false))))
3306− return -EINVAL;
3303+ if (vmcs12->vm_entry_controls & VM_ENTRY_LOAD_DEBUG_CONTROLS) {
3304+ u64 debugctl = vmcs12->guest_ia32_debugctl;
3305+
3306+ /*
3307+ * FREEZE_IN_SMM is not virtualized, but allow L1 to set it in
3308+ * vmcs12's DEBUGCTL under a quirk for backwards compatibility.
3309+ * Note that the quirk only relaxes the consistency check. The
3310+ * vmcc02 bit is still under the control of the host. In
3311+ * particular, if a host administrator decides to clear the bit,
3312+ * then L1 has no say in the matter.
3313+ */
3314+ if (kvm_check_has_quirk(vcpu->kvm, KVM_X86_QUIRK_VMCS12_ALLOW_FREEZE_IN_SMM))
3315+ debugctl &= ~DEBUGCTLMSR_FREEZE_IN_SMM;
3316+
3317+ if (CC(!kvm_dr7_valid(vmcs12->guest_dr7)) ||
3318+ CC(!vmx_is_valid_debugctl(vcpu, debugctl, false)))
3319+ return -EINVAL;
3320+ }
33073321
33083322 if ((vmcs12->vm_entry_controls & VM_ENTRY_LOAD_IA32_PAT) &&
33093323 CC(!kvm_pat_valid(vmcs12->guest_ia32_pat)))
@@ -6842,13 +6856,34 @@ void vmx_leave_nested(struct kvm_vcpu *vcpu) · 3532 unmodified lines
68426856 free_nested(vcpu);
68436857 }
68446858
6859+int nested_vmx_check_restored_vmcs12(struct kvm_vcpu *vcpu)
6860+{
6861+ enum vm_entry_failure_code ignored;
6862+ struct vmcs12 *vmcs12 = get_vmcs12(vcpu);
6863+
6864+ if (nested_cpu_has_shadow_vmcs(vmcs12) &&
6865+ vmcs12->vmcs_link_pointer != INVALID_GPA) {
6866+ struct vmcs12 *shadow_vmcs12 = get_shadow_vmcs12(vcpu);
6867+
6868+ if (shadow_vmcs12->hdr.revision_id != VMCS12_REVISION ||
6869+ !shadow_vmcs12->hdr.shadow_vmcs)
6870+ return -EINVAL;
6871+ }
6872+
6873+ if (nested_vmx_check_controls(vcpu, vmcs12) ||
6874+ nested_vmx_check_host_state(vcpu, vmcs12) ||
6875+ nested_vmx_check_guest_state(vcpu, vmcs12, &ignored))
6876+ return -EINVAL;
6877+
6878+ return 0;
6879+}
6880+
68456881 static int vmx_set_nested_state(struct kvm_vcpu *vcpu,
68466882 struct kvm_nested_state __user *user_kvm_nested_state,
68476883 struct kvm_nested_state *kvm_state)
68486884 {
68496885 struct vcpu_vmx *vmx = to_vmx(vcpu);
68506886 struct vmcs12 *vmcs12;
6851− enum vm_entry_failure_code ignored;
68526887 struct kvm_vmx_nested_state_data __user *user_vmx_nested_state =
68536888 &user_kvm_nested_state->data.vmx[0];
68546889 int ret;
@@ -6979,25 +7014,20 @@ static int vmx_set_nested_state(struct kvm_vcpu *vcpu, · 124 unmodified lines
69797014 vmx->nested.mtf_pending =
69807015 !!(kvm_state->flags & KVM_STATE_NESTED_MTF_PENDING);
69817016
6982− ret = -EINVAL;
69837017 if (nested_cpu_has_shadow_vmcs(vmcs12) &&
69847018 vmcs12->vmcs_link_pointer != INVALID_GPA) {
69857019 struct vmcs12 *shadow_vmcs12 = get_shadow_vmcs12(vcpu);
69867020
7021+ ret = -EINVAL;
69877022 if (kvm_state->size <
69887023 sizeof(*kvm_state) +
69897024 sizeof(user_vmx_nested_state->vmcs12) + sizeof(*shadow_vmcs12))
69907025 goto error_guest_mode;
69917026
7027+ ret = -EFAULT;
69927028 if (copy_from_user(shadow_vmcs12,
69937029 user_vmx_nested_state->shadow_vmcs12,
6994− sizeof(*shadow_vmcs12))) {
6995− ret = -EFAULT;
6996− goto error_guest_mode;
6997− }
6998−
6999− if (shadow_vmcs12->hdr.revision_id != VMCS12_REVISION ||
7000− !shadow_vmcs12->hdr.shadow_vmcs)
7030+ sizeof(*shadow_vmcs12)))
70017031 goto error_guest_mode;
70027032 }
70037033
@@ -7008,9 +7038,8 @@ static int vmx_set_nested_state(struct kvm_vcpu *vcpu, · 4 unmodified lines
70087038 kvm_state->hdr.vmx.preemption_timer_deadline;
70097039 }
70107040
7011− if (nested_vmx_check_controls(vcpu, vmcs12) ||
7012− nested_vmx_check_host_state(vcpu, vmcs12) ||
7013− nested_vmx_check_guest_state(vcpu, vmcs12, &ignored))
7041+ ret = nested_vmx_check_restored_vmcs12(vcpu);
7042+ if (ret < 0)
70147043 goto error_guest_mode;
70157044
70167045 vmx->nested.dirty_vmcs12 = true;
arch/x86/kvm/vmx/nested.h+1−0
@@ -22,6 +22,7 @@ void nested_vmx_setup_ctls_msrs(struct vmcs_config *vmcs_conf, u32 ept_caps); · 21 unmodified lines
2222 void nested_vmx_hardware_unsetup(void);
2323 __init int nested_vmx_hardware_setup(int (*exit_handlers[])(struct kvm_vcpu *));
2424 void nested_vmx_set_vmcs_shadowing_bitmap(void);
25+int nested_vmx_check_restored_vmcs12(struct kvm_vcpu *vcpu);
2526 void nested_vmx_free_vcpu(struct kvm_vcpu *vcpu);
2627 enum nvmx_vmentry_status nested_vmx_enter_non_root_mode(struct kvm_vcpu *vcpu,
2728 bool from_vmentry);
arch/x86/kvm/vmx/vmx.c+7−3
@@ -1149,7 +1149,7 @@ static void add_atomic_switch_msr(struct vcpu_vmx *vmx, unsigned msr, · 1148 unmodified lines
11491149 }
11501150
11511151 vmx_add_auto_msr(&m->guest, msr, guest_val, VM_ENTRY_MSR_LOAD_COUNT, kvm);
1152− vmx_add_auto_msr(&m->guest, msr, host_val, VM_EXIT_MSR_LOAD_COUNT, kvm);
1152+ vmx_add_auto_msr(&m->host, msr, host_val, VM_EXIT_MSR_LOAD_COUNT, kvm);
11531153 }
11541154
11551155 static bool update_transition_efer(struct vcpu_vmx *vmx)
@@ -8528,9 +8528,13 @@ int vmx_leave_smm(struct kvm_vcpu *vcpu, const union kvm_smram *smram) · 7372 unmodified lines
85288528 }
85298529
85308530 if (vmx->nested.smm.guest_mode) {
8531+ /* Triple fault if the state is invalid. */
8532+ if (nested_vmx_check_restored_vmcs12(vcpu) < 0)
8533+ return 1;
8534+
85318535 ret = nested_vmx_enter_non_root_mode(vcpu, false);
8532− if (ret)
8533− return ret;
8536+ if (ret != NVMX_VMENTRY_SUCCESS)
8537+ return 1;
85348538
85358539 vmx->nested.nested_run_pending = 1;
85368540 vmx->nested.smm.guest_mode = false;
arch/x86/kvm/x86.c+2−2
@@ -243,7 +243,7 @@ EXPORT_SYMBOL_FOR_KVM_INTERNAL(enable_ipiv); · 242 unmodified lines
243243 bool __read_mostly enable_device_posted_irqs = true;
244244 EXPORT_SYMBOL_FOR_KVM_INTERNAL(enable_device_posted_irqs);
245245
246−const struct _kvm_stats_desc kvm_vm_stats_desc[] = {
246+const struct kvm_stats_desc kvm_vm_stats_desc[] = {
247247 KVM_GENERIC_VM_STATS(),
248248 STATS_DESC_COUNTER(VM, mmu_shadow_zapped),
249249 STATS_DESC_COUNTER(VM, mmu_pte_write),
@@ -269,7 +269,7 @@ const struct kvm_stats_header kvm_vm_stats_header = { · 19 unmodified lines
269269 sizeof(kvm_vm_stats_desc),
270270 };
271271
272−const struct _kvm_stats_desc kvm_vcpu_stats_desc[] = {
272+const struct kvm_stats_desc kvm_vcpu_stats_desc[] = {
273273 KVM_GENERIC_VCPU_STATS(),
274274 STATS_DESC_COUNTER(VCPU, pf_taken),
275275 STATS_DESC_COUNTER(VCPU, pf_fixed),
drivers/accel/amdxdna/aie2_ctx.c+2−12
@@ -165,7 +165,6 @@ aie2_sched_notify(struct amdxdna_sched_job *job) · 164 unmodified lines
165165
166166 trace_xdna_job(&job->base, job->hwctx->name, "signaled fence", job->seq);
167167
168− amdxdna_pm_suspend_put(job->hwctx->client->xdna);
169168 job->hwctx->priv->completed++;
170169 dma_fence_signal(fence);
171170
@@ -290,19 +289,11 @@ aie2_sched_job_run(struct drm_sched_job *sched_job) · 118 unmodified lines
290289 struct dma_fence *fence;
291290 int ret;
292291
293− ret = amdxdna_pm_resume_get(hwctx->client->xdna);
294− if (ret)
292+ if (!hwctx->priv->mbox_chann)
295293 return NULL;
296294
297− if (!hwctx->priv->mbox_chann) {
298− amdxdna_pm_suspend_put(hwctx->client->xdna);
299− return NULL;
300− }
301−
302− if (!mmget_not_zero(job->mm)) {
303− amdxdna_pm_suspend_put(hwctx->client->xdna);
295+ if (!mmget_not_zero(job->mm))
304296 return ERR_PTR(-ESRCH);
305− }
306297
307298 kref_get(&job->refcnt);
308299 fence = dma_fence_get(job->fence);
@@ -333,7 +324,6 @@ aie2_sched_job_run(struct drm_sched_job *sched_job) · 24 unmodified lines
333324
334325 out:
335326 if (ret) {
336− amdxdna_pm_suspend_put(hwctx->client->xdna);
337327 dma_fence_put(job->fence);
338328 aie2_job_put(job);
339329 mmput(job->mm);
drivers/accel/amdxdna/amdxdna_ctx.c+10−0
@@ -17,6 +17,7 @@ · 16 unmodified lines
1717 #include "amdxdna_ctx.h"
1818 #include "amdxdna_gem.h"
1919 #include "amdxdna_pci_drv.h"
20+#include "amdxdna_pm.h"
2021
2122 #define MAX_HWCTX_ID 255
2223 #define MAX_ARG_COUNT 4095
@@ -445,6 +446,7 @@ put_shmem_bo: · 422 unmodified lines
445446 void amdxdna_sched_job_cleanup(struct amdxdna_sched_job *job)
446447 {
447448 trace_amdxdna_debug_point(job->hwctx->name, job->seq, "job release");
449+ amdxdna_pm_suspend_put(job->hwctx->client->xdna);
448450 amdxdna_arg_bos_put(job);
449451 amdxdna_gem_put_obj(job->cmd_bo);
450452 dma_fence_put(job->fence);
@@ -482,6 +484,12 @@ int amdxdna_cmd_submit(struct amdxdna_client *client, · 31 unmodified lines
482484 goto cmd_put;
483485 }
484486
487+ ret = amdxdna_pm_resume_get(xdna);
488+ if (ret) {
489+ XDNA_ERR(xdna, "Resume failed, ret %d", ret);
490+ goto put_bos;
491+ }
492+
485493 idx = srcu_read_lock(&client->hwctx_srcu);
486494 hwctx = xa_load(&client->hwctx_xa, hwctx_hdl);
487495 if (!hwctx) {
@@ -522,6 +530,8 @@ put_fence: · 34 unmodified lines
522530 dma_fence_put(job->fence);
523531 unlock_srcu:
524532 srcu_read_unlock(&client->hwctx_srcu, idx);
533+ amdxdna_pm_suspend_put(xdna);
534+put_bos:
525535 amdxdna_arg_bos_put(job);
526536 cmd_put:
527537 amdxdna_gem_put_obj(job->cmd_bo);
drivers/accel/ivpu/ivpu_hw_40xx_reg.h+0−6
@@ -121,12 +121,6 @@ · 120 unmodified lines
121121 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY 0x0003006cu
122122 #define VPU_50XX_HOST_SS_AON_PWR_ISLAND_STATUS_DLY_STATUS_DLY_MASK GENMASK(7, 0)
123123
124−#define VPU_40XX_HOST_SS_AON_RETENTION0 0x0003000cu
125−#define VPU_40XX_HOST_SS_AON_RETENTION1 0x00030010u
126−#define VPU_40XX_HOST_SS_AON_RETENTION2 0x00030014u
127−#define VPU_40XX_HOST_SS_AON_RETENTION3 0x00030018u
128−#define VPU_40XX_HOST_SS_AON_RETENTION4 0x0003001cu
129−
130124 #define VPU_40XX_HOST_SS_AON_IDLE_GEN 0x00030200u
131125 #define VPU_40XX_HOST_SS_AON_IDLE_GEN_EN_MASK BIT_MASK(0)
132126 #define VPU_40XX_HOST_SS_AON_IDLE_GEN_HW_PG_EN_MASK BIT_MASK(1)
drivers/accel/ivpu/ivpu_hw_ip.c+0−1
@@ -931,7 +931,6 @@ static int soc_cpu_boot_40xx(struct ivpu_device *vdev) · 930 unmodified lines
931931
932932 static int soc_cpu_boot_60xx(struct ivpu_device *vdev)
933933 {
934− REGV_WR64(VPU_40XX_HOST_SS_AON_RETENTION1, vdev->fw->mem_bp->vpu_addr);
935934 soc_cpu_set_entry_point_40xx(vdev, vdev->fw->cold_boot_entry_point);
936935
937936 return 0;
drivers/acpi/Kconfig+1−0
@@ -9,6 +9,7 @@ config ARCH_SUPPORTS_ACPI · 8 unmodified lines
99 menuconfig ACPI
1010 bool "ACPI (Advanced Configuration and Power Interface) Support"
1111 depends on ARCH_SUPPORTS_ACPI
12+ select AUXILIARY_BUS
1213 select PNP
1314 select NLS
1415 select CRC32
drivers/acpi/acpi_platform.c+1−1
@@ -135,7 +135,7 @@ struct platform_device *acpi_create_platform_device(struct acpi_device *adev, · 134 unmodified lines
135135 }
136136 }
137137
138− if (adev->device_type == ACPI_BUS_TYPE_DEVICE && !adev->pnp.type.backlight) {
138+ if (adev->device_type == ACPI_BUS_TYPE_DEVICE) {
139139 LIST_HEAD(resource_list);
140140
141141 count = acpi_dev_get_resources(adev, &resource_list, NULL, NULL);
drivers/acpi/acpi_processor.c+8−7
@@ -113,6 +113,10 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev) · 112 unmodified lines
113113 PCI_ANY_ID, PCI_ANY_ID, NULL);
114114 if (ide_dev) {
115115 errata.piix4.bmisx = pci_resource_start(ide_dev, 4);
116+ if (errata.piix4.bmisx)
117+ dev_dbg(&ide_dev->dev,
118+ "Bus master activity detection (BM-IDE) erratum enabled\n");
119+
116120 pci_dev_put(ide_dev);
117121 }
118122
@@ -131,20 +135,17 @@ static int acpi_processor_errata_piix4(struct pci_dev *dev) · 12 unmodified lines
131135 if (isa_dev) {
132136 pci_read_config_byte(isa_dev, 0x76, &value1);
133137 pci_read_config_byte(isa_dev, 0x77, &value2);
134− if ((value1 & 0x80) || (value2 & 0x80))
138+ if ((value1 & 0x80) || (value2 & 0x80)) {
135139 errata.piix4.fdma = 1;
140+ dev_dbg(&isa_dev->dev,
141+ "Type-F DMA livelock erratum (C3 disabled)\n");
142+ }
136143 pci_dev_put(isa_dev);
137144 }
138145
139146 break;
140147 }
141148
142− if (ide_dev)
143− dev_dbg(&ide_dev->dev, "Bus master activity detection (BM-IDE) erratum enabled\n");
144−
145− if (isa_dev)
146− dev_dbg(&isa_dev->dev, "Type-F DMA livelock erratum (C3 disabled)\n");
147−
148149 return 0;
149150 }
150151
drivers/acpi/acpi_video.c+22−23
@@ -9,6 +9,7 @@ · 8 unmodified lines
99
1010 #define pr_fmt(fmt) "ACPI: video: " fmt
1111
12+#include <linux/auxiliary_bus.h>
1213 #include <linux/kernel.h>
1314 #include <linux/module.h>
1415 #include <linux/init.h>
@@ -21,7 +22,6 @@ · 6 unmodified lines
2122 #include <linux/sort.h>
2223 #include <linux/pci.h>
2324 #include <linux/pci_ids.h>
24−#include <linux/platform_device.h>
2525 #include <linux/slab.h>
2626 #include <linux/dmi.h>
2727 #include <linux/suspend.h>
@@ -77,8 +77,9 @@ static int register_count; · 49 unmodified lines
7777 static DEFINE_MUTEX(register_count_mutex);
7878 static DEFINE_MUTEX(video_list_lock);
7979 static LIST_HEAD(video_bus_head);
80−static int acpi_video_bus_probe(struct platform_device *pdev);
81−static void acpi_video_bus_remove(struct platform_device *pdev);
80+static int acpi_video_bus_probe(struct auxiliary_device *aux_dev,
81+ const struct auxiliary_device_id *id);
82+static void acpi_video_bus_remove(struct auxiliary_device *aux);
8283 static void acpi_video_bus_notify(acpi_handle handle, u32 event, void *data);
8384
8485 /*
@@ -93,19 +94,16 @@ enum acpi_video_level_idx { · 8 unmodified lines
9394 ACPI_VIDEO_FIRST_LEVEL, /* actual supported levels begin here */
9495 };
9596
96−static const struct acpi_device_id video_device_ids[] = {
97− {ACPI_VIDEO_HID, 0},
98− {"", 0},
97+static const struct auxiliary_device_id video_bus_auxiliary_id_table[] = {
98+ { .name = "acpi.video_bus" },
99+ {},
99100 };
100−MODULE_DEVICE_TABLE(acpi, video_device_ids);
101+MODULE_DEVICE_TABLE(auxiliary, video_bus_auxiliary_id_table);
101102
102−static struct platform_driver acpi_video_bus = {
103+static struct auxiliary_driver acpi_video_bus = {
103104 .probe = acpi_video_bus_probe,
104105 .remove = acpi_video_bus_remove,
105− .driver = {
106− .name = "acpi-video",
107− .acpi_match_table = video_device_ids,
108− },
106+ .id_table = video_bus_auxiliary_id_table,
109107 };
110108
111109 struct acpi_video_bus_flags {
@@ -1885,7 +1883,7 @@ static void acpi_video_dev_add_notify_handler(struct acpi_video_device *device) · 1773 unmodified lines
18851883 }
18861884
18871885 static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video,
1888− struct platform_device *pdev)
1886+ struct device *parent)
18891887 {
18901888 struct input_dev *input;
18911889 struct acpi_video_device *dev;
@@ -1908,7 +1906,7 @@ static int acpi_video_bus_add_notify_handler(struct acpi_video_bus *video, · 16 unmodified lines
19081906 input->phys = video->phys;
19091907 input->id.bustype = BUS_HOST;
19101908 input->id.product = 0x06;
1911− input->dev.parent = &pdev->dev;
1909+ input->dev.parent = parent;
19121910 input->evbit[0] = BIT(EV_KEY);
19131911 set_bit(KEY_SWITCHVIDEOMODE, input->keybit);
19141912 set_bit(KEY_VIDEO_NEXT, input->keybit);
@@ -1980,9 +1978,10 @@ static int acpi_video_bus_put_devices(struct acpi_video_bus *video) · 65 unmodified lines
19801978
19811979 static int instance;
19821980
1983−static int acpi_video_bus_probe(struct platform_device *pdev)
1981+static int acpi_video_bus_probe(struct auxiliary_device *aux_dev,
1982+ const struct auxiliary_device_id *id_unused)
19841983 {
1985− struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
1984+ struct acpi_device *device = ACPI_COMPANION(&aux_dev->dev);
19861985 struct acpi_video_bus *video;
19871986 bool auto_detect;
19881987 int error;
@@ -2019,7 +2018,7 @@ static int acpi_video_bus_probe(struct platform_device *pdev) · 30 unmodified lines
20192018 instance++;
20202019 }
20212020
2022− platform_set_drvdata(pdev, video);
2021+ auxiliary_set_drvdata(aux_dev, video);
20232022
20242023 video->device = device;
20252024 strscpy(acpi_device_name(device), ACPI_VIDEO_BUS_NAME);
@@ -2068,7 +2067,7 @@ static int acpi_video_bus_probe(struct platform_device *pdev) · 42 unmodified lines
20682067 !auto_detect)
20692068 acpi_video_bus_register_backlight(video);
20702069
2071− error = acpi_video_bus_add_notify_handler(video, pdev);
2070+ error = acpi_video_bus_add_notify_handler(video, &aux_dev->dev);
20722071 if (error)
20732072 goto err_del;
20742073
@@ -2096,10 +2095,10 @@ err_free_video: · 21 unmodified lines
20962095 return error;
20972096 }
20982097
2099−static void acpi_video_bus_remove(struct platform_device *pdev)
2098+static void acpi_video_bus_remove(struct auxiliary_device *aux_dev)
21002099 {
2101− struct acpi_video_bus *video = platform_get_drvdata(pdev);
2102− struct acpi_device *device = ACPI_COMPANION(&pdev->dev);
2100+ struct acpi_video_bus *video = auxiliary_get_drvdata(aux_dev);
2101+ struct acpi_device *device = ACPI_COMPANION(&aux_dev->dev);
21032102
21042103 acpi_dev_remove_notify_handler(device, ACPI_DEVICE_NOTIFY,
21052104 acpi_video_bus_notify);
@@ -2163,7 +2162,7 @@ int acpi_video_register(void) · 57 unmodified lines
21632162
21642163 dmi_check_system(video_dmi_table);
21652164
2166− ret = platform_driver_register(&acpi_video_bus);
2165+ ret = auxiliary_driver_register(&acpi_video_bus);
21672166 if (ret)
21682167 goto leave;
21692168
@@ -2183,7 +2182,7 @@ void acpi_video_unregister(void) · 13 unmodified lines
21832182 {
21842183 mutex_lock(&register_count_mutex);
21852184 if (register_count) {
2186− platform_driver_unregister(&acpi_video_bus);
2185+ auxiliary_driver_unregister(&acpi_video_bus);
21872186 register_count = 0;
21882187 may_report_brightness_keys = false;
21892188 }
drivers/acpi/acpica/acpredef.h+1−1
@@ -451,7 +451,7 @@ const union acpi_predefined_info acpi_gbl_predefined_methods[] = { · 450 unmodified lines
451451
452452 {{"_DSM",
453453 METHOD_4ARGS(ACPI_TYPE_BUFFER, ACPI_TYPE_INTEGER, ACPI_TYPE_INTEGER,
454− ACPI_TYPE_ANY | ACPI_TYPE_PACKAGE) |
454+ ACPI_TYPE_PACKAGE | ACPI_TYPE_ANY) |
455455 ARG_COUNT_IS_MINIMUM,
456456 METHOD_RETURNS(ACPI_RTYPE_ALL)}}, /* Must return a value, but it can be of any type */
457457
drivers/acpi/bus.c+0−3
@@ -818,9 +818,6 @@ const struct acpi_device *acpi_companion_match(const struct device *dev) · 817 unmodified lines
818818 if (list_empty(&adev->pnp.ids))
819819 return NULL;
820820
821− if (adev->pnp.type.backlight)
822− return adev;
823−
824821 return acpi_primary_dev_companion(adev, dev);
825822 }
826823
drivers/acpi/osl.c+1−1
@@ -1681,7 +1681,7 @@ acpi_status __init acpi_os_initialize(void) · 1680 unmodified lines
16811681 * Use acpi_os_map_generic_address to pre-map the reset
16821682 * register if it's in system memory.
16831683 */
1684− void *rv;
1684+ void __iomem *rv;
16851685
16861686 rv = acpi_os_map_generic_address(&acpi_gbl_FADT.reset_register);
16871687 pr_debug("%s: Reset register mapping %s\n", __func__,
drivers/acpi/scan.c+45−0
@@ -6,6 +6,7 @@ · 5 unmodified lines
66 #define pr_fmt(fmt) "ACPI: " fmt
77
88 #include <linux/async.h>
9+#include <linux/auxiliary_bus.h>
910 #include <linux/module.h>
1011 #include <linux/init.h>
1112 #include <linux/slab.h>
@@ -2192,6 +2193,44 @@ static acpi_status acpi_bus_check_add_2(acpi_handle handle, u32 lvl_not_used, · 2180 unmodified lines
21922193 return acpi_bus_check_add(handle, false, (struct acpi_device **)ret_p);
21932194 }
21942195
2196+static void acpi_video_bus_device_release(struct device *dev)
2197+{
2198+ struct auxiliary_device *aux_dev = to_auxiliary_dev(dev);
2199+
2200+ kfree(aux_dev);
2201+}
2202+
2203+static void acpi_create_video_bus_device(struct acpi_device *adev,
2204+ struct acpi_device *parent)
2205+{
2206+ struct auxiliary_device *aux_dev;
2207+ static unsigned int aux_dev_id;
2208+
2209+ aux_dev = kzalloc_obj(*aux_dev);
2210+ if (!aux_dev)
2211+ return;
2212+
2213+ aux_dev->id = aux_dev_id++;
2214+ aux_dev->name = "video_bus";
2215+ aux_dev->dev.parent = acpi_get_first_physical_node(parent);
2216+ if (!aux_dev->dev.parent)
2217+ goto err;
2218+
2219+ aux_dev->dev.release = acpi_video_bus_device_release;
2220+
2221+ if (auxiliary_device_init(aux_dev))
2222+ goto err;
2223+
2224+ ACPI_COMPANION_SET(&aux_dev->dev, adev);
2225+ if (__auxiliary_device_add(aux_dev, "acpi"))
2226+ auxiliary_device_uninit(aux_dev);
2227+
2228+ return;
2229+
2230+err:
2231+ kfree(aux_dev);
2232+}
2233+
21952234 struct acpi_scan_system_dev {
21962235 struct list_head node;
21972236 struct acpi_device *adev;
@@ -2229,6 +2268,12 @@ static void acpi_default_enumeration(struct acpi_device *device) · 31 unmodified lines
22292268 sd->adev = device;
22302269 list_add_tail(&sd->node, &acpi_scan_system_dev_list);
22312270 }
2271+ } else if (device->pnp.type.backlight) {
2272+ struct acpi_device *parent;
2273+
2274+ parent = acpi_dev_parent(device);
2275+ if (parent)
2276+ acpi_create_video_bus_device(device, parent);
22322277 } else {
22332278 /* For a regular device object, create a platform device. */
22342279 acpi_create_platform_device(device, NULL);
drivers/android/binder/page_range.rs+64−20
@@ -142,6 +142,30 @@ pub(crate) struct ShrinkablePageRange { · 141 unmodified lines
142142 _pin: PhantomPinned,
143143 }
144144
145+// We do not define any ops. For now, used only to check identity of vmas.
146+static BINDER_VM_OPS: bindings::vm_operations_struct = pin_init::zeroed();
147+
148+// To ensure that we do not accidentally install pages into or zap pages from the wrong vma, we
149+// check its vm_ops and private data before using it.
150+fn check_vma(vma: &virt::VmaRef, owner: *const ShrinkablePageRange) -> Option<&virt::VmaMixedMap> {
151+ // SAFETY: Just reading the vm_ops pointer of any active vma is safe.
152+ let vm_ops = unsafe { (*vma.as_ptr()).vm_ops };
153+ if !ptr::eq(vm_ops, &BINDER_VM_OPS) {
154+ return None;
155+ }
156+
157+ // SAFETY: Reading the vm_private_data pointer of a binder-owned vma is safe.
158+ let vm_private_data = unsafe { (*vma.as_ptr()).vm_private_data };
159+ // The ShrinkablePageRange is only dropped when the Process is dropped, which only happens once
160+ // the file's ->release handler is invoked, which means the ShrinkablePageRange outlives any
161+ // VMA associated with it, so there can't be any false positives due to pointer reuse here.
162+ if !ptr::eq(vm_private_data, owner.cast()) {
163+ return None;
164+ }
165+
166+ vma.as_mixedmap_vma()
167+}
168+
145169 struct Inner {
146170 /// Array of pages.
147171 ///
@@ -308,6 +332,18 @@ impl ShrinkablePageRange { · 160 unmodified lines
308332 inner.size = num_pages;
309333 inner.vma_addr = vma.start();
310334
335+ // This pointer is only used for comparison - it's not dereferenced.
336+ //
337+ // SAFETY: We own the vma, and we don't use any methods on VmaNew that rely on
338+ // `vm_private_data`.
339+ unsafe {
340+ (*vma.as_ptr()).vm_private_data = ptr::from_ref(self).cast_mut().cast::<c_void>()
341+ };
342+
343+ // SAFETY: We own the vma, and we don't use any methods on VmaNew that rely on
344+ // `vm_ops`.
345+ unsafe { (*vma.as_ptr()).vm_ops = &BINDER_VM_OPS };
346+
311347 Ok(num_pages)
312348 }
313349
@@ -399,22 +435,25 @@ impl ShrinkablePageRange { · 85 unmodified lines
399435 //
400436 // Using `mmput_async` avoids this, because then the `mm` cleanup is instead queued to a
401437 // workqueue.
402− MmWithUser::into_mmput_async(self.mm.mmget_not_zero().ok_or(ESRCH)?)
403− .mmap_read_lock()
404− .vma_lookup(vma_addr)
405− .ok_or(ESRCH)?
406− .as_mixedmap_vma()
407− .ok_or(ESRCH)?
408− .vm_insert_page(user_page_addr, &new_page)
409− .inspect_err(|err| {
410− pr_warn!(
411− "Failed to vm_insert_page({}): vma_addr:{} i:{} err:{:?}",
412− user_page_addr,
413− vma_addr,
414− i,
415− err
416− )
417− })?;
438+ let mm = MmWithUser::into_mmput_async(self.mm.mmget_not_zero().ok_or(ESRCH)?);
439+ {
440+ let vma_read;
441+ let mmap_read;
442+ let vma = if let Some(ret) = mm.lock_vma_under_rcu(vma_addr) {
443+ vma_read = ret;
444+ check_vma(&vma_read, self)
445+ } else {
446+ mmap_read = mm.mmap_read_lock();
447+ mmap_read
448+ .vma_lookup(vma_addr)
449+ .and_then(|vma| check_vma(vma, self))
450+ };
451+
452+ match vma {
453+ Some(vma) => vma.vm_insert_page(user_page_addr, &new_page)?,
454+ None => return Err(ESRCH),
455+ }
456+ }
418457
419458 let inner = self.lock.lock();
420459
@@ -667,12 +706,15 @@ unsafe extern "C" fn rust_shrink_free_page( · 246 unmodified lines
667706 let mmap_read;
668707 let mm_mutex;
669708 let vma_addr;
709+ let range_ptr;
670710
671711 {
672712 // CAST: The `list_head` field is first in `PageInfo`.
673713 let info = item as *mut PageInfo;
674714 // SAFETY: The `range` field of `PageInfo` is immutable.
675− let range = unsafe { &*((*info).range) };
715+ range_ptr = unsafe { (*info).range };
716+ // SAFETY: The `range` outlives its `PageInfo` values.
717+ let range = unsafe { &*range_ptr };
676718
677719 mm = match range.mm.mmget_not_zero() {
678720 Some(mm) => MmWithUser::into_mmput_async(mm),
@@ -717,9 +759,11 @@ unsafe extern "C" fn rust_shrink_free_page( · 38 unmodified lines
717759 // SAFETY: The lru lock is locked when this method is called.
718760 unsafe { bindings::spin_unlock(&raw mut (*lru).lock) };
719761
720− if let Some(vma) = mmap_read.vma_lookup(vma_addr) {
721− let user_page_addr = vma_addr + (page_index << PAGE_SHIFT);
722− vma.zap_page_range_single(user_page_addr, PAGE_SIZE);
762+ if let Some(unchecked_vma) = mmap_read.vma_lookup(vma_addr) {
763+ if let Some(vma) = check_vma(unchecked_vma, range_ptr) {
764+ let user_page_addr = vma_addr + (page_index << PAGE_SHIFT);
765+ vma.zap_page_range_single(user_page_addr, PAGE_SIZE);
766+ }
723767 }
724768
725769 drop(mmap_read);
drivers/android/binder/process.rs+2−1
@@ -1295,7 +1295,8 @@ impl Process { · 1294 unmodified lines
12951295 }
12961296
12971297 pub(crate) fn dead_binder_done(&self, cookie: u64, thread: &Thread) {
1298− if let Some(death) = self.inner.lock().pull_delivered_death(cookie) {
1298+ let death = self.inner.lock().pull_delivered_death(cookie);
1299+ if let Some(death) = death {
12991300 death.set_notification_done(thread);
13001301 }
13011302 }
drivers/android/binder/range_alloc/array.rs+33−2
@@ -118,7 +118,7 @@ impl<T> ArrayRangeAllocator<T> { · 117 unmodified lines
118118 size: usize,
119119 is_oneway: bool,
120120 pid: Pid,
121− ) -> Result<usize> {
121+ ) -> Result<(usize, bool)> {
122122 // Compute new value of free_oneway_space, which is set only on success.
123123 let new_oneway_space = if is_oneway {
124124 match self.free_oneway_space.checked_sub(size) {
@@ -146,7 +146,38 @@ impl<T> ArrayRangeAllocator<T> { · 21 unmodified lines
146146 .ok()
147147 .unwrap();
148148
149− Ok(insert_at_offset)
149+ // Start detecting spammers once we have less than 20%
150+ // of async space left (which is less than 10% of total
151+ // buffer size).
152+ //
153+ // (This will short-circuit, so `low_oneway_space` is
154+ // only called when necessary.)
155+ let oneway_spam_detected =
156+ is_oneway && new_oneway_space < self.size / 10 && self.low_oneway_space(pid);
157+
158+ Ok((insert_at_offset, oneway_spam_detected))
159+ }
160+
161+ /// Find the amount and size of buffers allocated by the current caller.
162+ ///
163+ /// The idea is that once we cross the threshold, whoever is responsible
164+ /// for the low async space is likely to try to send another async transaction,
165+ /// and at some point we'll catch them in the act. This is more efficient
166+ /// than keeping a map per pid.
167+ fn low_oneway_space(&self, calling_pid: Pid) -> bool {
168+ let mut total_alloc_size = 0;
169+ let mut num_buffers = 0;
170+
171+ // Warn if this pid has more than 50 transactions, or more than 50% of
172+ // async space (which is 25% of total buffer size). Oneway spam is only
173+ // detected when the threshold is exceeded.
174+ for range in &self.ranges {
175+ if range.state.is_oneway() && range.state.pid() == calling_pid {
176+ total_alloc_size += range.size;
177+ num_buffers += 1;
178+ }
179+ }
180+ num_buffers > 50 || total_alloc_size > self.size / 4
150181 }
151182
152183 pub(crate) fn reservation_abort(&mut self, offset: usize) -> Result<FreedRange> {
drivers/android/binder/range_alloc/mod.rs+2−2
@@ -188,11 +188,11 @@ impl<T> RangeAllocator<T> { · 187 unmodified lines
188188 self.reserve_new(args)
189189 }
190190 Impl::Array(array) => {
191− let offset =
191+ let (offset, oneway_spam_detected) =
192192 array.reserve_new(args.debug_id, args.size, args.is_oneway, args.pid)?;
193193 Ok(ReserveNew::Success(ReserveNewSuccess {
194194 offset,
195− oneway_spam_detected: false,
195+ oneway_spam_detected,
196196 _empty_array_alloc: args.empty_array_alloc,
197197 _new_tree_alloc: args.new_tree_alloc,
198198 _tree_alloc: args.tree_alloc,
drivers/android/binder/range_alloc/tree.rs+9−9
@@ -164,15 +164,6 @@ impl<T> TreeRangeAllocator<T> { · 163 unmodified lines
164164 self.free_oneway_space
165165 };
166166
167− // Start detecting spammers once we have less than 20%
168− // of async space left (which is less than 10% of total
169− // buffer size).
170− //
171− // (This will short-circut, so `low_oneway_space` is
172− // only called when necessary.)
173− let oneway_spam_detected =
174− is_oneway && new_oneway_space < self.size / 10 && self.low_oneway_space(pid);
175−
176167 let (found_size, found_off, tree_node, free_tree_node) = match self.find_best_match(size) {
177168 None => {
178169 pr_warn!("ENOSPC from range_alloc.reserve_new - size: {}", size);
@@ -203,6 +194,15 @@ impl<T> TreeRangeAllocator<T> { · 24 unmodified lines
203194 self.free_tree.insert(free_tree_node);
204195 }
205196
197+ // Start detecting spammers once we have less than 20%
198+ // of async space left (which is less than 10% of total
199+ // buffer size).
200+ //
201+ // (This will short-circuit, so `low_oneway_space` is
202+ // only called when necessary.)
203+ let oneway_spam_detected =
204+ is_oneway && new_oneway_space < self.size / 10 && self.low_oneway_space(pid);
205+
206206 Ok((found_off, oneway_spam_detected))
207207 }
208208
drivers/android/binder/thread.rs+6−11
@@ -1015,12 +1015,9 @@ impl Thread { · 1014 unmodified lines
10151015
10161016 // Copy offsets if there are any.
10171017 if offsets_size > 0 {
1018− {
1019− let mut reader =
1020− UserSlice::new(UserPtr::from_addr(trd_data_ptr.offsets as _), offsets_size)
1021− .reader();
1022− alloc.copy_into(&mut reader, aligned_data_size, offsets_size)?;
1023− }
1018+ let mut offsets_reader =
1019+ UserSlice::new(UserPtr::from_addr(trd_data_ptr.offsets as _), offsets_size)
1020+ .reader();
10241021
10251022 let offsets_start = aligned_data_size;
10261023 let offsets_end = aligned_data_size + offsets_size;
@@ -1041,11 +1038,9 @@ impl Thread { · 14 unmodified lines
10411038 .step_by(size_of::<u64>())
10421039 .enumerate()
10431040 {
1044− let offset: usize = view
1045− .alloc
1046− .read::<u64>(index_offset)?
1047− .try_into()
1048− .map_err(|_| EINVAL)?;
1041+ let offset = offsets_reader.read::<u64>()?;
1042+ view.alloc.write(index_offset, &offset)?;
1043+ let offset: usize = offset.try_into().map_err(|_| EINVAL)?;
10491044
10501045 if offset < end_of_previous_object || !is_aligned(offset, size_of::<u32>()) {
10511046 pr_warn!("Got transaction with invalid offset.");
drivers/base/power/runtime.c+1−0
@@ -1895,6 +1895,7 @@ void pm_runtime_reinit(struct device *dev) · 1894 unmodified lines
18951895 void pm_runtime_remove(struct device *dev)
18961896 {
18971897 __pm_runtime_disable(dev, false);
1898+ flush_work(&dev->power.work);
18981899 pm_runtime_reinit(dev);
18991900 }
19001901
drivers/block/ublk_drv.c+12−4
@@ -4443,7 +4443,9 @@ static int ublk_ctrl_start_dev(struct ublk_device *ub, · 4442 unmodified lines
44434443
44444444 /* Skip partition scan if disabled by user */
44454445 if (ub->dev_info.flags & UBLK_F_NO_AUTO_PART_SCAN) {
4446− clear_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
4446+ /* Not clear for unprivileged daemons, see comment above */
4447+ if (!ub->unprivileged_daemons)
4448+ clear_bit(GD_SUPPRESS_PART_SCAN, &disk->state);
44474449 } else {
44484450 /* Schedule async partition scan for trusted daemons */
44494451 if (!ub->unprivileged_daemons)
@@ -5006,15 +5008,22 @@ static int ublk_ctrl_get_features(const struct ublksrv_ctrl_cmd *header) · 556 unmodified lines
50065008 return 0;
50075009 }
50085010
5009−static void ublk_ctrl_set_size(struct ublk_device *ub, const struct ublksrv_ctrl_cmd *header)
5011+static int ublk_ctrl_set_size(struct ublk_device *ub, const struct ublksrv_ctrl_cmd *header)
50105012 {
50115013 struct ublk_param_basic *p = &ub->params.basic;
50125014 u64 new_size = header->data[0];
5015+ int ret = 0;
50135016
50145017 mutex_lock(&ub->mutex);
5018+ if (!ub->ub_disk) {
5019+ ret = -ENODEV;
5020+ goto out;
5021+ }
50155022 p->dev_sectors = new_size;
50165023 set_capacity_and_notify(ub->ub_disk, p->dev_sectors);
5024+out:
50175025 mutex_unlock(&ub->mutex);
5026+ return ret;
50185027 }
50195028
50205029 struct count_busy {
@@ -5335,8 +5344,7 @@ static int ublk_ctrl_uring_cmd(struct io_uring_cmd *cmd, · 314 unmodified lines
53355344 ret = ublk_ctrl_end_recovery(ub, &header);
53365345 break;
53375346 case UBLK_CMD_UPDATE_SIZE:
5338− ublk_ctrl_set_size(ub, &header);
5339− ret = 0;
5347+ ret = ublk_ctrl_set_size(ub, &header);
53405348 break;
53415349 case UBLK_CMD_QUIESCE_DEV:
53425350 ret = ublk_ctrl_quiesce_dev(ub, &header);
drivers/bluetooth/btqca.c+2−0
@@ -787,6 +787,8 @@ int qca_uart_setup(struct hci_dev *hdev, uint8_t baudrate, · 786 unmodified lines
787787 */
788788 if (soc_type == QCA_WCN3988)
789789 rom_ver = ((soc_ver & 0x00000f00) >> 0x05) | (soc_ver & 0x0000000f);
790+ else if (soc_type == QCA_WCN3998)
791+ rom_ver = ((soc_ver & 0x0000f000) >> 0x07) | (soc_ver & 0x0000000f);
790792 else
791793 rom_ver = ((soc_ver & 0x00000f00) >> 0x04) | (soc_ver & 0x0000000f);
792794
drivers/cache/ax45mp_cache.c+2−2
@@ -178,11 +178,11 @@ static const struct of_device_id ax45mp_cache_ids[] = { · 177 unmodified lines
178178
179179 static int __init ax45mp_cache_init(void)
180180 {
181− struct device_node *np;
182181 struct resource res;
183182 int ret;
184183
185− np = of_find_matching_node(NULL, ax45mp_cache_ids);
184+ struct device_node *np __free(device_node) =
185+ of_find_matching_node(NULL, ax45mp_cache_ids);
186186 if (!of_device_is_available(np))
187187 return -ENODEV;
188188
drivers/cache/starfive_starlink_cache.c+2−2
@@ -102,11 +102,11 @@ static const struct of_device_id starlink_cache_ids[] = { · 101 unmodified lines
102102
103103 static int __init starlink_cache_init(void)
104104 {
105− struct device_node *np;
106105 u32 block_size;
107106 int ret;
108107
109− np = of_find_matching_node(NULL, starlink_cache_ids);
108+ struct device_node *np __free(device_node) =
109+ of_find_matching_node(NULL, starlink_cache_ids);
110110 if (!of_device_is_available(np))
111111 return -ENODEV;
112112
drivers/cpuidle/cpuidle.c+0−10
@@ -359,16 +359,6 @@ noinstr int cpuidle_enter_state(struct cpuidle_device *dev, · 358 unmodified lines
359359 int cpuidle_select(struct cpuidle_driver *drv, struct cpuidle_device *dev,
360360 bool *stop_tick)
361361 {
362− /*
363− * If there is only a single idle state (or none), there is nothing
364− * meaningful for the governor to choose. Skip the governor and
365− * always use state 0 with the tick running.
366− */
367− if (drv->state_count <= 1) {
368− *stop_tick = false;
369− return 0;
370− }
371−
372362 return cpuidle_curr_governor->select(drv, dev, stop_tick);
373363 }
374364
drivers/crypto/ccp/sev-dev.c+1−3
@@ -2408,10 +2408,8 @@ static int sev_ioctl_do_snp_platform_status(struct sev_issue_cmd *argp) · 2407 unmodified lines
24082408 * in Firmware state on failure. Use snp_reclaim_pages() to
24092409 * transition either case back to Hypervisor-owned state.
24102410 */
2411− if (snp_reclaim_pages(__pa(data), 1, true)) {
2412− snp_leak_pages(__page_to_pfn(status_page), 1);
2411+ if (snp_reclaim_pages(__pa(data), 1, true))
24132412 return -EFAULT;
2414− }
24152413 }
24162414
24172415 if (ret)
drivers/crypto/padlock-sha.c+7−0
@@ -332,6 +332,13 @@ static int __init padlock_init(void) · 331 unmodified lines
332332 if (!x86_match_cpu(padlock_sha_ids) || !boot_cpu_has(X86_FEATURE_PHE_EN))
333333 return -ENODEV;
334334
335+ /*
336+ * Skip family 0x07 and newer used by Zhaoxin processors,
337+ * as the driver's self-tests fail on these CPUs.
338+ */
339+ if (c->x86 >= 0x07)
340+ return -ENODEV;
341+
335342 /* Register the newly added algorithm module if on *
336343 * VIA Nano processor, or else just do as before */
337344 if (c->x86_model < 0x0f) {
drivers/firewire/net.c+3−2
@@ -257,9 +257,10 @@ static void fwnet_header_cache_update(struct hh_cache *hh, · 256 unmodified lines
257257 memcpy((u8 *)hh->hh_data + HH_DATA_OFF(FWNET_HLEN), haddr, net->addr_len);
258258 }
259259
260−static int fwnet_header_parse(const struct sk_buff *skb, unsigned char *haddr)
260+static int fwnet_header_parse(const struct sk_buff *skb, const struct net_device *dev,
261+ unsigned char *haddr)
261262 {
262− memcpy(haddr, skb->dev->dev_addr, FWNET_ALEN);
263+ memcpy(haddr, dev->dev_addr, FWNET_ALEN);
263264
264265 return FWNET_ALEN;
265266 }
drivers/firmware/arm_ffa/driver.c+4−4
@@ -205,12 +205,12 @@ static int ffa_rxtx_map(phys_addr_t tx_buf, phys_addr_t rx_buf, u32 pg_cnt) · 204 unmodified lines
205205 return 0;
206206 }
207207
208−static int ffa_rxtx_unmap(u16 vm_id)
208+static int ffa_rxtx_unmap(void)
209209 {
210210 ffa_value_t ret;
211211
212212 invoke_ffa_fn((ffa_value_t){
213− .a0 = FFA_RXTX_UNMAP, .a1 = PACK_TARGET_INFO(vm_id, 0),
213+ .a0 = FFA_RXTX_UNMAP,
214214 }, &ret);
215215
216216 if (ret.a0 == FFA_ERROR)
@@ -2097,7 +2097,7 @@ static int __init ffa_init(void) · 1880 unmodified lines
20972097
20982098 pr_err("failed to setup partitions\n");
20992099 ffa_notifications_cleanup();
2100− ffa_rxtx_unmap(drv_info->vm_id);
2100+ ffa_rxtx_unmap();
21012101 free_pages:
21022102 if (drv_info->tx_buffer)
21032103 free_pages_exact(drv_info->tx_buffer, rxtx_bufsz);
@@ -2112,7 +2112,7 @@ static void __exit ffa_exit(void) · 8 unmodified lines
21122112 {
21132113 ffa_notifications_cleanup();
21142114 ffa_partitions_cleanup();
2115− ffa_rxtx_unmap(drv_info->vm_id);
2115+ ffa_rxtx_unmap();
21162116 free_pages_exact(drv_info->tx_buffer, drv_info->rxtx_bufsz);
21172117 free_pages_exact(drv_info->rx_buffer, drv_info->rxtx_bufsz);
21182118 kfree(drv_info);
drivers/firmware/arm_scmi/notify.c+2−2
@@ -1066,7 +1066,7 @@ static int scmi_register_event_handler(struct scmi_notify_instance *ni, · 1065 unmodified lines
10661066 * since at creation time we usually want to have all setup and ready before
10671067 * events really start flowing.
10681068 *
1069− * Return: A properly refcounted handler on Success, NULL on Failure
1069+ * Return: A properly refcounted handler on Success, ERR_PTR on Failure
10701070 */
10711071 static inline struct scmi_event_handler *
10721072 __scmi_event_handler_get_ops(struct scmi_notify_instance *ni,
@@ -1113,7 +1113,7 @@ __scmi_event_handler_get_ops(struct scmi_notify_instance *ni, · 40 unmodified lines
11131113 }
11141114 mutex_unlock(&ni->pending_mtx);
11151115
1116− return hndl;
1116+ return hndl ?: ERR_PTR(-ENODEV);
11171117 }
11181118
11191119 static struct scmi_event_handler *
drivers/firmware/arm_scmi/protocols.h+2−2
@@ -189,13 +189,13 @@ struct scmi_protocol_handle { · 188 unmodified lines
189189
190190 /**
191191 * struct scmi_iterator_state - Iterator current state descriptor
192− * @desc_index: Starting index for the current mulit-part request.
192+ * @desc_index: Starting index for the current multi-part request.
193193 * @num_returned: Number of returned items in the last multi-part reply.
194194 * @num_remaining: Number of remaining items in the multi-part message.
195195 * @max_resources: Maximum acceptable number of items, configured by the caller
196196 * depending on the underlying resources that it is querying.
197197 * @loop_idx: The iterator loop index in the current multi-part reply.
198− * @rx_len: Size in bytes of the currenly processed message; it can be used by
198+ * @rx_len: Size in bytes of the currently processed message; it can be used by
199199 * the user of the iterator to verify a reply size.
200200 * @priv: Optional pointer to some additional state-related private data setup
201201 * by the caller during the iterations.
drivers/firmware/arm_scpi.c+3−2
@@ -18,6 +18,7 @@ · 17 unmodified lines
1818
1919 #include <linux/bitmap.h>
2020 #include <linux/bitfield.h>
21+#include <linux/cleanup.h>
2122 #include <linux/device.h>
2223 #include <linux/err.h>
2324 #include <linux/export.h>
@@ -940,13 +941,13 @@ static int scpi_probe(struct platform_device *pdev) · 916 unmodified lines
940941 int idx = scpi_drvinfo->num_chans;
941942 struct scpi_chan *pchan = scpi_drvinfo->channels + idx;
942943 struct mbox_client *cl = &pchan->cl;
943− struct device_node *shmem = of_parse_phandle(np, "shmem", idx);
944+ struct device_node *shmem __free(device_node) =
945+ of_parse_phandle(np, "shmem", idx);
944946
945947 if (!of_match_node(shmem_of_match, shmem))
946948 return -ENXIO;
947949
948950 ret = of_address_to_resource(shmem, 0, &res);
949− of_node_put(shmem);
950951 if (ret) {
951952 dev_err(dev, "failed to get SCPI payload mem resource\n");
952953 return ret;
drivers/firmware/cirrus/cs_dsp.c+18−6
@@ -1610,11 +1610,17 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware, · 1609 unmodified lines
16101610 region_name);
16111611
16121612 if (reg) {
1613+ /*
1614+ * Although we expect the underlying bus does not require
1615+ * physically-contiguous buffers, we pessimistically use
1616+ * a temporary buffer instead of trusting that the
1617+ * alignment of region->data is ok.
1618+ */
16131619 region_len = le32_to_cpu(region->len);
16141620 if (region_len > buf_len) {
16151621 buf_len = round_up(region_len, PAGE_SIZE);
1616− kfree(buf);
1617− buf = kmalloc(buf_len, GFP_KERNEL | GFP_DMA);
1622+ vfree(buf);
1623+ buf = vmalloc(buf_len);
16181624 if (!buf) {
16191625 ret = -ENOMEM;
16201626 goto out_fw;
@@ -1643,7 +1649,7 @@ static int cs_dsp_load(struct cs_dsp *dsp, const struct firmware *firmware, · 22 unmodified lines
16431649
16441650 ret = 0;
16451651 out_fw:
1646− kfree(buf);
1652+ vfree(buf);
16471653
16481654 if (ret == -EOVERFLOW)
16491655 cs_dsp_err(dsp, "%s: file content overflows file data\n", file);
@@ -2331,11 +2337,17 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware · 681 unmodified lines
23312337 }
23322338
23332339 if (reg) {
2340+ /*
2341+ * Although we expect the underlying bus does not require
2342+ * physically-contiguous buffers, we pessimistically use
2343+ * a temporary buffer instead of trusting that the
2344+ * alignment of blk->data is ok.
2345+ */
23342346 region_len = le32_to_cpu(blk->len);
23352347 if (region_len > buf_len) {
23362348 buf_len = round_up(region_len, PAGE_SIZE);
2337− kfree(buf);
2338− buf = kmalloc(buf_len, GFP_KERNEL | GFP_DMA);
2349+ vfree(buf);
2350+ buf = vmalloc(buf_len);
23392351 if (!buf) {
23402352 ret = -ENOMEM;
23412353 goto out_fw;
@@ -2366,7 +2378,7 @@ static int cs_dsp_load_coeff(struct cs_dsp *dsp, const struct firmware *firmware · 24 unmodified lines
23662378
23672379 ret = 0;
23682380 out_fw:
2369− kfree(buf);
2381+ vfree(buf);
23702382
23712383 if (ret == -EOVERFLOW)
23722384 cs_dsp_err(dsp, "%s: file content overflows file data\n", file);
drivers/firmware/stratix10-rsu.c+2−0
@@ -768,7 +768,9 @@ static int stratix10_rsu_probe(struct platform_device *pdev) · 767 unmodified lines
768768 rsu_async_status_callback);
769769 if (ret) {
770770 dev_err(dev, "Error, getting RSU status %i\n", ret);
771+ stratix10_svc_remove_async_client(priv->chan);
771772 stratix10_svc_free_channel(priv->chan);
773+ return ret;
772774 }
773775
774776 /* get DCMF version from firmware */
drivers/firmware/stratix10-svc.c+126−102
@@ -37,15 +37,14 @@ · 36 unmodified lines
3737 * service layer will return error to FPGA manager when timeout occurs,
3838 * timeout is set to 30 seconds (30 * 1000) at Intel Stratix10 SoC.
3939 */
40−#define SVC_NUM_DATA_IN_FIFO 32
40+#define SVC_NUM_DATA_IN_FIFO 8
4141 #define SVC_NUM_CHANNEL 4
42−#define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS 200
42+#define FPGA_CONFIG_DATA_CLAIM_TIMEOUT_MS 2000
4343 #define FPGA_CONFIG_STATUS_TIMEOUT_SEC 30
4444 #define BYTE_TO_WORD_SIZE 4
4545
4646 /* stratix10 service layer clients */
4747 #define STRATIX10_RSU "stratix10-rsu"
48−#define INTEL_FCS "intel-fcs"
4948
5049 /* Maximum number of SDM client IDs. */
5150 #define MAX_SDM_CLIENT_IDS 16
@@ -105,11 +104,9 @@ struct stratix10_svc_chan; · 53 unmodified lines
105104 /**
106105 * struct stratix10_svc - svc private data
107106 * @stratix10_svc_rsu: pointer to stratix10 RSU device
108− * @intel_svc_fcs: pointer to the FCS device
109107 */
110108 struct stratix10_svc {
111109 struct platform_device *stratix10_svc_rsu;
112− struct platform_device *intel_svc_fcs;
113110 };
114111
115112 /**
@@ -251,12 +248,10 @@ struct stratix10_async_ctrl { · 135 unmodified lines
251248 * @num_active_client: number of active service client
252249 * @node: list management
253250 * @genpool: memory pool pointing to the memory region
254− * @task: pointer to the thread task which handles SMC or HVC call
255− * @svc_fifo: a queue for storing service message data
256251 * @complete_status: state for completion
257− * @svc_fifo_lock: protect access to service message data queue
258252 * @invoke_fn: function to issue secure monitor call or hypervisor call
259253 * @svc: manages the list of client svc drivers
254+ * @sdm_lock: only allows a single command single response to SDM
260255 * @actrl: async control structure
261256 *
262257 * This struct is used to create communication channels for service clients, to
@@ -269,12 +264,10 @@ struct stratix10_svc_controller { · 6 unmodified lines
269264 int num_active_client;
270265 struct list_head node;
271266 struct gen_pool *genpool;
272− struct task_struct *task;
273− struct kfifo svc_fifo;
274267 struct completion complete_status;
275− spinlock_t svc_fifo_lock;
276268 svc_invoke_fn *invoke_fn;
277269 struct stratix10_svc *svc;
270+ struct mutex sdm_lock;
278271 struct stratix10_async_ctrl actrl;
279272 };
280273
@@ -283,6 +276,9 @@ struct stratix10_svc_controller { · 2 unmodified lines
283276 * @ctrl: pointer to service controller which is the provider of this channel
284277 * @scl: pointer to service client which owns the channel
285278 * @name: service client name associated with the channel
279+ * @task: pointer to the thread task which handles SMC or HVC call
280+ * @svc_fifo: a queue for storing service message data (separate fifo for every channel)
281+ * @svc_fifo_lock: protect access to service message data queue (locking pending fifo)
286282 * @lock: protect access to the channel
287283 * @async_chan: reference to asynchronous channel object for this channel
288284 *
@@ -293,6 +289,9 @@ struct stratix10_svc_chan { · 4 unmodified lines
293289 struct stratix10_svc_controller *ctrl;
294290 struct stratix10_svc_client *scl;
295291 char *name;
292+ struct task_struct *task;
293+ struct kfifo svc_fifo;
294+ spinlock_t svc_fifo_lock;
296295 spinlock_t lock;
297296 struct stratix10_async_chan *async_chan;
298297 };
@@ -527,10 +526,10 @@ static void svc_thread_recv_status_ok(struct stratix10_svc_data *p_data, · 228 unmodified lines
527526 */
528527 static int svc_normal_to_secure_thread(void *data)
529528 {
530− struct stratix10_svc_controller
531− *ctrl = (struct stratix10_svc_controller *)data;
532− struct stratix10_svc_data *pdata;
533− struct stratix10_svc_cb_data *cbdata;
529+ struct stratix10_svc_chan *chan = (struct stratix10_svc_chan *)data;
530+ struct stratix10_svc_controller *ctrl = chan->ctrl;
531+ struct stratix10_svc_data *pdata = NULL;
532+ struct stratix10_svc_cb_data *cbdata = NULL;
534533 struct arm_smccc_res res;
535534 unsigned long a0, a1, a2, a3, a4, a5, a6, a7;
536535 int ret_fifo = 0;
@@ -555,12 +554,12 @@ static int svc_normal_to_secure_thread(void *data) · 18 unmodified lines
555554 a6 = 0;
556555 a7 = 0;
557556
558− pr_debug("smc_hvc_shm_thread is running\n");
557+ pr_debug("%s: %s: Thread is running!\n", __func__, chan->name);
559558
560559 while (!kthread_should_stop()) {
561− ret_fifo = kfifo_out_spinlocked(&ctrl->svc_fifo,
560+ ret_fifo = kfifo_out_spinlocked(&chan->svc_fifo,
562561 pdata, sizeof(*pdata),
563− &ctrl->svc_fifo_lock);
562+ &chan->svc_fifo_lock);
564563
565564 if (!ret_fifo)
566565 continue;
@@ -569,9 +568,25 @@ static int svc_normal_to_secure_thread(void *data) · 2 unmodified lines
569568 (unsigned int)pdata->paddr, pdata->command,
570569 (unsigned int)pdata->size);
571570
571+ /* SDM can only process one command at a time */
572+ pr_debug("%s: %s: Thread is waiting for mutex!\n",
573+ __func__, chan->name);
574+ if (mutex_lock_interruptible(&ctrl->sdm_lock)) {
575+ /* item already dequeued; notify client to unblock it */
576+ cbdata->status = BIT(SVC_STATUS_ERROR);
577+ cbdata->kaddr1 = NULL;
578+ cbdata->kaddr2 = NULL;
579+ cbdata->kaddr3 = NULL;
580+ if (pdata->chan->scl)
581+ pdata->chan->scl->receive_cb(pdata->chan->scl,
582+ cbdata);
583+ break;
584+ }
585+
572586 switch (pdata->command) {
573587 case COMMAND_RECONFIG_DATA_CLAIM:
574588 svc_thread_cmd_data_claim(ctrl, pdata, cbdata);
589+ mutex_unlock(&ctrl->sdm_lock);
575590 continue;
576591 case COMMAND_RECONFIG:
577592 a0 = INTEL_SIP_SMC_FPGA_CONFIG_START;
@@ -700,10 +715,11 @@ static int svc_normal_to_secure_thread(void *data) · 122 unmodified lines
700715 break;
701716 default:
702717 pr_warn("it shouldn't happen\n");
703− break;
718+ mutex_unlock(&ctrl->sdm_lock);
719+ continue;
704720 }
705− pr_debug("%s: before SMC call -- a0=0x%016x a1=0x%016x",
706− __func__,
721+ pr_debug("%s: %s: before SMC call -- a0=0x%016x a1=0x%016x",
722+ __func__, chan->name,
707723 (unsigned int)a0,
708724 (unsigned int)a1);
709725 pr_debug(" a2=0x%016x\n", (unsigned int)a2);
@@ -712,8 +728,8 @@ static int svc_normal_to_secure_thread(void *data) · 2 unmodified lines
712728 pr_debug(" a5=0x%016x\n", (unsigned int)a5);
713729 ctrl->invoke_fn(a0, a1, a2, a3, a4, a5, a6, a7, &res);
714730
715− pr_debug("%s: after SMC call -- res.a0=0x%016x",
716− __func__, (unsigned int)res.a0);
731+ pr_debug("%s: %s: after SMC call -- res.a0=0x%016x",
732+ __func__, chan->name, (unsigned int)res.a0);
717733 pr_debug(" res.a1=0x%016x, res.a2=0x%016x",
718734 (unsigned int)res.a1, (unsigned int)res.a2);
719735 pr_debug(" res.a3=0x%016x\n", (unsigned int)res.a3);
@@ -728,6 +744,7 @@ static int svc_normal_to_secure_thread(void *data) · 8 unmodified lines
728744 cbdata->kaddr2 = NULL;
729745 cbdata->kaddr3 = NULL;
730746 pdata->chan->scl->receive_cb(pdata->chan->scl, cbdata);
747+ mutex_unlock(&ctrl->sdm_lock);
731748 continue;
732749 }
733750
@@ -801,6 +818,8 @@ static int svc_normal_to_secure_thread(void *data) · 67 unmodified lines
801818 break;
802819
803820 }
821+
822+ mutex_unlock(&ctrl->sdm_lock);
804823 }
805824
806825 kfree(cbdata);
@@ -1696,22 +1715,33 @@ int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg) · 889 unmodified lines
16961715 if (!p_data)
16971716 return -ENOMEM;
16981717
1699− /* first client will create kernel thread */
1700− if (!chan->ctrl->task) {
1701− chan->ctrl->task =
1702− kthread_run_on_cpu(svc_normal_to_secure_thread,
1703− (void *)chan->ctrl,
1704− cpu, "svc_smc_hvc_thread");
1705− if (IS_ERR(chan->ctrl->task)) {
1718+ /* first caller creates the per-channel kthread */
1719+ if (!chan->task) {
1720+ struct task_struct *task;
1721+
1722+ task = kthread_run_on_cpu(svc_normal_to_secure_thread,
1723+ (void *)chan,
1724+ cpu, "svc_smc_hvc_thread");
1725+ if (IS_ERR(task)) {
17061726 dev_err(chan->ctrl->dev,
17071727 "failed to create svc_smc_hvc_thread\n");
17081728 kfree(p_data);
17091729 return -EINVAL;
17101730 }
1731+
1732+ spin_lock(&chan->lock);
1733+ if (chan->task) {
1734+ /* another caller won the race; discard our thread */
1735+ spin_unlock(&chan->lock);
1736+ kthread_stop(task);
1737+ } else {
1738+ chan->task = task;
1739+ spin_unlock(&chan->lock);
1740+ }
17111741 }
17121742
1713− pr_debug("%s: sent P-va=%p, P-com=%x, P-size=%u\n", __func__,
1714− p_msg->payload, p_msg->command,
1743+ pr_debug("%s: %s: sent P-va=%p, P-com=%x, P-size=%u\n", __func__,
1744+ chan->name, p_msg->payload, p_msg->command,
17151745 (unsigned int)p_msg->payload_length);
17161746
17171747 if (list_empty(&svc_data_mem)) {
@@ -1747,12 +1777,16 @@ int stratix10_svc_send(struct stratix10_svc_chan *chan, void *msg) · 29 unmodified lines
17471777 p_data->arg[2] = p_msg->arg[2];
17481778 p_data->size = p_msg->payload_length;
17491779 p_data->chan = chan;
1750− pr_debug("%s: put to FIFO pa=0x%016x, cmd=%x, size=%u\n", __func__,
1751− (unsigned int)p_data->paddr, p_data->command,
1752− (unsigned int)p_data->size);
1753− ret = kfifo_in_spinlocked(&chan->ctrl->svc_fifo, p_data,
1780+ pr_debug("%s: %s: put to FIFO pa=0x%016x, cmd=%x, size=%u\n",
1781+ __func__,
1782+ chan->name,
1783+ (unsigned int)p_data->paddr,
1784+ p_data->command,
1785+ (unsigned int)p_data->size);
1786+
1787+ ret = kfifo_in_spinlocked(&chan->svc_fifo, p_data,
17541788 sizeof(*p_data),
1755− &chan->ctrl->svc_fifo_lock);
1789+ &chan->svc_fifo_lock);
17561790
17571791 kfree(p_data);
17581792
@@ -1773,11 +1807,12 @@ EXPORT_SYMBOL_GPL(stratix10_svc_send); · 14 unmodified lines
17731807 */
17741808 void stratix10_svc_done(struct stratix10_svc_chan *chan)
17751809 {
1776− /* stop thread when thread is running AND only one active client */
1777− if (chan->ctrl->task && chan->ctrl->num_active_client <= 1) {
1778− pr_debug("svc_smc_hvc_shm_thread is stopped\n");
1779− kthread_stop(chan->ctrl->task);
1780− chan->ctrl->task = NULL;
1810+ /* stop thread when thread is running */
1811+ if (chan->task) {
1812+ pr_debug("%s: %s: svc_smc_hvc_shm_thread is stopping\n",
1813+ __func__, chan->name);
1814+ kthread_stop(chan->task);
1815+ chan->task = NULL;
17811816 }
17821817 }
17831818 EXPORT_SYMBOL_GPL(stratix10_svc_done);
@@ -1817,8 +1852,8 @@ void *stratix10_svc_allocate_memory(struct stratix10_svc_chan *chan, · 33 unmodified lines
18171852 pmem->paddr = pa;
18181853 pmem->size = s;
18191854 list_add_tail(&pmem->node, &svc_data_mem);
1820− pr_debug("%s: va=%p, pa=0x%016x\n", __func__,
1821− pmem->vaddr, (unsigned int)pmem->paddr);
1855+ pr_debug("%s: %s: va=%p, pa=0x%016x\n", __func__,
1856+ chan->name, pmem->vaddr, (unsigned int)pmem->paddr);
18221857
18231858 return (void *)va;
18241859 }
@@ -1855,6 +1890,13 @@ static const struct of_device_id stratix10_svc_drv_match[] = { · 30 unmodified lines
18551890 {},
18561891 };
18571892
1893+static const char * const chan_names[SVC_NUM_CHANNEL] = {
1894+ SVC_CLIENT_FPGA,
1895+ SVC_CLIENT_RSU,
1896+ SVC_CLIENT_FCS,
1897+ SVC_CLIENT_HWMON
1898+};
1899+
18581900 static int stratix10_svc_drv_probe(struct platform_device *pdev)
18591901 {
18601902 struct device *dev = &pdev->dev;
@@ -1862,11 +1904,11 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) · 1 unmodified line
18621904 struct stratix10_svc_chan *chans;
18631905 struct gen_pool *genpool;
18641906 struct stratix10_svc_sh_memory *sh_memory;
1865− struct stratix10_svc *svc;
1907+ struct stratix10_svc *svc = NULL;
18661908
18671909 svc_invoke_fn *invoke_fn;
18681910 size_t fifo_size;
1869− int ret;
1911+ int ret, i = 0;
18701912
18711913 /* get SMC or HVC function */
18721914 invoke_fn = get_invoke_func(dev);
@@ -1905,8 +1947,8 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) · 32 unmodified lines
19051947 controller->num_active_client = 0;
19061948 controller->chans = chans;
19071949 controller->genpool = genpool;
1908− controller->task = NULL;
19091950 controller->invoke_fn = invoke_fn;
1951+ INIT_LIST_HEAD(&controller->node);
19101952 init_completion(&controller->complete_status);
19111953
19121954 ret = stratix10_svc_async_init(controller);
@@ -1917,32 +1959,20 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) · 4 unmodified lines
19171959 }
19181960
19191961 fifo_size = sizeof(struct stratix10_svc_data) * SVC_NUM_DATA_IN_FIFO;
1920− ret = kfifo_alloc(&controller->svc_fifo, fifo_size, GFP_KERNEL);
1921− if (ret) {
1922− dev_err(dev, "failed to allocate FIFO\n");
1923− goto err_async_exit;
1924− }
1925− spin_lock_init(&controller->svc_fifo_lock);
1926−
1927− chans[0].scl = NULL;
1928− chans[0].ctrl = controller;
1929− chans[0].name = SVC_CLIENT_FPGA;
1930− spin_lock_init(&chans[0].lock);
1962+ mutex_init(&controller->sdm_lock);
19311963
1932− chans[1].scl = NULL;
1933− chans[1].ctrl = controller;
1934− chans[1].name = SVC_CLIENT_RSU;
1935− spin_lock_init(&chans[1].lock);
1936−
1937− chans[2].scl = NULL;
1938− chans[2].ctrl = controller;
1939− chans[2].name = SVC_CLIENT_FCS;
1940− spin_lock_init(&chans[2].lock);
1941−
1942− chans[3].scl = NULL;
1943− chans[3].ctrl = controller;
1944− chans[3].name = SVC_CLIENT_HWMON;
1945− spin_lock_init(&chans[3].lock);
1964+ for (i = 0; i < SVC_NUM_CHANNEL; i++) {
1965+ chans[i].scl = NULL;
1966+ chans[i].ctrl = controller;
1967+ chans[i].name = (char *)chan_names[i];
1968+ spin_lock_init(&chans[i].lock);
1969+ ret = kfifo_alloc(&chans[i].svc_fifo, fifo_size, GFP_KERNEL);
1970+ if (ret) {
1971+ dev_err(dev, "failed to allocate FIFO %d\n", i);
1972+ goto err_free_fifos;
1973+ }
1974+ spin_lock_init(&chans[i].svc_fifo_lock);
1975+ }
19461976
19471977 list_add_tail(&controller->node, &svc_ctrl);
19481978 platform_set_drvdata(pdev, controller);
@@ -1951,7 +1981,7 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) · 2 unmodified lines
19511981 svc = devm_kzalloc(dev, sizeof(*svc), GFP_KERNEL);
19521982 if (!svc) {
19531983 ret = -ENOMEM;
1954− goto err_free_kfifo;
1984+ goto err_free_fifos;
19551985 }
19561986 controller->svc = svc;
19571987
@@ -1959,51 +1989,43 @@ static int stratix10_svc_drv_probe(struct platform_device *pdev) · 1 unmodified line
19591989 if (!svc->stratix10_svc_rsu) {
19601990 dev_err(dev, "failed to allocate %s device\n", STRATIX10_RSU);
19611991 ret = -ENOMEM;
1962− goto err_free_kfifo;
1992+ goto err_free_fifos;
19631993 }
19641994
19651995 ret = platform_device_add(svc->stratix10_svc_rsu);
1966− if (ret) {
1967− platform_device_put(svc->stratix10_svc_rsu);
1968− goto err_free_kfifo;
1969− }
1970−
1971− svc->intel_svc_fcs = platform_device_alloc(INTEL_FCS, 1);
1972− if (!svc->intel_svc_fcs) {
1973− dev_err(dev, "failed to allocate %s device\n", INTEL_FCS);
1974− ret = -ENOMEM;
1975− goto err_unregister_rsu_dev;
1976− }
1977−
1978− ret = platform_device_add(svc->intel_svc_fcs);
1979− if (ret) {
1980− platform_device_put(svc->intel_svc_fcs);
1981− goto err_unregister_rsu_dev;
1982− }
1996+ if (ret)
1997+ goto err_put_device;
19831998
19841999 ret = of_platform_default_populate(dev_of_node(dev), NULL, dev);
19852000 if (ret)
1986− goto err_unregister_fcs_dev;
2001+ goto err_unregister_rsu_dev;
19872002
19882003 pr_info("Intel Service Layer Driver Initialized\n");
19892004
19902005 return 0;
19912006
1992−err_unregister_fcs_dev:
1993− platform_device_unregister(svc->intel_svc_fcs);
19942007 err_unregister_rsu_dev:
19952008 platform_device_unregister(svc->stratix10_svc_rsu);
1996−err_free_kfifo:
1997− kfifo_free(&controller->svc_fifo);
1998−err_async_exit:
2009+ goto err_free_fifos;
2010+err_put_device:
2011+ platform_device_put(svc->stratix10_svc_rsu);
2012+err_free_fifos:
2013+ /* only remove from list if list_add_tail() was reached */
2014+ if (!list_empty(&controller->node))
2015+ list_del(&controller->node);
2016+ /* free only the FIFOs that were successfully allocated */
2017+ while (i--)
2018+ kfifo_free(&chans[i].svc_fifo);
19992019 stratix10_svc_async_exit(controller);
20002020 err_destroy_pool:
20012021 gen_pool_destroy(genpool);
2022+
20022023 return ret;
20032024 }
20042025
20052026 static void stratix10_svc_drv_remove(struct platform_device *pdev)
20062027 {
2028+ int i;
20072029 struct stratix10_svc_controller *ctrl = platform_get_drvdata(pdev);
20082030 struct stratix10_svc *svc = ctrl->svc;
20092031
@@ -2011,14 +2033,16 @@ static void stratix10_svc_drv_remove(struct platform_device *pdev) · 1 unmodified line
20112033
20122034 of_platform_depopulate(ctrl->dev);
20132035
2014− platform_device_unregister(svc->intel_svc_fcs);
20152036 platform_device_unregister(svc->stratix10_svc_rsu);
20162037
2017− kfifo_free(&ctrl->svc_fifo);
2018− if (ctrl->task) {
2019− kthread_stop(ctrl->task);
2020− ctrl->task = NULL;
2038+ for (i = 0; i < SVC_NUM_CHANNEL; i++) {
2039+ if (ctrl->chans[i].task) {
2040+ kthread_stop(ctrl->chans[i].task);
2041+ ctrl->chans[i].task = NULL;
2042+ }
2043+ kfifo_free(&ctrl->chans[i].svc_fifo);
20212044 }
2045+
20222046 if (ctrl->genpool)
20232047 gen_pool_destroy(ctrl->genpool);
20242048 list_del(&ctrl->node);
drivers/gpib/lpvo_usb_gpib/lpvo_usb_gpib.c+4−3
@@ -38,8 +38,10 @@ MODULE_DESCRIPTION("GPIB driver for LPVO usb devices"); · 37 unmodified lines
3838 /*
3939 * Table of devices that work with this driver.
4040 *
41− * Currently, only one device is known to be used in the
42− * lpvo_usb_gpib adapter (FTDI 0403:6001).
41+ * Currently, only one device is known to be used in the lpvo_usb_gpib
42+ * adapter (FTDI 0403:6001) but as this device id is already handled by the
43+ * ftdi_sio USB serial driver the LPVO driver must not bind to it by default.
44+ *
4345 * If your adapter uses a different chip, insert a line
4446 * in the following table with proper <Vendor-id>, <Product-id>.
4547 *
@@ -50,7 +52,6 @@ MODULE_DESCRIPTION("GPIB driver for LPVO usb devices"); · 4 unmodified lines
5052 */
5153
5254 static const struct usb_device_id skel_table[] = {
53− { USB_DEVICE(0x0403, 0x6001) },
5455 { } /* Terminating entry */
5556 };
5657 MODULE_DEVICE_TABLE(usb, skel_table);
drivers/gpu/drm/amd/amdgpu/amdgpu_device.c+13−1
@@ -2690,8 +2690,10 @@ static int amdgpu_device_ip_early_init(struct amdgpu_device *adev) · 2689 unmodified lines
26902690 break;
26912691 default:
26922692 r = amdgpu_discovery_set_ip_blocks(adev);
2693− if (r)
2693+ if (r) {
2694+ adev->num_ip_blocks = 0;
26942695 return r;
2696+ }
26952697 break;
26962698 }
26972699
@@ -3247,6 +3249,8 @@ int amdgpu_device_set_cg_state(struct amdgpu_device *adev, · 549 unmodified lines
32473249 i = state == AMD_CG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
32483250 if (!adev->ip_blocks[i].status.late_initialized)
32493251 continue;
3252+ if (!adev->ip_blocks[i].version)
3253+ continue;
32503254 /* skip CG for GFX, SDMA on S0ix */
32513255 if (adev->in_s0ix &&
32523256 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
@@ -3286,6 +3290,8 @@ int amdgpu_device_set_pg_state(struct amdgpu_device *adev, · 33 unmodified lines
32863290 i = state == AMD_PG_STATE_GATE ? j : adev->num_ip_blocks - j - 1;
32873291 if (!adev->ip_blocks[i].status.late_initialized)
32883292 continue;
3293+ if (!adev->ip_blocks[i].version)
3294+ continue;
32893295 /* skip PG for GFX, SDMA on S0ix */
32903296 if (adev->in_s0ix &&
32913297 (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GFX ||
@@ -3493,6 +3499,8 @@ static int amdgpu_device_ip_fini_early(struct amdgpu_device *adev) · 201 unmodified lines
34933499 int i, r;
34943500
34953501 for (i = 0; i < adev->num_ip_blocks; i++) {
3502+ if (!adev->ip_blocks[i].version)
3503+ continue;
34963504 if (!adev->ip_blocks[i].version->funcs->early_fini)
34973505 continue;
34983506
@@ -3570,6 +3578,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev) · 71 unmodified lines
35703578 if (!adev->ip_blocks[i].status.sw)
35713579 continue;
35723580
3581+ if (!adev->ip_blocks[i].version)
3582+ continue;
35733583 if (adev->ip_blocks[i].version->type == AMD_IP_BLOCK_TYPE_GMC) {
35743584 amdgpu_ucode_free_bo(adev);
35753585 amdgpu_free_static_csa(&adev->virt.csa_obj);
@@ -3596,6 +3606,8 @@ static int amdgpu_device_ip_fini(struct amdgpu_device *adev) · 20 unmodified lines
35963606 for (i = adev->num_ip_blocks - 1; i >= 0; i--) {
35973607 if (!adev->ip_blocks[i].status.late_initialized)
35983608 continue;
3609+ if (!adev->ip_blocks[i].version)
3610+ continue;
35993611 if (adev->ip_blocks[i].version->funcs->late_fini)
36003612 adev->ip_blocks[i].version->funcs->late_fini(&adev->ip_blocks[i]);
36013613 adev->ip_blocks[i].status.late_initialized = false;
drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c+1−1
@@ -83,7 +83,7 @@ void amdgpu_driver_unload_kms(struct drm_device *dev) · 82 unmodified lines
8383 {
8484 struct amdgpu_device *adev = drm_to_adev(dev);
8585
86− if (adev == NULL)
86+ if (adev == NULL || !adev->num_ip_blocks)
8787 return;
8888
8989 amdgpu_unregister_gpu_instance(adev);
drivers/gpu/drm/amd/amdgpu/amdgpu_mode.h+8−8
@@ -368,15 +368,15 @@ struct amdgpu_mode_info { · 367 unmodified lines
368368
369369 struct drm_property *plane_ctm_property;
370370 /**
371− * @shaper_lut_property: Plane property to set pre-blending shaper LUT
372− * that converts color content before 3D LUT. If
373− * plane_shaper_tf_property != Identity TF, AMD color module will
371+ * @plane_shaper_lut_property: Plane property to set pre-blending
372+ * shaper LUT that converts color content before 3D LUT.
373+ * If plane_shaper_tf_property != Identity TF, AMD color module will
374374 * combine the user LUT values with pre-defined TF into the LUT
375375 * parameters to be programmed.
376376 */
377377 struct drm_property *plane_shaper_lut_property;
378378 /**
379− * @shaper_lut_size_property: Plane property for the size of
379+ * @plane_shaper_lut_size_property: Plane property for the size of
380380 * pre-blending shaper LUT as supported by the driver (read-only).
381381 */
382382 struct drm_property *plane_shaper_lut_size_property;
@@ -400,10 +400,10 @@ struct amdgpu_mode_info { · 17 unmodified lines
400400 */
401401 struct drm_property *plane_lut3d_property;
402402 /**
403− * @plane_degamma_lut_size_property: Plane property to define the max
404− * size of 3D LUT as supported by the driver (read-only). The max size
405− * is the max size of one dimension and, therefore, the max number of
406− * entries for 3D LUT array is the 3D LUT size cubed;
403+ * @plane_lut3d_size_property: Plane property to define the max size
404+ * of 3D LUT as supported by the driver (read-only). The max size is
405+ * the max size of one dimension and, therefore, the max number of
406+ * entries for 3D LUT array is the 3D LUT size cubed.
407407 */
408408 struct drm_property *plane_lut3d_size_property;
409409 /**
drivers/gpu/drm/amd/amdgpu/mes_v12_0.c+4−1
@@ -731,6 +731,9 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe) · 730 unmodified lines
731731 int i;
732732 struct amdgpu_device *adev = mes->adev;
733733 union MESAPI_SET_HW_RESOURCES mes_set_hw_res_pkt;
734+ uint32_t mes_rev = (pipe == AMDGPU_MES_SCHED_PIPE) ?
735+ (mes->sched_version & AMDGPU_MES_VERSION_MASK) :
736+ (mes->kiq_version & AMDGPU_MES_VERSION_MASK);
734737
735738 memset(&mes_set_hw_res_pkt, 0, sizeof(mes_set_hw_res_pkt));
736739
@@ -785,7 +788,7 @@ static int mes_v12_0_set_hw_resources(struct amdgpu_mes *mes, int pipe) · 48 unmodified lines
785788 * handling support, other queue will not use the oversubscribe timer.
786789 * handling mode - 0: disabled; 1: basic version; 2: basic+ version
787790 */
788− mes_set_hw_res_pkt.oversubscription_timer = 50;
791+ mes_set_hw_res_pkt.oversubscription_timer = mes_rev < 0x8b ? 0 : 50;
789792 mes_set_hw_res_pkt.unmapped_doorbell_handling = 1;
790793
791794 if (amdgpu_mes_log_enable) {
drivers/gpu/drm/amd/amdkfd/kfd_process_queue_manager.c+1−0
@@ -593,6 +593,7 @@ int pqm_update_queue_properties(struct process_queue_manager *pqm, · 592 unmodified lines
593593 p->queue_size)) {
594594 pr_debug("ring buf 0x%llx size 0x%llx not mapped on GPU\n",
595595 p->queue_address, p->queue_size);
596+ amdgpu_bo_unreserve(vm->root.bo);
596597 return -EFAULT;
597598 }
598599
drivers/gpu/drm/amd/display/dc/dccg/dcn20/dcn20_dccg.h+5−1
@@ -38,7 +38,11 @@ · 37 unmodified lines
3838 DCCG_SRII(PIXEL_RATE_CNTL, OTG, 0),\
3939 DCCG_SRII(PIXEL_RATE_CNTL, OTG, 1),\
4040 SR(DISPCLK_FREQ_CHANGE_CNTL),\
41− SR(DC_MEM_GLOBAL_PWR_REQ_CNTL)
41+ SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
42+ SR(MICROSECOND_TIME_BASE_DIV),\
43+ SR(MILLISECOND_TIME_BASE_DIV),\
44+ SR(DCCG_GATE_DISABLE_CNTL),\
45+ SR(DCCG_GATE_DISABLE_CNTL2)
4246
4347 #define DCCG_REG_LIST_DCN2() \
4448 DCCG_COMMON_REG_LIST_DCN_BASE(),\
drivers/gpu/drm/amd/display/dc/dccg/dcn21/dcn21_dccg.c+20−1
@@ -96,6 +96,25 @@ static void dccg21_update_dpp_dto(struct dccg *dccg, int dpp_inst, int req_dppcl · 95 unmodified lines
9696 dccg->pipe_dppclk_khz[dpp_inst] = req_dppclk;
9797 }
9898
99+/*
100+ * On DCN21 S0i3 resume, BIOS programs MICROSECOND_TIME_BASE_DIV to
101+ * 0x00120464 as a marker that golden init has already been done.
102+ * dcn21_s0i3_golden_init_wa() reads this marker later in bios_golden_init()
103+ * to decide whether to skip golden init.
104+ *
105+ * dccg2_init() unconditionally overwrites MICROSECOND_TIME_BASE_DIV to
106+ * 0x00120264, destroying the marker before it can be read.
107+ *
108+ * Guard the call: if the S0i3 marker is present, skip dccg2_init() so the
109+ * WA can function correctly. bios_golden_init() will handle init in that case.
110+ */
111+static void dccg21_init(struct dccg *dccg)
112+{
113+ if (dccg2_is_s0i3_golden_init_wa_done(dccg))
114+ return;
115+
116+ dccg2_init(dccg);
117+}
99118
100119 static const struct dccg_funcs dccg21_funcs = {
101120 .update_dpp_dto = dccg21_update_dpp_dto,
@@ -103,7 +122,7 @@ static const struct dccg_funcs dccg21_funcs = { · 1 unmodified line
103122 .set_fifo_errdet_ovr_en = dccg2_set_fifo_errdet_ovr_en,
104123 .otg_add_pixel = dccg2_otg_add_pixel,
105124 .otg_drop_pixel = dccg2_otg_drop_pixel,
106− .dccg_init = dccg2_init,
125+ .dccg_init = dccg21_init,
107126 .refclk_setup = dccg2_refclk_setup, /* Deprecated - for backward compatibility only */
108127 .allow_clock_gating = dccg2_allow_clock_gating,
109128 .enable_memory_low_power = dccg2_enable_memory_low_power,
drivers/gpu/drm/amd/display/dc/dccg/dcn301/dcn301_dccg.h+7−1
@@ -34,7 +34,13 @@ · 33 unmodified lines
3434 DCCG_SRII(DTO_PARAM, DPPCLK, 1),\
3535 DCCG_SRII(DTO_PARAM, DPPCLK, 2),\
3636 DCCG_SRII(DTO_PARAM, DPPCLK, 3),\
37− SR(REFCLK_CNTL)
37+ SR(REFCLK_CNTL),\
38+ SR(DISPCLK_FREQ_CHANGE_CNTL),\
39+ SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
40+ SR(MICROSECOND_TIME_BASE_DIV),\
41+ SR(MILLISECOND_TIME_BASE_DIV),\
42+ SR(DCCG_GATE_DISABLE_CNTL),\
43+ SR(DCCG_GATE_DISABLE_CNTL2)
3844
3945 #define DCCG_MASK_SH_LIST_DCN301(mask_sh) \
4046 DCCG_SFI(DPPCLK_DTO_CTRL, DTO_ENABLE, DPPCLK, 0, mask_sh),\
drivers/gpu/drm/amd/display/dc/dccg/dcn31/dcn31_dccg.h+4−1
@@ -64,9 +64,12 @@ · 63 unmodified lines
6464 SR(DSCCLK1_DTO_PARAM),\
6565 SR(DSCCLK2_DTO_PARAM),\
6666 SR(DSCCLK_DTO_CTRL),\
67+ SR(DCCG_GATE_DISABLE_CNTL),\
6768 SR(DCCG_GATE_DISABLE_CNTL2),\
6869 SR(DCCG_GATE_DISABLE_CNTL3),\
69− SR(HDMISTREAMCLK0_DTO_PARAM)
70+ SR(HDMISTREAMCLK0_DTO_PARAM),\
71+ SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
72+ SR(MICROSECOND_TIME_BASE_DIV)
7073
7174
7275 #define DCCG_MASK_SH_LIST_DCN31(mask_sh) \
drivers/gpu/drm/amd/display/dc/dccg/dcn314/dcn314_dccg.h+4−1
@@ -70,11 +70,14 @@ · 69 unmodified lines
7070 SR(DSCCLK2_DTO_PARAM),\
7171 SR(DSCCLK3_DTO_PARAM),\
7272 SR(DSCCLK_DTO_CTRL),\
73+ SR(DCCG_GATE_DISABLE_CNTL),\
7374 SR(DCCG_GATE_DISABLE_CNTL2),\
7475 SR(DCCG_GATE_DISABLE_CNTL3),\
7576 SR(HDMISTREAMCLK0_DTO_PARAM),\
7677 SR(OTG_PIXEL_RATE_DIV),\
77− SR(DTBCLK_P_CNTL)
78+ SR(DTBCLK_P_CNTL),\
79+ SR(DC_MEM_GLOBAL_PWR_REQ_CNTL),\
80+ SR(MICROSECOND_TIME_BASE_DIV)
7881
7982 #define DCCG_MASK_SH_LIST_DCN314_COMMON(mask_sh) \
8083 DCCG_SFI(DPPCLK_DTO_CTRL, DTO_DB_EN, DPPCLK, 0, mask_sh),\
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_0_ppt.c+2−1
@@ -2222,7 +2222,8 @@ static int smu_v13_0_0_restore_user_od_settings(struct smu_context *smu) · 2221 unmodified lines
22222222 user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
22232223 BIT(PP_OD_FEATURE_UCLK_BIT) |
22242224 BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT) |
2225− BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
2225+ BIT(PP_OD_FEATURE_FAN_CURVE_BIT) |
2226+ BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
22262227 res = smu_v13_0_0_upload_overdrive_table(smu, user_od_table);
22272228 user_od_table->OverDriveTable.FeatureCtrlMask = 0;
22282229 if (res == 0)
drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0_7_ppt.c+2−1
@@ -2224,7 +2224,8 @@ static int smu_v13_0_7_restore_user_od_settings(struct smu_context *smu) · 2223 unmodified lines
22242224 user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
22252225 BIT(PP_OD_FEATURE_UCLK_BIT) |
22262226 BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT) |
2227− BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
2227+ BIT(PP_OD_FEATURE_FAN_CURVE_BIT) |
2228+ BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
22282229 res = smu_v13_0_7_upload_overdrive_table(smu, user_od_table);
22292230 user_od_table->OverDriveTable.FeatureCtrlMask = 0;
22302231 if (res == 0)
drivers/gpu/drm/amd/pm/swsmu/smu14/smu_v14_0_2_ppt.c+2−1
@@ -2311,7 +2311,8 @@ static int smu_v14_0_2_restore_user_od_settings(struct smu_context *smu) · 2310 unmodified lines
23112311 user_od_table->OverDriveTable.FeatureCtrlMask = BIT(PP_OD_FEATURE_GFXCLK_BIT) |
23122312 BIT(PP_OD_FEATURE_UCLK_BIT) |
23132313 BIT(PP_OD_FEATURE_GFX_VF_CURVE_BIT) |
2314− BIT(PP_OD_FEATURE_FAN_CURVE_BIT);
2314+ BIT(PP_OD_FEATURE_FAN_CURVE_BIT) |
2315+ BIT(PP_OD_FEATURE_ZERO_FAN_BIT);
23152316 res = smu_v14_0_2_upload_overdrive_table(smu, user_od_table);
23162317 user_od_table->OverDriveTable.FeatureCtrlMask = 0;
23172318 if (res == 0)
drivers/gpu/drm/bridge/ti-sn65dsi83.c+7−6
@@ -351,9 +351,9 @@ static u8 sn65dsi83_get_dsi_range(struct sn65dsi83 *ctx, · 350 unmodified lines
351351 * DSI_CLK = mode clock * bpp / dsi_data_lanes / 2
352352 * the 2 is there because the bus is DDR.
353353 */
354− return DIV_ROUND_UP(clamp((unsigned int)mode->clock *
355− mipi_dsi_pixel_format_to_bpp(ctx->dsi->format) /
356− ctx->dsi->lanes / 2, 40000U, 500000U), 5000U);
354+ return clamp((unsigned int)mode->clock *
355+ mipi_dsi_pixel_format_to_bpp(ctx->dsi->format) /
356+ ctx->dsi->lanes / 2, 40000U, 500000U) / 5000U;
357357 }
358358
359359 static u8 sn65dsi83_get_dsi_div(struct sn65dsi83 *ctx)
@@ -517,6 +517,7 @@ static void sn65dsi83_atomic_pre_enable(struct drm_bridge *bridge, · 157 unmodified lines
517517 struct drm_atomic_state *state)
518518 {
519519 struct sn65dsi83 *ctx = bridge_to_sn65dsi83(bridge);
520+ const unsigned int dual_factor = ctx->lvds_dual_link ? 2 : 1;
520521 const struct drm_bridge_state *bridge_state;
521522 const struct drm_crtc_state *crtc_state;
522523 const struct drm_display_mode *mode;
@@ -653,18 +654,18 @@ static void sn65dsi83_atomic_pre_enable(struct drm_bridge *bridge, · 130 unmodified lines
653654 /* 32 + 1 pixel clock to ensure proper operation */
654655 le16val = cpu_to_le16(32 + 1);
655656 regmap_bulk_write(ctx->regmap, REG_VID_CHA_SYNC_DELAY_LOW, &le16val, 2);
656− le16val = cpu_to_le16(mode->hsync_end - mode->hsync_start);
657+ le16val = cpu_to_le16((mode->hsync_end - mode->hsync_start) / dual_factor);
657658 regmap_bulk_write(ctx->regmap, REG_VID_CHA_HSYNC_PULSE_WIDTH_LOW,
658659 &le16val, 2);
659660 le16val = cpu_to_le16(mode->vsync_end - mode->vsync_start);
660661 regmap_bulk_write(ctx->regmap, REG_VID_CHA_VSYNC_PULSE_WIDTH_LOW,
661662 &le16val, 2);
662663 regmap_write(ctx->regmap, REG_VID_CHA_HORIZONTAL_BACK_PORCH,
663− mode->htotal - mode->hsync_end);
664+ (mode->htotal - mode->hsync_end) / dual_factor);
664665 regmap_write(ctx->regmap, REG_VID_CHA_VERTICAL_BACK_PORCH,
665666 mode->vtotal - mode->vsync_end);
666667 regmap_write(ctx->regmap, REG_VID_CHA_HORIZONTAL_FRONT_PORCH,
667− mode->hsync_start - mode->hdisplay);
668+ (mode->hsync_start - mode->hdisplay) / dual_factor);
668669 regmap_write(ctx->regmap, REG_VID_CHA_VERTICAL_FRONT_PORCH,
669670 mode->vsync_start - mode->vdisplay);
670671 regmap_write(ctx->regmap, REG_VID_CHA_TEST_PATTERN, 0x00);
drivers/gpu/drm/gud/gud_drv.c+8−1
@@ -339,7 +339,9 @@ static int gud_stats_debugfs(struct seq_file *m, void *data) · 338 unmodified lines
339339 }
340340
341341 static const struct drm_crtc_helper_funcs gud_crtc_helper_funcs = {
342− .atomic_check = drm_crtc_helper_atomic_check
342+ .atomic_check = drm_crtc_helper_atomic_check,
343+ .atomic_enable = gud_crtc_atomic_enable,
344+ .atomic_disable = gud_crtc_atomic_disable,
343345 };
344346
345347 static const struct drm_crtc_funcs gud_crtc_funcs = {
@@ -364,6 +366,10 @@ static const struct drm_plane_funcs gud_plane_funcs = { · 18 unmodified lines
364366 DRM_GEM_SHADOW_PLANE_FUNCS,
365367 };
366368
369+static const struct drm_mode_config_helper_funcs gud_mode_config_helpers = {
370+ .atomic_commit_tail = drm_atomic_helper_commit_tail_rpm,
371+};
372+
367373 static const struct drm_mode_config_funcs gud_mode_config_funcs = {
368374 .fb_create = drm_gem_fb_create_with_dirty,
369375 .atomic_check = drm_atomic_helper_check,
@@ -499,6 +505,7 @@ static int gud_probe(struct usb_interface *intf, const struct usb_device_id *id) · 129 unmodified lines
499505 drm->mode_config.min_height = le32_to_cpu(desc.min_height);
500506 drm->mode_config.max_height = le32_to_cpu(desc.max_height);
501507 drm->mode_config.funcs = &gud_mode_config_funcs;
508+ drm->mode_config.helper_private = &gud_mode_config_helpers;
502509
503510 /* Format init */
504511 formats_dev = devm_kmalloc(dev, GUD_FORMATS_MAX_NUM, GFP_KERNEL);
drivers/gpu/drm/gud/gud_internal.h+4−0
@@ -62,6 +62,10 @@ int gud_usb_set_u8(struct gud_device *gdrm, u8 request, u8 val); · 61 unmodified lines
6262
6363 void gud_clear_damage(struct gud_device *gdrm);
6464 void gud_flush_work(struct work_struct *work);
65+void gud_crtc_atomic_enable(struct drm_crtc *crtc,
66+ struct drm_atomic_state *state);
67+void gud_crtc_atomic_disable(struct drm_crtc *crtc,
68+ struct drm_atomic_state *state);
6569 int gud_plane_atomic_check(struct drm_plane *plane,
6670 struct drm_atomic_state *state);
6771 void gud_plane_atomic_update(struct drm_plane *plane,
drivers/gpu/drm/gud/gud_pipe.c+36−18
@@ -580,6 +580,39 @@ out: · 579 unmodified lines
580580 return ret;
581581 }
582582
583+void gud_crtc_atomic_enable(struct drm_crtc *crtc,
584+ struct drm_atomic_state *state)
585+{
586+ struct drm_device *drm = crtc->dev;
587+ struct gud_device *gdrm = to_gud_device(drm);
588+ int idx;
589+
590+ if (!drm_dev_enter(drm, &idx))
591+ return;
592+
593+ gud_usb_set_u8(gdrm, GUD_REQ_SET_CONTROLLER_ENABLE, 1);
594+ gud_usb_set(gdrm, GUD_REQ_SET_STATE_COMMIT, 0, NULL, 0);
595+ gud_usb_set_u8(gdrm, GUD_REQ_SET_DISPLAY_ENABLE, 1);
596+
597+ drm_dev_exit(idx);
598+}
599+
600+void gud_crtc_atomic_disable(struct drm_crtc *crtc,
601+ struct drm_atomic_state *state)
602+{
603+ struct drm_device *drm = crtc->dev;
604+ struct gud_device *gdrm = to_gud_device(drm);
605+ int idx;
606+
607+ if (!drm_dev_enter(drm, &idx))
608+ return;
609+
610+ gud_usb_set_u8(gdrm, GUD_REQ_SET_DISPLAY_ENABLE, 0);
611+ gud_usb_set_u8(gdrm, GUD_REQ_SET_CONTROLLER_ENABLE, 0);
612+
613+ drm_dev_exit(idx);
614+}
615+
583616 void gud_plane_atomic_update(struct drm_plane *plane,
584617 struct drm_atomic_state *atomic_state)
585618 {
@@ -607,24 +640,12 @@ void gud_plane_atomic_update(struct drm_plane *plane, · 21 unmodified lines
607640 mutex_unlock(&gdrm->damage_lock);
608641 }
609642
610− if (!drm_dev_enter(drm, &idx))
643+ if (!crtc || !drm_dev_enter(drm, &idx))
611644 return;
612645
613− if (!old_state->fb)
614− gud_usb_set_u8(gdrm, GUD_REQ_SET_CONTROLLER_ENABLE, 1);
615−
616− if (fb && (crtc->state->mode_changed || crtc->state->connectors_changed))
617− gud_usb_set(gdrm, GUD_REQ_SET_STATE_COMMIT, 0, NULL, 0);
618−
619− if (crtc->state->active_changed)
620− gud_usb_set_u8(gdrm, GUD_REQ_SET_DISPLAY_ENABLE, crtc->state->active);
621−
622− if (!fb)
623− goto ctrl_disable;
624−
625646 ret = drm_gem_fb_begin_cpu_access(fb, DMA_FROM_DEVICE);
626647 if (ret)
627− goto ctrl_disable;
648+ goto out;
628649
629650 drm_atomic_helper_damage_iter_init(&iter, old_state, new_state);
630651 drm_atomic_for_each_plane_damage(&iter, &damage)
@@ -632,9 +653,6 @@ void gud_plane_atomic_update(struct drm_plane *plane, · 1 unmodified line
632653
633654 drm_gem_fb_end_cpu_access(fb, DMA_FROM_DEVICE);
634655
635−ctrl_disable:
636− if (!crtc->state->enable)
637− gud_usb_set_u8(gdrm, GUD_REQ_SET_CONTROLLER_ENABLE, 0);
638−
656+out:
639657 drm_dev_exit(idx);
640658 }
drivers/gpu/drm/i915/display/intel_alpm.c+0−6
@@ -43,12 +43,6 @@ bool intel_alpm_is_alpm_aux_less(struct intel_dp *intel_dp, · 42 unmodified lines
4343
4444 void intel_alpm_init(struct intel_dp *intel_dp)
4545 {
46− u8 dpcd;
47−
48− if (drm_dp_dpcd_readb(&intel_dp->aux, DP_RECEIVER_ALPM_CAP, &dpcd) < 0)
49− return;
50−
51− intel_dp->alpm_dpcd = dpcd;
5246 mutex_init(&intel_dp->alpm.lock);
5347 }
5448
drivers/gpu/drm/i915/display/intel_display.c+0−1
@@ -1614,7 +1614,6 @@ static void hsw_configure_cpu_transcoder(const struct intel_crtc_state *crtc_sta · 1613 unmodified lines
16141614 }
16151615
16161616 intel_set_transcoder_timings(crtc_state);
1617− intel_vrr_set_transcoder_timings(crtc_state);
16181617
16191618 if (cpu_transcoder != TRANSCODER_EDP)
16201619 intel_de_write(display, TRANS_MULT(display, cpu_transcoder),
drivers/gpu/drm/i915/display/intel_dp.c+7−0
@@ -4577,6 +4577,7 @@ static bool · 4576 unmodified lines
45774577 intel_edp_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *connector)
45784578 {
45794579 struct intel_display *display = to_intel_display(intel_dp);
4580+ int ret;
45804581
45814582 /* this function is meant to be called only once */
45824583 drm_WARN_ON(display->drm, intel_dp->dpcd[DP_DPCD_REV] != 0);
@@ -4616,6 +4617,12 @@ intel_edp_init_dpcd(struct intel_dp *intel_dp, struct intel_connector *connector · 33 unmodified lines
46164617 */
46174618 intel_dp_init_source_oui(intel_dp);
46184619
4620+ /* Read the ALPM DPCD caps */
4621+ ret = drm_dp_dpcd_read_byte(&intel_dp->aux, DP_RECEIVER_ALPM_CAP,
4622+ &intel_dp->alpm_dpcd);
4623+ if (ret < 0)
4624+ return false;
4625+
46194626 /*
46204627 * This has to be called after intel_dp->edp_dpcd is filled, PSR checks
46214628 * for SET_POWER_CAPABLE bit in intel_dp->edp_dpcd[1]
drivers/gpu/drm/i915/display/intel_psr.c+48−12
@@ -2619,6 +2619,12 @@ void intel_psr2_program_trans_man_trk_ctl(struct intel_dsb *dsb, · 2618 unmodified lines
26192619
26202620 intel_de_write_dsb(display, dsb, PIPE_SRCSZ_ERLY_TPT(crtc->pipe),
26212621 crtc_state->pipe_srcsz_early_tpt);
2622+
2623+ if (!crtc_state->dsc.compression_enable)
2624+ return;
2625+
2626+ intel_dsc_su_et_parameters_configure(dsb, encoder, crtc_state,
2627+ drm_rect_height(&crtc_state->psr2_su_area));
26222628 }
26232629
26242630 static void psr2_man_trk_ctl_calc(struct intel_crtc_state *crtc_state,
@@ -2689,11 +2695,12 @@ static void clip_area_update(struct drm_rect *overlap_damage_area, · 64 unmodified lines
26892695 overlap_damage_area->y2 = damage_area->y2;
26902696 }
26912697
2692−static void intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state *crtc_state)
2698+static bool intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state *crtc_state)
26932699 {
26942700 struct intel_display *display = to_intel_display(crtc_state);
26952701 const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
26962702 u16 y_alignment;
2703+ bool su_area_changed = false;
26972704
26982705 /* ADLP aligns the SU region to vdsc slice height in case dsc is enabled */
26992706 if (crtc_state->dsc.compression_enable &&
@@ -2702,10 +2709,18 @@ static void intel_psr2_sel_fetch_pipe_alignment(struct intel_crtc_state *crtc_st · 2 unmodified lines
27022709 else
27032710 y_alignment = crtc_state->su_y_granularity;
27042711
2705− crtc_state->psr2_su_area.y1 -= crtc_state->psr2_su_area.y1 % y_alignment;
2706− if (crtc_state->psr2_su_area.y2 % y_alignment)
2712+ if (crtc_state->psr2_su_area.y1 % y_alignment) {
2713+ crtc_state->psr2_su_area.y1 -= crtc_state->psr2_su_area.y1 % y_alignment;
2714+ su_area_changed = true;
2715+ }
2716+
2717+ if (crtc_state->psr2_su_area.y2 % y_alignment) {
27072718 crtc_state->psr2_su_area.y2 = ((crtc_state->psr2_su_area.y2 /
27082719 y_alignment) + 1) * y_alignment;
2720+ su_area_changed = true;
2721+ }
2722+
2723+ return su_area_changed;
27092724 }
27102725
27112726 /*
@@ -2839,7 +2854,7 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, · 127 unmodified lines
28392854 struct intel_crtc_state *crtc_state = intel_atomic_get_new_crtc_state(state, crtc);
28402855 struct intel_plane_state *new_plane_state, *old_plane_state;
28412856 struct intel_plane *plane;
2842− bool full_update = false, cursor_in_su_area = false;
2857+ bool full_update = false, su_area_changed;
28432858 int i, ret;
28442859
28452860 if (!crtc_state->enable_psr2_sel_fetch)
@@ -2946,15 +2961,32 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, · 100 unmodified lines
29462961 if (ret)
29472962 return ret;
29482963
2949− /*
2950− * Adjust su area to cover cursor fully as necessary (early
2951− * transport). This needs to be done after
2952− * drm_atomic_add_affected_planes to ensure visible cursor is added into
2953− * affected planes even when cursor is not updated by itself.
2954− */
2955− intel_psr2_sel_fetch_et_alignment(state, crtc, &cursor_in_su_area);
2964+ do {
2965+ bool cursor_in_su_area;
29562966
2957− intel_psr2_sel_fetch_pipe_alignment(crtc_state);
2967+ /*
2968+ * Adjust su area to cover cursor fully as necessary
2969+ * (early transport). This needs to be done after
2970+ * drm_atomic_add_affected_planes to ensure visible
2971+ * cursor is added into affected planes even when
2972+ * cursor is not updated by itself.
2973+ */
2974+ intel_psr2_sel_fetch_et_alignment(state, crtc, &cursor_in_su_area);
2975+
2976+ su_area_changed = intel_psr2_sel_fetch_pipe_alignment(crtc_state);
2977+
2978+ /*
2979+ * If the cursor was outside the SU area before
2980+ * alignment, the alignment step (which only expands
2981+ * SU) may pull the cursor partially inside, so we
2982+ * must run ET alignment again to fully cover it. But
2983+ * if the cursor was already fully inside before
2984+ * alignment, expanding the SU area won't change that,
2985+ * so no further work is needed.
2986+ */
2987+ if (cursor_in_su_area)
2988+ break;
2989+ } while (su_area_changed);
29582990
29592991 /*
29602992 * Now that we have the pipe damaged area check if it intersect with
@@ -3014,6 +3046,10 @@ int intel_psr2_sel_fetch_update(struct intel_atomic_state *state, · 53 unmodified lines
30143046 }
30153047
30163048 skip_sel_fetch_set_loop:
3049+ if (full_update)
3050+ clip_area_update(&crtc_state->psr2_su_area, &crtc_state->pipe_src,
3051+ &crtc_state->pipe_src);
3052+
30173053 psr2_man_trk_ctl_calc(crtc_state, full_update);
30183054 crtc_state->pipe_srcsz_early_tpt =
30193055 psr2_pipe_srcsz_early_tpt_calc(crtc_state, full_update);
drivers/gpu/drm/i915/display/intel_vdsc.c+23−0
@@ -767,6 +767,29 @@ void intel_dsc_dp_pps_write(struct intel_encoder *encoder, · 766 unmodified lines
767767 sizeof(dp_dsc_pps_sdp));
768768 }
769769
770+void intel_dsc_su_et_parameters_configure(struct intel_dsb *dsb, struct intel_encoder *encoder,
771+ const struct intel_crtc_state *crtc_state, int su_lines)
772+{
773+ struct intel_display *display = to_intel_display(crtc_state);
774+ struct intel_crtc *crtc = to_intel_crtc(crtc_state->uapi.crtc);
775+ const struct drm_dsc_config *vdsc_cfg = &crtc_state->dsc.config;
776+ enum pipe pipe = crtc->pipe;
777+ int vdsc_instances_per_pipe = intel_dsc_get_vdsc_per_pipe(crtc_state);
778+ int slice_row_per_frame = su_lines / vdsc_cfg->slice_height;
779+ u32 val;
780+
781+ drm_WARN_ON_ONCE(display->drm, su_lines % vdsc_cfg->slice_height);
782+ drm_WARN_ON_ONCE(display->drm, vdsc_instances_per_pipe > 2);
783+
784+ val = DSC_SUPS0_SU_SLICE_ROW_PER_FRAME(slice_row_per_frame);
785+ val |= DSC_SUPS0_SU_PIC_HEIGHT(su_lines);
786+
787+ intel_de_write_dsb(display, dsb, LNL_DSC0_SU_PARAMETER_SET_0(pipe), val);
788+
789+ if (vdsc_instances_per_pipe == 2)
790+ intel_de_write_dsb(display, dsb, LNL_DSC1_SU_PARAMETER_SET_0(pipe), val);
791+}
792+
770793 static i915_reg_t dss_ctl1_reg(struct intel_crtc *crtc, enum transcoder cpu_transcoder)
771794 {
772795 return is_pipe_dsc(crtc, cpu_transcoder) ?
drivers/gpu/drm/i915/display/intel_vdsc.h+3−0
@@ -13,6 +13,7 @@ struct drm_printer; · 12 unmodified lines
1313 enum transcoder;
1414 struct intel_crtc;
1515 struct intel_crtc_state;
16+struct intel_dsb;
1617 struct intel_encoder;
1718
1819 bool intel_dsc_source_support(const struct intel_crtc_state *crtc_state);
@@ -31,6 +32,8 @@ void intel_dsc_dsi_pps_write(struct intel_encoder *encoder, · 12 unmodified lines
3132 const struct intel_crtc_state *crtc_state);
3233 void intel_dsc_dp_pps_write(struct intel_encoder *encoder,
3334 const struct intel_crtc_state *crtc_state);
35+void intel_dsc_su_et_parameters_configure(struct intel_dsb *dsb, struct intel_encoder *encoder,
36+ const struct intel_crtc_state *crtc_state, int su_lines);
3437 void intel_vdsc_state_dump(struct drm_printer *p, int indent,
3538 const struct intel_crtc_state *crtc_state);
3639 int intel_vdsc_min_cdclk(const struct intel_crtc_state *crtc_state);
drivers/gpu/drm/i915/display/intel_vdsc_regs.h+12−0
@@ -196,6 +196,18 @@ · 195 unmodified lines
196196 #define DSC_PPS18_NSL_BPG_OFFSET(offset) REG_FIELD_PREP(DSC_PPS18_NSL_BPG_OFFSET_MASK, offset)
197197 #define DSC_PPS18_SL_OFFSET_ADJ(offset) REG_FIELD_PREP(DSC_PPS18_SL_OFFSET_ADJ_MASK, offset)
198198
199+#define _LNL_DSC0_SU_PARAMETER_SET_0_PA 0x78064
200+#define _LNL_DSC1_SU_PARAMETER_SET_0_PA 0x78164
201+#define _LNL_DSC0_SU_PARAMETER_SET_0_PB 0x78264
202+#define _LNL_DSC1_SU_PARAMETER_SET_0_PB 0x78364
203+#define LNL_DSC0_SU_PARAMETER_SET_0(pipe) _MMIO_PIPE((pipe), _LNL_DSC0_SU_PARAMETER_SET_0_PA, _LNL_DSC0_SU_PARAMETER_SET_0_PB)
204+#define LNL_DSC1_SU_PARAMETER_SET_0(pipe) _MMIO_PIPE((pipe), _LNL_DSC1_SU_PARAMETER_SET_0_PA, _LNL_DSC1_SU_PARAMETER_SET_0_PB)
205+
206+#define DSC_SUPS0_SU_SLICE_ROW_PER_FRAME_MASK REG_GENMASK(31, 20)
207+#define DSC_SUPS0_SU_SLICE_ROW_PER_FRAME(rows) REG_FIELD_PREP(DSC_SUPS0_SU_SLICE_ROW_PER_FRAME_MASK, (rows))
208+#define DSC_SUPS0_SU_PIC_HEIGHT_MASK REG_GENMASK(15, 0)
209+#define DSC_SUPS0_SU_PIC_HEIGHT(h) REG_FIELD_PREP(DSC_SUPS0_SU_PIC_HEIGHT_MASK, (h))
210+
199211 /* Icelake Rate Control Buffer Threshold Registers */
200212 #define DSCA_RC_BUF_THRESH_0 _MMIO(0x6B230)
201213 #define DSCA_RC_BUF_THRESH_0_UDW _MMIO(0x6B230 + 4)
drivers/gpu/drm/i915/display/intel_vrr.c+14−0
@@ -597,6 +597,18 @@ void intel_vrr_set_transcoder_timings(const struct intel_crtc_state *crtc_state) · 596 unmodified lines
597597 if (!HAS_VRR(display))
598598 return;
599599
600+ /*
601+ * Bspec says:
602+ * "(note: VRR needs to be programmed after
603+ * TRANS_DDI_FUNC_CTL and before TRANS_CONF)."
604+ *
605+ * In practice it turns out that ICL can hang if
606+ * TRANS_VRR_VMAX/FLIPLINE are written before
607+ * enabling TRANS_DDI_FUNC_CTL.
608+ */
609+ drm_WARN_ON(display->drm,
610+ !(intel_de_read(display, TRANS_DDI_FUNC_CTL(display, cpu_transcoder)) & TRANS_DDI_FUNC_ENABLE));
611+
600612 /*
601613 * This bit seems to have two meanings depending on the platform:
602614 * TGL: generate VRR "safe window" for DSB vblank waits
@@ -939,6 +951,8 @@ void intel_vrr_transcoder_enable(const struct intel_crtc_state *crtc_state) · 336 unmodified lines
939951 {
940952 struct intel_display *display = to_intel_display(crtc_state);
941953
954+ intel_vrr_set_transcoder_timings(crtc_state);
955+
942956 if (!intel_vrr_possible(crtc_state))
943957 return;
944958
drivers/gpu/drm/i915/gem/i915_gem_shmem.c+9−3
@@ -153,8 +153,12 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, struct sg_table *st, · 152 unmodified lines
153153 }
154154 } while (1);
155155
156− nr_pages = min_t(unsigned long,
157− folio_nr_pages(folio), page_count - i);
156+ nr_pages = min_array(((unsigned long[]) {
157+ folio_nr_pages(folio),
158+ page_count - i,
159+ max_segment / PAGE_SIZE,
160+ }), 3);
161+
158162 if (!i ||
159163 sg->length >= max_segment ||
160164 folio_pfn(folio) != next_pfn) {
@@ -164,7 +168,9 @@ int shmem_sg_alloc_table(struct drm_i915_private *i915, struct sg_table *st, · 3 unmodified lines
164168 st->nents++;
165169 sg_set_folio(sg, folio, nr_pages * PAGE_SIZE, 0);
166170 } else {
167− /* XXX: could overflow? */
171+ nr_pages = min_t(unsigned long, nr_pages,
172+ (max_segment - sg->length) / PAGE_SIZE);
173+
168174 sg->length += nr_pages * PAGE_SIZE;
169175 }
170176 next_pfn = folio_pfn(folio) + nr_pages;
drivers/gpu/drm/msm/adreno/a2xx_gpummu.c+1−1
@@ -78,7 +78,7 @@ static void a2xx_gpummu_destroy(struct msm_mmu *mmu) · 77 unmodified lines
7878 {
7979 struct a2xx_gpummu *gpummu = to_a2xx_gpummu(mmu);
8080
81− dma_free_attrs(mmu->dev, TABLE_SIZE, gpummu->table, gpummu->pt_base,
81+ dma_free_attrs(mmu->dev, TABLE_SIZE + 32, gpummu->table, gpummu->pt_base,
8282 DMA_ATTR_FORCE_CONTIGUOUS);
8383
8484 kfree(gpummu);
drivers/gpu/drm/msm/adreno/a6xx_catalog.c+1−2
@@ -1759,7 +1759,7 @@ static const u32 x285_protect_regs[] = { · 1758 unmodified lines
17591759 A6XX_PROTECT_NORDWR(0x27c06, 0x0000),
17601760 };
17611761
1762−DECLARE_ADRENO_PROTECT(x285_protect, 64);
1762+DECLARE_ADRENO_PROTECT(x285_protect, 15);
17631763
17641764 static const struct adreno_reglist_pipe a840_nonctxt_regs[] = {
17651765 { REG_A8XX_CP_SMMU_STREAM_ID_LPAC, 0x00000101, BIT(PIPE_NONE) },
@@ -1966,5 +1966,4 @@ static inline __always_unused void __build_asserts(void) · 200 unmodified lines
19661966 BUILD_BUG_ON(a660_protect.count > a660_protect.count_max);
19671967 BUILD_BUG_ON(a690_protect.count > a690_protect.count_max);
19681968 BUILD_BUG_ON(a730_protect.count > a730_protect.count_max);
1969− BUILD_BUG_ON(a840_protect.count > a840_protect.count_max);
19701969 }
drivers/gpu/drm/msm/adreno/a8xx_gpu.c+12−2
@@ -310,11 +310,21 @@ static void a8xx_set_ubwc_config(struct msm_gpu *gpu) · 309 unmodified lines
310310 hbb = cfg->highest_bank_bit - 13;
311311 hbb_hi = hbb >> 2;
312312 hbb_lo = hbb & 3;
313− a8xx_write_pipe(gpu, PIPE_BV, REG_A8XX_GRAS_NC_MODE_CNTL, hbb << 5);
314− a8xx_write_pipe(gpu, PIPE_BR, REG_A8XX_GRAS_NC_MODE_CNTL, hbb << 5);
313+
314+ a8xx_write_pipe(gpu, PIPE_BV, REG_A8XX_GRAS_NC_MODE_CNTL,
315+ hbb << 5 |
316+ level3_swizzling_dis << 4 |
317+ level2_swizzling_dis << 3);
318+
319+ a8xx_write_pipe(gpu, PIPE_BR, REG_A8XX_GRAS_NC_MODE_CNTL,
320+ hbb << 5 |
321+ level3_swizzling_dis << 4 |
322+ level2_swizzling_dis << 3);
315323
316324 a8xx_write_pipe(gpu, PIPE_BR, REG_A8XX_RB_CCU_NC_MODE_CNTL,
317325 yuvnotcomptofc << 6 |
326+ level3_swizzling_dis << 5 |
327+ level2_swizzling_dis << 4 |
318328 hbb_hi << 3 |
319329 hbb_lo << 1);
320330
drivers/gpu/drm/msm/adreno/adreno_device.c+1−0
@@ -302,6 +302,7 @@ static const struct of_device_id dt_match[] = { · 301 unmodified lines
302302 { .compatible = "qcom,kgsl-3d0" },
303303 {}
304304 };
305+MODULE_DEVICE_TABLE(of, dt_match);
305306
306307 static int adreno_runtime_resume(struct device *dev)
307308 {
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_0_sc8280xp.h+6−6
@@ -133,7 +133,7 @@ static const struct dpu_sspp_cfg sc8280xp_sspp[] = { · 132 unmodified lines
133133 static const struct dpu_lm_cfg sc8280xp_lm[] = {
134134 {
135135 .name = "lm_0", .id = LM_0,
136− .base = 0x44000, .len = 0x320,
136+ .base = 0x44000, .len = 0x400,
137137 .features = MIXER_MSM8998_MASK,
138138 .sblk = &sdm845_lm_sblk,
139139 .lm_pair = LM_1,
@@ -141,7 +141,7 @@ static const struct dpu_lm_cfg sc8280xp_lm[] = { · 1 unmodified line
141141 .dspp = DSPP_0,
142142 }, {
143143 .name = "lm_1", .id = LM_1,
144− .base = 0x45000, .len = 0x320,
144+ .base = 0x45000, .len = 0x400,
145145 .features = MIXER_MSM8998_MASK,
146146 .sblk = &sdm845_lm_sblk,
147147 .lm_pair = LM_0,
@@ -149,7 +149,7 @@ static const struct dpu_lm_cfg sc8280xp_lm[] = { · 1 unmodified line
149149 .dspp = DSPP_1,
150150 }, {
151151 .name = "lm_2", .id = LM_2,
152− .base = 0x46000, .len = 0x320,
152+ .base = 0x46000, .len = 0x400,
153153 .features = MIXER_MSM8998_MASK,
154154 .sblk = &sdm845_lm_sblk,
155155 .lm_pair = LM_3,
@@ -157,7 +157,7 @@ static const struct dpu_lm_cfg sc8280xp_lm[] = { · 1 unmodified line
157157 .dspp = DSPP_2,
158158 }, {
159159 .name = "lm_3", .id = LM_3,
160− .base = 0x47000, .len = 0x320,
160+ .base = 0x47000, .len = 0x400,
161161 .features = MIXER_MSM8998_MASK,
162162 .sblk = &sdm845_lm_sblk,
163163 .lm_pair = LM_2,
@@ -165,14 +165,14 @@ static const struct dpu_lm_cfg sc8280xp_lm[] = { · 1 unmodified line
165165 .dspp = DSPP_3,
166166 }, {
167167 .name = "lm_4", .id = LM_4,
168− .base = 0x48000, .len = 0x320,
168+ .base = 0x48000, .len = 0x400,
169169 .features = MIXER_MSM8998_MASK,
170170 .sblk = &sdm845_lm_sblk,
171171 .lm_pair = LM_5,
172172 .pingpong = PINGPONG_4,
173173 }, {
174174 .name = "lm_5", .id = LM_5,
175− .base = 0x49000, .len = 0x320,
175+ .base = 0x49000, .len = 0x400,
176176 .features = MIXER_MSM8998_MASK,
177177 .sblk = &sdm845_lm_sblk,
178178 .lm_pair = LM_4,
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_1_sm8450.h+6−6
@@ -134,7 +134,7 @@ static const struct dpu_sspp_cfg sm8450_sspp[] = { · 133 unmodified lines
134134 static const struct dpu_lm_cfg sm8450_lm[] = {
135135 {
136136 .name = "lm_0", .id = LM_0,
137− .base = 0x44000, .len = 0x320,
137+ .base = 0x44000, .len = 0x400,
138138 .features = MIXER_MSM8998_MASK,
139139 .sblk = &sdm845_lm_sblk,
140140 .lm_pair = LM_1,
@@ -142,7 +142,7 @@ static const struct dpu_lm_cfg sm8450_lm[] = { · 1 unmodified line
142142 .dspp = DSPP_0,
143143 }, {
144144 .name = "lm_1", .id = LM_1,
145− .base = 0x45000, .len = 0x320,
145+ .base = 0x45000, .len = 0x400,
146146 .features = MIXER_MSM8998_MASK,
147147 .sblk = &sdm845_lm_sblk,
148148 .lm_pair = LM_0,
@@ -150,7 +150,7 @@ static const struct dpu_lm_cfg sm8450_lm[] = { · 1 unmodified line
150150 .dspp = DSPP_1,
151151 }, {
152152 .name = "lm_2", .id = LM_2,
153− .base = 0x46000, .len = 0x320,
153+ .base = 0x46000, .len = 0x400,
154154 .features = MIXER_MSM8998_MASK,
155155 .sblk = &sdm845_lm_sblk,
156156 .lm_pair = LM_3,
@@ -158,7 +158,7 @@ static const struct dpu_lm_cfg sm8450_lm[] = { · 1 unmodified line
158158 .dspp = DSPP_2,
159159 }, {
160160 .name = "lm_3", .id = LM_3,
161− .base = 0x47000, .len = 0x320,
161+ .base = 0x47000, .len = 0x400,
162162 .features = MIXER_MSM8998_MASK,
163163 .sblk = &sdm845_lm_sblk,
164164 .lm_pair = LM_2,
@@ -166,14 +166,14 @@ static const struct dpu_lm_cfg sm8450_lm[] = { · 1 unmodified line
166166 .dspp = DSPP_3,
167167 }, {
168168 .name = "lm_4", .id = LM_4,
169− .base = 0x48000, .len = 0x320,
169+ .base = 0x48000, .len = 0x400,
170170 .features = MIXER_MSM8998_MASK,
171171 .sblk = &sdm845_lm_sblk,
172172 .lm_pair = LM_5,
173173 .pingpong = PINGPONG_4,
174174 }, {
175175 .name = "lm_5", .id = LM_5,
176− .base = 0x49000, .len = 0x320,
176+ .base = 0x49000, .len = 0x400,
177177 .features = MIXER_MSM8998_MASK,
178178 .sblk = &sdm845_lm_sblk,
179179 .lm_pair = LM_4,
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_8_4_sa8775p.h+2−2
@@ -366,8 +366,8 @@ static const struct dpu_intf_cfg sa8775p_intf[] = { · 365 unmodified lines
366366 .type = INTF_NONE,
367367 .controller_id = MSM_DP_CONTROLLER_0, /* pair with intf_0 for DP MST */
368368 .prog_fetch_lines_worst_case = 24,
369− .intr_underrun = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 17),
370− .intr_vsync = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 16),
369+ .intr_underrun = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 16),
370+ .intr_vsync = DPU_IRQ_IDX(MDP_SSPP_TOP0_INTR, 17),
371371 }, {
372372 .name = "intf_7", .id = INTF_7,
373373 .base = 0x3b000, .len = 0x280,
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_0_sm8550.h+6−6
@@ -131,7 +131,7 @@ static const struct dpu_sspp_cfg sm8550_sspp[] = { · 130 unmodified lines
131131 static const struct dpu_lm_cfg sm8550_lm[] = {
132132 {
133133 .name = "lm_0", .id = LM_0,
134− .base = 0x44000, .len = 0x320,
134+ .base = 0x44000, .len = 0x400,
135135 .features = MIXER_MSM8998_MASK,
136136 .sblk = &sdm845_lm_sblk,
137137 .lm_pair = LM_1,
@@ -139,7 +139,7 @@ static const struct dpu_lm_cfg sm8550_lm[] = { · 1 unmodified line
139139 .dspp = DSPP_0,
140140 }, {
141141 .name = "lm_1", .id = LM_1,
142− .base = 0x45000, .len = 0x320,
142+ .base = 0x45000, .len = 0x400,
143143 .features = MIXER_MSM8998_MASK,
144144 .sblk = &sdm845_lm_sblk,
145145 .lm_pair = LM_0,
@@ -147,7 +147,7 @@ static const struct dpu_lm_cfg sm8550_lm[] = { · 1 unmodified line
147147 .dspp = DSPP_1,
148148 }, {
149149 .name = "lm_2", .id = LM_2,
150− .base = 0x46000, .len = 0x320,
150+ .base = 0x46000, .len = 0x400,
151151 .features = MIXER_MSM8998_MASK,
152152 .sblk = &sdm845_lm_sblk,
153153 .lm_pair = LM_3,
@@ -155,7 +155,7 @@ static const struct dpu_lm_cfg sm8550_lm[] = { · 1 unmodified line
155155 .dspp = DSPP_2,
156156 }, {
157157 .name = "lm_3", .id = LM_3,
158− .base = 0x47000, .len = 0x320,
158+ .base = 0x47000, .len = 0x400,
159159 .features = MIXER_MSM8998_MASK,
160160 .sblk = &sdm845_lm_sblk,
161161 .lm_pair = LM_2,
@@ -163,14 +163,14 @@ static const struct dpu_lm_cfg sm8550_lm[] = { · 1 unmodified line
163163 .dspp = DSPP_3,
164164 }, {
165165 .name = "lm_4", .id = LM_4,
166− .base = 0x48000, .len = 0x320,
166+ .base = 0x48000, .len = 0x400,
167167 .features = MIXER_MSM8998_MASK,
168168 .sblk = &sdm845_lm_sblk,
169169 .lm_pair = LM_5,
170170 .pingpong = PINGPONG_4,
171171 }, {
172172 .name = "lm_5", .id = LM_5,
173− .base = 0x49000, .len = 0x320,
173+ .base = 0x49000, .len = 0x400,
174174 .features = MIXER_MSM8998_MASK,
175175 .sblk = &sdm845_lm_sblk,
176176 .lm_pair = LM_4,
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_1_sar2130p.h+6−6
@@ -131,7 +131,7 @@ static const struct dpu_sspp_cfg sar2130p_sspp[] = { · 130 unmodified lines
131131 static const struct dpu_lm_cfg sar2130p_lm[] = {
132132 {
133133 .name = "lm_0", .id = LM_0,
134− .base = 0x44000, .len = 0x320,
134+ .base = 0x44000, .len = 0x400,
135135 .features = MIXER_MSM8998_MASK,
136136 .sblk = &sdm845_lm_sblk,
137137 .lm_pair = LM_1,
@@ -139,7 +139,7 @@ static const struct dpu_lm_cfg sar2130p_lm[] = { · 1 unmodified line
139139 .dspp = DSPP_0,
140140 }, {
141141 .name = "lm_1", .id = LM_1,
142− .base = 0x45000, .len = 0x320,
142+ .base = 0x45000, .len = 0x400,
143143 .features = MIXER_MSM8998_MASK,
144144 .sblk = &sdm845_lm_sblk,
145145 .lm_pair = LM_0,
@@ -147,7 +147,7 @@ static const struct dpu_lm_cfg sar2130p_lm[] = { · 1 unmodified line
147147 .dspp = DSPP_1,
148148 }, {
149149 .name = "lm_2", .id = LM_2,
150− .base = 0x46000, .len = 0x320,
150+ .base = 0x46000, .len = 0x400,
151151 .features = MIXER_MSM8998_MASK,
152152 .sblk = &sdm845_lm_sblk,
153153 .lm_pair = LM_3,
@@ -155,7 +155,7 @@ static const struct dpu_lm_cfg sar2130p_lm[] = { · 1 unmodified line
155155 .dspp = DSPP_2,
156156 }, {
157157 .name = "lm_3", .id = LM_3,
158− .base = 0x47000, .len = 0x320,
158+ .base = 0x47000, .len = 0x400,
159159 .features = MIXER_MSM8998_MASK,
160160 .sblk = &sdm845_lm_sblk,
161161 .lm_pair = LM_2,
@@ -163,14 +163,14 @@ static const struct dpu_lm_cfg sar2130p_lm[] = { · 1 unmodified line
163163 .dspp = DSPP_3,
164164 }, {
165165 .name = "lm_4", .id = LM_4,
166− .base = 0x48000, .len = 0x320,
166+ .base = 0x48000, .len = 0x400,
167167 .features = MIXER_MSM8998_MASK,
168168 .sblk = &sdm845_lm_sblk,
169169 .lm_pair = LM_5,
170170 .pingpong = PINGPONG_4,
171171 }, {
172172 .name = "lm_5", .id = LM_5,
173− .base = 0x49000, .len = 0x320,
173+ .base = 0x49000, .len = 0x400,
174174 .features = MIXER_MSM8998_MASK,
175175 .sblk = &sdm845_lm_sblk,
176176 .lm_pair = LM_4,
drivers/gpu/drm/msm/disp/dpu1/catalog/dpu_9_2_x1e80100.h+6−6
@@ -130,7 +130,7 @@ static const struct dpu_sspp_cfg x1e80100_sspp[] = { · 129 unmodified lines
130130 static const struct dpu_lm_cfg x1e80100_lm[] = {
131131 {
132132 .name = "lm_0", .id = LM_0,
133− .base = 0x44000, .len = 0x320,
133+ .base = 0x44000, .len = 0x400,
134134 .features = MIXER_MSM8998_MASK,
135135 .sblk = &sdm845_lm_sblk,
136136 .lm_pair = LM_1,
@@ -138,7 +138,7 @@ static const struct dpu_lm_cfg x1e80100_lm[] = { · 1 unmodified line
138138 .dspp = DSPP_0,
139139 }, {
140140 .name = "lm_1", .id = LM_1,
141− .base = 0x45000, .len = 0x320,
141+ .base = 0x45000, .len = 0x400,
142142 .features = MIXER_MSM8998_MASK,
143143 .sblk = &sdm845_lm_sblk,
144144 .lm_pair = LM_0,
@@ -146,7 +146,7 @@ static const struct dpu_lm_cfg x1e80100_lm[] = { · 1 unmodified line
146146 .dspp = DSPP_1,
147147 }, {
148148 .name = "lm_2", .id = LM_2,
149− .base = 0x46000, .len = 0x320,
149+ .base = 0x46000, .len = 0x400,
150150 .features = MIXER_MSM8998_MASK,
151151 .sblk = &sdm845_lm_sblk,
152152 .lm_pair = LM_3,
@@ -154,7 +154,7 @@ static const struct dpu_lm_cfg x1e80100_lm[] = { · 1 unmodified line
154154 .dspp = DSPP_2,
155155 }, {
156156 .name = "lm_3", .id = LM_3,
157− .base = 0x47000, .len = 0x320,
157+ .base = 0x47000, .len = 0x400,
158158 .features = MIXER_MSM8998_MASK,
159159 .sblk = &sdm845_lm_sblk,
160160 .lm_pair = LM_2,
@@ -162,14 +162,14 @@ static const struct dpu_lm_cfg x1e80100_lm[] = { · 1 unmodified line
162162 .dspp = DSPP_3,
163163 }, {
164164 .name = "lm_4", .id = LM_4,
165− .base = 0x48000, .len = 0x320,
165+ .base = 0x48000, .len = 0x400,
166166 .features = MIXER_MSM8998_MASK,
167167 .sblk = &sdm845_lm_sblk,
168168 .lm_pair = LM_5,
169169 .pingpong = PINGPONG_4,
170170 }, {
171171 .name = "lm_5", .id = LM_5,
172− .base = 0x49000, .len = 0x320,
172+ .base = 0x49000, .len = 0x400,
173173 .features = MIXER_MSM8998_MASK,
174174 .sblk = &sdm845_lm_sblk,
175175 .lm_pair = LM_4,
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_dspp.c+1−1
@@ -89,7 +89,7 @@ static void dpu_setup_dspp_gc(struct dpu_hw_dspp *ctx, · 88 unmodified lines
8989 base = ctx->cap->sblk->gc.base;
9090
9191 if (!base) {
92− DRM_ERROR("invalid ctx %pK gc base\n", ctx);
92+ DRM_ERROR("invalid ctx %p gc base\n", ctx);
9393 return;
9494 }
9595
drivers/gpu/drm/msm/disp/dpu1/dpu_hw_sspp_v13.c+3−1
@@ -156,11 +156,13 @@ static void dpu_hw_sspp_setup_pe_config_v13(struct dpu_hw_sspp *ctx, · 155 unmodified lines
156156 u8 color;
157157 u32 lr_pe[4], tb_pe[4];
158158 const u32 bytemask = 0xff;
159− u32 offset = ctx->cap->sblk->sspp_rec0_blk.base;
159+ u32 offset;
160160
161161 if (!ctx || !pe_ext)
162162 return;
163163
164+ offset = ctx->cap->sblk->sspp_rec0_blk.base;
165+
164166 c = &ctx->hw;
165167 /* program SW pixel extension override for all pipes*/
166168 for (color = 0; color < DPU_MAX_PLANES; color++) {
drivers/gpu/drm/msm/disp/dpu1/dpu_rm.c+14−38
@@ -350,26 +350,28 @@ static bool _dpu_rm_check_lm_and_get_connected_blks(struct dpu_rm *rm, · 349 unmodified lines
350350 return true;
351351 }
352352
353−static bool dpu_rm_find_lms(struct dpu_rm *rm,
354− struct dpu_global_state *global_state,
355− uint32_t crtc_id, bool skip_dspp,
356− struct msm_display_topology *topology,
357− int *lm_idx, int *pp_idx, int *dspp_idx)
353+static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
354+ struct dpu_global_state *global_state,
355+ uint32_t crtc_id,
356+ struct msm_display_topology *topology)
358357
359358 {
359+ int lm_idx[MAX_BLOCKS];
360+ int pp_idx[MAX_BLOCKS];
361+ int dspp_idx[MAX_BLOCKS] = {0};
360362 int i, lm_count = 0;
361363
364+ if (!topology->num_lm) {
365+ DPU_ERROR("zero LMs in topology\n");
366+ return -EINVAL;
367+ }
368+
362369 /* Find a primary mixer */
363370 for (i = 0; i < ARRAY_SIZE(rm->mixer_blks) &&
364371 lm_count < topology->num_lm; i++) {
365372 if (!rm->mixer_blks[i])
366373 continue;
367374
368− if (skip_dspp && to_dpu_hw_mixer(rm->mixer_blks[i])->cap->dspp) {
369− DPU_DEBUG("Skipping LM_%d, skipping LMs with DSPPs\n", i);
370− continue;
371− }
372−
373375 /*
374376 * Reset lm_count to an even index. This will drop the previous
375377 * primary mixer if failed to find its peer.
@@ -408,38 +410,12 @@ static bool dpu_rm_find_lms(struct dpu_rm *rm, · 32 unmodified lines
408410 }
409411 }
410412
411− return lm_count == topology->num_lm;
412−}
413−
414−static int _dpu_rm_reserve_lms(struct dpu_rm *rm,
415− struct dpu_global_state *global_state,
416− uint32_t crtc_id,
417− struct msm_display_topology *topology)
418−
419−{
420− int lm_idx[MAX_BLOCKS];
421− int pp_idx[MAX_BLOCKS];
422− int dspp_idx[MAX_BLOCKS] = {0};
423− int i;
424− bool found;
425−
426− if (!topology->num_lm) {
427− DPU_ERROR("zero LMs in topology\n");
428− return -EINVAL;
429− }
430−
431− /* Try using non-DSPP LM blocks first */
432− found = dpu_rm_find_lms(rm, global_state, crtc_id, !topology->num_dspp,
433− topology, lm_idx, pp_idx, dspp_idx);
434− if (!found && !topology->num_dspp)
435− found = dpu_rm_find_lms(rm, global_state, crtc_id, false,
436− topology, lm_idx, pp_idx, dspp_idx);
437− if (!found) {
413+ if (lm_count != topology->num_lm) {
438414 DPU_DEBUG("unable to find appropriate mixers\n");
439415 return -ENAVAIL;
440416 }
441417
442− for (i = 0; i < topology->num_lm; i++) {
418+ for (i = 0; i < lm_count; i++) {
443419 global_state->mixer_to_crtc_id[lm_idx[i]] = crtc_id;
444420 global_state->pingpong_to_crtc_id[pp_idx[i]] = crtc_id;
445421 global_state->dspp_to_crtc_id[dspp_idx[i]] =
drivers/gpu/drm/msm/dsi/dsi_host.c+31−12
@@ -584,13 +584,30 @@ void dsi_link_clk_disable_v2(struct msm_dsi_host *msm_host) · 583 unmodified lines
584584 * FIXME: Reconsider this if/when CMD mode handling is rewritten to use
585585 * transfer time and data overhead as a starting point of the calculations.
586586 */
587−static unsigned long dsi_adjust_pclk_for_compression(const struct drm_display_mode *mode,
588− const struct drm_dsc_config *dsc)
587+static unsigned long
588+dsi_adjust_pclk_for_compression(const struct drm_display_mode *mode,
589+ const struct drm_dsc_config *dsc,
590+ bool is_bonded_dsi)
589591 {
590− int new_hdisplay = DIV_ROUND_UP(mode->hdisplay * drm_dsc_get_bpp_int(dsc),
591− dsc->bits_per_component * 3);
592+ int hdisplay, new_hdisplay, new_htotal;
592593
593− int new_htotal = mode->htotal - mode->hdisplay + new_hdisplay;
594+ /*
595+ * For bonded DSI, split hdisplay across two links and round up each
596+ * half separately, passing the full hdisplay would only round up once.
597+ * This also aligns with the hdisplay we program later in
598+ * dsi_timing_setup()
599+ */
600+ hdisplay = mode->hdisplay;
601+ if (is_bonded_dsi)
602+ hdisplay /= 2;
603+
604+ new_hdisplay = DIV_ROUND_UP(hdisplay * drm_dsc_get_bpp_int(dsc),
605+ dsc->bits_per_component * 3);
606+
607+ if (is_bonded_dsi)
608+ new_hdisplay *= 2;
609+
610+ new_htotal = mode->htotal - mode->hdisplay + new_hdisplay;
594611
595612 return mult_frac(mode->clock * 1000u, new_htotal, mode->htotal);
596613 }
@@ -603,7 +620,7 @@ static unsigned long dsi_get_pclk_rate(const struct drm_display_mode *mode, · 6 unmodified lines
603620 pclk_rate = mode->clock * 1000u;
604621
605622 if (dsc)
606− pclk_rate = dsi_adjust_pclk_for_compression(mode, dsc);
623+ pclk_rate = dsi_adjust_pclk_for_compression(mode, dsc, is_bonded_dsi);
607624
608625 /*
609626 * For bonded DSI mode, the current DRM mode has the complete width of the
@@ -993,7 +1010,7 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi) · 383 unmodified lines
9931010
9941011 if (msm_host->dsc) {
9951012 struct drm_dsc_config *dsc = msm_host->dsc;
996− u32 bytes_per_pclk;
1013+ u32 bits_per_pclk;
9971014
9981015 /* update dsc params with timing params */
9991016 if (!dsc || !mode->hdisplay || !mode->vdisplay) {
@@ -1015,7 +1032,9 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi) · 15 unmodified lines
10151032
10161033 /*
10171034 * DPU sends 3 bytes per pclk cycle to DSI. If widebus is
1018− * enabled, bus width is extended to 6 bytes.
1035+ * enabled, MDP always sends out 48-bit compressed data per
1036+ * pclk and on average, DSI consumes an amount of compressed
1037+ * data equivalent to the uncompressed pixel depth per pclk.
10191038 *
10201039 * Calculate the number of pclks needed to transmit one line of
10211040 * the compressed data.
@@ -1027,12 +1046,12 @@ static void dsi_timing_setup(struct msm_dsi_host *msm_host, bool is_bonded_dsi) · 5 unmodified lines
10271046 * unused anyway.
10281047 */
10291048 h_total -= hdisplay;
1030− if (wide_bus_enabled && !(msm_host->mode_flags & MIPI_DSI_MODE_VIDEO))
1031− bytes_per_pclk = 6;
1049+ if (wide_bus_enabled)
1050+ bits_per_pclk = mipi_dsi_pixel_format_to_bpp(msm_host->format);
10321051 else
1033− bytes_per_pclk = 3;
1052+ bits_per_pclk = 24;
10341053
1035− hdisplay = DIV_ROUND_UP(msm_dsc_get_bytes_per_line(msm_host->dsc), bytes_per_pclk);
1054+ hdisplay = DIV_ROUND_UP(msm_dsc_get_bytes_per_line(msm_host->dsc) * 8, bits_per_pclk);
10361055
10371056 h_total += hdisplay;
10381057 ha_end = ha_start + hdisplay;
drivers/gpu/drm/msm/dsi/phy/dsi_phy_7nm.c+11−11
@@ -51,8 +51,8 @@ · 50 unmodified lines
5151 #define DSI_PHY_7NM_QUIRK_V4_3 BIT(3)
5252 /* Hardware is V5.2 */
5353 #define DSI_PHY_7NM_QUIRK_V5_2 BIT(4)
54−/* Hardware is V7.0 */
55−#define DSI_PHY_7NM_QUIRK_V7_0 BIT(5)
54+/* Hardware is V7.2 */
55+#define DSI_PHY_7NM_QUIRK_V7_2 BIT(5)
5656
5757 struct dsi_pll_config {
5858 bool enable_ssc;
@@ -143,7 +143,7 @@ static void dsi_pll_calc_dec_frac(struct dsi_pll_7nm *pll, struct dsi_pll_config · 84 unmodified lines
143143
144144 if (pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_PRE_V4_1) {
145145 config->pll_clock_inverters = 0x28;
146− } else if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) {
146+ } else if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_2)) {
147147 if (pll_freq < 163000000ULL)
148148 config->pll_clock_inverters = 0xa0;
149149 else if (pll_freq < 175000000ULL)
@@ -284,7 +284,7 @@ static void dsi_pll_config_hzindep_reg(struct dsi_pll_7nm *pll) · 134 unmodified lines
284284 }
285285
286286 if ((pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) ||
287− (pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) {
287+ (pll->phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_2)) {
288288 if (pll->vco_current_rate < 1557000000ULL)
289289 vco_config_1 = 0x08;
290290 else
@@ -699,7 +699,7 @@ static int dsi_7nm_set_usecase(struct msm_dsi_phy *phy) · 408 unmodified lines
699699 case MSM_DSI_PHY_MASTER:
700700 pll_7nm->slave = pll_7nm_list[(pll_7nm->phy->id + 1) % DSI_MAX];
701701 /* v7.0: Enable ATB_EN0 and alternate clock output to external phy */
702− if (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)
702+ if (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_2)
703703 writel(0x07, base + REG_DSI_7nm_PHY_CMN_CTRL_5);
704704 break;
705705 case MSM_DSI_PHY_SLAVE:
@@ -987,7 +987,7 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy, · 281 unmodified lines
987987 /* Request for REFGEN READY */
988988 if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V4_3) ||
989989 (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) ||
990− (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) {
990+ (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_2)) {
991991 writel(0x1, phy->base + REG_DSI_7nm_PHY_CMN_GLBL_DIGTOP_SPARE10);
992992 udelay(500);
993993 }
@@ -1021,7 +1021,7 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy, · 27 unmodified lines
10211021 lane_ctrl0 = 0x1f;
10221022 }
10231023
1024− if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) {
1024+ if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_2)) {
10251025 if (phy->cphy_mode) {
10261026 /* TODO: different for second phy */
10271027 vreg_ctrl_0 = 0x57;
@@ -1097,7 +1097,7 @@ static int dsi_7nm_phy_enable(struct msm_dsi_phy *phy, · 69 unmodified lines
10971097
10981098 /* program CMN_CTRL_4 for minor_ver 2 chipsets*/
10991099 if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) ||
1100− (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0) ||
1100+ (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_2) ||
11011101 (readl(base + REG_DSI_7nm_PHY_CMN_REVISION_ID0) & (0xf0)) == 0x20)
11021102 writel(0x04, base + REG_DSI_7nm_PHY_CMN_CTRL_4);
11031103
@@ -1213,7 +1213,7 @@ static void dsi_7nm_phy_disable(struct msm_dsi_phy *phy) · 109 unmodified lines
12131213 /* Turn off REFGEN Vote */
12141214 if ((phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V4_3) ||
12151215 (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V5_2) ||
1216− (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_0)) {
1216+ (phy->cfg->quirks & DSI_PHY_7NM_QUIRK_V7_2)) {
12171217 writel(0x0, base + REG_DSI_7nm_PHY_CMN_GLBL_DIGTOP_SPARE10);
12181218 wmb();
12191219 /* Delay to ensure HW removes vote before PHY shut down */
@@ -1502,7 +1502,7 @@ const struct msm_dsi_phy_cfg dsi_phy_3nm_8750_cfgs = { · 282 unmodified lines
15021502 #endif
15031503 .io_start = { 0xae95000, 0xae97000 },
15041504 .num_dsi_phy = 2,
1505− .quirks = DSI_PHY_7NM_QUIRK_V7_0,
1505+ .quirks = DSI_PHY_7NM_QUIRK_V7_2,
15061506 };
15071507
15081508 const struct msm_dsi_phy_cfg dsi_phy_3nm_kaanapali_cfgs = {
@@ -1525,5 +1525,5 @@ const struct msm_dsi_phy_cfg dsi_phy_3nm_kaanapali_cfgs = { · 16 unmodified lines
15251525 #endif
15261526 .io_start = { 0x9ac1000, 0x9ac4000 },
15271527 .num_dsi_phy = 2,
1528− .quirks = DSI_PHY_7NM_QUIRK_V7_0,
1528+ .quirks = DSI_PHY_7NM_QUIRK_V7_2,
15291529 };
drivers/gpu/drm/sitronix/st7586.c+6−9
@@ -347,6 +347,12 @@ static int st7586_probe(struct spi_device *spi) · 346 unmodified lines
347347 if (ret)
348348 return ret;
349349
350+ /*
351+ * Override value set by mipi_dbi_spi_init(). This driver is a bit
352+ * non-standard, so best to set it explicitly here.
353+ */
354+ dbi->write_memory_bpw = 8;
355+
350356 /* Cannot read from this controller via SPI */
351357 dbi->read_commands = NULL;
352358
@@ -356,15 +362,6 @@ static int st7586_probe(struct spi_device *spi) · 3 unmodified lines
356362 if (ret)
357363 return ret;
358364
359− /*
360− * we are using 8-bit data, so we are not actually swapping anything,
361− * but setting mipi->swap_bytes makes mipi_dbi_typec3_command() do the
362− * right thing and not use 16-bit transfers (which results in swapped
363− * bytes on little-endian systems and causes out of order data to be
364− * sent to the display).
365− */
366− dbi->swap_bytes = true;
367−
368365 drm_mode_config_reset(drm);
369366
370367 ret = drm_dev_register(drm, 0);
drivers/gpu/nova-core/gsp.rs+24−22
@@ -47,16 +47,12 @@ struct PteArray<const NUM_ENTRIES: usize>([u64; NUM_ENTRIES]); · 46 unmodified lines
4747 unsafe impl<const NUM_ENTRIES: usize> AsBytes for PteArray<NUM_ENTRIES> {}
4848
4949 impl<const NUM_PAGES: usize> PteArray<NUM_PAGES> {
50− /// Creates a new page table array mapping `NUM_PAGES` GSP pages starting at address `start`.
51− fn new(start: DmaAddress) -> Result<Self> {
52− let mut ptes = [0u64; NUM_PAGES];
53− for (i, pte) in ptes.iter_mut().enumerate() {
54− *pte = start
55− .checked_add(num::usize_as_u64(i) << GSP_PAGE_SHIFT)
56− .ok_or(EOVERFLOW)?;
57− }
58−
59− Ok(Self(ptes))
50+ /// Returns the page table entry for `index`, for a mapping starting at `start`.
51+ // TODO: Replace with `IoView` projection once available.
52+ fn entry(start: DmaAddress, index: usize) -> Result<u64> {
53+ start
54+ .checked_add(num::usize_as_u64(index) << GSP_PAGE_SHIFT)
55+ .ok_or(EOVERFLOW)
6056 }
6157 }
6258
@@ -86,16 +82,22 @@ impl LogBuffer { · 23 unmodified lines
8682 NUM_PAGES * GSP_PAGE_SIZE,
8783 GFP_KERNEL | __GFP_ZERO,
8884 )?);
89− let ptes = PteArray::<NUM_PAGES>::new(obj.0.dma_handle())?;
85+
86+ let start_addr = obj.0.dma_handle();
9087
9188 // SAFETY: `obj` has just been created and we are its sole user.
92− unsafe {
93− // Copy the self-mapping PTE at the expected location.
89+ let pte_region = unsafe {
9490 obj.0
95− .as_slice_mut(size_of::<u64>(), size_of_val(&ptes))?
96− .copy_from_slice(ptes.as_bytes())
91+ .as_slice_mut(size_of::<u64>(), NUM_PAGES * size_of::<u64>())?
9792 };
9893
94+ // Write values one by one to avoid an on-stack instance of `PteArray`.
95+ for (i, chunk) in pte_region.chunks_exact_mut(size_of::<u64>()).enumerate() {
96+ let pte_value = PteArray::<0>::entry(start_addr, i)?;
97+
98+ chunk.copy_from_slice(&pte_value.to_ne_bytes());
99+ }
100+
99101 Ok(obj)
100102 }
101103 }
@@ -143,14 +145,14 @@ impl Gsp { · 41 unmodified lines
143145 // _kgspInitLibosLoggingStructures (allocates memory for buffers)
144146 // kgspSetupLibosInitArgs_IMPL (creates pLibosInitArgs[] array)
145147 dma_write!(
146− libos[0] = LibosMemoryRegionInitArgument::new("LOGINIT", &loginit.0)
147− )?;
148+ libos, [0]?, LibosMemoryRegionInitArgument::new("LOGINIT", &loginit.0)
149+ );
148150 dma_write!(
149− libos[1] = LibosMemoryRegionInitArgument::new("LOGINTR", &logintr.0)
150− )?;
151− dma_write!(libos[2] = LibosMemoryRegionInitArgument::new("LOGRM", &logrm.0))?;
152− dma_write!(rmargs[0].inner = fw::GspArgumentsCached::new(cmdq))?;
153− dma_write!(libos[3] = LibosMemoryRegionInitArgument::new("RMARGS", rmargs))?;
151+ libos, [1]?, LibosMemoryRegionInitArgument::new("LOGINTR", &logintr.0)
152+ );
153+ dma_write!(libos, [2]?, LibosMemoryRegionInitArgument::new("LOGRM", &logrm.0));
154+ dma_write!(rmargs, [0]?.inner, fw::GspArgumentsCached::new(cmdq));
155+ dma_write!(libos, [3]?, LibosMemoryRegionInitArgument::new("RMARGS", rmargs));
154156 },
155157 }))
156158 })
drivers/gpu/nova-core/gsp/boot.rs+1−1
@@ -157,7 +157,7 @@ impl super::Gsp { · 156 unmodified lines
157157
158158 let wpr_meta =
159159 CoherentAllocation::<GspFwWprMeta>::alloc_coherent(dev, 1, GFP_KERNEL | __GFP_ZERO)?;
160− dma_write!(wpr_meta[0] = GspFwWprMeta::new(&gsp_fw, &fb_layout))?;
160+ dma_write!(wpr_meta, [0]?, GspFwWprMeta::new(&gsp_fw, &fb_layout));
161161
162162 self.cmdq
163163 .send_command(bar, commands::SetSystemInfo::new(pdev))?;
drivers/gpu/nova-core/gsp/cmdq.rs+33−60
@@ -2,11 +2,7 @@ · 1 unmodified line
22
33 use core::{
44 cmp,
5− mem,
6− sync::atomic::{
7− fence,
8− Ordering, //
9− }, //
5+ mem, //
106 };
117
128 use kernel::{
@@ -146,30 +142,36 @@ static_assert!(align_of::<MsgqData>() == GSP_PAGE_SIZE); · 133 unmodified lines
146142 #[repr(C)]
147143 // There is no struct defined for this in the open-gpu-kernel-source headers.
148144 // Instead it is defined by code in `GspMsgQueuesInit()`.
149−struct Msgq {
145+// TODO: Revert to private once `IoView` projections replace the `gsp_mem` module.
146+pub(super) struct Msgq {
150147 /// Header for sending messages, including the write pointer.
151− tx: MsgqTxHeader,
148+ pub(super) tx: MsgqTxHeader,
152149 /// Header for receiving messages, including the read pointer.
153− rx: MsgqRxHeader,
150+ pub(super) rx: MsgqRxHeader,
154151 /// The message queue proper.
155152 msgq: MsgqData,
156153 }
157154
158155 /// Structure shared between the driver and the GSP and containing the command and message queues.
159156 #[repr(C)]
160−struct GspMem {
157+// TODO: Revert to private once `IoView` projections replace the `gsp_mem` module.
158+pub(super) struct GspMem {
161159 /// Self-mapping page table entries.
162− ptes: PteArray<{ GSP_PAGE_SIZE / size_of::<u64>() }>,
160+ ptes: PteArray<{ Self::PTE_ARRAY_SIZE }>,
163161 /// CPU queue: the driver writes commands here, and the GSP reads them. It also contains the
164162 /// write and read pointers that the CPU updates.
165163 ///
166164 /// This member is read-only for the GSP.
167− cpuq: Msgq,
165+ pub(super) cpuq: Msgq,
168166 /// GSP queue: the GSP writes messages here, and the driver reads them. It also contains the
169167 /// write and read pointers that the GSP updates.
170168 ///
171169 /// This member is read-only for the driver.
172− gspq: Msgq,
170+ pub(super) gspq: Msgq,
171+}
172+
173+impl GspMem {
174+ const PTE_ARRAY_SIZE: usize = GSP_PAGE_SIZE / size_of::<u64>();
173175 }
174176
175177 // SAFETY: These structs don't meet the no-padding requirements of AsBytes but
@@ -201,9 +203,19 @@ impl DmaGspMem { · 25 unmodified lines
201203
202204 let gsp_mem =
203205 CoherentAllocation::<GspMem>::alloc_coherent(dev, 1, GFP_KERNEL | __GFP_ZERO)?;
204− dma_write!(gsp_mem[0].ptes = PteArray::new(gsp_mem.dma_handle())?)?;
205− dma_write!(gsp_mem[0].cpuq.tx = MsgqTxHeader::new(MSGQ_SIZE, RX_HDR_OFF, MSGQ_NUM_PAGES))?;
206− dma_write!(gsp_mem[0].cpuq.rx = MsgqRxHeader::new())?;
206+
207+ let start = gsp_mem.dma_handle();
208+ // Write values one by one to avoid an on-stack instance of `PteArray`.
209+ for i in 0..GspMem::PTE_ARRAY_SIZE {
210+ dma_write!(gsp_mem, [0]?.ptes.0[i], PteArray::<0>::entry(start, i)?);
211+ }
212+
213+ dma_write!(
214+ gsp_mem,
215+ [0]?.cpuq.tx,
216+ MsgqTxHeader::new(MSGQ_SIZE, RX_HDR_OFF, MSGQ_NUM_PAGES)
217+ );
218+ dma_write!(gsp_mem, [0]?.cpuq.rx, MsgqRxHeader::new());
207219
208220 Ok(Self(gsp_mem))
209221 }
@@ -317,12 +329,7 @@ impl DmaGspMem { · 107 unmodified lines
317329 //
318330 // - The returned value is between `0` and `MSGQ_NUM_PAGES`.
319331 fn gsp_write_ptr(&self) -> u32 {
320− let gsp_mem = self.0.start_ptr();
321−
322− // SAFETY:
323− // - The 'CoherentAllocation' contains at least one object.
324− // - By the invariants of `CoherentAllocation` the pointer is valid.
325− (unsafe { (*gsp_mem).gspq.tx.write_ptr() } % MSGQ_NUM_PAGES)
332+ super::fw::gsp_mem::gsp_write_ptr(&self.0)
326333 }
327334
328335 // Returns the index of the memory page the GSP will read the next command from.
@@ -331,12 +338,7 @@ impl DmaGspMem { · 2 unmodified lines
331338 //
332339 // - The returned value is between `0` and `MSGQ_NUM_PAGES`.
333340 fn gsp_read_ptr(&self) -> u32 {
334− let gsp_mem = self.0.start_ptr();
335−
336− // SAFETY:
337− // - The 'CoherentAllocation' contains at least one object.
338− // - By the invariants of `CoherentAllocation` the pointer is valid.
339− (unsafe { (*gsp_mem).gspq.rx.read_ptr() } % MSGQ_NUM_PAGES)
341+ super::fw::gsp_mem::gsp_read_ptr(&self.0)
340342 }
341343
342344 // Returns the index of the memory page the CPU can read the next message from.
@@ -345,27 +347,12 @@ impl DmaGspMem { · 2 unmodified lines
345347 //
346348 // - The returned value is between `0` and `MSGQ_NUM_PAGES`.
347349 fn cpu_read_ptr(&self) -> u32 {
348− let gsp_mem = self.0.start_ptr();
349−
350− // SAFETY:
351− // - The ['CoherentAllocation'] contains at least one object.
352− // - By the invariants of CoherentAllocation the pointer is valid.
353− (unsafe { (*gsp_mem).cpuq.rx.read_ptr() } % MSGQ_NUM_PAGES)
350+ super::fw::gsp_mem::cpu_read_ptr(&self.0)
354351 }
355352
356353 // Informs the GSP that it can send `elem_count` new pages into the message queue.
357354 fn advance_cpu_read_ptr(&mut self, elem_count: u32) {
358− let rptr = self.cpu_read_ptr().wrapping_add(elem_count) % MSGQ_NUM_PAGES;
359−
360− // Ensure read pointer is properly ordered.
361− fence(Ordering::SeqCst);
362−
363− let gsp_mem = self.0.start_ptr_mut();
364−
365− // SAFETY:
366− // - The 'CoherentAllocation' contains at least one object.
367− // - By the invariants of `CoherentAllocation` the pointer is valid.
368− unsafe { (*gsp_mem).cpuq.rx.set_read_ptr(rptr) };
355+ super::fw::gsp_mem::advance_cpu_read_ptr(&self.0, elem_count)
369356 }
370357
371358 // Returns the index of the memory page the CPU can write the next command to.
@@ -374,26 +361,12 @@ impl DmaGspMem { · 2 unmodified lines
374361 //
375362 // - The returned value is between `0` and `MSGQ_NUM_PAGES`.
376363 fn cpu_write_ptr(&self) -> u32 {
377− let gsp_mem = self.0.start_ptr();
378−
379− // SAFETY:
380− // - The 'CoherentAllocation' contains at least one object.
381− // - By the invariants of `CoherentAllocation` the pointer is valid.
382− (unsafe { (*gsp_mem).cpuq.tx.write_ptr() } % MSGQ_NUM_PAGES)
364+ super::fw::gsp_mem::cpu_write_ptr(&self.0)
383365 }
384366
385367 // Informs the GSP that it can process `elem_count` new pages from the command queue.
386368 fn advance_cpu_write_ptr(&mut self, elem_count: u32) {
387− let wptr = self.cpu_write_ptr().wrapping_add(elem_count) & MSGQ_NUM_PAGES;
388− let gsp_mem = self.0.start_ptr_mut();
389−
390− // SAFETY:
391− // - The 'CoherentAllocation' contains at least one object.
392− // - By the invariants of `CoherentAllocation` the pointer is valid.
393− unsafe { (*gsp_mem).cpuq.tx.set_write_ptr(wptr) };
394−
395− // Ensure all command data is visible before triggering the GSP read.
396− fence(Ordering::SeqCst);
369+ super::fw::gsp_mem::advance_cpu_write_ptr(&self.0, elem_count)
397370 }
398371 }
399372
drivers/gpu/nova-core/gsp/fw.rs+69−32
@@ -40,6 +40,75 @@ use crate::{ · 39 unmodified lines
4040 },
4141 };
4242
43+// TODO: Replace with `IoView` projections once available; the `unwrap()` calls go away once we
44+// switch to the new `dma::Coherent` API.
45+pub(super) mod gsp_mem {
46+ use core::sync::atomic::{
47+ fence,
48+ Ordering, //
49+ };
50+
51+ use kernel::{
52+ dma::CoherentAllocation,
53+ dma_read,
54+ dma_write,
55+ prelude::*, //
56+ };
57+
58+ use crate::gsp::cmdq::{
59+ GspMem,
60+ MSGQ_NUM_PAGES, //
61+ };
62+
63+ pub(in crate::gsp) fn gsp_write_ptr(qs: &CoherentAllocation<GspMem>) -> u32 {
64+ // PANIC: A `dma::CoherentAllocation` always contains at least one element.
65+ || -> Result<u32> { Ok(dma_read!(qs, [0]?.gspq.tx.0.writePtr) % MSGQ_NUM_PAGES) }().unwrap()
66+ }
67+
68+ pub(in crate::gsp) fn gsp_read_ptr(qs: &CoherentAllocation<GspMem>) -> u32 {
69+ // PANIC: A `dma::CoherentAllocation` always contains at least one element.
70+ || -> Result<u32> { Ok(dma_read!(qs, [0]?.gspq.rx.0.readPtr) % MSGQ_NUM_PAGES) }().unwrap()
71+ }
72+
73+ pub(in crate::gsp) fn cpu_read_ptr(qs: &CoherentAllocation<GspMem>) -> u32 {
74+ // PANIC: A `dma::CoherentAllocation` always contains at least one element.
75+ || -> Result<u32> { Ok(dma_read!(qs, [0]?.cpuq.rx.0.readPtr) % MSGQ_NUM_PAGES) }().unwrap()
76+ }
77+
78+ pub(in crate::gsp) fn advance_cpu_read_ptr(qs: &CoherentAllocation<GspMem>, count: u32) {
79+ let rptr = cpu_read_ptr(qs).wrapping_add(count) % MSGQ_NUM_PAGES;
80+
81+ // Ensure read pointer is properly ordered.
82+ fence(Ordering::SeqCst);
83+
84+ // PANIC: A `dma::CoherentAllocation` always contains at least one element.
85+ || -> Result {
86+ dma_write!(qs, [0]?.cpuq.rx.0.readPtr, rptr);
87+ Ok(())
88+ }()
89+ .unwrap()
90+ }
91+
92+ pub(in crate::gsp) fn cpu_write_ptr(qs: &CoherentAllocation<GspMem>) -> u32 {
93+ // PANIC: A `dma::CoherentAllocation` always contains at least one element.
94+ || -> Result<u32> { Ok(dma_read!(qs, [0]?.cpuq.tx.0.writePtr) % MSGQ_NUM_PAGES) }().unwrap()
95+ }
96+
97+ pub(in crate::gsp) fn advance_cpu_write_ptr(qs: &CoherentAllocation<GspMem>, count: u32) {
98+ let wptr = cpu_write_ptr(qs).wrapping_add(count) % MSGQ_NUM_PAGES;
99+
100+ // PANIC: A `dma::CoherentAllocation` always contains at least one element.
101+ || -> Result {
102+ dma_write!(qs, [0]?.cpuq.tx.0.writePtr, wptr);
103+ Ok(())
104+ }()
105+ .unwrap();
106+
107+ // Ensure all command data is visible before triggering the GSP read.
108+ fence(Ordering::SeqCst);
109+ }
110+}
111+
43112 /// Empty type to group methods related to heap parameters for running the GSP firmware.
44113 enum GspFwHeapParams {}
45114
@@ -708,22 +777,6 @@ impl MsgqTxHeader { · 662 unmodified lines
708777 entryOff: num::usize_into_u32::<GSP_PAGE_SIZE>(),
709778 })
710779 }
711−
712− /// Returns the value of the write pointer for this queue.
713− pub(crate) fn write_ptr(&self) -> u32 {
714− let ptr = core::ptr::from_ref(&self.0.writePtr);
715−
716− // SAFETY: `ptr` is a valid pointer to a `u32`.
717− unsafe { ptr.read_volatile() }
718− }
719−
720− /// Sets the value of the write pointer for this queue.
721− pub(crate) fn set_write_ptr(&mut self, val: u32) {
722− let ptr = core::ptr::from_mut(&mut self.0.writePtr);
723−
724− // SAFETY: `ptr` is a valid pointer to a `u32`.
725− unsafe { ptr.write_volatile(val) }
726− }
727780 }
728781
729782 // SAFETY: Padding is explicit and does not contain uninitialized data.
@@ -739,22 +792,6 @@ impl MsgqRxHeader { · 9 unmodified lines
739792 pub(crate) fn new() -> Self {
740793 Self(Default::default())
741794 }
742−
743− /// Returns the value of the read pointer for this queue.
744− pub(crate) fn read_ptr(&self) -> u32 {
745− let ptr = core::ptr::from_ref(&self.0.readPtr);
746−
747− // SAFETY: `ptr` is a valid pointer to a `u32`.
748− unsafe { ptr.read_volatile() }
749− }
750−
751− /// Sets the value of the read pointer for this queue.
752− pub(crate) fn set_read_ptr(&mut self, val: u32) {
753− let ptr = core::ptr::from_mut(&mut self.0.readPtr);
754−
755− // SAFETY: `ptr` is a valid pointer to a `u32`.
756− unsafe { ptr.write_volatile(val) }
757− }
758795 }
759796
760797 // SAFETY: Padding is explicit and does not contain uninitialized data.
drivers/hid/bpf/hid_bpf_dispatch.c+2−0
@@ -444,6 +444,8 @@ hid_bpf_hw_request(struct hid_bpf_ctx *ctx, __u8 *buf, size_t buf__sz, · 443 unmodified lines
444444 (u64)(long)ctx,
445445 true); /* prevent infinite recursions */
446446
447+ if (ret > size)
448+ ret = size;
447449 if (ret > 0)
448450 memcpy(buf, dma_data, ret);
449451
drivers/hid/hid-appletb-kbd.c+3−2
@@ -476,7 +476,7 @@ static int appletb_kbd_suspend(struct hid_device *hdev, pm_message_t msg) · 475 unmodified lines
476476 return 0;
477477 }
478478
479−static int appletb_kbd_reset_resume(struct hid_device *hdev)
479+static int appletb_kbd_resume(struct hid_device *hdev)
480480 {
481481 struct appletb_kbd *kbd = hid_get_drvdata(hdev);
482482
@@ -500,7 +500,8 @@ static struct hid_driver appletb_kbd_hid_driver = { · 17 unmodified lines
500500 .event = appletb_kbd_hid_event,
501501 .input_configured = appletb_kbd_input_configured,
502502 .suspend = pm_ptr(appletb_kbd_suspend),
503− .reset_resume = pm_ptr(appletb_kbd_reset_resume),
503+ .resume = pm_ptr(appletb_kbd_resume),
504+ .reset_resume = pm_ptr(appletb_kbd_resume),
504505 .driver.dev_groups = appletb_kbd_groups,
505506 };
506507 module_hid_driver(appletb_kbd_hid_driver);
drivers/hid/hid-asus.c+3−0
@@ -1497,6 +1497,9 @@ static const struct hid_device_id asus_devices[] = { · 1496 unmodified lines
14971497 { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
14981498 USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X),
14991499 QUIRK_USE_KBD_BACKLIGHT | QUIRK_ROG_NKEY_KEYBOARD | QUIRK_ROG_ALLY_XPAD },
1500+ { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
1501+ USB_DEVICE_ID_ASUSTEK_XGM_2022),
1502+ },
15001503 { HID_USB_DEVICE(USB_VENDOR_ID_ASUSTEK,
15011504 USB_DEVICE_ID_ASUSTEK_XGM_2023),
15021505 },
drivers/hid/hid-core.c+4−3
@@ -2057,9 +2057,10 @@ int hid_report_raw_event(struct hid_device *hid, enum hid_report_type type, u8 * · 2056 unmodified lines
20572057 rsize = max_buffer_size;
20582058
20592059 if (csize < rsize) {
2060− dbg_hid("report %d is too short, (%d < %d)\n", report->id,
2061− csize, rsize);
2062− memset(cdata + csize, 0, rsize - csize);
2060+ hid_warn_ratelimited(hid, "Event data for report %d was too short (%d vs %d)\n",
2061+ report->id, rsize, csize);
2062+ ret = -EINVAL;
2063+ goto out;
20632064 }
20642065
20652066 if ((hid->claimed & HID_CLAIMED_HIDDEV) && hid->hiddev_report_event)
drivers/hid/hid-ids.h+1−2
@@ -229,6 +229,7 @@ · 228 unmodified lines
229229 #define USB_DEVICE_ID_ASUSTEK_ROG_NKEY_ALLY_X 0x1b4c
230230 #define USB_DEVICE_ID_ASUSTEK_ROG_CLAYMORE_II_KEYBOARD 0x196b
231231 #define USB_DEVICE_ID_ASUSTEK_FX503VD_KEYBOARD 0x1869
232+#define USB_DEVICE_ID_ASUSTEK_XGM_2022 0x1970
232233 #define USB_DEVICE_ID_ASUSTEK_XGM_2023 0x1a9a
233234
234235 #define USB_VENDOR_ID_ATEN 0x0557
@@ -454,8 +455,6 @@ · 219 unmodified lines
454455 #define USB_DEVICE_ID_TOSHIBA_CLICK_L9W 0x0401
455456 #define USB_DEVICE_ID_HP_X2 0x074d
456457 #define USB_DEVICE_ID_HP_X2_10_COVER 0x0755
457−#define USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN 0x2544
458−#define USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN 0x2706
459458 #define I2C_DEVICE_ID_CHROMEBOOK_TROGDOR_POMPOM 0x2F81
460459
461460 #define USB_VENDOR_ID_ELECOM 0x056e
drivers/hid/hid-input.c+11−7
@@ -354,6 +354,7 @@ static enum power_supply_property hidinput_battery_props[] = { · 353 unmodified lines
354354 #define HID_BATTERY_QUIRK_FEATURE (1 << 1) /* ask for feature report */
355355 #define HID_BATTERY_QUIRK_IGNORE (1 << 2) /* completely ignore the battery */
356356 #define HID_BATTERY_QUIRK_AVOID_QUERY (1 << 3) /* do not query the battery */
357+#define HID_BATTERY_QUIRK_DYNAMIC (1 << 4) /* report present only after life signs */
357358
358359 static const struct hid_device_id hid_battery_quirks[] = {
359360 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_APPLE,
@@ -386,10 +387,6 @@ static const struct hid_device_id hid_battery_quirks[] = { · 26 unmodified lines
386387 { HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH,
387388 USB_DEVICE_ID_LOGITECH_DINOVO_EDGE_KBD),
388389 HID_BATTERY_QUIRK_IGNORE },
389− { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550_TOUCHSCREEN),
390− HID_BATTERY_QUIRK_IGNORE },
391− { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, USB_DEVICE_ID_ASUS_UX550VE_TOUCHSCREEN),
392− HID_BATTERY_QUIRK_IGNORE },
393390 { HID_USB_DEVICE(USB_VENDOR_ID_UGEE, USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_L),
394391 HID_BATTERY_QUIRK_AVOID_QUERY },
395392 { HID_USB_DEVICE(USB_VENDOR_ID_UGEE, USB_DEVICE_ID_UGEE_XPPEN_TABLET_DECO_PRO_MW),
@@ -402,8 +399,8 @@ static const struct hid_device_id hid_battery_quirks[] = { · 6 unmodified lines
402399 * Elan HID touchscreens seem to all report a non present battery,
403400 * set HID_BATTERY_QUIRK_IGNORE for all Elan I2C and USB HID devices.
404401 */
405− { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_BATTERY_QUIRK_IGNORE },
406− { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_BATTERY_QUIRK_IGNORE },
402+ { HID_I2C_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_BATTERY_QUIRK_DYNAMIC },
403+ { HID_USB_DEVICE(USB_VENDOR_ID_ELAN, HID_ANY_ID), HID_BATTERY_QUIRK_DYNAMIC },
407404 {}
408405 };
409406
@@ -460,11 +457,14 @@ static int hidinput_get_battery_property(struct power_supply *psy, · 50 unmodified lines
460457 int ret = 0;
461458
462459 switch (prop) {
463− case POWER_SUPPLY_PROP_PRESENT:
464460 case POWER_SUPPLY_PROP_ONLINE:
465461 val->intval = 1;
466462 break;
467463
464+ case POWER_SUPPLY_PROP_PRESENT:
465+ val->intval = dev->battery_present;
466+ break;
467+
468468 case POWER_SUPPLY_PROP_CAPACITY:
469469 if (dev->battery_status != HID_BATTERY_REPORTED &&
470470 !dev->battery_avoid_query) {
@@ -577,6 +577,8 @@ static int hidinput_setup_battery(struct hid_device *dev, unsigned report_type, · 106 unmodified lines
577577 if (quirks & HID_BATTERY_QUIRK_AVOID_QUERY)
578578 dev->battery_avoid_query = true;
579579
580+ dev->battery_present = (quirks & HID_BATTERY_QUIRK_DYNAMIC) ? false : true;
581+
580582 dev->battery = power_supply_register(&dev->dev, psy_desc, &psy_cfg);
581583 if (IS_ERR(dev->battery)) {
582584 error = PTR_ERR(dev->battery);
@@ -632,6 +634,7 @@ static void hidinput_update_battery(struct hid_device *dev, unsigned int usage, · 49 unmodified lines
632634 return;
633635
634636 if (hidinput_update_battery_charge_status(dev, usage, value)) {
637+ dev->battery_present = true;
635638 power_supply_changed(dev->battery);
636639 return;
637640 }
@@ -647,6 +650,7 @@ static void hidinput_update_battery(struct hid_device *dev, unsigned int usage, · 9 unmodified lines
647650 if (dev->battery_status != HID_BATTERY_REPORTED ||
648651 capacity != dev->battery_capacity ||
649652 ktime_after(ktime_get_coarse(), dev->battery_ratelimit_time)) {
653+ dev->battery_present = true;
650654 dev->battery_capacity = capacity;
651655 dev->battery_status = HID_BATTERY_REPORTED;
652656 dev->battery_ratelimit_time =
drivers/hid/hid-logitech-hidpp.c+5−1
@@ -4487,10 +4487,12 @@ static int hidpp_probe(struct hid_device *hdev, const struct hid_device_id *id) · 4486 unmodified lines
44874487 if (!ret)
44884488 ret = hidpp_ff_init(hidpp, &data);
44894489
4490− if (ret)
4490+ if (ret) {
44914491 hid_warn(hidpp->hid_dev,
44924492 "Unable to initialize force feedback support, errno %d\n",
44934493 ret);
4494+ ret = 0;
4495+ }
44944496 }
44954497
44964498 /*
@@ -4668,6 +4670,8 @@ static const struct hid_device_id hidpp_devices[] = { · 171 unmodified lines
46684670 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb038) },
46694671 { /* Slim Solar+ K980 Keyboard over Bluetooth */
46704672 HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb391) },
4673+ { /* MX Master 4 mouse over Bluetooth */
4674+ HID_BLUETOOTH_DEVICE(USB_VENDOR_ID_LOGITECH, 0xb042) },
46714675 {}
46724676 };
46734677
drivers/hid/hid-multitouch.c+7−0
@@ -526,12 +526,19 @@ static void mt_get_feature(struct hid_device *hdev, struct hid_report *report) · 525 unmodified lines
526526 dev_warn(&hdev->dev, "failed to fetch feature %d\n",
527527 report->id);
528528 } else {
529+ /* The report ID in the request and the response should match */
530+ if (report->id != buf[0]) {
531+ hid_err(hdev, "Returned feature report did not match the request\n");
532+ goto free;
533+ }
534+
529535 ret = hid_report_raw_event(hdev, HID_FEATURE_REPORT, buf,
530536 size, 0);
531537 if (ret)
532538 dev_warn(&hdev->dev, "failed to report feature\n");
533539 }
534540
541+free:
535542 kfree(buf);
536543 }
537544
drivers/hid/intel-thc-hid/intel-quicki2c/quicki2c-hid.c+1−0
@@ -127,6 +127,7 @@ int quicki2c_hid_probe(struct quicki2c_device *qcdev) · 126 unmodified lines
127127 hid->product = le16_to_cpu(qcdev->dev_desc.product_id);
128128 snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", "quicki2c-hid",
129129 hid->vendor, hid->product);
130+ strscpy(hid->phys, dev_name(qcdev->dev), sizeof(hid->phys));
130131
131132 ret = hid_add_device(hid);
132133 if (ret) {
drivers/hid/intel-thc-hid/intel-quickspi/quickspi-hid.c+1−0
@@ -118,6 +118,7 @@ int quickspi_hid_probe(struct quickspi_device *qsdev) · 117 unmodified lines
118118 hid->product = le16_to_cpu(qsdev->dev_desc.product_id);
119119 snprintf(hid->name, sizeof(hid->name), "%s %04X:%04X", "quickspi-hid",
120120 hid->vendor, hid->product);
121+ strscpy(hid->phys, dev_name(qsdev->dev), sizeof(hid->phys));
121122
122123 ret = hid_add_device(hid);
123124 if (ret) {
drivers/hid/wacom_wac.c+10−0
@@ -1208,10 +1208,20 @@ static int wacom_intuos_bt_irq(struct wacom_wac *wacom, size_t len) · 1207 unmodified lines
12081208
12091209 switch (data[0]) {
12101210 case 0x04:
1211+ if (len < 32) {
1212+ dev_warn(wacom->pen_input->dev.parent,
1213+ "Report 0x04 too short: %zu bytes\n", len);
1214+ break;
1215+ }
12111216 wacom_intuos_bt_process_data(wacom, data + i);
12121217 i += 10;
12131218 fallthrough;
12141219 case 0x03:
1220+ if (i == 1 && len < 22) {
1221+ dev_warn(wacom->pen_input->dev.parent,
1222+ "Report 0x03 too short: %zu bytes\n", len);
1223+ break;
1224+ }
12151225 wacom_intuos_bt_process_data(wacom, data + i);
12161226 i += 10;
12171227 wacom_intuos_bt_process_data(wacom, data + i);
drivers/hwmon/Kconfig+2−4
@@ -1493,8 +1493,7 @@ config SENSORS_LM73 · 1492 unmodified lines
14931493
14941494 config SENSORS_LM75
14951495 tristate "National Semiconductor LM75 and compatibles"
1496− depends on I2C
1497− depends on I3C || !I3C
1496+ depends on I3C_OR_I2C
14981497 select REGMAP_I2C
14991498 select REGMAP_I3C if I3C
15001499 help
@@ -2382,8 +2381,7 @@ config SENSORS_TMP103 · 881 unmodified lines
23822381
23832382 config SENSORS_TMP108
23842383 tristate "Texas Instruments TMP108"
2385− depends on I2C
2386− depends on I3C || !I3C
2384+ depends on I3C_OR_I2C
23872385 select REGMAP_I2C
23882386 select REGMAP_I3C if I3C
23892387 help
drivers/i3c/Kconfig+12−0
@@ -22,3 +22,15 @@ menuconfig I3C · 21 unmodified lines
2222 if I3C
2323 source "drivers/i3c/master/Kconfig"
2424 endif # I3C
25+
26+config I3C_OR_I2C
27+ tristate
28+ default m if I3C=m
29+ default I2C
30+ help
31+ Device drivers using module_i3c_i2c_driver() can use either
32+ i2c or i3c hosts, but cannot be built-in for the kernel when
33+ CONFIG_I3C=m.
34+
35+ Add 'depends on I2C_OR_I3C' in Kconfig for those drivers to
36+ get the correct dependencies.
drivers/i3c/master/dw-i3c-master.c+4−2
@@ -1024,7 +1024,7 @@ static int dw_i3c_master_reattach_i3c_dev(struct i3c_dev_desc *dev, · 1023 unmodified lines
10241024 master->free_pos &= ~BIT(pos);
10251025 }
10261026
1027− writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(dev->info.dyn_addr),
1027+ writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(dev->info.dyn_addr) | DEV_ADDR_TABLE_SIR_REJECT,
10281028 master->regs +
10291029 DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
10301030
@@ -1053,7 +1053,7 @@ static int dw_i3c_master_attach_i3c_dev(struct i3c_dev_desc *dev) · 22 unmodified lines
10531053 master->free_pos &= ~BIT(pos);
10541054 i3c_dev_set_master_data(dev, data);
10551055
1056− writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr),
1056+ writel(DEV_ADDR_TABLE_DYNAMIC_ADDR(master->devs[pos].addr) | DEV_ADDR_TABLE_SIR_REJECT,
10571057 master->regs +
10581058 DEV_ADDR_TABLE_LOC(master->datstartaddr, data->index));
10591059
@@ -1659,6 +1659,8 @@ int dw_i3c_common_probe(struct dw_i3c_master *master, · 599 unmodified lines
16591659 pm_runtime_get_noresume(&pdev->dev);
16601660
16611661 INIT_WORK(&master->hj_work, dw_i3c_hj_work);
1662+
1663+ device_set_of_node_from_dev(&master->base.i2c.dev, &pdev->dev);
16621664 ret = i3c_master_register(&master->base, &pdev->dev,
16631665 &dw_mipi_i3c_ops, false);
16641666 if (ret)
drivers/i3c/master/mipi-i3c-hci/cmd.h+1−0
@@ -17,6 +17,7 @@ · 16 unmodified lines
1717 #define CMD_0_TOC W0_BIT_(31)
1818 #define CMD_0_ROC W0_BIT_(30)
1919 #define CMD_0_ATTR W0_MASK(2, 0)
20+#define CMD_0_TID W0_MASK(6, 3)
2021
2122 /*
2223 * Response Descriptor Structure
drivers/i3c/master/mipi-i3c-hci/cmd_v1.c+3−5
@@ -331,12 +331,10 @@ static int hci_cmd_v1_daa(struct i3c_hci *hci) · 330 unmodified lines
331331 CMD_A0_ROC | CMD_A0_TOC;
332332 xfer->cmd_desc[1] = 0;
333333 xfer->completion = &done;
334− hci->io->queue_xfer(hci, xfer, 1);
335− if (!wait_for_completion_timeout(&done, HZ) &&
336− hci->io->dequeue_xfer(hci, xfer, 1)) {
337− ret = -ETIME;
334+ xfer->timeout = HZ;
335+ ret = i3c_hci_process_xfer(hci, xfer, 1);
336+ if (ret)
338337 break;
339− }
340338 if ((RESP_STATUS(xfer->response) == RESP_ERR_ADDR_HEADER ||
341339 RESP_STATUS(xfer->response) == RESP_ERR_NACK) &&
342340 RESP_DATA_LENGTH(xfer->response) == 1) {
drivers/i3c/master/mipi-i3c-hci/cmd_v2.c+3−5
@@ -253,6 +253,7 @@ static int hci_cmd_v2_daa(struct i3c_hci *hci) · 252 unmodified lines
253253 xfer[0].rnw = true;
254254 xfer[0].cmd_desc[1] = CMD_A1_DATA_LENGTH(8);
255255 xfer[1].completion = &done;
256+ xfer[1].timeout = HZ;
256257
257258 for (;;) {
258259 ret = i3c_master_get_free_addr(&hci->master, next_addr);
@@ -272,12 +273,9 @@ static int hci_cmd_v2_daa(struct i3c_hci *hci) · 13 unmodified lines
272273 CMD_A0_ASSIGN_ADDRESS(next_addr) |
273274 CMD_A0_ROC |
274275 CMD_A0_TOC;
275− hci->io->queue_xfer(hci, xfer, 2);
276− if (!wait_for_completion_timeout(&done, HZ) &&
277− hci->io->dequeue_xfer(hci, xfer, 2)) {
278− ret = -ETIME;
276+ ret = i3c_hci_process_xfer(hci, xfer, 2);
277+ if (ret)
279278 break;
280− }
281279 if (RESP_STATUS(xfer[0].response) != RESP_SUCCESS) {
282280 ret = 0; /* no more devices to be assigned */
283281 break;
drivers/i3c/master/mipi-i3c-hci/core.c+90−53
@@ -152,7 +152,11 @@ static int i3c_hci_bus_init(struct i3c_master_controller *m) · 151 unmodified lines
152152 if (hci->quirks & HCI_QUIRK_RESP_BUF_THLD)
153153 amd_set_resp_buf_thld(hci);
154154
155− reg_set(HC_CONTROL, HC_CONTROL_BUS_ENABLE);
155+ scoped_guard(spinlock_irqsave, &hci->lock)
156+ hci->irq_inactive = false;
157+
158+ /* Enable bus with Hot-Join disabled */
159+ reg_set(HC_CONTROL, HC_CONTROL_BUS_ENABLE | HC_CONTROL_HOT_JOIN_CTRL);
156160 dev_dbg(&hci->master.dev, "HC_CONTROL = %#x", reg_read(HC_CONTROL));
157161
158162 return 0;
@@ -177,21 +181,51 @@ static int i3c_hci_bus_disable(struct i3c_hci *hci) · 18 unmodified lines
177181 return ret;
178182 }
179183
184+static int i3c_hci_software_reset(struct i3c_hci *hci)
185+{
186+ u32 regval;
187+ int ret;
188+
189+ /*
190+ * SOFT_RST must be clear before we write to it.
191+ * Then we must wait until it clears again.
192+ */
193+ ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
194+ !(regval & SOFT_RST), 0, 10 * USEC_PER_MSEC);
195+ if (ret) {
196+ dev_err(&hci->master.dev, "%s: Software reset stuck\n", __func__);
197+ return ret;
198+ }
199+
200+ reg_write(RESET_CONTROL, SOFT_RST);
201+
202+ ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
203+ !(regval & SOFT_RST), 0, 10 * USEC_PER_MSEC);
204+ if (ret) {
205+ dev_err(&hci->master.dev, "%s: Software reset failed\n", __func__);
206+ return ret;
207+ }
208+
209+ return 0;
210+}
211+
180212 void i3c_hci_sync_irq_inactive(struct i3c_hci *hci)
181213 {
182214 struct platform_device *pdev = to_platform_device(hci->master.dev.parent);
183215 int irq = platform_get_irq(pdev, 0);
184216
185217 reg_write(INTR_SIGNAL_ENABLE, 0x0);
186− hci->irq_inactive = true;
187218 synchronize_irq(irq);
219+ scoped_guard(spinlock_irqsave, &hci->lock)
220+ hci->irq_inactive = true;
188221 }
189222
190223 static void i3c_hci_bus_cleanup(struct i3c_master_controller *m)
191224 {
192225 struct i3c_hci *hci = to_i3c_hci(m);
193226
194− i3c_hci_bus_disable(hci);
227+ if (i3c_hci_bus_disable(hci))
228+ i3c_hci_software_reset(hci);
195229 hci->io->cleanup(hci);
196230 }
197231
@@ -212,6 +246,36 @@ void mipi_i3c_hci_dct_index_reset(struct i3c_hci *hci) · 14 unmodified lines
212246 reg_write(DCT_SECTION, FIELD_PREP(DCT_TABLE_INDEX, 0));
213247 }
214248
249+int i3c_hci_process_xfer(struct i3c_hci *hci, struct hci_xfer *xfer, int n)
250+{
251+ struct completion *done = xfer[n - 1].completion;
252+ unsigned long timeout = xfer[n - 1].timeout;
253+ int ret;
254+
255+ ret = hci->io->queue_xfer(hci, xfer, n);
256+ if (ret)
257+ return ret;
258+
259+ if (!wait_for_completion_timeout(done, timeout)) {
260+ if (hci->io->dequeue_xfer(hci, xfer, n)) {
261+ dev_err(&hci->master.dev, "%s: timeout error\n", __func__);
262+ return -ETIMEDOUT;
263+ }
264+ return 0;
265+ }
266+
267+ if (hci->io->handle_error) {
268+ bool error = false;
269+
270+ for (int i = 0; i < n && !error; i++)
271+ error = RESP_STATUS(xfer[i].response);
272+ if (error)
273+ return hci->io->handle_error(hci, xfer, n);
274+ }
275+
276+ return 0;
277+}
278+
215279 static int i3c_hci_send_ccc_cmd(struct i3c_master_controller *m,
216280 struct i3c_ccc_cmd *ccc)
217281 {
@@ -252,18 +316,14 @@ static int i3c_hci_send_ccc_cmd(struct i3c_master_controller *m, · 34 unmodified lines
252316 last = i - 1;
253317 xfer[last].cmd_desc[0] |= CMD_0_TOC;
254318 xfer[last].completion = &done;
319+ xfer[last].timeout = HZ;
255320
256321 if (prefixed)
257322 xfer--;
258323
259− ret = hci->io->queue_xfer(hci, xfer, nxfers);
324+ ret = i3c_hci_process_xfer(hci, xfer, nxfers);
260325 if (ret)
261326 goto out;
262− if (!wait_for_completion_timeout(&done, HZ) &&
263− hci->io->dequeue_xfer(hci, xfer, nxfers)) {
264− ret = -ETIME;
265− goto out;
266− }
267327 for (i = prefixed; i < nxfers; i++) {
268328 if (ccc->rnw)
269329 ccc->dests[i - prefixed].payload.len =
@@ -334,15 +394,11 @@ static int i3c_hci_i3c_xfers(struct i3c_dev_desc *dev, · 64 unmodified lines
334394 last = i - 1;
335395 xfer[last].cmd_desc[0] |= CMD_0_TOC;
336396 xfer[last].completion = &done;
397+ xfer[last].timeout = HZ;
337398
338− ret = hci->io->queue_xfer(hci, xfer, nxfers);
399+ ret = i3c_hci_process_xfer(hci, xfer, nxfers);
339400 if (ret)
340401 goto out;
341− if (!wait_for_completion_timeout(&done, HZ) &&
342− hci->io->dequeue_xfer(hci, xfer, nxfers)) {
343− ret = -ETIME;
344− goto out;
345− }
346402 for (i = 0; i < nxfers; i++) {
347403 if (i3c_xfers[i].rnw)
348404 i3c_xfers[i].len = RESP_DATA_LENGTH(xfer[i].response);
@@ -382,15 +438,11 @@ static int i3c_hci_i2c_xfers(struct i2c_dev_desc *dev, · 33 unmodified lines
382438 last = i - 1;
383439 xfer[last].cmd_desc[0] |= CMD_0_TOC;
384440 xfer[last].completion = &done;
441+ xfer[last].timeout = m->i2c.timeout;
385442
386− ret = hci->io->queue_xfer(hci, xfer, nxfers);
443+ ret = i3c_hci_process_xfer(hci, xfer, nxfers);
387444 if (ret)
388445 goto out;
389− if (!wait_for_completion_timeout(&done, m->i2c.timeout) &&
390− hci->io->dequeue_xfer(hci, xfer, nxfers)) {
391− ret = -ETIME;
392− goto out;
393− }
394446 for (i = 0; i < nxfers; i++) {
395447 if (RESP_STATUS(xfer[i].response) != RESP_SUCCESS) {
396448 ret = -EIO;
@@ -566,6 +618,8 @@ static irqreturn_t i3c_hci_irq_handler(int irq, void *dev_id) · 169 unmodified lines
566618 irqreturn_t result = IRQ_NONE;
567619 u32 val;
568620
621+ guard(spinlock)(&hci->lock);
622+
569623 /*
570624 * The IRQ can be shared, so the handler may be called when the IRQ is
571625 * due to a different device. That could happen when runtime suspended,
@@ -601,34 +655,6 @@ static irqreturn_t i3c_hci_irq_handler(int irq, void *dev_id) · 29 unmodified lines
601655 return result;
602656 }
603657
604−static int i3c_hci_software_reset(struct i3c_hci *hci)
605−{
606− u32 regval;
607− int ret;
608−
609− /*
610− * SOFT_RST must be clear before we write to it.
611− * Then we must wait until it clears again.
612− */
613− ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
614− !(regval & SOFT_RST), 0, 10 * USEC_PER_MSEC);
615− if (ret) {
616− dev_err(&hci->master.dev, "%s: Software reset stuck\n", __func__);
617− return ret;
618− }
619−
620− reg_write(RESET_CONTROL, SOFT_RST);
621−
622− ret = readx_poll_timeout(reg_read, RESET_CONTROL, regval,
623− !(regval & SOFT_RST), 0, 10 * USEC_PER_MSEC);
624− if (ret) {
625− dev_err(&hci->master.dev, "%s: Software reset failed\n", __func__);
626− return ret;
627− }
628−
629− return 0;
630−}
631−
632658 static inline bool is_version_1_1_or_newer(struct i3c_hci *hci)
633659 {
634660 return hci->version_major > 1 || (hci->version_major == 1 && hci->version_minor > 0);
@@ -739,8 +765,12 @@ static int i3c_hci_runtime_suspend(struct device *dev) · 104 unmodified lines
739765 int ret;
740766
741767 ret = i3c_hci_bus_disable(hci);
742− if (ret)
768+ if (ret) {
769+ /* Fall back to software reset to disable the bus */
770+ ret = i3c_hci_software_reset(hci);
771+ i3c_hci_sync_irq_inactive(hci);
743772 return ret;
773+ }
744774
745775 hci->io->suspend(hci);
746776
@@ -760,11 +790,13 @@ static int i3c_hci_runtime_resume(struct device *dev) · 13 unmodified lines
760790
761791 mipi_i3c_hci_dat_v1.restore(hci);
762792
763− hci->irq_inactive = false;
764−
765793 hci->io->resume(hci);
766794
767− reg_set(HC_CONTROL, HC_CONTROL_BUS_ENABLE);
795+ scoped_guard(spinlock_irqsave, &hci->lock)
796+ hci->irq_inactive = false;
797+
798+ /* Enable bus with Hot-Join disabled */
799+ reg_set(HC_CONTROL, HC_CONTROL_BUS_ENABLE | HC_CONTROL_HOT_JOIN_CTRL);
768800
769801 return 0;
770802 }
@@ -924,6 +956,9 @@ static int i3c_hci_probe(struct platform_device *pdev) · 153 unmodified lines
924956 if (!hci)
925957 return -ENOMEM;
926958
959+ spin_lock_init(&hci->lock);
960+ mutex_init(&hci->control_mutex);
961+
927962 /*
928963 * Multi-bus instances share the same MMIO address range, but not
929964 * necessarily in separate contiguous sub-ranges. To avoid overlapping
@@ -950,6 +985,8 @@ static int i3c_hci_probe(struct platform_device *pdev) · 20 unmodified lines
950985 if (ret)
951986 return ret;
952987
988+ hci->irq_inactive = true;
989+
953990 irq = platform_get_irq(pdev, 0);
954991 ret = devm_request_irq(&pdev->dev, irq, i3c_hci_irq_handler,
955992 IRQF_SHARED, NULL, hci);
drivers/i3c/master/mipi-i3c-hci/dma.c+84−74
@@ -129,9 +129,8 @@ struct hci_rh_data { · 128 unmodified lines
129129 dma_addr_t xfer_dma, resp_dma, ibi_status_dma, ibi_data_dma;
130130 unsigned int xfer_entries, ibi_status_entries, ibi_chunks_total;
131131 unsigned int xfer_struct_sz, resp_struct_sz, ibi_status_sz, ibi_chunk_sz;
132− unsigned int done_ptr, ibi_chunk_ptr;
132+ unsigned int done_ptr, ibi_chunk_ptr, xfer_space;
133133 struct hci_xfer **src_xfers;
134− spinlock_t lock;
135134 struct completion op_done;
136135 };
137136
@@ -261,6 +260,7 @@ ring_ready: · 123 unmodified lines
261260
262261 rh->done_ptr = 0;
263262 rh->ibi_chunk_ptr = 0;
263+ rh->xfer_space = rh->xfer_entries;
264264 }
265265
266266 static void hci_dma_init_rings(struct i3c_hci *hci)
@@ -344,7 +344,6 @@ static int hci_dma_init(struct i3c_hci *hci) · 77 unmodified lines
344344 goto err_out;
345345 rh = &rings->headers[i];
346346 rh->regs = hci->base_regs + offset;
347− spin_lock_init(&rh->lock);
348347 init_completion(&rh->op_done);
349348
350349 rh->xfer_entries = XFER_RING_ENTRIES;
@@ -439,26 +438,63 @@ static void hci_dma_unmap_xfer(struct i3c_hci *hci, · 88 unmodified lines
439438 }
440439 }
441440
441+static struct i3c_dma *hci_dma_map_xfer(struct device *dev, struct hci_xfer *xfer)
442+{
443+ enum dma_data_direction dir = xfer->rnw ? DMA_FROM_DEVICE : DMA_TO_DEVICE;
444+ bool need_bounce = device_iommu_mapped(dev) && xfer->rnw && (xfer->data_len & 3);
445+
446+ return i3c_master_dma_map_single(dev, xfer->data, xfer->data_len, need_bounce, dir);
447+}
448+
449+static int hci_dma_map_xfer_list(struct i3c_hci *hci, struct device *dev,
450+ struct hci_xfer *xfer_list, int n)
451+{
452+ for (int i = 0; i < n; i++) {
453+ struct hci_xfer *xfer = xfer_list + i;
454+
455+ if (!xfer->data)
456+ continue;
457+
458+ xfer->dma = hci_dma_map_xfer(dev, xfer);
459+ if (!xfer->dma) {
460+ hci_dma_unmap_xfer(hci, xfer_list, i);
461+ return -ENOMEM;
462+ }
463+ }
464+
465+ return 0;
466+}
467+
442468 static int hci_dma_queue_xfer(struct i3c_hci *hci,
443469 struct hci_xfer *xfer_list, int n)
444470 {
445471 struct hci_rings_data *rings = hci->io_data;
446472 struct hci_rh_data *rh;
447473 unsigned int i, ring, enqueue_ptr;
448− u32 op1_val, op2_val;
474+ u32 op1_val;
475+ int ret;
476+
477+ ret = hci_dma_map_xfer_list(hci, rings->sysdev, xfer_list, n);
478+ if (ret)
479+ return ret;
449480
450481 /* For now we only use ring 0 */
451482 ring = 0;
452483 rh = &rings->headers[ring];
453484
485+ spin_lock_irq(&hci->lock);
486+
487+ if (n > rh->xfer_space) {
488+ spin_unlock_irq(&hci->lock);
489+ hci_dma_unmap_xfer(hci, xfer_list, n);
490+ return -EBUSY;
491+ }
492+
454493 op1_val = rh_reg_read(RING_OPERATION1);
455494 enqueue_ptr = FIELD_GET(RING_OP1_CR_ENQ_PTR, op1_val);
456495 for (i = 0; i < n; i++) {
457496 struct hci_xfer *xfer = xfer_list + i;
458497 u32 *ring_data = rh->xfer + rh->xfer_struct_sz * enqueue_ptr;
459− enum dma_data_direction dir = xfer->rnw ? DMA_FROM_DEVICE :
460− DMA_TO_DEVICE;
461− bool need_bounce;
462498
463499 /* store cmd descriptor */
464500 *ring_data++ = xfer->cmd_desc[0];
@@ -477,18 +513,6 @@ static int hci_dma_queue_xfer(struct i3c_hci *hci, · 12 unmodified lines
477513
478514 /* 2nd and 3rd words of Data Buffer Descriptor Structure */
479515 if (xfer->data) {
480− need_bounce = device_iommu_mapped(rings->sysdev) &&
481− xfer->rnw &&
482− xfer->data_len != ALIGN(xfer->data_len, 4);
483− xfer->dma = i3c_master_dma_map_single(rings->sysdev,
484− xfer->data,
485− xfer->data_len,
486− need_bounce,
487− dir);
488− if (!xfer->dma) {
489− hci_dma_unmap_xfer(hci, xfer_list, i);
490− return -ENOMEM;
491− }
492516 *ring_data++ = lower_32_bits(xfer->dma->addr);
493517 *ring_data++ = upper_32_bits(xfer->dma->addr);
494518 } else {
@@ -503,26 +527,14 @@ static int hci_dma_queue_xfer(struct i3c_hci *hci, · 8 unmodified lines
503527 xfer->ring_entry = enqueue_ptr;
504528
505529 enqueue_ptr = (enqueue_ptr + 1) % rh->xfer_entries;
506−
507− /*
508− * We may update the hardware view of the enqueue pointer
509− * only if we didn't reach its dequeue pointer.
510− */
511− op2_val = rh_reg_read(RING_OPERATION2);
512− if (enqueue_ptr == FIELD_GET(RING_OP2_CR_DEQ_PTR, op2_val)) {
513− /* the ring is full */
514− hci_dma_unmap_xfer(hci, xfer_list, i + 1);
515− return -EBUSY;
516− }
517530 }
518531
519− /* take care to update the hardware enqueue pointer atomically */
520− spin_lock_irq(&rh->lock);
521− op1_val = rh_reg_read(RING_OPERATION1);
532+ rh->xfer_space -= n;
533+
522534 op1_val &= ~RING_OP1_CR_ENQ_PTR;
523535 op1_val |= FIELD_PREP(RING_OP1_CR_ENQ_PTR, enqueue_ptr);
524536 rh_reg_write(RING_OPERATION1, op1_val);
525− spin_unlock_irq(&rh->lock);
537+ spin_unlock_irq(&hci->lock);
526538
527539 return 0;
528540 }
@@ -534,18 +546,29 @@ static bool hci_dma_dequeue_xfer(struct i3c_hci *hci, · 5 unmodified lines
534546 struct hci_rh_data *rh = &rings->headers[xfer_list[0].ring_number];
535547 unsigned int i;
536548 bool did_unqueue = false;
537−
538− /* stop the ring */
539− rh_reg_write(RING_CONTROL, RING_CTRL_ABORT);
540− if (wait_for_completion_timeout(&rh->op_done, HZ) == 0) {
541− /*
542− * We're deep in it if ever this condition is ever met.
543− * Hardware might still be writing to memory, etc.
544− */
545− dev_crit(&hci->master.dev, "unable to abort the ring\n");
546− WARN_ON(1);
549+ u32 ring_status;
550+
551+ guard(mutex)(&hci->control_mutex);
552+
553+ ring_status = rh_reg_read(RING_STATUS);
554+ if (ring_status & RING_STATUS_RUNNING) {
555+ /* stop the ring */
556+ reinit_completion(&rh->op_done);
557+ rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE | RING_CTRL_ABORT);
558+ wait_for_completion_timeout(&rh->op_done, HZ);
559+ ring_status = rh_reg_read(RING_STATUS);
560+ if (ring_status & RING_STATUS_RUNNING) {
561+ /*
562+ * We're deep in it if ever this condition is ever met.
563+ * Hardware might still be writing to memory, etc.
564+ */
565+ dev_crit(&hci->master.dev, "unable to abort the ring\n");
566+ WARN_ON(1);
567+ }
547568 }
548569
570+ spin_lock_irq(&hci->lock);
571+
549572 for (i = 0; i < n; i++) {
550573 struct hci_xfer *xfer = xfer_list + i;
551574 int idx = xfer->ring_entry;
@@ -559,7 +582,7 @@ static bool hci_dma_dequeue_xfer(struct i3c_hci *hci, · 7 unmodified lines
559582 u32 *ring_data = rh->xfer + rh->xfer_struct_sz * idx;
560583
561584 /* store no-op cmd descriptor */
562− *ring_data++ = FIELD_PREP(CMD_0_ATTR, 0x7);
585+ *ring_data++ = FIELD_PREP(CMD_0_ATTR, 0x7) | FIELD_PREP(CMD_0_TID, xfer->cmd_tid);
563586 *ring_data++ = 0;
564587 if (hci->cmd == &mipi_i3c_hci_cmd_v2) {
565588 *ring_data++ = 0;
@@ -577,15 +600,25 @@ static bool hci_dma_dequeue_xfer(struct i3c_hci *hci, · 11 unmodified lines
577600 }
578601
579602 /* restart the ring */
603+ mipi_i3c_hci_resume(hci);
580604 rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE);
605+ rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE | RING_CTRL_RUN_STOP);
606+
607+ spin_unlock_irq(&hci->lock);
581608
582609 return did_unqueue;
583610 }
584611
612+static int hci_dma_handle_error(struct i3c_hci *hci, struct hci_xfer *xfer_list, int n)
613+{
614+ return hci_dma_dequeue_xfer(hci, xfer_list, n) ? -EIO : 0;
615+}
616+
585617 static void hci_dma_xfer_done(struct i3c_hci *hci, struct hci_rh_data *rh)
586618 {
587619 u32 op1_val, op2_val, resp, *ring_resp;
588620 unsigned int tid, done_ptr = rh->done_ptr;
621+ unsigned int done_cnt = 0;
589622 struct hci_xfer *xfer;
590623
591624 for (;;) {
@@ -603,6 +636,7 @@ static void hci_dma_xfer_done(struct i3c_hci *hci, struct hci_rh_data *rh) · 11 unmodified lines
603636 dev_dbg(&hci->master.dev, "orphaned ring entry");
604637 } else {
605638 hci_dma_unmap_xfer(hci, xfer, 1);
639+ rh->src_xfers[done_ptr] = NULL;
606640 xfer->ring_entry = -1;
607641 xfer->response = resp;
608642 if (tid != xfer->cmd_tid) {
@@ -617,15 +651,14 @@ static void hci_dma_xfer_done(struct i3c_hci *hci, struct hci_rh_data *rh) · 8 unmodified lines
617651
618652 done_ptr = (done_ptr + 1) % rh->xfer_entries;
619653 rh->done_ptr = done_ptr;
654+ done_cnt += 1;
620655 }
621656
622− /* take care to update the software dequeue pointer atomically */
623− spin_lock(&rh->lock);
657+ rh->xfer_space += done_cnt;
624658 op1_val = rh_reg_read(RING_OPERATION1);
625659 op1_val &= ~RING_OP1_CR_SW_DEQ_PTR;
626660 op1_val |= FIELD_PREP(RING_OP1_CR_SW_DEQ_PTR, done_ptr);
627661 rh_reg_write(RING_OPERATION1, op1_val);
628− spin_unlock(&rh->lock);
629662 }
630663
631664 static int hci_dma_request_ibi(struct i3c_hci *hci, struct i3c_dev_desc *dev,
@@ -805,13 +838,10 @@ static void hci_dma_process_ibi(struct i3c_hci *hci, struct hci_rh_data *rh) · 173 unmodified lines
805838 i3c_master_queue_ibi(dev, slot);
806839
807840 done:
808− /* take care to update the ibi dequeue pointer atomically */
809− spin_lock(&rh->lock);
810841 op1_val = rh_reg_read(RING_OPERATION1);
811842 op1_val &= ~RING_OP1_IBI_DEQ_PTR;
812843 op1_val |= FIELD_PREP(RING_OP1_IBI_DEQ_PTR, deq_ptr);
813844 rh_reg_write(RING_OPERATION1, op1_val);
814− spin_unlock(&rh->lock);
815845
816846 /* update the chunk pointer */
817847 rh->ibi_chunk_ptr += ibi_chunks;
@@ -845,29 +875,8 @@ static bool hci_dma_irq_handler(struct i3c_hci *hci) · 27 unmodified lines
845875 hci_dma_xfer_done(hci, rh);
846876 if (status & INTR_RING_OP)
847877 complete(&rh->op_done);
848−
849− if (status & INTR_TRANSFER_ABORT) {
850− u32 ring_status;
851−
852− dev_notice_ratelimited(&hci->master.dev,
853− "Ring %d: Transfer Aborted\n", i);
854− mipi_i3c_hci_resume(hci);
855− ring_status = rh_reg_read(RING_STATUS);
856− if (!(ring_status & RING_STATUS_RUNNING) &&
857− status & INTR_TRANSFER_COMPLETION &&
858− status & INTR_TRANSFER_ERR) {
859− /*
860− * Ring stop followed by run is an Intel
861− * specific required quirk after resuming the
862− * halted controller. Do it only when the ring
863− * is not in running state after a transfer
864− * error.
865− */
866− rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE);
867− rh_reg_write(RING_CONTROL, RING_CTRL_ENABLE |
868− RING_CTRL_RUN_STOP);
869− }
870− }
878+ if (status & INTR_TRANSFER_ABORT)
879+ dev_dbg(&hci->master.dev, "Ring %d: Transfer Aborted\n", i);
871880 if (status & INTR_IBI_RING_FULL)
872881 dev_err_ratelimited(&hci->master.dev,
873882 "Ring %d: IBI Ring Full Condition\n", i);
@@ -883,6 +892,7 @@ const struct hci_io_ops mipi_i3c_hci_dma = { · 9 unmodified lines
883892 .cleanup = hci_dma_cleanup,
884893 .queue_xfer = hci_dma_queue_xfer,
885894 .dequeue_xfer = hci_dma_dequeue_xfer,
895+ .handle_error = hci_dma_handle_error,
886896 .irq_handler = hci_dma_irq_handler,
887897 .request_ibi = hci_dma_request_ibi,
888898 .free_ibi = hci_dma_free_ibi,
drivers/i3c/master/mipi-i3c-hci/hci.h+5−0
@@ -50,6 +50,8 @@ struct i3c_hci { · 49 unmodified lines
5050 const struct hci_io_ops *io;
5151 void *io_data;
5252 const struct hci_cmd_ops *cmd;
53+ spinlock_t lock;
54+ struct mutex control_mutex;
5355 atomic_t next_cmd_tid;
5456 bool irq_inactive;
5557 u32 caps;
@@ -87,6 +89,7 @@ struct hci_xfer { · 31 unmodified lines
8789 unsigned int data_len;
8890 unsigned int cmd_tid;
8991 struct completion *completion;
92+ unsigned long timeout;
9093 union {
9194 struct {
9295 /* PIO specific */
@@ -120,6 +123,7 @@ struct hci_io_ops { · 27 unmodified lines
120123 bool (*irq_handler)(struct i3c_hci *hci);
121124 int (*queue_xfer)(struct i3c_hci *hci, struct hci_xfer *xfer, int n);
122125 bool (*dequeue_xfer)(struct i3c_hci *hci, struct hci_xfer *xfer, int n);
126+ int (*handle_error)(struct i3c_hci *hci, struct hci_xfer *xfer, int n);
123127 int (*request_ibi)(struct i3c_hci *hci, struct i3c_dev_desc *dev,
124128 const struct i3c_ibi_setup *req);
125129 void (*free_ibi)(struct i3c_hci *hci, struct i3c_dev_desc *dev);
@@ -154,5 +158,6 @@ void mipi_i3c_hci_dct_index_reset(struct i3c_hci *hci); · 28 unmodified lines
154158 void amd_set_od_pp_timing(struct i3c_hci *hci);
155159 void amd_set_resp_buf_thld(struct i3c_hci *hci);
156160 void i3c_hci_sync_irq_inactive(struct i3c_hci *hci);
161+int i3c_hci_process_xfer(struct i3c_hci *hci, struct hci_xfer *xfer, int n);
157162
158163 #endif
drivers/i3c/master/mipi-i3c-hci/pio.c+5−11
@@ -123,7 +123,6 @@ struct hci_pio_ibi_data { · 122 unmodified lines
123123 };
124124
125125 struct hci_pio_data {
126− spinlock_t lock;
127126 struct hci_xfer *curr_xfer, *xfer_queue;
128127 struct hci_xfer *curr_rx, *rx_queue;
129128 struct hci_xfer *curr_tx, *tx_queue;
@@ -212,7 +211,6 @@ static int hci_pio_init(struct i3c_hci *hci) · 82 unmodified lines
212211 return -ENOMEM;
213212
214213 hci->io_data = pio;
215− spin_lock_init(&pio->lock);
216214
217215 __hci_pio_init(hci, &size_val);
218216
@@ -631,7 +629,7 @@ static int hci_pio_queue_xfer(struct i3c_hci *hci, struct hci_xfer *xfer, int n) · 412 unmodified lines
631629 xfer[i].data_left = xfer[i].data_len;
632630 }
633631
634− spin_lock_irq(&pio->lock);
632+ spin_lock_irq(&hci->lock);
635633 prev_queue_tail = pio->xfer_queue;
636634 pio->xfer_queue = &xfer[n - 1];
637635 if (pio->curr_xfer) {
@@ -645,7 +643,7 @@ static int hci_pio_queue_xfer(struct i3c_hci *hci, struct hci_xfer *xfer, int n) · 7 unmodified lines
645643 pio_reg_read(INTR_STATUS),
646644 pio_reg_read(INTR_SIGNAL_ENABLE));
647645 }
648− spin_unlock_irq(&pio->lock);
646+ spin_unlock_irq(&hci->lock);
649647 return 0;
650648 }
651649
@@ -716,14 +714,14 @@ static bool hci_pio_dequeue_xfer(struct i3c_hci *hci, struct hci_xfer *xfer, int · 64 unmodified lines
716714 struct hci_pio_data *pio = hci->io_data;
717715 int ret;
718716
719− spin_lock_irq(&pio->lock);
717+ spin_lock_irq(&hci->lock);
720718 dev_dbg(&hci->master.dev, "n=%d status=%#x/%#x", n,
721719 pio_reg_read(INTR_STATUS), pio_reg_read(INTR_SIGNAL_ENABLE));
722720 dev_dbg(&hci->master.dev, "main_status = %#x/%#x",
723721 readl(hci->base_regs + 0x20), readl(hci->base_regs + 0x28));
724722
725723 ret = hci_pio_dequeue_xfer_common(hci, pio, xfer, n);
726− spin_unlock_irq(&pio->lock);
724+ spin_unlock_irq(&hci->lock);
727725 return ret;
728726 }
729727
@@ -1016,15 +1014,12 @@ static bool hci_pio_irq_handler(struct i3c_hci *hci) · 286 unmodified lines
10161014 struct hci_pio_data *pio = hci->io_data;
10171015 u32 status;
10181016
1019− spin_lock(&pio->lock);
10201017 status = pio_reg_read(INTR_STATUS);
10211018 dev_dbg(&hci->master.dev, "PIO_INTR_STATUS %#x/%#x",
10221019 status, pio->enabled_irqs);
10231020 status &= pio->enabled_irqs | STAT_LATENCY_WARNINGS;
1024− if (!status) {
1025− spin_unlock(&pio->lock);
1021+ if (!status)
10261022 return false;
1027− }
10281023
10291024 if (status & STAT_IBI_STATUS_THLD)
10301025 hci_pio_process_ibi(hci, pio);
@@ -1058,7 +1053,6 @@ static bool hci_pio_irq_handler(struct i3c_hci *hci) · 27 unmodified lines
10581053 pio_reg_write(INTR_SIGNAL_ENABLE, pio->enabled_irqs);
10591054 dev_dbg(&hci->master.dev, "PIO_INTR_STATUS %#x/%#x",
10601055 pio_reg_read(INTR_STATUS), pio_reg_read(INTR_SIGNAL_ENABLE));
1061− spin_unlock(&pio->lock);
10621056 return true;
10631057 }
10641058
drivers/iio/adc/ad7768-1.c+11−2
@@ -531,7 +531,7 @@ static int ad7768_reg_access(struct iio_dev *indio_dev, · 530 unmodified lines
531531 return ret;
532532 }
533533
534−static void ad7768_fill_scale_tbl(struct iio_dev *dev)
534+static int ad7768_fill_scale_tbl(struct iio_dev *dev)
535535 {
536536 struct ad7768_state *st = iio_priv(dev);
537537 const struct iio_scan_type *scan_type;
@@ -541,6 +541,11 @@ static void ad7768_fill_scale_tbl(struct iio_dev *dev) · 3 unmodified lines
541541 u64 tmp2;
542542
543543 scan_type = iio_get_current_scan_type(dev, &dev->channels[0]);
544+ if (IS_ERR(scan_type)) {
545+ dev_err(&st->spi->dev, "Failed to get scan type.\n");
546+ return PTR_ERR(scan_type);
547+ }
548+
544549 if (scan_type->sign == 's')
545550 val2 = scan_type->realbits - 1;
546551 else
@@ -565,6 +570,8 @@ static void ad7768_fill_scale_tbl(struct iio_dev *dev) · 18 unmodified lines
565570 st->scale_tbl[i][0] = tmp0; /* Integer part */
566571 st->scale_tbl[i][1] = abs(tmp1); /* Fractional part */
567572 }
573+
574+ return 0;
568575 }
569576
570577 static int ad7768_set_sinc3_dec_rate(struct ad7768_state *st,
@@ -669,7 +676,9 @@ static int ad7768_configure_dig_fil(struct iio_dev *dev, · 98 unmodified lines
669676 }
670677
671678 /* Update scale table: scale values vary according to the precision */
672− ad7768_fill_scale_tbl(dev);
679+ ret = ad7768_fill_scale_tbl(dev);
680+ if (ret)
681+ return ret;
673682
674683 ad7768_fill_samp_freq_tbl(st);
675684
drivers/iio/chemical/bme680_core.c+1−1
@@ -613,7 +613,7 @@ static int bme680_wait_for_eoc(struct bme680_data *data) · 612 unmodified lines
613613 * + heater duration
614614 */
615615 int wait_eoc_us = ((data->oversampling_temp + data->oversampling_press +
616− data->oversampling_humid) * 1936) + (477 * 4) +
616+ data->oversampling_humid) * 1963) + (477 * 4) +
617617 (477 * 5) + 1000 + (data->heater_dur * 1000);
618618
619619 fsleep(wait_eoc_us);
drivers/iio/chemical/sps30_i2c.c+1−1
@@ -171,7 +171,7 @@ static int sps30_i2c_read_meas(struct sps30_state *state, __be32 *meas, size_t n · 170 unmodified lines
171171 if (!sps30_i2c_meas_ready(state))
172172 return -ETIMEDOUT;
173173
174− return sps30_i2c_command(state, SPS30_I2C_READ_MEAS, NULL, 0, meas, sizeof(num) * num);
174+ return sps30_i2c_command(state, SPS30_I2C_READ_MEAS, NULL, 0, meas, sizeof(*meas) * num);
175175 }
176176
177177 static int sps30_i2c_clean_fan(struct sps30_state *state)
drivers/iio/chemical/sps30_serial.c+1−1
@@ -303,7 +303,7 @@ static int sps30_serial_read_meas(struct sps30_state *state, __be32 *meas, size_ · 302 unmodified lines
303303 if (msleep_interruptible(1000))
304304 return -EINTR;
305305
306− ret = sps30_serial_command(state, SPS30_SERIAL_READ_MEAS, NULL, 0, meas, num * sizeof(num));
306+ ret = sps30_serial_command(state, SPS30_SERIAL_READ_MEAS, NULL, 0, meas, num * sizeof(*meas));
307307 if (ret < 0)
308308 return ret;
309309 /* if measurements aren't ready sensor returns empty frame */
drivers/iio/dac/ds4424.c+1−1
@@ -140,7 +140,7 @@ static int ds4424_write_raw(struct iio_dev *indio_dev, · 139 unmodified lines
140140
141141 switch (mask) {
142142 case IIO_CHAN_INFO_RAW:
143− if (val < S8_MIN || val > S8_MAX)
143+ if (val <= S8_MIN || val > S8_MAX)
144144 return -EINVAL;
145145
146146 if (val > 0) {
drivers/iio/frequency/adf4377.c+1−1
@@ -508,7 +508,7 @@ static int adf4377_soft_reset(struct adf4377_state *st) · 507 unmodified lines
508508 return ret;
509509
510510 return regmap_read_poll_timeout(st->regmap, 0x0, read_val,
511− !(read_val & (ADF4377_0000_SOFT_RESET_R_MSK |
511+ !(read_val & (ADF4377_0000_SOFT_RESET_MSK |
512512 ADF4377_0000_SOFT_RESET_R_MSK)), 200, 200 * 100);
513513 }
514514
drivers/iio/gyro/mpu3050-core.c+13−5
@@ -322,7 +322,9 @@ static int mpu3050_read_raw(struct iio_dev *indio_dev, · 321 unmodified lines
322322 }
323323 case IIO_CHAN_INFO_RAW:
324324 /* Resume device */
325− pm_runtime_get_sync(mpu3050->dev);
325+ ret = pm_runtime_resume_and_get(mpu3050->dev);
326+ if (ret)
327+ return ret;
326328 mutex_lock(&mpu3050->lock);
327329
328330 ret = mpu3050_set_8khz_samplerate(mpu3050);
@@ -647,14 +649,20 @@ out_trigger_unlock: · 318 unmodified lines
647649 static int mpu3050_buffer_preenable(struct iio_dev *indio_dev)
648650 {
649651 struct mpu3050 *mpu3050 = iio_priv(indio_dev);
652+ int ret;
650653
651− pm_runtime_get_sync(mpu3050->dev);
654+ ret = pm_runtime_resume_and_get(mpu3050->dev);
655+ if (ret)
656+ return ret;
652657
653658 /* Unless we have OUR trigger active, run at full speed */
654− if (!mpu3050->hw_irq_trigger)
655− return mpu3050_set_8khz_samplerate(mpu3050);
659+ if (!mpu3050->hw_irq_trigger) {
660+ ret = mpu3050_set_8khz_samplerate(mpu3050);
661+ if (ret)
662+ pm_runtime_put_autosuspend(mpu3050->dev);
663+ }
656664
657− return 0;
665+ return ret;
658666 }
659667
660668 static int mpu3050_buffer_postdisable(struct iio_dev *indio_dev)
drivers/iio/gyro/mpu3050-i2c.c+1−2
@@ -19,8 +19,7 @@ static int mpu3050_i2c_bypass_select(struct i2c_mux_core *mux, u32 chan_id) · 18 unmodified lines
1919 struct mpu3050 *mpu3050 = i2c_mux_priv(mux);
2020
2121 /* Just power up the device, that is all that is needed */
22− pm_runtime_get_sync(mpu3050->dev);
23− return 0;
22+ return pm_runtime_resume_and_get(mpu3050->dev);
2423 }
2524
2625 static int mpu3050_i2c_bypass_deselect(struct i2c_mux_core *mux, u32 chan_id)
drivers/iio/imu/adis.c+1−1
@@ -526,7 +526,7 @@ int adis_init(struct adis *adis, struct iio_dev *indio_dev, · 525 unmodified lines
526526
527527 adis->spi = spi;
528528 adis->data = data;
529− if (!adis->ops->write && !adis->ops->read && !adis->ops->reset)
529+ if (!adis->ops)
530530 adis->ops = &adis_default_ops;
531531 else if (!adis->ops->write || !adis->ops->read || !adis->ops->reset)
532532 return -EINVAL;
drivers/iio/imu/inv_icm42600/inv_icm42600_accel.c+2−0
@@ -651,6 +651,8 @@ static int inv_icm42600_accel_write_odr(struct iio_dev *indio_dev, · 650 unmodified lines
651651 return -EINVAL;
652652
653653 conf.odr = inv_icm42600_accel_odr_conv[idx / 2];
654+ if (conf.odr == st->conf.accel.odr)
655+ return 0;
654656
655657 pm_runtime_get_sync(dev);
656658 mutex_lock(&st->lock);
drivers/iio/imu/inv_icm42600/inv_icm42600_buffer.c+4−0
@@ -371,6 +371,8 @@ static int inv_icm42600_buffer_predisable(struct iio_dev *indio_dev) · 370 unmodified lines
371371 static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev)
372372 {
373373 struct inv_icm42600_state *st = iio_device_get_drvdata(indio_dev);
374+ struct inv_icm42600_sensor_state *sensor_st = iio_priv(indio_dev);
375+ struct inv_sensors_timestamp *ts = &sensor_st->ts;
374376 struct device *dev = regmap_get_device(st->map);
375377 unsigned int sensor;
376378 unsigned int *watermark;
@@ -392,6 +394,8 @@ static int inv_icm42600_buffer_postdisable(struct iio_dev *indio_dev) · 15 unmodified lines
392394
393395 mutex_lock(&st->lock);
394396
397+ inv_sensors_timestamp_apply_odr(ts, 0, 0, 0);
398+
395399 ret = inv_icm42600_buffer_set_fifo_en(st, st->fifo.en & ~sensor);
396400 if (ret)
397401 goto out_unlock;
drivers/iio/imu/inv_icm42600/inv_icm42600_gyro.c+2−0
@@ -358,6 +358,8 @@ static int inv_icm42600_gyro_write_odr(struct iio_dev *indio_dev, · 357 unmodified lines
358358 return -EINVAL;
359359
360360 conf.odr = inv_icm42600_gyro_odr_conv[idx / 2];
361+ if (conf.odr == st->conf.gyro.odr)
362+ return 0;
361363
362364 pm_runtime_get_sync(dev);
363365 mutex_lock(&st->lock);
drivers/iio/imu/inv_icm45600/inv_icm45600.h+1−1
@@ -205,7 +205,7 @@ struct inv_icm45600_sensor_state { · 204 unmodified lines
205205 #define INV_ICM45600_SPI_SLEW_RATE_38NS 0
206206
207207 #define INV_ICM45600_REG_INT1_CONFIG2 0x0018
208−#define INV_ICM45600_INT1_CONFIG2_PUSH_PULL BIT(2)
208+#define INV_ICM45600_INT1_CONFIG2_OPEN_DRAIN BIT(2)
209209 #define INV_ICM45600_INT1_CONFIG2_LATCHED BIT(1)
210210 #define INV_ICM45600_INT1_CONFIG2_ACTIVE_HIGH BIT(0)
211211 #define INV_ICM45600_INT1_CONFIG2_ACTIVE_LOW 0x00
drivers/iio/imu/inv_icm45600/inv_icm45600_core.c+8−3
@@ -637,8 +637,8 @@ static int inv_icm45600_irq_init(struct inv_icm45600_state *st, int irq, · 636 unmodified lines
637637 break;
638638 }
639639
640− if (!open_drain)
641− val |= INV_ICM45600_INT1_CONFIG2_PUSH_PULL;
640+ if (open_drain)
641+ val |= INV_ICM45600_INT1_CONFIG2_OPEN_DRAIN;
642642
643643 ret = regmap_write(st->map, INV_ICM45600_REG_INT1_CONFIG2, val);
644644 if (ret)
@@ -744,6 +744,11 @@ int inv_icm45600_core_probe(struct regmap *regmap, const struct inv_icm45600_chi · 99 unmodified lines
744744 */
745745 fsleep(5 * USEC_PER_MSEC);
746746
747+ /* set pm_runtime active early for disable vddio resource cleanup */
748+ ret = pm_runtime_set_active(dev);
749+ if (ret)
750+ return ret;
751+
747752 ret = inv_icm45600_enable_regulator_vddio(st);
748753 if (ret)
749754 return ret;
@@ -776,7 +781,7 @@ int inv_icm45600_core_probe(struct regmap *regmap, const struct inv_icm45600_chi · 26 unmodified lines
776781 if (ret)
777782 return ret;
778783
779− ret = devm_pm_runtime_set_active_enabled(dev);
784+ ret = devm_pm_runtime_enable(dev);
780785 if (ret)
781786 return ret;
782787
drivers/iio/imu/inv_mpu6050/inv_mpu_core.c+8−0
@@ -1943,6 +1943,14 @@ int inv_mpu_core_probe(struct regmap *regmap, int irq, const char *name, · 1942 unmodified lines
19431943 irq_type);
19441944 return -EINVAL;
19451945 }
1946+
1947+ /*
1948+ * Acking interrupts by status register does not work reliably
1949+ * but seem to work when this bit is set.
1950+ */
1951+ if (st->chip_type == INV_MPU9150)
1952+ st->irq_mask |= INV_MPU6050_INT_RD_CLEAR;
1953+
19461954 device_set_wakeup_capable(dev, true);
19471955
19481956 st->vdd_supply = devm_regulator_get(dev, "vdd");
drivers/iio/imu/inv_mpu6050/inv_mpu_iio.h+2−0
@@ -390,6 +390,8 @@ struct inv_mpu6050_state { · 389 unmodified lines
390390 /* enable level triggering */
391391 #define INV_MPU6050_LATCH_INT_EN 0x20
392392 #define INV_MPU6050_BIT_BYPASS_EN 0x2
393+/* allow acking interrupts by any register read */
394+#define INV_MPU6050_INT_RD_CLEAR 0x10
393395
394396 /* Allowed timestamp period jitter in percent */
395397 #define INV_MPU6050_TS_PERIOD_JITTER 4
drivers/iio/imu/inv_mpu6050/inv_mpu_trigger.c+4−1
@@ -248,7 +248,6 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) · 247 unmodified lines
248248 switch (st->chip_type) {
249249 case INV_MPU6000:
250250 case INV_MPU6050:
251− case INV_MPU9150:
252251 /*
253252 * WoM is not supported and interrupt status read seems to be broken for
254253 * some chips. Since data ready is the only interrupt, bypass interrupt
@@ -257,6 +256,10 @@ static irqreturn_t inv_mpu6050_interrupt_handle(int irq, void *p) · 2 unmodified lines
257256 wom_bits = 0;
258257 int_status = INV_MPU6050_BIT_RAW_DATA_RDY_INT;
259258 goto data_ready_interrupt;
259+ case INV_MPU9150:
260+ /* IRQ needs to be acked */
261+ wom_bits = 0;
262+ break;
260263 case INV_MPU6500:
261264 case INV_MPU6515:
262265 case INV_MPU6880:
drivers/iio/industrialio-buffer.c+4−2
@@ -228,8 +228,10 @@ static ssize_t iio_buffer_write(struct file *filp, const char __user *buf, · 227 unmodified lines
228228 written = 0;
229229 add_wait_queue(&rb->pollq, &wait);
230230 do {
231− if (!indio_dev->info)
232− return -ENODEV;
231+ if (!indio_dev->info) {
232+ ret = -ENODEV;
233+ break;
234+ }
233235
234236 if (!iio_buffer_space_available(rb)) {
235237 if (signal_pending(current)) {
drivers/iio/light/bh1780.c+1−1
@@ -109,9 +109,9 @@ static int bh1780_read_raw(struct iio_dev *indio_dev, · 108 unmodified lines
109109 case IIO_LIGHT:
110110 pm_runtime_get_sync(&bh1780->client->dev);
111111 value = bh1780_read_word(bh1780, BH1780_REG_DLOW);
112+ pm_runtime_put_autosuspend(&bh1780->client->dev);
112113 if (value < 0)
113114 return value;
114− pm_runtime_put_autosuspend(&bh1780->client->dev);
115115 *val = value;
116116
117117 return IIO_VAL_INT;
drivers/iio/magnetometer/Kconfig+1−2
@@ -143,8 +143,7 @@ config MMC5633 · 142 unmodified lines
143143 tristate "MEMSIC MMC5633 3-axis magnetic sensor"
144144 select REGMAP_I2C
145145 select REGMAP_I3C if I3C
146− depends on I2C
147− depends on I3C || !I3C
146+ depends on I3C_OR_I2C
148147 help
149148 Say yes here to build support for the MEMSIC MMC5633 3-axis
150149 magnetic sensor.
drivers/iio/magnetometer/tlv493d.c+1−1
@@ -171,7 +171,7 @@ static s16 tlv493d_get_channel_data(u8 *b, enum tlv493d_channels ch) · 170 unmodified lines
171171 switch (ch) {
172172 case TLV493D_AXIS_X:
173173 val = FIELD_GET(TLV493D_BX_MAG_X_AXIS_MSB, b[TLV493D_RD_REG_BX]) << 4 |
174− FIELD_GET(TLV493D_BX2_MAG_X_AXIS_LSB, b[TLV493D_RD_REG_BX2]) >> 4;
174+ FIELD_GET(TLV493D_BX2_MAG_X_AXIS_LSB, b[TLV493D_RD_REG_BX2]);
175175 break;
176176 case TLV493D_AXIS_Y:
177177 val = FIELD_GET(TLV493D_BY_MAG_Y_AXIS_MSB, b[TLV493D_RD_REG_BY]) << 4 |
drivers/iio/potentiometer/mcp4131.c+1−1
@@ -221,7 +221,7 @@ static int mcp4131_write_raw(struct iio_dev *indio_dev, · 220 unmodified lines
221221
222222 mutex_lock(&data->lock);
223223
224− data->buf[0] = address << MCP4131_WIPER_SHIFT;
224+ data->buf[0] = address;
225225 data->buf[0] |= MCP4131_WRITE | (val >> 8);
226226 data->buf[1] = val & 0xFF; /* 8 bits here */
227227
drivers/iio/proximity/hx9023s.c+4−2
@@ -719,6 +719,9 @@ static int hx9023s_set_samp_freq(struct hx9023s_data *data, int val, int val2) · 718 unmodified lines
719719 struct device *dev = regmap_get_device(data->regmap);
720720 unsigned int i, period_ms;
721721
722+ if (!val && !val2)
723+ return -EINVAL;
724+
722725 period_ms = div_u64(NANO, (val * MEGA + val2));
723726
724727 for (i = 0; i < ARRAY_SIZE(hx9023s_samp_freq_table); i++) {
@@ -1034,9 +1037,8 @@ static int hx9023s_send_cfg(const struct firmware *fw, struct hx9023s_data *data · 309 unmodified lines
10341037 if (!bin)
10351038 return -ENOMEM;
10361039
1037− memcpy(bin->data, fw->data, fw->size);
1038−
10391040 bin->fw_size = fw->size;
1041+ memcpy(bin->data, fw->data, bin->fw_size);
10401042 bin->fw_ver = bin->data[FW_VER_OFFSET];
10411043 bin->reg_count = get_unaligned_le16(bin->data + FW_REG_CNT_OFFSET);
10421044
drivers/irqchip/irq-riscv-aplic-main.c+17−4
@@ -116,6 +116,16 @@ static struct syscore aplic_syscore = { · 115 unmodified lines
116116 .ops = &aplic_syscore_ops,
117117 };
118118
119+static bool aplic_syscore_registered __ro_after_init;
120+
121+static void aplic_syscore_init(void)
122+{
123+ if (!aplic_syscore_registered) {
124+ register_syscore(&aplic_syscore);
125+ aplic_syscore_registered = true;
126+ }
127+}
128+
119129 static int aplic_pm_notifier(struct notifier_block *nb, unsigned long action, void *data)
120130 {
121131 struct aplic_priv *priv = container_of(nb, struct aplic_priv, genpd_nb);
@@ -372,18 +382,21 @@ static int aplic_probe(struct platform_device *pdev) · 250 unmodified lines
372382 rc = aplic_msi_setup(dev, regs);
373383 else
374384 rc = aplic_direct_setup(dev, regs);
375− if (rc)
385+
386+ if (rc) {
376387 dev_err_probe(dev, rc, "failed to setup APLIC in %s mode\n",
377388 msi_mode ? "MSI" : "direct");
378− else
379− register_syscore(&aplic_syscore);
389+ return rc;
390+ }
391+
392+ aplic_syscore_init();
380393
381394 #ifdef CONFIG_ACPI
382395 if (!acpi_disabled)
383396 acpi_dev_clear_dependencies(ACPI_COMPANION(dev));
384397 #endif
385398
386− return rc;
399+ return 0;
387400 }
388401
389402 static const struct of_device_id aplic_match[] = {
drivers/misc/amd-sbi/Kconfig+1−2
@@ -1,10 +1,9 @@
11 # SPDX-License-Identifier: GPL-2.0-only
22 config AMD_SBRMI_I2C
33 tristate "AMD side band RMI support"
4− depends on I2C
4+ depends on I3C_OR_I2C
55 depends on ARM || ARM64 || COMPILE_TEST
66 select REGMAP_I2C
7− depends on I3C || !I3C
87 select REGMAP_I3C if I3C
98 help
109 Side band RMI over I2C/I3C support for AMD out of band management.
drivers/net/bonding/bond_debugfs.c+11−5
@@ -34,11 +34,17 @@ static int bond_debug_rlb_hash_show(struct seq_file *m, void *v) · 33 unmodified lines
3434 for (; hash_index != RLB_NULL_INDEX;
3535 hash_index = client_info->used_next) {
3636 client_info = &(bond_info->rx_hashtbl[hash_index]);
37− seq_printf(m, "%-15pI4 %-15pI4 %-17pM %s\n",
38− &client_info->ip_src,
39− &client_info->ip_dst,
40− &client_info->mac_dst,
41− client_info->slave->dev->name);
37+ if (client_info->slave)
38+ seq_printf(m, "%-15pI4 %-15pI4 %-17pM %s\n",
39+ &client_info->ip_src,
40+ &client_info->ip_dst,
41+ &client_info->mac_dst,
42+ client_info->slave->dev->name);
43+ else
44+ seq_printf(m, "%-15pI4 %-15pI4 %-17pM (none)\n",
45+ &client_info->ip_src,
46+ &client_info->ip_dst,
47+ &client_info->mac_dst);
4248 }
4349
4450 spin_unlock_bh(&bond->mode_lock);
drivers/net/bonding/bond_main.c+5−3
@@ -1530,9 +1530,11 @@ static int bond_header_create(struct sk_buff *skb, struct net_device *bond_dev, · 1529 unmodified lines
15301530 return ret;
15311531 }
15321532
1533−static int bond_header_parse(const struct sk_buff *skb, unsigned char *haddr)
1533+static int bond_header_parse(const struct sk_buff *skb,
1534+ const struct net_device *dev,
1535+ unsigned char *haddr)
15341536 {
1535− struct bonding *bond = netdev_priv(skb->dev);
1537+ struct bonding *bond = netdev_priv(dev);
15361538 const struct header_ops *slave_ops;
15371539 struct slave *slave;
15381540 int ret = 0;
@@ -1542,7 +1544,7 @@ static int bond_header_parse(const struct sk_buff *skb, unsigned char *haddr) · 3 unmodified lines
15421544 if (slave) {
15431545 slave_ops = READ_ONCE(slave->dev->header_ops);
15441546 if (slave_ops && slave_ops->parse)
1545− ret = slave_ops->parse(skb, haddr);
1547+ ret = slave_ops->parse(skb, slave->dev, haddr);
15461548 }
15471549 rcu_read_unlock();
15481550 return ret;
drivers/net/dsa/bcm_sf2.c+6−2
@@ -980,15 +980,19 @@ static int bcm_sf2_sw_resume(struct dsa_switch *ds) · 979 unmodified lines
980980 ret = bcm_sf2_sw_rst(priv);
981981 if (ret) {
982982 pr_err("%s: failed to software reset switch\n", __func__);
983+ if (!priv->wol_ports_mask)
984+ clk_disable_unprepare(priv->clk);
983985 return ret;
984986 }
985987
986988 bcm_sf2_crossbar_setup(priv);
987989
988990 ret = bcm_sf2_cfp_resume(ds);
989− if (ret)
991+ if (ret) {
992+ if (!priv->wol_ports_mask)
993+ clk_disable_unprepare(priv->clk);
990994 return ret;
991−
995+ }
992996 if (priv->hw_params.num_gphy == 1)
993997 bcm_sf2_gphy_enable_set(ds, true);
994998
drivers/net/ethernet/airoha/airoha_eth.c+0−1
@@ -3093,7 +3093,6 @@ static void airoha_remove(struct platform_device *pdev) · 3092 unmodified lines
30933093 if (!port)
30943094 continue;
30953095
3096− airoha_dev_stop(port->dev);
30973096 unregister_netdev(port->dev);
30983097 airoha_metadata_dst_free(port);
30993098 }
drivers/net/ethernet/broadcom/bnxt/bnxt.c+2−0
@@ -2929,6 +2929,8 @@ static int bnxt_async_event_process(struct bnxt *bp, · 2928 unmodified lines
29292929 u16 type = (u16)BNXT_EVENT_BUF_PRODUCER_TYPE(data1);
29302930 u32 offset = BNXT_EVENT_BUF_PRODUCER_OFFSET(data2);
29312931
2932+ if (type >= ARRAY_SIZE(bp->bs_trace))
2933+ goto async_event_process_exit;
29322934 bnxt_bs_trace_check_wrap(&bp->bs_trace[type], offset);
29332935 goto async_event_process_exit;
29342936 }
drivers/net/ethernet/broadcom/bnxt/bnxt.h+1−1
@@ -2146,7 +2146,7 @@ enum board_idx { · 2145 unmodified lines
21462146 };
21472147
21482148 #define BNXT_TRACE_BUF_MAGIC_BYTE ((u8)0xbc)
2149−#define BNXT_TRACE_MAX 11
2149+#define BNXT_TRACE_MAX (DBG_LOG_BUFFER_FLUSH_REQ_TYPE_ERR_QPC_TRACE + 1)
21502150
21512151 struct bnxt_bs_trace_info {
21522152 u8 *magic_byte;
drivers/net/ethernet/broadcom/genet/bcmgenet_wol.c+1−1
@@ -123,7 +123,7 @@ static int bcmgenet_poll_wol_status(struct bcmgenet_priv *priv) · 122 unmodified lines
123123 while (!(bcmgenet_rbuf_readl(priv, RBUF_STATUS)
124124 & RBUF_STATUS_WOL)) {
125125 retries++;
126− if (retries > 5) {
126+ if (retries > 50) {
127127 netdev_crit(dev, "polling wol mode timeout\n");
128128 return -ETIMEDOUT;
129129 }
drivers/net/ethernet/broadcom/tg3.c+11−0
@@ -17029,6 +17029,13 @@ static int tg3_get_invariants(struct tg3 *tp, const struct pci_device_id *ent) · 17028 unmodified lines
1702917029 return err;
1703017030 }
1703117031
17032+static int tg3_is_default_mac_address(u8 *addr)
17033+{
17034+ static const u8 default_mac_address[ETH_ALEN] = { 0x00, 0x10, 0x18, 0x00, 0x00, 0x00 };
17035+
17036+ return ether_addr_equal(default_mac_address, addr);
17037+}
17038+
1703217039 static int tg3_get_device_address(struct tg3 *tp, u8 *addr)
1703317040 {
1703417041 u32 hi, lo, mac_offset;
@@ -17102,6 +17109,10 @@ static int tg3_get_device_address(struct tg3 *tp, u8 *addr) · 67 unmodified lines
1710217109
1710317110 if (!is_valid_ether_addr(addr))
1710417111 return -EINVAL;
17112+
17113+ if (tg3_is_default_mac_address(addr))
17114+ return device_get_mac_address(&tp->pdev->dev, addr);
17115+
1710517116 return 0;
1710617117 }
1710717118
drivers/net/ethernet/cadence/macb_main.c+22−4
@@ -2812,6 +2812,14 @@ static void macb_init_tieoff(struct macb *bp) · 2811 unmodified lines
28122812 desc->ctrl = 0;
28132813 }
28142814
2815+static void gem_init_rx_ring(struct macb_queue *queue)
2816+{
2817+ queue->rx_tail = 0;
2818+ queue->rx_prepared_head = 0;
2819+
2820+ gem_rx_refill(queue);
2821+}
2822+
28152823 static void gem_init_rings(struct macb *bp)
28162824 {
28172825 struct macb_queue *queue;
@@ -2829,10 +2837,7 @@ static void gem_init_rings(struct macb *bp) · 11 unmodified lines
28292837 queue->tx_head = 0;
28302838 queue->tx_tail = 0;
28312839
2832− queue->rx_tail = 0;
2833− queue->rx_prepared_head = 0;
2834−
2835− gem_rx_refill(queue);
2840+ gem_init_rx_ring(queue);
28362841 }
28372842
28382843 macb_init_tieoff(bp);
@@ -4119,6 +4124,9 @@ static int gem_set_rxnfc(struct net_device *netdev, struct ethtool_rxnfc *cmd) · 1280 unmodified lines
41194124 struct macb *bp = netdev_priv(netdev);
41204125 int ret;
41214126
4127+ if (!(netdev->hw_features & NETIF_F_NTUPLE))
4128+ return -EOPNOTSUPP;
4129+
41224130 switch (cmd->cmd) {
41234131 case ETHTOOL_SRXCLSRLINS:
41244132 if ((cmd->fs.location >= bp->max_tuples)
@@ -6094,8 +6102,18 @@ static int __maybe_unused macb_resume(struct device *dev) · 1969 unmodified lines
60946102 rtnl_unlock();
60956103 }
60966104
6105+ if (!(bp->caps & MACB_CAPS_MACB_IS_EMAC))
6106+ macb_init_buffers(bp);
6107+
60976108 for (q = 0, queue = bp->queues; q < bp->num_queues;
60986109 ++q, ++queue) {
6110+ if (!(bp->caps & MACB_CAPS_MACB_IS_EMAC)) {
6111+ if (macb_is_gem(bp))
6112+ gem_init_rx_ring(queue);
6113+ else
6114+ macb_init_rx_ring(queue);
6115+ }
6116+
60996117 napi_enable(&queue->napi_rx);
61006118 napi_enable(&queue->napi_tx);
61016119 }
drivers/net/ethernet/cadence/macb_ptp.c+3−1
@@ -357,8 +357,10 @@ void gem_ptp_remove(struct net_device *ndev) · 356 unmodified lines
357357 {
358358 struct macb *bp = netdev_priv(ndev);
359359
360− if (bp->ptp_clock)
360+ if (bp->ptp_clock) {
361361 ptp_clock_unregister(bp->ptp_clock);
362+ bp->ptp_clock = NULL;
363+ }
362364
363365 gem_ptp_clear_timer(bp);
364366
drivers/net/ethernet/intel/iavf/iavf_main.c+6−3
@@ -757,10 +757,13 @@ iavf_vlan_filter *iavf_add_vlan(struct iavf_adapter *adapter, · 756 unmodified lines
757757 adapter->num_vlan_filters++;
758758 iavf_schedule_aq_request(adapter, IAVF_FLAG_AQ_ADD_VLAN_FILTER);
759759 } else if (f->state == IAVF_VLAN_REMOVE) {
760− /* IAVF_VLAN_REMOVE means that VLAN wasn't yet removed.
761− * We can safely only change the state here.
760+ /* Re-add the filter since we cannot tell whether the
761+ * pending delete has already been processed by the PF.
762+ * A duplicate add is harmless.
762763 */
763− f->state = IAVF_VLAN_ACTIVE;
764+ f->state = IAVF_VLAN_ADD;
765+ iavf_schedule_aq_request(adapter,
766+ IAVF_FLAG_AQ_ADD_VLAN_FILTER);
764767 }
765768
766769 clearout:
drivers/net/ethernet/intel/igc/igc.h+2−0
@@ -781,6 +781,8 @@ int igc_ptp_hwtstamp_set(struct net_device *netdev, · 780 unmodified lines
781781 struct kernel_hwtstamp_config *config,
782782 struct netlink_ext_ack *extack);
783783 void igc_ptp_tx_hang(struct igc_adapter *adapter);
784+void igc_ptp_clear_xsk_tx_tstamp_queue(struct igc_adapter *adapter,
785+ u16 queue_id);
784786 void igc_ptp_read(struct igc_adapter *adapter, struct timespec64 *ts);
785787 void igc_ptp_tx_tstamp_event(struct igc_adapter *adapter);
786788
drivers/net/ethernet/intel/igc/igc_main.c+9−5
@@ -264,6 +264,13 @@ static void igc_clean_tx_ring(struct igc_ring *tx_ring) · 263 unmodified lines
264264 /* reset next_to_use and next_to_clean */
265265 tx_ring->next_to_use = 0;
266266 tx_ring->next_to_clean = 0;
267+
268+ /* Clear any lingering XSK TX timestamp requests */
269+ if (test_bit(IGC_RING_FLAG_TX_HWTSTAMP, &tx_ring->flags)) {
270+ struct igc_adapter *adapter = netdev_priv(tx_ring->netdev);
271+
272+ igc_ptp_clear_xsk_tx_tstamp_queue(adapter, tx_ring->queue_index);
273+ }
267274 }
268275
269276 /**
@@ -1730,11 +1737,8 @@ static netdev_tx_t igc_xmit_frame(struct sk_buff *skb, · 1460 unmodified lines
17301737 /* The minimum packet size with TCTL.PSP set is 17 so pad the skb
17311738 * in order to meet this minimum size requirement.
17321739 */
1733− if (skb->len < 17) {
1734− if (skb_padto(skb, 17))
1735− return NETDEV_TX_OK;
1736− skb->len = 17;
1737− }
1740+ if (skb_put_padto(skb, 17))
1741+ return NETDEV_TX_OK;
17381742
17391743 return igc_xmit_frame_ring(skb, igc_tx_queue_mapping(adapter, skb));
17401744 }
drivers/net/ethernet/intel/igc/igc_ptp.c+33−0
@@ -577,6 +577,39 @@ static void igc_ptp_clear_tx_tstamp(struct igc_adapter *adapter) · 576 unmodified lines
577577 spin_unlock_irqrestore(&adapter->ptp_tx_lock, flags);
578578 }
579579
580+/**
581+ * igc_ptp_clear_xsk_tx_tstamp_queue - Clear pending XSK TX timestamps for a queue
582+ * @adapter: Board private structure
583+ * @queue_id: TX queue index to clear timestamps for
584+ *
585+ * Iterates over all TX timestamp registers and releases any pending
586+ * timestamp requests associated with the given TX queue. This is
587+ * called when an XDP pool is being disabled to ensure no stale
588+ * timestamp references remain.
589+ */
590+void igc_ptp_clear_xsk_tx_tstamp_queue(struct igc_adapter *adapter, u16 queue_id)
591+{
592+ unsigned long flags;
593+ int i;
594+
595+ spin_lock_irqsave(&adapter->ptp_tx_lock, flags);
596+
597+ for (i = 0; i < IGC_MAX_TX_TSTAMP_REGS; i++) {
598+ struct igc_tx_timestamp_request *tstamp = &adapter->tx_tstamp[i];
599+
600+ if (tstamp->buffer_type != IGC_TX_BUFFER_TYPE_XSK)
601+ continue;
602+ if (tstamp->xsk_queue_index != queue_id)
603+ continue;
604+ if (!tstamp->xsk_tx_buffer)
605+ continue;
606+
607+ igc_ptp_free_tx_buffer(adapter, tstamp);
608+ }
609+
610+ spin_unlock_irqrestore(&adapter->ptp_tx_lock, flags);
611+}
612+
580613 static void igc_ptp_disable_tx_timestamp(struct igc_adapter *adapter)
581614 {
582615 struct igc_hw *hw = &adapter->hw;
drivers/net/ethernet/intel/libie/fwlog.c+36−13
@@ -433,17 +433,21 @@ libie_debugfs_module_write(struct file *filp, const char __user *buf, · 432 unmodified lines
433433 module = libie_find_module_by_dentry(fwlog->debugfs_modules, dentry);
434434 if (module < 0) {
435435 dev_info(dev, "unknown module\n");
436− return -EINVAL;
436+ count = -EINVAL;
437+ goto free_cmd_buf;
437438 }
438439
439440 cnt = sscanf(cmd_buf, "%s", user_val);
440− if (cnt != 1)
441− return -EINVAL;
441+ if (cnt != 1) {
442+ count = -EINVAL;
443+ goto free_cmd_buf;
444+ }
442445
443446 log_level = sysfs_match_string(libie_fwlog_level_string, user_val);
444447 if (log_level < 0) {
445448 dev_info(dev, "unknown log level '%s'\n", user_val);
446− return -EINVAL;
449+ count = -EINVAL;
450+ goto free_cmd_buf;
447451 }
448452
449453 if (module != LIBIE_AQC_FW_LOG_ID_MAX) {
@@ -458,6 +462,9 @@ libie_debugfs_module_write(struct file *filp, const char __user *buf, · 8 unmodified lines
458462 fwlog->cfg.module_entries[i].log_level = log_level;
459463 }
460464
465+free_cmd_buf:
466+ kfree(cmd_buf);
467+
461468 return count;
462469 }
463470
@@ -515,23 +522,31 @@ libie_debugfs_nr_messages_write(struct file *filp, const char __user *buf, · 51 unmodified lines
515522 return PTR_ERR(cmd_buf);
516523
517524 ret = sscanf(cmd_buf, "%s", user_val);
518− if (ret != 1)
519− return -EINVAL;
525+ if (ret != 1) {
526+ count = -EINVAL;
527+ goto free_cmd_buf;
528+ }
520529
521530 ret = kstrtos16(user_val, 0, &nr_messages);
522− if (ret)
523− return ret;
531+ if (ret) {
532+ count = ret;
533+ goto free_cmd_buf;
534+ }
524535
525536 if (nr_messages < LIBIE_AQC_FW_LOG_MIN_RESOLUTION ||
526537 nr_messages > LIBIE_AQC_FW_LOG_MAX_RESOLUTION) {
527538 dev_err(dev, "Invalid FW log number of messages %d, value must be between %d - %d\n",
528539 nr_messages, LIBIE_AQC_FW_LOG_MIN_RESOLUTION,
529540 LIBIE_AQC_FW_LOG_MAX_RESOLUTION);
530− return -EINVAL;
541+ count = -EINVAL;
542+ goto free_cmd_buf;
531543 }
532544
533545 fwlog->cfg.log_resolution = nr_messages;
534546
547+free_cmd_buf:
548+ kfree(cmd_buf);
549+
535550 return count;
536551 }
537552
@@ -588,8 +603,10 @@ libie_debugfs_enable_write(struct file *filp, const char __user *buf, · 50 unmodified lines
588603 return PTR_ERR(cmd_buf);
589604
590605 ret = sscanf(cmd_buf, "%s", user_val);
591− if (ret != 1)
592− return -EINVAL;
606+ if (ret != 1) {
607+ ret = -EINVAL;
608+ goto free_cmd_buf;
609+ }
593610
594611 ret = kstrtobool(user_val, &enable);
595612 if (ret)
@@ -624,6 +641,8 @@ enable_write_error: · 28 unmodified lines
624641 */
625642 if (WARN_ON(ret != (ssize_t)count && ret >= 0))
626643 ret = -EIO;
644+free_cmd_buf:
645+ kfree(cmd_buf);
627646
628647 return ret;
629648 }
@@ -682,8 +701,10 @@ libie_debugfs_log_size_write(struct file *filp, const char __user *buf, · 52 unmodified lines
682701 return PTR_ERR(cmd_buf);
683702
684703 ret = sscanf(cmd_buf, "%s", user_val);
685− if (ret != 1)
686− return -EINVAL;
704+ if (ret != 1) {
705+ ret = -EINVAL;
706+ goto free_cmd_buf;
707+ }
687708
688709 index = sysfs_match_string(libie_fwlog_log_size, user_val);
689710 if (index < 0) {
@@ -712,6 +733,8 @@ log_size_write_error: · 22 unmodified lines
712733 */
713734 if (WARN_ON(ret != (ssize_t)count && ret >= 0))
714735 ret = -EIO;
736+free_cmd_buf:
737+ kfree(cmd_buf);
715738
716739 return ret;
717740 }
drivers/net/ethernet/marvell/mvpp2/mvpp2_main.c+2−2
@@ -5016,7 +5016,7 @@ static int mvpp2_bm_switch_buffers(struct mvpp2 *priv, bool percpu) · 5015 unmodified lines
50165016 if (priv->percpu_pools)
50175017 numbufs = port->nrxqs * 2;
50185018
5019− if (change_percpu)
5019+ if (change_percpu && priv->global_tx_fc)
50205020 mvpp2_bm_pool_update_priv_fc(priv, false);
50215021
50225022 for (i = 0; i < numbufs; i++)
@@ -5041,7 +5041,7 @@ static int mvpp2_bm_switch_buffers(struct mvpp2 *priv, bool percpu) · 18 unmodified lines
50415041 mvpp2_open(port->dev);
50425042 }
50435043
5044− if (change_percpu)
5044+ if (change_percpu && priv->global_tx_fc)
50455045 mvpp2_bm_pool_update_priv_fc(priv, true);
50465046
50475047 return 0;
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec.h+1−0
@@ -287,6 +287,7 @@ struct mlx5e_ipsec_sa_entry { · 286 unmodified lines
287287 struct mlx5e_ipsec_dwork *dwork;
288288 struct mlx5e_ipsec_limits limits;
289289 u32 rx_mapped_id;
290+ u8 ctx[MLX5_ST_SZ_BYTES(ipsec_aso)];
290291 };
291292
292293 struct mlx5_accel_pol_xfrm_attrs {
drivers/net/ethernet/mellanox/mlx5/core/en_accel/ipsec_offload.c+22−28
@@ -310,10 +310,11 @@ static void mlx5e_ipsec_aso_update(struct mlx5e_ipsec_sa_entry *sa_entry, · 309 unmodified lines
310310 mlx5e_ipsec_aso_query(sa_entry, data);
311311 }
312312
313−static void mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
314− u32 mode_param)
313+static void
314+mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry,
315+ u32 mode_param,
316+ struct mlx5_accel_esp_xfrm_attrs *attrs)
315317 {
316− struct mlx5_accel_esp_xfrm_attrs attrs = {};
317318 struct mlx5_wqe_aso_ctrl_seg data = {};
318319
319320 if (mode_param < MLX5E_IPSEC_ESN_SCOPE_MID) {
@@ -323,18 +324,7 @@ static void mlx5e_ipsec_update_esn_state(struct mlx5e_ipsec_sa_entry *sa_entry, · 3 unmodified lines
323324 sa_entry->esn_state.overlap = 1;
324325 }
325326
326− mlx5e_ipsec_build_accel_xfrm_attrs(sa_entry, &attrs);
327−
328− /* It is safe to execute the modify below unlocked since the only flows
329− * that could affect this HW object, are create, destroy and this work.
330− *
331− * Creation flow can't co-exist with this modify work, the destruction
332− * flow would cancel this work, and this work is a single entity that
333− * can't conflict with it self.
334− */
335− spin_unlock_bh(&sa_entry->x->lock);
336− mlx5_accel_esp_modify_xfrm(sa_entry, &attrs);
337− spin_lock_bh(&sa_entry->x->lock);
327+ mlx5e_ipsec_build_accel_xfrm_attrs(sa_entry, attrs);
338328
339329 data.data_offset_condition_operand =
340330 MLX5_IPSEC_ASO_REMOVE_FLOW_PKT_CNT_OFFSET;
@@ -370,20 +360,18 @@ static void mlx5e_ipsec_aso_update_soft(struct mlx5e_ipsec_sa_entry *sa_entry, · 29 unmodified lines
370360 static void mlx5e_ipsec_handle_limits(struct mlx5e_ipsec_sa_entry *sa_entry)
371361 {
372362 struct mlx5_accel_esp_xfrm_attrs *attrs = &sa_entry->attrs;
373− struct mlx5e_ipsec *ipsec = sa_entry->ipsec;
374− struct mlx5e_ipsec_aso *aso = ipsec->aso;
375363 bool soft_arm, hard_arm;
376364 u64 hard_cnt;
377365
378366 lockdep_assert_held(&sa_entry->x->lock);
379367
380− soft_arm = !MLX5_GET(ipsec_aso, aso->ctx, soft_lft_arm);
381− hard_arm = !MLX5_GET(ipsec_aso, aso->ctx, hard_lft_arm);
368+ soft_arm = !MLX5_GET(ipsec_aso, sa_entry->ctx, soft_lft_arm);
369+ hard_arm = !MLX5_GET(ipsec_aso, sa_entry->ctx, hard_lft_arm);
382370 if (!soft_arm && !hard_arm)
383371 /* It is not lifetime event */
384372 return;
385373
386− hard_cnt = MLX5_GET(ipsec_aso, aso->ctx, remove_flow_pkt_cnt);
374+ hard_cnt = MLX5_GET(ipsec_aso, sa_entry->ctx, remove_flow_pkt_cnt);
387375 if (!hard_cnt || hard_arm) {
388376 /* It is possible to see packet counter equal to zero without
389377 * hard limit event armed. Such situation can be if packet
@@ -453,11 +441,11 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work) · 63 unmodified lines
453441 struct mlx5e_ipsec_work *work =
454442 container_of(_work, struct mlx5e_ipsec_work, work);
455443 struct mlx5e_ipsec_sa_entry *sa_entry = work->data;
444+ struct mlx5_accel_esp_xfrm_attrs tmp = {};
456445 struct mlx5_accel_esp_xfrm_attrs *attrs;
457− struct mlx5e_ipsec_aso *aso;
446+ bool need_modify = false;
458447 int ret;
459448
460− aso = sa_entry->ipsec->aso;
461449 attrs = &sa_entry->attrs;
462450
463451 spin_lock_bh(&sa_entry->x->lock);
@@ -465,18 +453,22 @@ static void mlx5e_ipsec_handle_event(struct work_struct *_work) · 1 unmodified line
465453 if (ret)
466454 goto unlock;
467455
456+ if (attrs->lft.soft_packet_limit != XFRM_INF)
457+ mlx5e_ipsec_handle_limits(sa_entry);
458+
468459 if (attrs->replay_esn.trigger &&
469− !MLX5_GET(ipsec_aso, aso->ctx, esn_event_arm)) {
470− u32 mode_param = MLX5_GET(ipsec_aso, aso->ctx, mode_parameter);
460+ !MLX5_GET(ipsec_aso, sa_entry->ctx, esn_event_arm)) {
461+ u32 mode_param = MLX5_GET(ipsec_aso, sa_entry->ctx,
462+ mode_parameter);
471463
472− mlx5e_ipsec_update_esn_state(sa_entry, mode_param);
464+ mlx5e_ipsec_update_esn_state(sa_entry, mode_param, &tmp);
465+ need_modify = true;
473466 }
474467
475− if (attrs->lft.soft_packet_limit != XFRM_INF)
476− mlx5e_ipsec_handle_limits(sa_entry);
477−
478468 unlock:
479469 spin_unlock_bh(&sa_entry->x->lock);
470+ if (need_modify)
471+ mlx5_accel_esp_modify_xfrm(sa_entry, &tmp);
480472 kfree(work);
481473 }
482474
@@ -629,6 +621,8 @@ int mlx5e_ipsec_aso_query(struct mlx5e_ipsec_sa_entry *sa_entry, · 146 unmodified lines
629621 /* We are in atomic context */
630622 udelay(10);
631623 } while (ret && time_is_after_jiffies(expires));
624+ if (!ret)
625+ memcpy(sa_entry->ctx, aso->ctx, MLX5_ST_SZ_BYTES(ipsec_aso));
632626 spin_unlock_bh(&aso->lock);
633627 return ret;
634628 }
drivers/net/ethernet/mellanox/mlx5/core/esw/qos.c+9−14
@@ -1489,24 +1489,24 @@ out: · 1488 unmodified lines
14891489 return err;
14901490 }
14911491
1492−static u32 mlx5_esw_qos_lag_link_speed_get_locked(struct mlx5_core_dev *mdev)
1492+static u32 mlx5_esw_qos_lag_link_speed_get(struct mlx5_core_dev *mdev,
1493+ bool take_rtnl)
14931494 {
14941495 struct ethtool_link_ksettings lksettings;
14951496 struct net_device *slave, *master;
14961497 u32 speed = SPEED_UNKNOWN;
14971498
1498− /* Lock ensures a stable reference to master and slave netdevice
1499− * while port speed of master is queried.
1500− */
1501− ASSERT_RTNL();
1502−
15031499 slave = mlx5_uplink_netdev_get(mdev);
15041500 if (!slave)
15051501 goto out;
15061502
1503+ if (take_rtnl)
1504+ rtnl_lock();
15071505 master = netdev_master_upper_dev_get(slave);
15081506 if (master && !__ethtool_get_link_ksettings(master, &lksettings))
15091507 speed = lksettings.base.speed;
1508+ if (take_rtnl)
1509+ rtnl_unlock();
15101510
15111511 out:
15121512 mlx5_uplink_netdev_put(mdev, slave);
@@ -1514,20 +1514,15 @@ out: · 1 unmodified line
15141514 }
15151515
15161516 static int mlx5_esw_qos_max_link_speed_get(struct mlx5_core_dev *mdev, u32 *link_speed_max,
1517− bool hold_rtnl_lock, struct netlink_ext_ack *extack)
1517+ bool take_rtnl,
1518+ struct netlink_ext_ack *extack)
15181519 {
15191520 int err;
15201521
15211522 if (!mlx5_lag_is_active(mdev))
15221523 goto skip_lag;
15231524
1524− if (hold_rtnl_lock)
1525− rtnl_lock();
1526−
1527− *link_speed_max = mlx5_esw_qos_lag_link_speed_get_locked(mdev);
1528−
1529− if (hold_rtnl_lock)
1530− rtnl_unlock();
1525+ *link_speed_max = mlx5_esw_qos_lag_link_speed_get(mdev, take_rtnl);
15311526
15321527 if (*link_speed_max != (u32)SPEED_UNKNOWN)
15331528 return 0;
drivers/net/ethernet/microsoft/mana/hw_channel.c+3−3
@@ -814,9 +814,6 @@ void mana_hwc_destroy_channel(struct gdma_context *gc) · 813 unmodified lines
814814 gc->max_num_cqs = 0;
815815 }
816816
817− kfree(hwc->caller_ctx);
818− hwc->caller_ctx = NULL;
819−
820817 if (hwc->txq)
821818 mana_hwc_destroy_wq(hwc, hwc->txq);
822819
@@ -826,6 +823,9 @@ void mana_hwc_destroy_channel(struct gdma_context *gc) · 3 unmodified lines
826823 if (hwc->cq)
827824 mana_hwc_destroy_cq(hwc->gdma_dev->gdma_context, hwc->cq);
828825
826+ kfree(hwc->caller_ctx);
827+ hwc->caller_ctx = NULL;
828+
829829 mana_gd_free_res_map(&hwc->inflight_msg_res);
830830
831831 hwc->num_inflight_msg = 0;
drivers/net/ethernet/ti/icssg/icssg_common.c+5−0
@@ -1075,6 +1075,11 @@ static int emac_rx_packet(struct prueth_emac *emac, u32 flow_id, u32 *xdp_state) · 1074 unmodified lines
10751075 xdp_prepare_buff(&xdp, pa, PRUETH_HEADROOM, pkt_len, false);
10761076
10771077 *xdp_state = emac_run_xdp(emac, &xdp, &pkt_len);
1078+ if (*xdp_state == ICSSG_XDP_CONSUMED) {
1079+ page_pool_recycle_direct(pool, page);
1080+ goto requeue;
1081+ }
1082+
10781083 if (*xdp_state != ICSSG_XDP_PASS)
10791084 goto requeue;
10801085 headroom = xdp.data - xdp.data_hard_start;
drivers/net/netdevsim/netdev.c+4−1
@@ -109,8 +109,11 @@ static int nsim_forward_skb(struct net_device *tx_dev, · 108 unmodified lines
109109 int ret;
110110
111111 ret = __dev_forward_skb(rx_dev, skb);
112− if (ret)
112+ if (ret) {
113+ if (psp_ext)
114+ __skb_ext_put(psp_ext);
113115 return ret;
116+ }
114117
115118 nsim_psp_handle_ext(skb, psp_ext);
116119
drivers/net/usb/aqc111.c+6−6
@@ -1395,14 +1395,14 @@ static int aqc111_suspend(struct usb_interface *intf, pm_message_t message) · 1394 unmodified lines
13951395 aqc111_write16_cmd_nopm(dev, AQ_ACCESS_MAC,
13961396 SFR_MEDIUM_STATUS_MODE, 2, &reg16);
13971397
1398− aqc111_write_cmd(dev, AQ_WOL_CFG, 0, 0,
1399− WOL_CFG_SIZE, &wol_cfg);
1400− aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
1401− &aqc111_data->phy_cfg);
1398+ aqc111_write_cmd_nopm(dev, AQ_WOL_CFG, 0, 0,
1399+ WOL_CFG_SIZE, &wol_cfg);
1400+ aqc111_write32_cmd_nopm(dev, AQ_PHY_OPS, 0, 0,
1401+ &aqc111_data->phy_cfg);
14021402 } else {
14031403 aqc111_data->phy_cfg |= AQ_LOW_POWER;
1404− aqc111_write32_cmd(dev, AQ_PHY_OPS, 0, 0,
1405− &aqc111_data->phy_cfg);
1404+ aqc111_write32_cmd_nopm(dev, AQ_PHY_OPS, 0, 0,
1405+ &aqc111_data->phy_cfg);
14061406
14071407 /* Disable RX path */
14081408 aqc111_read16_cmd_nopm(dev, AQ_ACCESS_MAC,
drivers/net/usb/cdc_ncm.c+6−4
@@ -1656,6 +1656,7 @@ int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset) · 1655 unmodified lines
16561656 struct usbnet *dev = netdev_priv(skb_in->dev);
16571657 struct usb_cdc_ncm_ndp16 *ndp16;
16581658 int ret = -EINVAL;
1659+ size_t ndp_len;
16591660
16601661 if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp16)) > skb_in->len) {
16611662 netif_dbg(dev, rx_err, dev->net, "invalid NDP offset <%u>\n",
@@ -1675,8 +1676,8 @@ int cdc_ncm_rx_verify_ndp16(struct sk_buff *skb_in, int ndpoffset) · 13 unmodified lines
16751676 sizeof(struct usb_cdc_ncm_dpe16));
16761677 ret--; /* we process NDP entries except for the last one */
16771678
1678− if ((sizeof(struct usb_cdc_ncm_ndp16) +
1679− ret * (sizeof(struct usb_cdc_ncm_dpe16))) > skb_in->len) {
1679+ ndp_len = struct_size_t(struct usb_cdc_ncm_ndp16, dpe16, ret);
1680+ if (ndpoffset + ndp_len > skb_in->len) {
16801681 netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
16811682 ret = -EINVAL;
16821683 }
@@ -1692,6 +1693,7 @@ int cdc_ncm_rx_verify_ndp32(struct sk_buff *skb_in, int ndpoffset) · 9 unmodified lines
16921693 struct usbnet *dev = netdev_priv(skb_in->dev);
16931694 struct usb_cdc_ncm_ndp32 *ndp32;
16941695 int ret = -EINVAL;
1696+ size_t ndp_len;
16951697
16961698 if ((ndpoffset + sizeof(struct usb_cdc_ncm_ndp32)) > skb_in->len) {
16971699 netif_dbg(dev, rx_err, dev->net, "invalid NDP offset <%u>\n",
@@ -1711,8 +1713,8 @@ int cdc_ncm_rx_verify_ndp32(struct sk_buff *skb_in, int ndpoffset) · 13 unmodified lines
17111713 sizeof(struct usb_cdc_ncm_dpe32));
17121714 ret--; /* we process NDP entries except for the last one */
17131715
1714− if ((sizeof(struct usb_cdc_ncm_ndp32) +
1715− ret * (sizeof(struct usb_cdc_ncm_dpe32))) > skb_in->len) {
1716+ ndp_len = struct_size_t(struct usb_cdc_ncm_ndp32, dpe32, ret);
1717+ if (ndpoffset + ndp_len > skb_in->len) {
17161718 netif_dbg(dev, rx_err, dev->net, "Invalid nframes = %d\n", ret);
17171719 ret = -EINVAL;
17181720 }
drivers/net/wireless/ath/ath9k/channel.c+2−4
@@ -1006,7 +1006,7 @@ static void ath_scan_send_probe(struct ath_softc *sc, · 1005 unmodified lines
10061006 skb_set_queue_mapping(skb, IEEE80211_AC_VO);
10071007
10081008 if (!ieee80211_tx_prepare_skb(sc->hw, vif, skb, band, NULL))
1009− goto error;
1009+ return;
10101010
10111011 txctl.txq = sc->tx.txq_map[IEEE80211_AC_VO];
10121012 if (ath_tx_start(sc->hw, skb, &txctl))
@@ -1119,10 +1119,8 @@ ath_chanctx_send_vif_ps_frame(struct ath_softc *sc, struct ath_vif *avp, · 106 unmodified lines
11191119
11201120 skb->priority = 7;
11211121 skb_set_queue_mapping(skb, IEEE80211_AC_VO);
1122− if (!ieee80211_tx_prepare_skb(sc->hw, vif, skb, band, &sta)) {
1123− dev_kfree_skb_any(skb);
1122+ if (!ieee80211_tx_prepare_skb(sc->hw, vif, skb, band, &sta))
11241123 return false;
1125− }
11261124 break;
11271125 default:
11281126 return false;
drivers/net/wireless/mediatek/mt76/scan.c+1−3
@@ -63,10 +63,8 @@ mt76_scan_send_probe(struct mt76_dev *dev, struct cfg80211_ssid *ssid) · 62 unmodified lines
6363
6464 rcu_read_lock();
6565
66− if (!ieee80211_tx_prepare_skb(phy->hw, vif, skb, band, NULL)) {
67− ieee80211_free_txskb(phy->hw, skb);
66+ if (!ieee80211_tx_prepare_skb(phy->hw, vif, skb, band, NULL))
6867 goto out;
69− }
7068
7169 info = IEEE80211_SKB_CB(skb);
7270 if (req->no_cck)
drivers/net/wireless/ti/wlcore/tx.c+1−1
@@ -210,7 +210,7 @@ static int wl1271_tx_allocate(struct wl1271 *wl, struct wl12xx_vif *wlvif, · 209 unmodified lines
210210 if (skb_headroom(skb) < (total_len - skb->len) &&
211211 pskb_expand_head(skb, (total_len - skb->len), 0, GFP_ATOMIC)) {
212212 wl1271_free_tx_id(wl, id);
213− return -EAGAIN;
213+ return -ENOMEM;
214214 }
215215 desc = skb_push(skb, total_len - skb->len);
216216
drivers/net/wireless/virtual/mac80211_hwsim.c+1−2
@@ -3157,7 +3157,6 @@ static void hw_scan_work(struct work_struct *work) · 3156 unmodified lines
31573157 hwsim->tmp_chan->band,
31583158 NULL)) {
31593159 rcu_read_unlock();
3160− kfree_skb(probe);
31613160 continue;
31623161 }
31633162
@@ -6677,7 +6676,7 @@ static int hwsim_new_radio_nl(struct sk_buff *msg, struct genl_info *info) · 3513 unmodified lines
66776676 if (info->attrs[HWSIM_ATTR_PMSR_SUPPORT]) {
66786677 struct cfg80211_pmsr_capabilities *pmsr_capa;
66796678
6680− pmsr_capa = kmalloc_obj(*pmsr_capa);
6679+ pmsr_capa = kzalloc_obj(*pmsr_capa);
66816680 if (!pmsr_capa) {
66826681 ret = -ENOMEM;
66836682 goto out_free;
drivers/nfc/nxp-nci/i2c.c+2−2
@@ -47,8 +47,8 @@ static int nxp_nci_i2c_set_mode(void *phy_id, · 46 unmodified lines
4747 {
4848 struct nxp_nci_i2c_phy *phy = (struct nxp_nci_i2c_phy *) phy_id;
4949
50− gpiod_set_value(phy->gpiod_fw, (mode == NXP_NCI_MODE_FW) ? 1 : 0);
51− gpiod_set_value(phy->gpiod_en, (mode != NXP_NCI_MODE_COLD) ? 1 : 0);
50+ gpiod_set_value_cansleep(phy->gpiod_fw, (mode == NXP_NCI_MODE_FW) ? 1 : 0);
51+ gpiod_set_value_cansleep(phy->gpiod_en, (mode != NXP_NCI_MODE_COLD) ? 1 : 0);
5252 usleep_range(10000, 15000);
5353
5454 if (mode == NXP_NCI_MODE_COLD)
drivers/nvdimm/bus.c+3−2
@@ -486,14 +486,15 @@ EXPORT_SYMBOL_GPL(nd_synchronize); · 485 unmodified lines
486486 static void nd_async_device_register(void *d, async_cookie_t cookie)
487487 {
488488 struct device *dev = d;
489+ struct device *parent = dev->parent;
489490
490491 if (device_add(dev) != 0) {
491492 dev_err(dev, "%s: failed\n", __func__);
492493 put_device(dev);
493494 }
494495 put_device(dev);
495− if (dev->parent)
496− put_device(dev->parent);
496+ if (parent)
497+ put_device(parent);
497498 }
498499
499500 static void nd_async_device_unregister(void *d, async_cookie_t cookie)
drivers/nvme/host/core.c+1−2
@@ -4834,7 +4834,6 @@ EXPORT_SYMBOL_GPL(nvme_complete_async_event); · 4833 unmodified lines
48344834 int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set,
48354835 const struct blk_mq_ops *ops, unsigned int cmd_size)
48364836 {
4837− struct queue_limits lim = {};
48384837 int ret;
48394838
48404839 memset(set, 0, sizeof(*set));
@@ -4861,7 +4860,7 @@ int nvme_alloc_admin_tag_set(struct nvme_ctrl *ctrl, struct blk_mq_tag_set *set, · 20 unmodified lines
48614860 if (ctrl->admin_q)
48624861 blk_put_queue(ctrl->admin_q);
48634862
4864− ctrl->admin_q = blk_mq_alloc_queue(set, &lim, NULL);
4863+ ctrl->admin_q = blk_mq_alloc_queue(set, NULL, NULL);
48654864 if (IS_ERR(ctrl->admin_q)) {
48664865 ret = PTR_ERR(ctrl->admin_q);
48674866 goto out_free_tagset;
drivers/nvme/host/pci.c+5−3
@@ -544,7 +544,7 @@ static void nvme_dbbuf_set(struct nvme_dev *dev) · 543 unmodified lines
544544 /* Free memory and continue on */
545545 nvme_dbbuf_dma_free(dev);
546546
547− for (i = 1; i <= dev->online_queues; i++)
547+ for (i = 1; i < dev->online_queues; i++)
548548 nvme_dbbuf_free(&dev->queues[i]);
549549 }
550550 }
@@ -1625,14 +1625,16 @@ static irqreturn_t nvme_irq_check(int irq, void *data) · 1074 unmodified lines
16251625 static void nvme_poll_irqdisable(struct nvme_queue *nvmeq)
16261626 {
16271627 struct pci_dev *pdev = to_pci_dev(nvmeq->dev->dev);
1628+ int irq;
16281629
16291630 WARN_ON_ONCE(test_bit(NVMEQ_POLLED, &nvmeq->flags));
16301631
1631− disable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
1632+ irq = pci_irq_vector(pdev, nvmeq->cq_vector);
1633+ disable_irq(irq);
16321634 spin_lock(&nvmeq->cq_poll_lock);
16331635 nvme_poll_cq(nvmeq, NULL);
16341636 spin_unlock(&nvmeq->cq_poll_lock);
1635− enable_irq(pci_irq_vector(pdev, nvmeq->cq_vector));
1637+ enable_irq(irq);
16361638 }
16371639
16381640 static int nvme_poll(struct blk_mq_hw_ctx *hctx, struct io_comp_batch *iob)
drivers/nvme/target/admin-cmd.c+1−1
@@ -1585,7 +1585,7 @@ void nvmet_execute_async_event(struct nvmet_req *req) · 1584 unmodified lines
15851585 ctrl->async_event_cmds[ctrl->nr_async_event_cmds++] = req;
15861586 mutex_unlock(&ctrl->lock);
15871587
1588− queue_work(nvmet_wq, &ctrl->async_event_work);
1588+ queue_work(nvmet_aen_wq, &ctrl->async_event_work);
15891589 }
15901590
15911591 void nvmet_execute_keep_alive(struct nvmet_req *req)
drivers/nvme/target/core.c+12−2
@@ -27,6 +27,8 @@ static DEFINE_IDA(cntlid_ida); · 26 unmodified lines
2727
2828 struct workqueue_struct *nvmet_wq;
2929 EXPORT_SYMBOL_GPL(nvmet_wq);
30+struct workqueue_struct *nvmet_aen_wq;
31+EXPORT_SYMBOL_GPL(nvmet_aen_wq);
3032
3133 /*
3234 * This read/write semaphore is used to synchronize access to configuration
@@ -206,7 +208,7 @@ void nvmet_add_async_event(struct nvmet_ctrl *ctrl, u8 event_type, · 173 unmodified lines
206208 list_add_tail(&aen->entry, &ctrl->async_events);
207209 mutex_unlock(&ctrl->lock);
208210
209− queue_work(nvmet_wq, &ctrl->async_event_work);
211+ queue_work(nvmet_aen_wq, &ctrl->async_event_work);
210212 }
211213
212214 static void nvmet_add_to_changed_ns_log(struct nvmet_ctrl *ctrl, __le32 nsid)
@@ -1956,9 +1958,14 @@ static int __init nvmet_init(void) · 1743 unmodified lines
19561958 if (!nvmet_wq)
19571959 goto out_free_buffered_work_queue;
19581960
1961+ nvmet_aen_wq = alloc_workqueue("nvmet-aen-wq",
1962+ WQ_MEM_RECLAIM | WQ_UNBOUND, 0);
1963+ if (!nvmet_aen_wq)
1964+ goto out_free_nvmet_work_queue;
1965+
19591966 error = nvmet_init_debugfs();
19601967 if (error)
1961− goto out_free_nvmet_work_queue;
1968+ goto out_free_nvmet_aen_work_queue;
19621969
19631970 error = nvmet_init_discovery();
19641971 if (error)
@@ -1974,6 +1981,8 @@ out_exit_discovery: · 9 unmodified lines
19741981 nvmet_exit_discovery();
19751982 out_exit_debugfs:
19761983 nvmet_exit_debugfs();
1984+out_free_nvmet_aen_work_queue:
1985+ destroy_workqueue(nvmet_aen_wq);
19771986 out_free_nvmet_work_queue:
19781987 destroy_workqueue(nvmet_wq);
19791988 out_free_buffered_work_queue:
@@ -1991,6 +2000,7 @@ static void __exit nvmet_exit(void) · 11 unmodified lines
19912000 nvmet_exit_discovery();
19922001 nvmet_exit_debugfs();
19932002 ida_destroy(&cntlid_ida);
2003+ destroy_workqueue(nvmet_aen_wq);
19942004 destroy_workqueue(nvmet_wq);
19952005 destroy_workqueue(buffered_io_wq);
19962006 destroy_workqueue(zbd_wq);
drivers/nvme/target/nvmet.h+1−0
@@ -501,6 +501,7 @@ extern struct kmem_cache *nvmet_bvec_cache; · 500 unmodified lines
501501 extern struct workqueue_struct *buffered_io_wq;
502502 extern struct workqueue_struct *zbd_wq;
503503 extern struct workqueue_struct *nvmet_wq;
504+extern struct workqueue_struct *nvmet_aen_wq;
504505
505506 static inline void nvmet_set_result(struct nvmet_req *req, u32 result)
506507 {
drivers/nvme/target/rdma.c+1−0
@@ -2087,6 +2087,7 @@ static void nvmet_rdma_remove_one(struct ib_device *ib_device, void *client_data · 2086 unmodified lines
20872087 mutex_unlock(&nvmet_rdma_queue_mutex);
20882088
20892089 flush_workqueue(nvmet_wq);
2090+ flush_workqueue(nvmet_aen_wq);
20902091 }
20912092
20922093 static struct ib_client nvmet_rdma_ib_client = {
drivers/power/sequencing/pwrseq-pcie-m2.c+1−1
@@ -109,7 +109,7 @@ static int pwrseq_pcie_m2_probe(struct platform_device *pdev) · 108 unmodified lines
109109 if (!ctx)
110110 return -ENOMEM;
111111
112− ctx->of_node = of_node_get(dev->of_node);
112+ ctx->of_node = dev_of_node(dev);
113113 ctx->pdata = device_get_match_data(dev);
114114 if (!ctx->pdata)
115115 return dev_err_probe(dev, -ENODEV,
drivers/regulator/pca9450-regulator.c+10−4
@@ -1293,6 +1293,7 @@ static int pca9450_i2c_probe(struct i2c_client *i2c) · 1292 unmodified lines
12931293 struct regulator_dev *ldo5;
12941294 struct pca9450 *pca9450;
12951295 unsigned int device_id, i;
1296+ const char *type_name;
12961297 int ret;
12971298
12981299 pca9450 = devm_kzalloc(&i2c->dev, sizeof(struct pca9450), GFP_KERNEL);
@@ -1303,15 +1304,22 @@ static int pca9450_i2c_probe(struct i2c_client *i2c) · 4 unmodified lines
13031304 case PCA9450_TYPE_PCA9450A:
13041305 regulator_desc = pca9450a_regulators;
13051306 pca9450->rcnt = ARRAY_SIZE(pca9450a_regulators);
1307+ type_name = "pca9450a";
13061308 break;
13071309 case PCA9450_TYPE_PCA9450BC:
13081310 regulator_desc = pca9450bc_regulators;
13091311 pca9450->rcnt = ARRAY_SIZE(pca9450bc_regulators);
1312+ type_name = "pca9450bc";
13101313 break;
13111314 case PCA9450_TYPE_PCA9451A:
1315+ regulator_desc = pca9451a_regulators;
1316+ pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators);
1317+ type_name = "pca9451a";
1318+ break;
13121319 case PCA9450_TYPE_PCA9452:
13131320 regulator_desc = pca9451a_regulators;
13141321 pca9450->rcnt = ARRAY_SIZE(pca9451a_regulators);
1322+ type_name = "pca9452";
13151323 break;
13161324 default:
13171325 dev_err(&i2c->dev, "Unknown device type");
@@ -1369,7 +1377,7 @@ static int pca9450_i2c_probe(struct i2c_client *i2c) · 51 unmodified lines
13691377 if (pca9450->irq) {
13701378 ret = devm_request_threaded_irq(pca9450->dev, pca9450->irq, NULL,
13711379 pca9450_irq_handler,
1372− (IRQF_TRIGGER_FALLING | IRQF_ONESHOT),
1380+ (IRQF_TRIGGER_LOW | IRQF_ONESHOT),
13731381 "pca9450-irq", pca9450);
13741382 if (ret != 0)
13751383 return dev_err_probe(pca9450->dev, ret, "Failed to request IRQ: %d\n",
@@ -1413,9 +1421,7 @@ static int pca9450_i2c_probe(struct i2c_client *i2c) · 37 unmodified lines
14131421 pca9450_i2c_restart_handler, pca9450))
14141422 dev_warn(&i2c->dev, "Failed to register restart handler\n");
14151423
1416− dev_info(&i2c->dev, "%s probed.\n",
1417− type == PCA9450_TYPE_PCA9450A ? "pca9450a" :
1418− (type == PCA9450_TYPE_PCA9451A ? "pca9451a" : "pca9450bc"));
1424+ dev_info(&i2c->dev, "%s probed.\n", type_name);
14191425
14201426 return 0;
14211427 }
drivers/reset/reset-rzg2l-usbphy-ctrl.c+3−0
@@ -136,6 +136,9 @@ static int rzg2l_usbphy_ctrl_set_pwrrdy(struct regmap_field *pwrrdy, · 135 unmodified lines
136136 {
137137 u32 val = power_on ? 0 : 1;
138138
139+ if (!pwrrdy)
140+ return 0;
141+
139142 /* The initialization path guarantees that the mask is 1 bit long. */
140143 return regmap_field_update_bits(pwrrdy, 1, val);
141144 }
drivers/s390/block/dasd_eckd.c+16−0
@@ -6135,6 +6135,7 @@ static void copy_pair_set_active(struct dasd_copy_relation *copy, char *new_busi · 6134 unmodified lines
61356135 static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid,
61366136 char *sec_busid)
61376137 {
6138+ struct dasd_eckd_private *prim_priv, *sec_priv;
61386139 struct dasd_device *primary, *secondary;
61396140 struct dasd_copy_relation *copy;
61406141 struct dasd_block *block;
@@ -6155,6 +6156,9 @@ static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid · 14 unmodified lines
61556156 if (!secondary)
61566157 return DASD_COPYPAIRSWAP_SECONDARY;
61576158
6159+ prim_priv = primary->private;
6160+ sec_priv = secondary->private;
6161+
61586162 /*
61596163 * usually the device should be quiesced for swap
61606164 * for paranoia stop device and requeue requests again
@@ -6182,6 +6186,18 @@ static int dasd_eckd_copy_pair_swap(struct dasd_device *device, char *prim_busid · 21 unmodified lines
61826186 dev_name(&secondary->cdev->dev), rc);
61836187 }
61846188
6189+ if (primary->stopped & DASD_STOPPED_QUIESCE) {
6190+ dasd_device_set_stop_bits(secondary, DASD_STOPPED_QUIESCE);
6191+ dasd_device_remove_stop_bits(primary, DASD_STOPPED_QUIESCE);
6192+ }
6193+
6194+ /*
6195+ * The secondary device never got through format detection, but since it
6196+ * is a copy of the primary device, the format is exactly the same;
6197+ * therefore, the detected layout can simply be copied.
6198+ */
6199+ sec_priv->uses_cdl = prim_priv->uses_cdl;
6200+
61856201 /* re-enable device */
61866202 dasd_device_remove_stop_bits(primary, DASD_STOPPED_PPRC);
61876203 dasd_device_remove_stop_bits(secondary, DASD_STOPPED_PPRC);
drivers/s390/crypto/zcrypt_ccamisc.c+7−5
@@ -1639,11 +1639,13 @@ int cca_get_info(u16 cardnr, u16 domain, struct cca_info *ci, u32 xflags) · 1638 unmodified lines
16391639
16401640 memset(ci, 0, sizeof(*ci));
16411641
1642− /* get first info from zcrypt device driver about this apqn */
1643− rc = zcrypt_device_status_ext(cardnr, domain, &devstat);
1644− if (rc)
1645− return rc;
1646− ci->hwtype = devstat.hwtype;
1642+ /* if specific domain given, fetch status and hw info for this apqn */
1643+ if (domain != AUTOSEL_DOM) {
1644+ rc = zcrypt_device_status_ext(cardnr, domain, &devstat);
1645+ if (rc)
1646+ return rc;
1647+ ci->hwtype = devstat.hwtype;
1648+ }
16471649
16481650 /*
16491651 * Prep memory for rule array and var array use.
drivers/s390/crypto/zcrypt_cex4.c+1−2
@@ -85,8 +85,7 @@ static ssize_t cca_serialnr_show(struct device *dev, · 84 unmodified lines
8585
8686 memset(&ci, 0, sizeof(ci));
8787
88− if (ap_domain_index >= 0)
89− cca_get_info(ac->id, ap_domain_index, &ci, 0);
88+ cca_get_info(ac->id, AUTOSEL_DOM, &ci, 0);
9089
9190 return sysfs_emit(buf, "%s\n", ci.serial);
9291 }
drivers/scsi/hisi_sas/hisi_sas_main.c+1−1
@@ -2578,7 +2578,7 @@ int hisi_sas_probe(struct platform_device *pdev, · 2577 unmodified lines
25782578 shost->transportt = hisi_sas_stt;
25792579 shost->max_id = HISI_SAS_MAX_DEVICES;
25802580 shost->max_lun = ~0;
2581− shost->max_channel = 1;
2581+ shost->max_channel = 0;
25822582 shost->max_cmd_len = HISI_SAS_MAX_CDB_LEN;
25832583 if (hisi_hba->hw->slot_index_alloc) {
25842584 shost->can_queue = HISI_SAS_MAX_COMMANDS;
drivers/scsi/hisi_sas/hisi_sas_v3_hw.c+1−1
@@ -4993,7 +4993,7 @@ hisi_sas_v3_probe(struct pci_dev *pdev, const struct pci_device_id *id) · 4992 unmodified lines
49934993 shost->transportt = hisi_sas_stt;
49944994 shost->max_id = HISI_SAS_MAX_DEVICES;
49954995 shost->max_lun = ~0;
4996− shost->max_channel = 1;
4996+ shost->max_channel = 0;
49974997 shost->max_cmd_len = HISI_SAS_MAX_CDB_LEN;
49984998 shost->can_queue = HISI_SAS_UNRESERVED_IPTT;
49994999 shost->cmd_per_lun = HISI_SAS_UNRESERVED_IPTT;
drivers/scsi/qla2xxx/qla_iocb.c+0−2
@@ -2751,7 +2751,6 @@ qla24xx_els_dcmd_iocb(scsi_qla_host_t *vha, int els_opcode, · 2750 unmodified lines
27512751 if (!elsio->u.els_logo.els_logo_pyld) {
27522752 /* ref: INIT */
27532753 kref_put(&sp->cmd_kref, qla2x00_sp_release);
2754− qla2x00_free_fcport(fcport);
27552754 return QLA_FUNCTION_FAILED;
27562755 }
27572756
@@ -2776,7 +2775,6 @@ qla24xx_els_dcmd_iocb(scsi_qla_host_t *vha, int els_opcode, · 18 unmodified lines
27762775 if (rval != QLA_SUCCESS) {
27772776 /* ref: INIT */
27782777 kref_put(&sp->cmd_kref, qla2x00_sp_release);
2779− qla2x00_free_fcport(fcport);
27802778 return QLA_FUNCTION_FAILED;
27812779 }
27822780
drivers/scsi/scsi_scan.c+2−6
@@ -360,12 +360,8 @@ static struct scsi_device *scsi_alloc_sdev(struct scsi_target *starget, · 359 unmodified lines
360360 * default device queue depth to figure out sbitmap shift
361361 * since we use this queue depth most of times.
362362 */
363− if (scsi_realloc_sdev_budget_map(sdev, depth)) {
364− kref_put(&sdev->host->tagset_refcnt, scsi_mq_free_tags);
365− put_device(&starget->dev);
366− kfree(sdev);
367− goto out;
368− }
363+ if (scsi_realloc_sdev_budget_map(sdev, depth))
364+ goto out_device_destroy;
369365
370366 scsi_change_queue_depth(sdev, depth);
371367
drivers/soc/fsl/qbman/qman.c+22−2
@@ -1827,6 +1827,8 @@ EXPORT_SYMBOL(qman_create_fq); · 1826 unmodified lines
18271827
18281828 void qman_destroy_fq(struct qman_fq *fq)
18291829 {
1830+ int leaked;
1831+
18301832 /*
18311833 * We don't need to lock the FQ as it is a pre-condition that the FQ be
18321834 * quiesced. Instead, run some checks.
@@ -1834,11 +1836,29 @@ void qman_destroy_fq(struct qman_fq *fq) · 1 unmodified line
18341836 switch (fq->state) {
18351837 case qman_fq_state_parked:
18361838 case qman_fq_state_oos:
1837− if (fq_isset(fq, QMAN_FQ_FLAG_DYNAMIC_FQID))
1838− qman_release_fqid(fq->fqid);
1839+ /*
1840+ * There's a race condition here on releasing the fqid,
1841+ * setting the fq_table to NULL, and freeing the fqid.
1842+ * To prevent it, this order should be respected:
1843+ */
1844+ if (fq_isset(fq, QMAN_FQ_FLAG_DYNAMIC_FQID)) {
1845+ leaked = qman_shutdown_fq(fq->fqid);
1846+ if (leaked)
1847+ pr_debug("FQID %d leaked\n", fq->fqid);
1848+ }
18391849
18401850 DPAA_ASSERT(fq_table[fq->idx]);
18411851 fq_table[fq->idx] = NULL;
1852+
1853+ if (fq_isset(fq, QMAN_FQ_FLAG_DYNAMIC_FQID) && !leaked) {
1854+ /*
1855+ * fq_table[fq->idx] should be set to null before
1856+ * freeing fq->fqid otherwise it could by allocated by
1857+ * qman_alloc_fqid() while still being !NULL
1858+ */
1859+ smp_wmb();
1860+ gen_pool_free(qm_fqalloc, fq->fqid | DPAA_GENALLOC_OFF, 1);
1861+ }
18421862 return;
18431863 default:
18441864 break;
drivers/soc/fsl/qe/qmc.c+2−2
@@ -1790,8 +1790,8 @@ static int qmc_qe_init_resources(struct qmc *qmc, struct platform_device *pdev) · 1789 unmodified lines
17901790 return -EINVAL;
17911791 qmc->dpram_offset = res->start - qe_muram_dma(qe_muram_addr(0));
17921792 qmc->dpram = devm_ioremap_resource(qmc->dev, res);
1793− if (IS_ERR(qmc->scc_pram))
1794− return PTR_ERR(qmc->scc_pram);
1793+ if (IS_ERR(qmc->dpram))
1794+ return PTR_ERR(qmc->dpram);
17951795
17961796 return 0;
17971797 }
drivers/soc/microchip/mpfs-sys-controller.c+9−4
@@ -142,8 +142,10 @@ static int mpfs_sys_controller_probe(struct platform_device *pdev) · 141 unmodified lines
142142
143143 sys_controller->flash = of_get_mtd_device_by_node(np);
144144 of_node_put(np);
145− if (IS_ERR(sys_controller->flash))
146− return dev_err_probe(dev, PTR_ERR(sys_controller->flash), "Failed to get flash\n");
145+ if (IS_ERR(sys_controller->flash)) {
146+ ret = dev_err_probe(dev, PTR_ERR(sys_controller->flash), "Failed to get flash\n");
147+ goto out_free;
148+ }
147149
148150 no_flash:
149151 sys_controller->client.dev = dev;
@@ -155,8 +157,7 @@ no_flash: · 5 unmodified lines
155157 if (IS_ERR(sys_controller->chan)) {
156158 ret = dev_err_probe(dev, PTR_ERR(sys_controller->chan),
157159 "Failed to get mbox channel\n");
158− kfree(sys_controller);
159− return ret;
160+ goto out_free;
160161 }
161162
162163 init_completion(&sys_controller->c);
@@ -174,6 +175,10 @@ no_flash: · 11 unmodified lines
174175 dev_info(&pdev->dev, "Registered MPFS system controller\n");
175176
176177 return 0;
178+
179+out_free:
180+ kfree(sys_controller);
181+ return ret;
177182 }
178183
179184 static void mpfs_sys_controller_remove(struct platform_device *pdev)
drivers/soc/rockchip/grf.c+1−0
@@ -231,6 +231,7 @@ static int __init rockchip_grf_init(void) · 230 unmodified lines
231231 grf = syscon_node_to_regmap(np);
232232 if (IS_ERR(grf)) {
233233 pr_err("%s: could not get grf syscon\n", __func__);
234+ of_node_put(np);
234235 return PTR_ERR(grf);
235236 }
236237
drivers/spi/spi-amlogic-spifc-a4.c+2−3
@@ -411,7 +411,7 @@ static int aml_sfc_dma_buffer_setup(struct aml_sfc *sfc, void *databuf, · 410 unmodified lines
411411 ret = dma_mapping_error(sfc->dev, sfc->daddr);
412412 if (ret) {
413413 dev_err(sfc->dev, "DMA mapping error\n");
414− goto out_map_data;
414+ return ret;
415415 }
416416
417417 cmd = CMD_DATA_ADDRL(sfc->daddr);
@@ -429,7 +429,6 @@ static int aml_sfc_dma_buffer_setup(struct aml_sfc *sfc, void *databuf, · 11 unmodified lines
429429 ret = dma_mapping_error(sfc->dev, sfc->iaddr);
430430 if (ret) {
431431 dev_err(sfc->dev, "DMA mapping error\n");
432− dma_unmap_single(sfc->dev, sfc->daddr, datalen, dir);
433432 goto out_map_data;
434433 }
435434
@@ -448,7 +447,7 @@ static int aml_sfc_dma_buffer_setup(struct aml_sfc *sfc, void *databuf, · 12 unmodified lines
448447 return 0;
449448
450449 out_map_info:
451− dma_unmap_single(sfc->dev, sfc->iaddr, datalen, dir);
450+ dma_unmap_single(sfc->dev, sfc->iaddr, infolen, dir);
452451 out_map_data:
453452 dma_unmap_single(sfc->dev, sfc->daddr, datalen, dir);
454453
drivers/spi/spi-atcspi200.c+16−22
@@ -195,7 +195,15 @@ static void atcspi_set_trans_ctl(struct atcspi_dev *spi, · 194 unmodified lines
195195 if (op->addr.buswidth > 1)
196196 tc |= TRANS_ADDR_FMT;
197197 if (op->data.nbytes) {
198− tc |= TRANS_DUAL_QUAD(ffs(op->data.buswidth) - 1);
198+ unsigned int width_code;
199+
200+ width_code = ffs(op->data.buswidth) - 1;
201+ if (unlikely(width_code > 3)) {
202+ WARN_ON_ONCE(1);
203+ width_code = 0;
204+ }
205+ tc |= TRANS_DUAL_QUAD(width_code);
206+
199207 if (op->data.dir == SPI_MEM_DATA_IN) {
200208 if (op->dummy.nbytes)
201209 tc |= TRANS_MODE_DMY_READ |
@@ -497,31 +505,17 @@ static int atcspi_init_resources(struct platform_device *pdev, · 295 unmodified lines
497505
498506 static int atcspi_configure_dma(struct atcspi_dev *spi)
499507 {
500− struct dma_chan *dma_chan;
501− int ret = 0;
508+ spi->host->dma_rx = devm_dma_request_chan(spi->dev, "rx");
509+ if (IS_ERR(spi->host->dma_rx))
510+ return PTR_ERR(spi->host->dma_rx);
502511
503− dma_chan = devm_dma_request_chan(spi->dev, "rx");
504− if (IS_ERR(dma_chan)) {
505− ret = PTR_ERR(dma_chan);
506− goto err_exit;
507− }
508− spi->host->dma_rx = dma_chan;
512+ spi->host->dma_tx = devm_dma_request_chan(spi->dev, "tx");
513+ if (IS_ERR(spi->host->dma_tx))
514+ return PTR_ERR(spi->host->dma_tx);
509515
510− dma_chan = devm_dma_request_chan(spi->dev, "tx");
511− if (IS_ERR(dma_chan)) {
512− ret = PTR_ERR(dma_chan);
513− goto free_rx;
514− }
515− spi->host->dma_tx = dma_chan;
516516 init_completion(&spi->dma_completion);
517517
518− return ret;
519−
520−free_rx:
521− dma_release_channel(spi->host->dma_rx);
522− spi->host->dma_rx = NULL;
523−err_exit:
524− return ret;
518+ return 0;
525519 }
526520
527521 static int atcspi_enable_clk(struct atcspi_dev *spi)
drivers/spi/spi-cadence-quadspi.c+6−0
@@ -76,6 +76,11 @@ struct cqspi_flash_pdata { · 75 unmodified lines
7676 u8 cs;
7777 };
7878
79+static const struct clk_bulk_data cqspi_clks[CLK_QSPI_NUM] = {
80+ [CLK_QSPI_APB] = { .id = "apb" },
81+ [CLK_QSPI_AHB] = { .id = "ahb" },
82+};
83+
7984 struct cqspi_st {
8085 struct platform_device *pdev;
8186 struct spi_controller *host;
@@ -1823,6 +1828,7 @@ static int cqspi_probe(struct platform_device *pdev) · 1741 unmodified lines
18231828 }
18241829
18251830 /* Obtain QSPI clocks. */
1831+ memcpy(&cqspi->clks, &cqspi_clks, sizeof(cqspi->clks));
18261832 ret = devm_clk_bulk_get_optional(dev, CLK_QSPI_NUM, cqspi->clks);
18271833 if (ret)
18281834 return dev_err_probe(dev, ret, "Failed to get clocks\n");
drivers/spi/spi-intel-pci.c+1−0
@@ -96,6 +96,7 @@ static const struct pci_device_id intel_spi_pci_ids[] = { · 95 unmodified lines
9696 { PCI_VDEVICE(INTEL, 0xa324), (unsigned long)&cnl_info },
9797 { PCI_VDEVICE(INTEL, 0xa3a4), (unsigned long)&cnl_info },
9898 { PCI_VDEVICE(INTEL, 0xa823), (unsigned long)&cnl_info },
99+ { PCI_VDEVICE(INTEL, 0xd323), (unsigned long)&cnl_info },
99100 { PCI_VDEVICE(INTEL, 0xe323), (unsigned long)&cnl_info },
100101 { PCI_VDEVICE(INTEL, 0xe423), (unsigned long)&cnl_info },
101102 { },
drivers/spi/spi-rockchip-sfc.c+1−1
@@ -711,7 +711,7 @@ static int rockchip_sfc_probe(struct platform_device *pdev) · 710 unmodified lines
711711 }
712712 }
713713
714− ret = devm_spi_register_controller(dev, host);
714+ ret = spi_register_controller(host);
715715 if (ret)
716716 goto err_register;
717717
drivers/staging/rtl8723bs/core/rtw_ieee80211.c+10−5
@@ -186,20 +186,25 @@ u8 *rtw_get_ie_ex(u8 *in_ie, uint in_len, u8 eid, u8 *oui, u8 oui_len, u8 *ie, u · 185 unmodified lines
186186
187187 cnt = 0;
188188
189− while (cnt < in_len) {
189+ while (cnt + 2 <= in_len) {
190+ u8 ie_len = in_ie[cnt + 1];
191+
192+ if (cnt + 2 + ie_len > in_len)
193+ break;
194+
190195 if (eid == in_ie[cnt]
191− && (!oui || !memcmp(&in_ie[cnt+2], oui, oui_len))) {
196+ && (!oui || (ie_len >= oui_len && !memcmp(&in_ie[cnt + 2], oui, oui_len)))) {
192197 target_ie = &in_ie[cnt];
193198
194199 if (ie)
195− memcpy(ie, &in_ie[cnt], in_ie[cnt+1]+2);
200+ memcpy(ie, &in_ie[cnt], ie_len + 2);
196201
197202 if (ielen)
198− *ielen = in_ie[cnt+1]+2;
203+ *ielen = ie_len + 2;
199204
200205 break;
201206 }
202− cnt += in_ie[cnt+1]+2; /* goto next */
207+ cnt += ie_len + 2; /* goto next */
203208 }
204209
205210 return target_ie;
drivers/staging/rtl8723bs/core/rtw_mlme.c+4−1
@@ -1988,7 +1988,10 @@ int rtw_restruct_wmm_ie(struct adapter *adapter, u8 *in_ie, u8 *out_ie, uint in_ · 1987 unmodified lines
19881988 while (i < in_len) {
19891989 ielength = initial_out_len;
19901990
1991− if (in_ie[i] == 0xDD && in_ie[i + 2] == 0x00 && in_ie[i + 3] == 0x50 && in_ie[i + 4] == 0xF2 && in_ie[i + 5] == 0x02 && i + 5 < in_len) { /* WMM element ID and OUI */
1991+ if (i + 5 < in_len &&
1992+ in_ie[i] == 0xDD && in_ie[i + 2] == 0x00 &&
1993+ in_ie[i + 3] == 0x50 && in_ie[i + 4] == 0xF2 &&
1994+ in_ie[i + 5] == 0x02) {
19921995 for (j = i; j < i + 9; j++) {
19931996 out_ie[ielength] = in_ie[j];
19941997 ielength++;
drivers/staging/sm750fb/sm750.c+1−0
@@ -1123,6 +1123,7 @@ static void lynxfb_pci_remove(struct pci_dev *pdev) · 1122 unmodified lines
11231123
11241124 iounmap(sm750_dev->pvReg);
11251125 iounmap(sm750_dev->pvMem);
1126+ pci_release_region(pdev, 1);
11261127 kfree(g_settings);
11271128 }
11281129
drivers/staging/sm750fb/sm750_hw.c+11−11
@@ -36,16 +36,11 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev) · 35 unmodified lines
3636
3737 pr_info("mmio phyAddr = %lx\n", sm750_dev->vidreg_start);
3838
39− /*
40− * reserve the vidreg space of smi adaptor
41− * if you do this, you need to add release region code
42− * in lynxfb_remove, or memory will not be mapped again
43− * successfully
44− */
39+ /* reserve the vidreg space of smi adaptor */
4540 ret = pci_request_region(pdev, 1, "sm750fb");
4641 if (ret) {
4742 pr_err("Can not request PCI regions.\n");
48− goto exit;
43+ return ret;
4944 }
5045
5146 /* now map mmio and vidmem */
@@ -54,7 +49,7 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev) · 2 unmodified lines
5449 if (!sm750_dev->pvReg) {
5550 pr_err("mmio failed\n");
5651 ret = -EFAULT;
57− goto exit;
52+ goto err_release_region;
5853 }
5954 pr_info("mmio virtual addr = %p\n", sm750_dev->pvReg);
6055
@@ -79,13 +74,18 @@ int hw_sm750_map(struct sm750_dev *sm750_dev, struct pci_dev *pdev) · 18 unmodified lines
7974 sm750_dev->pvMem =
8075 ioremap_wc(sm750_dev->vidmem_start, sm750_dev->vidmem_size);
8176 if (!sm750_dev->pvMem) {
82− iounmap(sm750_dev->pvReg);
8377 pr_err("Map video memory failed\n");
8478 ret = -EFAULT;
85− goto exit;
79+ goto err_unmap_reg;
8680 }
8781 pr_info("video memory vaddr = %p\n", sm750_dev->pvMem);
88−exit:
82+
83+ return 0;
84+
85+err_unmap_reg:
86+ iounmap(sm750_dev->pvReg);
87+err_release_region:
88+ pci_release_region(pdev, 1);
8989 return ret;
9090 }
9191
drivers/tee/tee_shm.c+0−27
@@ -23,29 +23,11 @@ struct tee_shm_dma_mem { · 22 unmodified lines
2323 struct page *page;
2424 };
2525
26−static void shm_put_kernel_pages(struct page **pages, size_t page_count)
27−{
28− size_t n;
29−
30− for (n = 0; n < page_count; n++)
31− put_page(pages[n]);
32−}
33−
34−static void shm_get_kernel_pages(struct page **pages, size_t page_count)
35−{
36− size_t n;
37−
38− for (n = 0; n < page_count; n++)
39− get_page(pages[n]);
40−}
41−
4226 static void release_registered_pages(struct tee_shm *shm)
4327 {
4428 if (shm->pages) {
4529 if (shm->flags & TEE_SHM_USER_MAPPED)
4630 unpin_user_pages(shm->pages, shm->num_pages);
47− else
48− shm_put_kernel_pages(shm->pages, shm->num_pages);
4931
5032 kfree(shm->pages);
5133 }
@@ -477,13 +459,6 @@ register_shm_helper(struct tee_context *ctx, struct iov_iter *iter, u32 flags, · 425 unmodified lines
477459 goto err_put_shm_pages;
478460 }
479461
480− /*
481− * iov_iter_extract_kvec_pages does not get reference on the pages,
482− * get a reference on them.
483− */
484− if (iov_iter_is_kvec(iter))
485− shm_get_kernel_pages(shm->pages, num_pages);
486−
487462 shm->offset = off;
488463 shm->size = len;
489464 shm->num_pages = num_pages;
@@ -499,8 +474,6 @@ register_shm_helper(struct tee_context *ctx, struct iov_iter *iter, u32 flags, · 9 unmodified lines
499474 err_put_shm_pages:
500475 if (!iov_iter_is_kvec(iter))
501476 unpin_user_pages(shm->pages, shm->num_pages);
502− else
503− shm_put_kernel_pages(shm->pages, shm->num_pages);
504477 err_free_shm_pages:
505478 kfree(shm->pages);
506479 err_free_shm:
drivers/ufs/core/ufshcd.c+1−1
@@ -10066,6 +10066,7 @@ static int __ufshcd_wl_suspend(struct ufs_hba *hba, enum ufs_pm_op pm_op) · 10065 unmodified lines
1006610066 }
1006710067
1006810068 flush_work(&hba->eeh_work);
10069+ cancel_delayed_work_sync(&hba->ufs_rtc_update_work);
1006910070
1007010071 ret = ufshcd_vops_suspend(hba, pm_op, PRE_CHANGE);
1007110072 if (ret)
@@ -10120,7 +10121,6 @@ vops_suspend: · 48 unmodified lines
1012010121 if (ret)
1012110122 goto set_link_active;
1012210123
10123− cancel_delayed_work_sync(&hba->ufs_rtc_update_work);
1012410124 goto out;
1012510125
1012610126 set_link_active:
drivers/usb/class/cdc-acm.c+5−0
@@ -1379,6 +1379,8 @@ made_compressed_probe: · 1378 unmodified lines
13791379 acm->ctrl_caps = h.usb_cdc_acm_descriptor->bmCapabilities;
13801380 if (quirks & NO_CAP_LINE)
13811381 acm->ctrl_caps &= ~USB_CDC_CAP_LINE;
1382+ if (quirks & MISSING_CAP_BRK)
1383+ acm->ctrl_caps |= USB_CDC_CAP_BRK;
13821384 acm->ctrlsize = ctrlsize;
13831385 acm->readsize = readsize;
13841386 acm->rx_buflimit = num_rx_buf;
@@ -2002,6 +2004,9 @@ static const struct usb_device_id acm_ids[] = { · 617 unmodified lines
20022004 .driver_info = IGNORE_DEVICE,
20032005 },
20042006
2007+ /* CH343 supports CAP_BRK, but doesn't advertise it */
2008+ { USB_DEVICE(0x1a86, 0x55d3), .driver_info = MISSING_CAP_BRK, },
2009+
20052010 /* control interfaces without any protocol set */
20062011 { USB_INTERFACE_INFO(USB_CLASS_COMM, USB_CDC_SUBCLASS_ACM,
20072012 USB_CDC_PROTO_NONE) },
drivers/usb/class/cdc-acm.h+1−0
@@ -113,3 +113,4 @@ struct acm { · 112 unmodified lines
113113 #define CLEAR_HALT_CONDITIONS BIT(5)
114114 #define SEND_ZERO_PACKET BIT(6)
115115 #define DISABLE_ECHO BIT(7)
116+#define MISSING_CAP_BRK BIT(8)
drivers/usb/class/cdc-wdm.c+3−1
@@ -225,7 +225,8 @@ static void wdm_in_callback(struct urb *urb) · 224 unmodified lines
225225 /* we may already be in overflow */
226226 if (!test_bit(WDM_OVERFLOW, &desc->flags)) {
227227 memmove(desc->ubuf + desc->length, desc->inbuf, length);
228− desc->length += length;
228+ smp_wmb(); /* against wdm_read() */
229+ WRITE_ONCE(desc->length, desc->length + length);
229230 }
230231 }
231232 skip_error:
@@ -533,6 +534,7 @@ static ssize_t wdm_read · 301 unmodified lines
533534 return -ERESTARTSYS;
534535
535536 cntr = READ_ONCE(desc->length);
537+ smp_rmb(); /* against wdm_in_callback() */
536538 if (cntr == 0) {
537539 desc->read = 0;
538540 retry:
drivers/usb/class/usbtmc.c+3−3
@@ -727,7 +727,7 @@ static int usbtmc488_ioctl_trigger(struct usbtmc_file_data *file_data) · 726 unmodified lines
727727 buffer[1] = data->bTag;
728728 buffer[2] = ~data->bTag;
729729
730− retval = usb_bulk_msg(data->usb_dev,
730+ retval = usb_bulk_msg_killable(data->usb_dev,
731731 usb_sndbulkpipe(data->usb_dev,
732732 data->bulk_out),
733733 buffer, USBTMC_HEADER_SIZE,
@@ -1347,7 +1347,7 @@ static int send_request_dev_dep_msg_in(struct usbtmc_file_data *file_data, · 613 unmodified lines
13471347 buffer[11] = 0; /* Reserved */
13481348
13491349 /* Send bulk URB */
1350− retval = usb_bulk_msg(data->usb_dev,
1350+ retval = usb_bulk_msg_killable(data->usb_dev,
13511351 usb_sndbulkpipe(data->usb_dev,
13521352 data->bulk_out),
13531353 buffer, USBTMC_HEADER_SIZE,
@@ -1419,7 +1419,7 @@ static ssize_t usbtmc_read(struct file *filp, char __user *buf, · 65 unmodified lines
14191419 actual = 0;
14201420
14211421 /* Send bulk URB */
1422− retval = usb_bulk_msg(data->usb_dev,
1422+ retval = usb_bulk_msg_killable(data->usb_dev,
14231423 usb_rcvbulkpipe(data->usb_dev,
14241424 data->bulk_in),
14251425 buffer, bufsize, &actual,
drivers/usb/core/config.c+5−1
@@ -927,7 +927,11 @@ int usb_get_configuration(struct usb_device *dev) · 926 unmodified lines
927927 dev->descriptor.bNumConfigurations = ncfg = USB_MAXCONFIG;
928928 }
929929
930− if (ncfg < 1) {
930+ if (ncfg < 1 && dev->quirks & USB_QUIRK_FORCE_ONE_CONFIG) {
931+ dev_info(ddev, "Device claims zero configurations, forcing to 1\n");
932+ dev->descriptor.bNumConfigurations = 1;
933+ ncfg = 1;
934+ } else if (ncfg < 1) {
931935 dev_err(ddev, "no configurations\n");
932936 return -EINVAL;
933937 }
drivers/usb/core/message.c+79−21
@@ -42,16 +42,19 @@ static void usb_api_blocking_completion(struct urb *urb) · 41 unmodified lines
4242
4343
4444 /*
45− * Starts urb and waits for completion or timeout. Note that this call
46− * is NOT interruptible. Many device driver i/o requests should be
47− * interruptible and therefore these drivers should implement their
48− * own interruptible routines.
45+ * Starts urb and waits for completion or timeout.
46+ * Whether or not the wait is killable depends on the flag passed in.
47+ * For example, compare usb_bulk_msg() and usb_bulk_msg_killable().
48+ *
49+ * For non-killable waits, we enforce a maximum limit on the timeout value.
4950 */
50−static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length)
51+static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length,
52+ bool killable)
5153 {
5254 struct api_context ctx;
5355 unsigned long expire;
5456 int retval;
57+ long rc;
5558
5659 init_completion(&ctx.done);
5760 urb->context = &ctx;
@@ -60,13 +63,24 @@ static int usb_start_wait_urb(struct urb *urb, int timeout, int *actual_length) · 2 unmodified lines
6063 if (unlikely(retval))
6164 goto out;
6265
63− expire = timeout ? msecs_to_jiffies(timeout) : MAX_SCHEDULE_TIMEOUT;
64− if (!wait_for_completion_timeout(&ctx.done, expire)) {
66+ if (!killable && (timeout <= 0 || timeout > USB_MAX_SYNCHRONOUS_TIMEOUT))
67+ timeout = USB_MAX_SYNCHRONOUS_TIMEOUT;
68+ expire = (timeout > 0) ? msecs_to_jiffies(timeout) : MAX_SCHEDULE_TIMEOUT;
69+ if (killable)
70+ rc = wait_for_completion_killable_timeout(&ctx.done, expire);
71+ else
72+ rc = wait_for_completion_timeout(&ctx.done, expire);
73+ if (rc <= 0) {
6574 usb_kill_urb(urb);
66− retval = (ctx.status == -ENOENT ? -ETIMEDOUT : ctx.status);
75+ if (ctx.status != -ENOENT)
76+ retval = ctx.status;
77+ else if (rc == 0)
78+ retval = -ETIMEDOUT;
79+ else
80+ retval = rc;
6781
6882 dev_dbg(&urb->dev->dev,
69− "%s timed out on ep%d%s len=%u/%u\n",
83+ "%s timed out or killed on ep%d%s len=%u/%u\n",
7084 current->comm,
7185 usb_endpoint_num(&urb->ep->desc),
7286 usb_urb_dir_in(urb) ? "in" : "out",
@@ -100,7 +114,7 @@ static int usb_internal_control_msg(struct usb_device *usb_dev, · 27 unmodified lines
100114 usb_fill_control_urb(urb, usb_dev, pipe, (unsigned char *)cmd, data,
101115 len, usb_api_blocking_completion, NULL);
102116
103− retv = usb_start_wait_urb(urb, timeout, &length);
117+ retv = usb_start_wait_urb(urb, timeout, &length, false);
104118 if (retv < 0)
105119 return retv;
106120 else
@@ -117,8 +131,7 @@ static int usb_internal_control_msg(struct usb_device *usb_dev, · 10 unmodified lines
117131 * @index: USB message index value
118132 * @data: pointer to the data to send
119133 * @size: length in bytes of the data to send
120− * @timeout: time in msecs to wait for the message to complete before timing
121− * out (if 0 the wait is forever)
134+ * @timeout: time in msecs to wait for the message to complete before timing out
122135 *
123136 * Context: task context, might sleep.
124137 *
@@ -173,8 +186,7 @@ EXPORT_SYMBOL_GPL(usb_control_msg); · 48 unmodified lines
173186 * @index: USB message index value
174187 * @driver_data: pointer to the data to send
175188 * @size: length in bytes of the data to send
176− * @timeout: time in msecs to wait for the message to complete before timing
177− * out (if 0 the wait is forever)
189+ * @timeout: time in msecs to wait for the message to complete before timing out
178190 * @memflags: the flags for memory allocation for buffers
179191 *
180192 * Context: !in_interrupt ()
@@ -232,8 +244,7 @@ EXPORT_SYMBOL_GPL(usb_control_msg_send); · 51 unmodified lines
232244 * @index: USB message index value
233245 * @driver_data: pointer to the data to be filled in by the message
234246 * @size: length in bytes of the data to be received
235− * @timeout: time in msecs to wait for the message to complete before timing
236− * out (if 0 the wait is forever)
247+ * @timeout: time in msecs to wait for the message to complete before timing out
237248 * @memflags: the flags for memory allocation for buffers
238249 *
239250 * Context: !in_interrupt ()
@@ -304,8 +315,7 @@ EXPORT_SYMBOL_GPL(usb_control_msg_recv); · 64 unmodified lines
304315 * @len: length in bytes of the data to send
305316 * @actual_length: pointer to a location to put the actual length transferred
306317 * in bytes
307− * @timeout: time in msecs to wait for the message to complete before
308− * timing out (if 0 the wait is forever)
318+ * @timeout: time in msecs to wait for the message to complete before timing out
309319 *
310320 * Context: task context, might sleep.
311321 *
@@ -337,8 +347,7 @@ EXPORT_SYMBOL_GPL(usb_interrupt_msg); · 25 unmodified lines
337347 * @len: length in bytes of the data to send
338348 * @actual_length: pointer to a location to put the actual length transferred
339349 * in bytes
340− * @timeout: time in msecs to wait for the message to complete before
341− * timing out (if 0 the wait is forever)
350+ * @timeout: time in msecs to wait for the message to complete before timing out
342351 *
343352 * Context: task context, might sleep.
344353 *
@@ -385,10 +394,59 @@ int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe, · 40 unmodified lines
385394 usb_fill_bulk_urb(urb, usb_dev, pipe, data, len,
386395 usb_api_blocking_completion, NULL);
387396
388− return usb_start_wait_urb(urb, timeout, actual_length);
397+ return usb_start_wait_urb(urb, timeout, actual_length, false);
389398 }
390399 EXPORT_SYMBOL_GPL(usb_bulk_msg);
391400
401+/**
402+ * usb_bulk_msg_killable - Builds a bulk urb, sends it off and waits for completion in a killable state
403+ * @usb_dev: pointer to the usb device to send the message to
404+ * @pipe: endpoint "pipe" to send the message to
405+ * @data: pointer to the data to send
406+ * @len: length in bytes of the data to send
407+ * @actual_length: pointer to a location to put the actual length transferred
408+ * in bytes
409+ * @timeout: time in msecs to wait for the message to complete before
410+ * timing out (if <= 0, the wait is as long as possible)
411+ *
412+ * Context: task context, might sleep.
413+ *
414+ * This function is just like usb_blk_msg(), except that it waits in a
415+ * killable state and there is no limit on the timeout length.
416+ *
417+ * Return:
418+ * If successful, 0. Otherwise a negative error number. The number of actual
419+ * bytes transferred will be stored in the @actual_length parameter.
420+ *
421+ */
422+int usb_bulk_msg_killable(struct usb_device *usb_dev, unsigned int pipe,
423+ void *data, int len, int *actual_length, int timeout)
424+{
425+ struct urb *urb;
426+ struct usb_host_endpoint *ep;
427+
428+ ep = usb_pipe_endpoint(usb_dev, pipe);
429+ if (!ep || len < 0)
430+ return -EINVAL;
431+
432+ urb = usb_alloc_urb(0, GFP_KERNEL);
433+ if (!urb)
434+ return -ENOMEM;
435+
436+ if ((ep->desc.bmAttributes & USB_ENDPOINT_XFERTYPE_MASK) ==
437+ USB_ENDPOINT_XFER_INT) {
438+ pipe = (pipe & ~(3 << 30)) | (PIPE_INTERRUPT << 30);
439+ usb_fill_int_urb(urb, usb_dev, pipe, data, len,
440+ usb_api_blocking_completion, NULL,
441+ ep->desc.bInterval);
442+ } else
443+ usb_fill_bulk_urb(urb, usb_dev, pipe, data, len,
444+ usb_api_blocking_completion, NULL);
445+
446+ return usb_start_wait_urb(urb, timeout, actual_length, true);
447+}
448+EXPORT_SYMBOL_GPL(usb_bulk_msg_killable);
449+
392450 /*-------------------------------------------------------------------*/
393451
394452 static void sg_clean(struct usb_sg_request *io)
drivers/usb/core/phy.c+1−7
@@ -200,16 +200,10 @@ int usb_phy_roothub_set_mode(struct usb_phy_roothub *phy_roothub, · 199 unmodified lines
200200 list_for_each_entry(roothub_entry, head, list) {
201201 err = phy_set_mode(roothub_entry->phy, mode);
202202 if (err)
203− goto err_out;
203+ return err;
204204 }
205205
206206 return 0;
207−
208−err_out:
209− list_for_each_entry_continue_reverse(roothub_entry, head, list)
210− phy_power_off(roothub_entry->phy);
211−
212− return err;
213207 }
214208 EXPORT_SYMBOL_GPL(usb_phy_roothub_set_mode);
215209
drivers/usb/core/quirks.c+21−0
@@ -140,6 +140,8 @@ static int quirks_param_set(const char *value, const struct kernel_param *kp) · 139 unmodified lines
140140 case 'p':
141141 flags |= USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT;
142142 break;
143+ case 'q':
144+ flags |= USB_QUIRK_FORCE_ONE_CONFIG;
143145 /* Ignore unrecognized flag characters */
144146 }
145147 }
@@ -207,6 +209,10 @@ static const struct usb_device_id usb_quirk_list[] = { · 61 unmodified lines
207209 /* HP v222w 16GB Mini USB Drive */
208210 { USB_DEVICE(0x03f0, 0x3f40), .driver_info = USB_QUIRK_DELAY_INIT },
209211
212+ /* Huawei 4G LTE module ME906S */
213+ { USB_DEVICE(0x03f0, 0xa31d), .driver_info =
214+ USB_QUIRK_DISCONNECT_SUSPEND },
215+
210216 /* Creative SB Audigy 2 NX */
211217 { USB_DEVICE(0x041e, 0x3020), .driver_info = USB_QUIRK_RESET_RESUME },
212218
@@ -376,6 +382,9 @@ static const struct usb_device_id usb_quirk_list[] = { · 163 unmodified lines
376382 /* SanDisk Extreme 55AE */
377383 { USB_DEVICE(0x0781, 0x55ae), .driver_info = USB_QUIRK_NO_LPM },
378384
385+ /* Avermedia Live Gamer Ultra 2.1 (GC553G2) - BOS descriptor fetch hangs at SuperSpeed Plus */
386+ { USB_DEVICE(0x07ca, 0x2553), .driver_info = USB_QUIRK_NO_BOS },
387+
379388 /* Realforce 87U Keyboard */
380389 { USB_DEVICE(0x0853, 0x011b), .driver_info = USB_QUIRK_NO_LPM },
381390
@@ -436,6 +445,9 @@ static const struct usb_device_id usb_quirk_list[] = { · 54 unmodified lines
436445 { USB_DEVICE(0x0b05, 0x17e0), .driver_info =
437446 USB_QUIRK_IGNORE_REMOTE_WAKEUP },
438447
448+ /* ASUS TUF 4K PRO - BOS descriptor fetch hangs at SuperSpeed Plus */
449+ { USB_DEVICE(0x0b05, 0x1ab9), .driver_info = USB_QUIRK_NO_BOS },
450+
439451 /* Realtek Semiconductor Corp. Mass Storage Device (Multicard Reader)*/
440452 { USB_DEVICE(0x0bda, 0x0151), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
441453
@@ -564,6 +576,9 @@ static const struct usb_device_id usb_quirk_list[] = { · 122 unmodified lines
564576
565577 { USB_DEVICE(0x2386, 0x350e), .driver_info = USB_QUIRK_NO_LPM },
566578
579+ /* UGREEN 35871 - BOS descriptor fetch hangs at SuperSpeed Plus */
580+ { USB_DEVICE(0x2b89, 0x5871), .driver_info = USB_QUIRK_NO_BOS },
581+
567582 /* APTIV AUTOMOTIVE HUB */
568583 { USB_DEVICE(0x2c48, 0x0132), .driver_info =
569584 USB_QUIRK_SHORT_SET_ADDRESS_REQ_TIMEOUT },
@@ -574,12 +589,18 @@ static const struct usb_device_id usb_quirk_list[] = { · 4 unmodified lines
574589 /* Alcor Link AK9563 SC Reader used in 2022 Lenovo ThinkPads */
575590 { USB_DEVICE(0x2ce3, 0x9563), .driver_info = USB_QUIRK_NO_LPM },
576591
592+ /* ezcap401 - BOS descriptor fetch hangs at SuperSpeed Plus */
593+ { USB_DEVICE(0x32ed, 0x0401), .driver_info = USB_QUIRK_NO_BOS },
594+
577595 /* DELL USB GEN2 */
578596 { USB_DEVICE(0x413c, 0xb062), .driver_info = USB_QUIRK_NO_LPM | USB_QUIRK_RESET_RESUME },
579597
580598 /* VCOM device */
581599 { USB_DEVICE(0x4296, 0x7570), .driver_info = USB_QUIRK_CONFIG_INTF_STRINGS },
582600
601+ /* Noji-MCS SmartCard Reader */
602+ { USB_DEVICE(0x5131, 0x2007), .driver_info = USB_QUIRK_FORCE_ONE_CONFIG },
603+
583604 /* INTEL VALUE SSD */
584605 { USB_DEVICE(0x8086, 0xf1a5), .driver_info = USB_QUIRK_RESET_RESUME },
585606
drivers/usb/dwc3/dwc3-pci.c+2−0
@@ -56,6 +56,7 @@ · 55 unmodified lines
5656 #define PCI_DEVICE_ID_INTEL_CNPH 0xa36e
5757 #define PCI_DEVICE_ID_INTEL_CNPV 0xa3b0
5858 #define PCI_DEVICE_ID_INTEL_RPL 0xa70e
59+#define PCI_DEVICE_ID_INTEL_NVLH 0xd37f
5960 #define PCI_DEVICE_ID_INTEL_PTLH 0xe332
6061 #define PCI_DEVICE_ID_INTEL_PTLH_PCH 0xe37e
6162 #define PCI_DEVICE_ID_INTEL_PTLU 0xe432
@@ -447,6 +448,7 @@ static const struct pci_device_id dwc3_pci_id_table[] = { · 385 unmodified lines
447448 { PCI_DEVICE_DATA(INTEL, CNPH, &dwc3_pci_intel_swnode) },
448449 { PCI_DEVICE_DATA(INTEL, CNPV, &dwc3_pci_intel_swnode) },
449450 { PCI_DEVICE_DATA(INTEL, RPL, &dwc3_pci_intel_swnode) },
451+ { PCI_DEVICE_DATA(INTEL, NVLH, &dwc3_pci_intel_swnode) },
450452 { PCI_DEVICE_DATA(INTEL, PTLH, &dwc3_pci_intel_swnode) },
451453 { PCI_DEVICE_DATA(INTEL, PTLH_PCH, &dwc3_pci_intel_swnode) },
452454 { PCI_DEVICE_DATA(INTEL, PTLU, &dwc3_pci_intel_swnode) },
drivers/usb/gadget/function/f_hid.c+4−0
@@ -1207,9 +1207,11 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f) · 1206 unmodified lines
12071207 if (!hidg->interval_user_set) {
12081208 hidg_fs_in_ep_desc.bInterval = 10;
12091209 hidg_hs_in_ep_desc.bInterval = 4;
1210+ hidg_ss_in_ep_desc.bInterval = 4;
12101211 } else {
12111212 hidg_fs_in_ep_desc.bInterval = hidg->interval;
12121213 hidg_hs_in_ep_desc.bInterval = hidg->interval;
1214+ hidg_ss_in_ep_desc.bInterval = hidg->interval;
12131215 }
12141216
12151217 hidg_ss_out_comp_desc.wBytesPerInterval =
@@ -1239,9 +1241,11 @@ static int hidg_bind(struct usb_configuration *c, struct usb_function *f) · 23 unmodified lines
12391241 if (!hidg->interval_user_set) {
12401242 hidg_fs_out_ep_desc.bInterval = 10;
12411243 hidg_hs_out_ep_desc.bInterval = 4;
1244+ hidg_ss_out_ep_desc.bInterval = 4;
12421245 } else {
12431246 hidg_fs_out_ep_desc.bInterval = hidg->interval;
12441247 hidg_hs_out_ep_desc.bInterval = hidg->interval;
1248+ hidg_ss_out_ep_desc.bInterval = hidg->interval;
12451249 }
12461250 status = usb_assign_descriptors(f,
12471251 hidg_fs_descriptors_intout,
drivers/usb/gadget/function/f_mass_storage.c+10−2
@@ -180,6 +180,7 @@ · 179 unmodified lines
180180 #include <linux/kthread.h>
181181 #include <linux/sched/signal.h>
182182 #include <linux/limits.h>
183+#include <linux/overflow.h>
183184 #include <linux/pagemap.h>
184185 #include <linux/rwsem.h>
185186 #include <linux/slab.h>
@@ -1853,8 +1854,15 @@ static int check_command_size_in_blocks(struct fsg_common *common, · 1667 unmodified lines
18531854 int cmnd_size, enum data_direction data_dir,
18541855 unsigned int mask, int needs_medium, const char *name)
18551856 {
1856− if (common->curlun)
1857− common->data_size_from_cmnd <<= common->curlun->blkbits;
1857+ if (common->curlun) {
1858+ if (check_shl_overflow(common->data_size_from_cmnd,
1859+ common->curlun->blkbits,
1860+ &common->data_size_from_cmnd)) {
1861+ common->phase_error = 1;
1862+ return -EINVAL;
1863+ }
1864+ }
1865+
18581866 return check_command(common, cmnd_size, data_dir,
18591867 mask, needs_medium, name);
18601868 }
drivers/usb/gadget/function/f_ncm.c+80−66
@@ -83,11 +83,6 @@ static inline struct f_ncm *func_to_ncm(struct usb_function *f) · 82 unmodified lines
8383 return container_of(f, struct f_ncm, port.func);
8484 }
8585
86−static inline struct f_ncm_opts *func_to_ncm_opts(struct usb_function *f)
87−{
88− return container_of(f->fi, struct f_ncm_opts, func_inst);
89−}
90−
9186 /*-------------------------------------------------------------------------*/
9287
9388 /*
@@ -864,7 +859,6 @@ invalid: · 770 unmodified lines
864859 static int ncm_set_alt(struct usb_function *f, unsigned intf, unsigned alt)
865860 {
866861 struct f_ncm *ncm = func_to_ncm(f);
867− struct f_ncm_opts *opts = func_to_ncm_opts(f);
868862 struct usb_composite_dev *cdev = f->config->cdev;
869863
870864 /* Control interface has only altsetting 0 */
@@ -887,13 +881,12 @@ static int ncm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) · 16 unmodified lines
887881 if (alt > 1)
888882 goto fail;
889883
890− scoped_guard(mutex, &opts->lock)
891− if (opts->net) {
892− DBG(cdev, "reset ncm\n");
893− opts->net = NULL;
894− gether_disconnect(&ncm->port);
895− ncm_reset_values(ncm);
896− }
884+ if (ncm->netdev) {
885+ DBG(cdev, "reset ncm\n");
886+ ncm->netdev = NULL;
887+ gether_disconnect(&ncm->port);
888+ ncm_reset_values(ncm);
889+ }
897890
898891 /*
899892 * CDC Network only sends data in non-default altsettings.
@@ -926,8 +919,7 @@ static int ncm_set_alt(struct usb_function *f, unsigned intf, unsigned alt) · 26 unmodified lines
926919 net = gether_connect(&ncm->port);
927920 if (IS_ERR(net))
928921 return PTR_ERR(net);
929− scoped_guard(mutex, &opts->lock)
930− opts->net = net;
922+ ncm->netdev = net;
931923 }
932924
933925 spin_lock(&ncm->lock);
@@ -1374,16 +1366,14 @@ err: · 440 unmodified lines
13741366 static void ncm_disable(struct usb_function *f)
13751367 {
13761368 struct f_ncm *ncm = func_to_ncm(f);
1377− struct f_ncm_opts *opts = func_to_ncm_opts(f);
13781369 struct usb_composite_dev *cdev = f->config->cdev;
13791370
13801371 DBG(cdev, "ncm deactivated\n");
13811372
1382− scoped_guard(mutex, &opts->lock)
1383− if (opts->net) {
1384− opts->net = NULL;
1385− gether_disconnect(&ncm->port);
1386− }
1373+ if (ncm->netdev) {
1374+ ncm->netdev = NULL;
1375+ gether_disconnect(&ncm->port);
1376+ }
13871377
13881378 if (ncm->notify->enabled) {
13891379 usb_ep_disable(ncm->notify);
@@ -1443,44 +1433,41 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) · 53 unmodified lines
14431433 {
14441434 struct usb_composite_dev *cdev = c->cdev;
14451435 struct f_ncm *ncm = func_to_ncm(f);
1446− struct f_ncm_opts *ncm_opts = func_to_ncm_opts(f);
14471436 struct usb_string *us;
14481437 int status = 0;
14491438 struct usb_ep *ep;
1439+ struct f_ncm_opts *ncm_opts;
14501440
14511441 struct usb_os_desc_table *os_desc_table __free(kfree) = NULL;
1452− struct net_device *netdev __free(free_gether_netdev) = NULL;
1442+ struct net_device *net __free(detach_gadget) = NULL;
14531443 struct usb_request *request __free(free_usb_request) = NULL;
14541444
14551445 if (!can_support_ecm(cdev->gadget))
14561446 return -EINVAL;
14571447
1448+ ncm_opts = container_of(f->fi, struct f_ncm_opts, func_inst);
1449+
14581450 if (cdev->use_os_string) {
14591451 os_desc_table = kzalloc(sizeof(*os_desc_table), GFP_KERNEL);
14601452 if (!os_desc_table)
14611453 return -ENOMEM;
14621454 }
14631455
1464− netdev = gether_setup_default();
1465− if (IS_ERR(netdev))
1466− return -ENOMEM;
1467−
1468− scoped_guard(mutex, &ncm_opts->lock) {
1469− gether_apply_opts(netdev, &ncm_opts->net_opts);
1470− netdev->mtu = ncm_opts->max_segment_size - ETH_HLEN;
1471− }
1472−
1473− gether_set_gadget(netdev, cdev->gadget);
1474− status = gether_register_netdev(netdev);
1475− if (status)
1476− return status;
1456+ scoped_guard(mutex, &ncm_opts->lock)
1457+ if (ncm_opts->bind_count == 0) {
1458+ if (!device_is_registered(&ncm_opts->net->dev)) {
1459+ ncm_opts->net->mtu = (ncm_opts->max_segment_size - ETH_HLEN);
1460+ gether_set_gadget(ncm_opts->net, cdev->gadget);
1461+ status = gether_register_netdev(ncm_opts->net);
1462+ } else
1463+ status = gether_attach_gadget(ncm_opts->net, cdev->gadget);
1464+
1465+ if (status)
1466+ return status;
1467+ net = ncm_opts->net;
1468+ }
14771469
1478− /* export host's Ethernet address in CDC format */
1479− status = gether_get_host_addr_cdc(netdev, ncm->ethaddr,
1480− sizeof(ncm->ethaddr));
1481− if (status < 12)
1482− return -EINVAL;
1483− ncm_string_defs[STRING_MAC_IDX].s = ncm->ethaddr;
1470+ ncm_string_defs[1].s = ncm->ethaddr;
14841471
14851472 us = usb_gstrings_attach(cdev, ncm_strings,
14861473 ARRAY_SIZE(ncm_string_defs));
@@ -1578,8 +1565,9 @@ static int ncm_bind(struct usb_configuration *c, struct usb_function *f) · 91 unmodified lines
15781565 f->os_desc_n = 1;
15791566 }
15801567 ncm->notify_req = no_free_ptr(request);
1581− ncm->netdev = no_free_ptr(netdev);
1582− ncm->port.ioport = netdev_priv(ncm->netdev);
1568+
1569+ ncm_opts->bind_count++;
1570+ retain_and_null_ptr(net);
15831571
15841572 DBG(cdev, "CDC Network: IN/%s OUT/%s NOTIFY/%s\n",
15851573 ncm->port.in_ep->name, ncm->port.out_ep->name,
@@ -1594,19 +1582,19 @@ static inline struct f_ncm_opts *to_f_ncm_opts(struct config_item *item) · 8 unmodified lines
15941582 }
15951583
15961584 /* f_ncm_item_ops */
1597−USB_ETHER_OPTS_ITEM(ncm);
1585+USB_ETHERNET_CONFIGFS_ITEM(ncm);
15981586
15991587 /* f_ncm_opts_dev_addr */
1600−USB_ETHER_OPTS_ATTR_DEV_ADDR(ncm);
1588+USB_ETHERNET_CONFIGFS_ITEM_ATTR_DEV_ADDR(ncm);
16011589
16021590 /* f_ncm_opts_host_addr */
1603−USB_ETHER_OPTS_ATTR_HOST_ADDR(ncm);
1591+USB_ETHERNET_CONFIGFS_ITEM_ATTR_HOST_ADDR(ncm);
16041592
16051593 /* f_ncm_opts_qmult */
1606−USB_ETHER_OPTS_ATTR_QMULT(ncm);
1594+USB_ETHERNET_CONFIGFS_ITEM_ATTR_QMULT(ncm);
16071595
16081596 /* f_ncm_opts_ifname */
1609−USB_ETHER_OPTS_ATTR_IFNAME(ncm);
1597+USB_ETHERNET_CONFIGFS_ITEM_ATTR_IFNAME(ncm);
16101598
16111599 static ssize_t ncm_opts_max_segment_size_show(struct config_item *item,
16121600 char *page)
@@ -1672,27 +1660,34 @@ static void ncm_free_inst(struct usb_function_instance *f) · 59 unmodified lines
16721660 struct f_ncm_opts *opts;
16731661
16741662 opts = container_of(f, struct f_ncm_opts, func_inst);
1663+ if (device_is_registered(&opts->net->dev))
1664+ gether_cleanup(netdev_priv(opts->net));
1665+ else
1666+ free_netdev(opts->net);
16751667 kfree(opts->ncm_interf_group);
16761668 kfree(opts);
16771669 }
16781670
16791671 static struct usb_function_instance *ncm_alloc_inst(void)
16801672 {
1681− struct usb_function_instance *ret;
1673+ struct f_ncm_opts *opts;
16821674 struct usb_os_desc *descs[1];
16831675 char *names[1];
16841676 struct config_group *ncm_interf_group;
16851677
1686− struct f_ncm_opts *opts __free(kfree) = kzalloc_obj(*opts);
1678+ opts = kzalloc_obj(*opts);
16871679 if (!opts)
16881680 return ERR_PTR(-ENOMEM);
1689−
1690− opts->net = NULL;
16911681 opts->ncm_os_desc.ext_compat_id = opts->ncm_ext_compat_id;
1692− gether_setup_opts_default(&opts->net_opts, "usb");
16931682
16941683 mutex_init(&opts->lock);
16951684 opts->func_inst.free_func_inst = ncm_free_inst;
1685+ opts->net = gether_setup_default();
1686+ if (IS_ERR(opts->net)) {
1687+ struct net_device *net = opts->net;
1688+ kfree(opts);
1689+ return ERR_CAST(net);
1690+ }
16961691 opts->max_segment_size = ETH_FRAME_LEN;
16971692 INIT_LIST_HEAD(&opts->ncm_os_desc.ext_prop);
16981693
@@ -1703,30 +1698,37 @@ static struct usb_function_instance *ncm_alloc_inst(void) · 4 unmodified lines
17031698 ncm_interf_group =
17041699 usb_os_desc_prepare_interf_dir(&opts->func_inst.group, 1, descs,
17051700 names, THIS_MODULE);
1706− if (IS_ERR(ncm_interf_group))
1701+ if (IS_ERR(ncm_interf_group)) {
1702+ ncm_free_inst(&opts->func_inst);
17071703 return ERR_CAST(ncm_interf_group);
1704+ }
17081705 opts->ncm_interf_group = ncm_interf_group;
17091706
1710− ret = &opts->func_inst;
1711− retain_and_null_ptr(opts);
1712− return ret;
1707+ return &opts->func_inst;
17131708 }
17141709
17151710 static void ncm_free(struct usb_function *f)
17161711 {
1717− struct f_ncm_opts *opts = func_to_ncm_opts(f);
1712+ struct f_ncm *ncm;
1713+ struct f_ncm_opts *opts;
17181714
1719− scoped_guard(mutex, &opts->lock)
1720− opts->refcnt--;
1721− kfree(func_to_ncm(f));
1715+ ncm = func_to_ncm(f);
1716+ opts = container_of(f->fi, struct f_ncm_opts, func_inst);
1717+ kfree(ncm);
1718+ mutex_lock(&opts->lock);
1719+ opts->refcnt--;
1720+ mutex_unlock(&opts->lock);
17221721 }
17231722
17241723 static void ncm_unbind(struct usb_configuration *c, struct usb_function *f)
17251724 {
17261725 struct f_ncm *ncm = func_to_ncm(f);
1726+ struct f_ncm_opts *ncm_opts;
17271727
17281728 DBG(c->cdev, "ncm unbind\n");
17291729
1730+ ncm_opts = container_of(f->fi, struct f_ncm_opts, func_inst);
1731+
17301732 hrtimer_cancel(&ncm->task_timer);
17311733
17321734 kfree(f->os_desc_table);
@@ -1743,14 +1745,16 @@ static void ncm_unbind(struct usb_configuration *c, struct usb_function *f) · 10 unmodified lines
17431745 kfree(ncm->notify_req->buf);
17441746 usb_ep_free_request(ncm->notify, ncm->notify_req);
17451747
1746− ncm->port.ioport = NULL;
1747− gether_cleanup(netdev_priv(ncm->netdev));
1748+ ncm_opts->bind_count--;
1749+ if (ncm_opts->bind_count == 0)
1750+ gether_detach_gadget(ncm_opts->net);
17481751 }
17491752
17501753 static struct usb_function *ncm_alloc(struct usb_function_instance *fi)
17511754 {
17521755 struct f_ncm *ncm;
17531756 struct f_ncm_opts *opts;
1757+ int status;
17541758
17551759 /* allocate and initialize one new instance */
17561760 ncm = kzalloc(sizeof(*ncm), GFP_KERNEL);
@@ -1758,12 +1762,22 @@ static struct usb_function *ncm_alloc(struct usb_function_instance *fi) · 1 unmodified line
17581762 return ERR_PTR(-ENOMEM);
17591763
17601764 opts = container_of(fi, struct f_ncm_opts, func_inst);
1765+ mutex_lock(&opts->lock);
1766+ opts->refcnt++;
17611767
1762− scoped_guard(mutex, &opts->lock)
1763− opts->refcnt++;
1768+ /* export host's Ethernet address in CDC format */
1769+ status = gether_get_host_addr_cdc(opts->net, ncm->ethaddr,
1770+ sizeof(ncm->ethaddr));
1771+ if (status < 12) { /* strlen("01234567890a") */
1772+ kfree(ncm);
1773+ mutex_unlock(&opts->lock);
1774+ return ERR_PTR(-EINVAL);
1775+ }
17641776
17651777 spin_lock_init(&ncm->lock);
17661778 ncm_reset_values(ncm);
1779+ ncm->port.ioport = netdev_priv(opts->net);
1780+ mutex_unlock(&opts->lock);
17671781 ncm->port.is_fixed = true;
17681782 ncm->port.supports_multi_frame = true;
17691783
drivers/usb/gadget/function/f_tcm.c+14−0
@@ -1222,6 +1222,13 @@ static void usbg_submit_cmd(struct usbg_cmd *cmd) · 1221 unmodified lines
12221222 se_cmd = &cmd->se_cmd;
12231223 tpg = cmd->fu->tpg;
12241224 tv_nexus = tpg->tpg_nexus;
1225+ if (!tv_nexus) {
1226+ struct usb_gadget *gadget = fuas_to_gadget(cmd->fu);
1227+
1228+ dev_err(&gadget->dev, "Missing nexus, ignoring command\n");
1229+ return;
1230+ }
1231+
12251232 dir = get_cmd_dir(cmd->cmd_buf);
12261233 if (dir < 0)
12271234 goto out;
@@ -1483,6 +1490,13 @@ static void bot_cmd_work(struct work_struct *work) · 255 unmodified lines
14831490 se_cmd = &cmd->se_cmd;
14841491 tpg = cmd->fu->tpg;
14851492 tv_nexus = tpg->tpg_nexus;
1493+ if (!tv_nexus) {
1494+ struct usb_gadget *gadget = fuas_to_gadget(cmd->fu);
1495+
1496+ dev_err(&gadget->dev, "Missing nexus, ignoring command\n");
1497+ return;
1498+ }
1499+
14861500 dir = get_cmd_dir(cmd->cmd_buf);
14871501 if (dir < 0)
14881502 goto out;
drivers/usb/gadget/function/u_ether.c+22−45
@@ -897,6 +897,28 @@ void gether_set_gadget(struct net_device *net, struct usb_gadget *g) · 896 unmodified lines
897897 }
898898 EXPORT_SYMBOL_GPL(gether_set_gadget);
899899
900+int gether_attach_gadget(struct net_device *net, struct usb_gadget *g)
901+{
902+ int ret;
903+
904+ ret = device_move(&net->dev, &g->dev, DPM_ORDER_DEV_AFTER_PARENT);
905+ if (ret)
906+ return ret;
907+
908+ gether_set_gadget(net, g);
909+ return 0;
910+}
911+EXPORT_SYMBOL_GPL(gether_attach_gadget);
912+
913+void gether_detach_gadget(struct net_device *net)
914+{
915+ struct eth_dev *dev = netdev_priv(net);
916+
917+ device_move(&net->dev, NULL, DPM_ORDER_NONE);
918+ dev->gadget = NULL;
919+}
920+EXPORT_SYMBOL_GPL(gether_detach_gadget);
921+
900922 int gether_set_dev_addr(struct net_device *net, const char *dev_addr)
901923 {
902924 struct eth_dev *dev;
@@ -1040,36 +1062,6 @@ int gether_set_ifname(struct net_device *net, const char *name, int len) · 137 unmodified lines
10401062 }
10411063 EXPORT_SYMBOL_GPL(gether_set_ifname);
10421064
1043−void gether_setup_opts_default(struct gether_opts *opts, const char *name)
1044−{
1045− opts->qmult = QMULT_DEFAULT;
1046− snprintf(opts->name, sizeof(opts->name), "%s%%d", name);
1047− eth_random_addr(opts->dev_mac);
1048− opts->addr_assign_type = NET_ADDR_RANDOM;
1049− eth_random_addr(opts->host_mac);
1050−}
1051−EXPORT_SYMBOL_GPL(gether_setup_opts_default);
1052−
1053−void gether_apply_opts(struct net_device *net, struct gether_opts *opts)
1054−{
1055− struct eth_dev *dev = netdev_priv(net);
1056−
1057− dev->qmult = opts->qmult;
1058−
1059− if (opts->ifname_set) {
1060− strscpy(net->name, opts->name, sizeof(net->name));
1061− dev->ifname_set = true;
1062− }
1063−
1064− memcpy(dev->host_mac, opts->host_mac, sizeof(dev->host_mac));
1065−
1066− if (opts->addr_assign_type == NET_ADDR_SET) {
1067− memcpy(dev->dev_mac, opts->dev_mac, sizeof(dev->dev_mac));
1068− net->addr_assign_type = opts->addr_assign_type;
1069− }
1070−}
1071−EXPORT_SYMBOL_GPL(gether_apply_opts);
1072−
10731065 void gether_suspend(struct gether *link)
10741066 {
10751067 struct eth_dev *dev = link->ioport;
@@ -1126,21 +1118,6 @@ void gether_cleanup(struct eth_dev *dev) · 50 unmodified lines
11261118 }
11271119 EXPORT_SYMBOL_GPL(gether_cleanup);
11281120
1129−void gether_unregister_free_netdev(struct net_device *net)
1130−{
1131− if (!net)
1132− return;
1133−
1134− struct eth_dev *dev = netdev_priv(net);
1135−
1136− if (net->reg_state == NETREG_REGISTERED) {
1137− unregister_netdev(net);
1138− flush_work(&dev->work);
1139− }
1140− free_netdev(net);
1141−}
1142−EXPORT_SYMBOL_GPL(gether_unregister_free_netdev);
1143−
11441121 /**
11451122 * gether_connect - notify network layer that USB link is active
11461123 * @link: the USB link, set up with endpoints, descriptors matching
drivers/usb/gadget/function/u_ether.h+26−30
@@ -38,31 +38,6 @@ · 37 unmodified lines
3838
3939 struct eth_dev;
4040
41−/**
42− * struct gether_opts - Options for Ethernet gadget function instances
43− * @name: Pattern for the network interface name (e.g., "usb%d").
44− * Used to generate the net device name.
45− * @qmult: Queue length multiplier for high/super speed.
46− * @host_mac: The MAC address to be used by the host side.
47− * @dev_mac: The MAC address to be used by the device side.
48− * @ifname_set: True if the interface name pattern has been set by userspace.
49− * @addr_assign_type: The method used for assigning the device MAC address
50− * (e.g., NET_ADDR_RANDOM, NET_ADDR_SET).
51− *
52− * This structure caches network-related settings provided through configfs
53− * before the net_device is fully instantiated. This allows for early
54− * configuration while deferring net_device allocation until the function
55− * is bound.
56− */
57−struct gether_opts {
58− char name[IFNAMSIZ];
59− unsigned int qmult;
60− u8 host_mac[ETH_ALEN];
61− u8 dev_mac[ETH_ALEN];
62− bool ifname_set;
63− unsigned char addr_assign_type;
64−};
65−
6641 /*
6742 * This represents the USB side of an "ethernet" link, managed by a USB
6843 * function which provides control and (maybe) framing. Two functions
@@ -175,6 +150,32 @@ static inline struct net_device *gether_setup_default(void) · 106 unmodified lines
175150 */
176151 void gether_set_gadget(struct net_device *net, struct usb_gadget *g);
177152
153+/**
154+ * gether_attach_gadget - Reparent net_device to the gadget device.
155+ * @net: The network device to reparent.
156+ * @g: The target USB gadget device to parent to.
157+ *
158+ * This function moves the network device to be a child of the USB gadget
159+ * device in the device hierarchy. This is typically done when the function
160+ * is bound to a configuration.
161+ *
162+ * Returns 0 on success, or a negative error code on failure.
163+ */
164+int gether_attach_gadget(struct net_device *net, struct usb_gadget *g);
165+
166+/**
167+ * gether_detach_gadget - Detach net_device from its gadget parent.
168+ * @net: The network device to detach.
169+ *
170+ * This function moves the network device to be a child of the virtual
171+ * devices parent, effectively detaching it from the USB gadget device
172+ * hierarchy. This is typically done when the function is unbound
173+ * from a configuration but the instance is not yet freed.
174+ */
175+void gether_detach_gadget(struct net_device *net);
176+
177+DEFINE_FREE(detach_gadget, struct net_device *, if (_T) gether_detach_gadget(_T))
178+
178179 /**
179180 * gether_set_dev_addr - initialize an ethernet-over-usb link with eth address
180181 * @net: device representing this link
@@ -283,11 +284,6 @@ int gether_get_ifname(struct net_device *net, char *name, int len); · 102 unmodified lines
283284 int gether_set_ifname(struct net_device *net, const char *name, int len);
284285
285286 void gether_cleanup(struct eth_dev *dev);
286−void gether_unregister_free_netdev(struct net_device *net);
287−DEFINE_FREE(free_gether_netdev, struct net_device *, gether_unregister_free_netdev(_T));
288−
289−void gether_setup_opts_default(struct gether_opts *opts, const char *name);
290−void gether_apply_opts(struct net_device *net, struct gether_opts *opts);
291287
292288 void gether_suspend(struct gether *link);
293289 void gether_resume(struct gether *link);
drivers/usb/gadget/function/u_ether_configfs.h+0−177
@@ -13,13 +13,6 @@ · 12 unmodified lines
1313 #ifndef __U_ETHER_CONFIGFS_H
1414 #define __U_ETHER_CONFIGFS_H
1515
16−#include <linux/cleanup.h>
17−#include <linux/hex.h>
18−#include <linux/if_ether.h>
19−#include <linux/mutex.h>
20−#include <linux/netdevice.h>
21−#include <linux/rtnetlink.h>
22−
2316 #define USB_ETHERNET_CONFIGFS_ITEM(_f_) \
2417 static void _f_##_attr_release(struct config_item *item) \
2518 { \
@@ -204,174 +197,4 @@ out: \ · 178 unmodified lines
204197 \
205198 CONFIGFS_ATTR(_f_##_opts_, _n_)
206199
207−#define USB_ETHER_OPTS_ITEM(_f_) \
208− static void _f_##_attr_release(struct config_item *item) \
209− { \
210− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
211− \
212− usb_put_function_instance(&opts->func_inst); \
213− } \
214− \
215− static struct configfs_item_operations _f_##_item_ops = { \
216− .release = _f_##_attr_release, \
217− }
218−
219−#define USB_ETHER_OPTS_ATTR_DEV_ADDR(_f_) \
220− static ssize_t _f_##_opts_dev_addr_show(struct config_item *item, \
221− char *page) \
222− { \
223− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
224− \
225− guard(mutex)(&opts->lock); \
226− return sysfs_emit(page, "%pM\n", opts->net_opts.dev_mac); \
227− } \
228− \
229− static ssize_t _f_##_opts_dev_addr_store(struct config_item *item, \
230− const char *page, size_t len) \
231− { \
232− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
233− u8 new_addr[ETH_ALEN]; \
234− const char *p = page; \
235− \
236− guard(mutex)(&opts->lock); \
237− if (opts->refcnt) \
238− return -EBUSY; \
239− \
240− for (int i = 0; i < ETH_ALEN; i++) { \
241− unsigned char num; \
242− if ((*p == '.') || (*p == ':')) \
243− p++; \
244− num = hex_to_bin(*p++) << 4; \
245− num |= hex_to_bin(*p++); \
246− new_addr[i] = num; \
247− } \
248− if (!is_valid_ether_addr(new_addr)) \
249− return -EINVAL; \
250− memcpy(opts->net_opts.dev_mac, new_addr, ETH_ALEN); \
251− opts->net_opts.addr_assign_type = NET_ADDR_SET; \
252− return len; \
253− } \
254− \
255− CONFIGFS_ATTR(_f_##_opts_, dev_addr)
256−
257−#define USB_ETHER_OPTS_ATTR_HOST_ADDR(_f_) \
258− static ssize_t _f_##_opts_host_addr_show(struct config_item *item, \
259− char *page) \
260− { \
261− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
262− \
263− guard(mutex)(&opts->lock); \
264− return sysfs_emit(page, "%pM\n", opts->net_opts.host_mac); \
265− } \
266− \
267− static ssize_t _f_##_opts_host_addr_store(struct config_item *item, \
268− const char *page, size_t len) \
269− { \
270− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
271− u8 new_addr[ETH_ALEN]; \
272− const char *p = page; \
273− \
274− guard(mutex)(&opts->lock); \
275− if (opts->refcnt) \
276− return -EBUSY; \
277− \
278− for (int i = 0; i < ETH_ALEN; i++) { \
279− unsigned char num; \
280− if ((*p == '.') || (*p == ':')) \
281− p++; \
282− num = hex_to_bin(*p++) << 4; \
283− num |= hex_to_bin(*p++); \
284− new_addr[i] = num; \
285− } \
286− if (!is_valid_ether_addr(new_addr)) \
287− return -EINVAL; \
288− memcpy(opts->net_opts.host_mac, new_addr, ETH_ALEN); \
289− return len; \
290− } \
291− \
292− CONFIGFS_ATTR(_f_##_opts_, host_addr)
293−
294−#define USB_ETHER_OPTS_ATTR_QMULT(_f_) \
295− static ssize_t _f_##_opts_qmult_show(struct config_item *item, \
296− char *page) \
297− { \
298− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
299− \
300− guard(mutex)(&opts->lock); \
301− return sysfs_emit(page, "%u\n", opts->net_opts.qmult); \
302− } \
303− \
304− static ssize_t _f_##_opts_qmult_store(struct config_item *item, \
305− const char *page, size_t len) \
306− { \
307− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
308− u32 val; \
309− int ret; \
310− \
311− guard(mutex)(&opts->lock); \
312− if (opts->refcnt) \
313− return -EBUSY; \
314− \
315− ret = kstrtou32(page, 0, &val); \
316− if (ret) \
317− return ret; \
318− \
319− opts->net_opts.qmult = val; \
320− return len; \
321− } \
322− \
323− CONFIGFS_ATTR(_f_##_opts_, qmult)
324−
325−#define USB_ETHER_OPTS_ATTR_IFNAME(_f_) \
326− static ssize_t _f_##_opts_ifname_show(struct config_item *item, \
327− char *page) \
328− { \
329− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
330− const char *name; \
331− \
332− guard(mutex)(&opts->lock); \
333− rtnl_lock(); \
334− if (opts->net_opts.ifname_set) \
335− name = opts->net_opts.name; \
336− else if (opts->net) \
337− name = netdev_name(opts->net); \
338− else \
339− name = "(inactive net_device)"; \
340− rtnl_unlock(); \
341− return sysfs_emit(page, "%s\n", name); \
342− } \
343− \
344− static ssize_t _f_##_opts_ifname_store(struct config_item *item, \
345− const char *page, size_t len) \
346− { \
347− struct f_##_f_##_opts *opts = to_f_##_f_##_opts(item); \
348− char tmp[IFNAMSIZ]; \
349− const char *p; \
350− size_t c_len = len; \
351− \
352− if (c_len > 0 && page[c_len - 1] == '\n') \
353− c_len--; \
354− \
355− if (c_len >= sizeof(tmp)) \
356− return -E2BIG; \
357− \
358− strscpy(tmp, page, c_len + 1); \
359− if (!dev_valid_name(tmp)) \
360− return -EINVAL; \
361− \
362− /* Require exactly one %d */ \
363− p = strchr(tmp, '%'); \
364− if (!p || p[1] != 'd' || strchr(p + 2, '%')) \
365− return -EINVAL; \
366− \
367− guard(mutex)(&opts->lock); \
368− if (opts->refcnt) \
369− return -EBUSY; \
370− strscpy(opts->net_opts.name, tmp, sizeof(opts->net_opts.name)); \
371− opts->net_opts.ifname_set = true; \
372− return len; \
373− } \
374− \
375− CONFIGFS_ATTR(_f_##_opts_, ifname)
376−
377200 #endif /* __U_ETHER_CONFIGFS_H */
drivers/usb/gadget/function/u_ncm.h+1−3
@@ -15,13 +15,11 @@ · 14 unmodified lines
1515
1616 #include <linux/usb/composite.h>
1717
18−#include "u_ether.h"
19−
2018 struct f_ncm_opts {
2119 struct usb_function_instance func_inst;
2220 struct net_device *net;
21+ int bind_count;
2322
24− struct gether_opts net_opts;
2523 struct config_group *ncm_interf_group;
2624 struct usb_os_desc ncm_os_desc;
2725 char ncm_ext_compat_id[16];
drivers/usb/gadget/function/uvc_video.c+1−1
@@ -513,7 +513,7 @@ uvc_video_prep_requests(struct uvc_video *video) · 512 unmodified lines
513513 return;
514514 }
515515
516− interval_duration = 2 << (video->ep->desc->bInterval - 1);
516+ interval_duration = 1 << (video->ep->desc->bInterval - 1);
517517 if (cdev->gadget->speed < USB_SPEED_HIGH)
518518 interval_duration *= 10000;
519519 else
drivers/usb/host/xhci-debugfs.c+9−1
@@ -386,11 +386,19 @@ static const struct file_operations port_fops = { · 385 unmodified lines
386386 static int xhci_portli_show(struct seq_file *s, void *unused)
387387 {
388388 struct xhci_port *port = s->private;
389− struct xhci_hcd *xhci = hcd_to_xhci(port->rhub->hcd);
389+ struct xhci_hcd *xhci;
390390 u32 portli;
391391
392392 portli = readl(&port->port_reg->portli);
393393
394+ /* port without protocol capability isn't added to a roothub */
395+ if (!port->rhub) {
396+ seq_printf(s, "0x%08x\n", portli);
397+ return 0;
398+ }
399+
400+ xhci = hcd_to_xhci(port->rhub->hcd);
401+
394402 /* PORTLI fields are valid if port is a USB3 or eUSB2V2 port */
395403 if (port->rhub == &xhci->usb3_rhub)
396404 seq_printf(s, "0x%08x LEC=%u RLC=%u TLC=%u\n", portli,
drivers/usb/host/xhci-ring.c+1−0
@@ -3195,6 +3195,7 @@ irqreturn_t xhci_irq(struct usb_hcd *hcd) · 3194 unmodified lines
31953195
31963196 if (status & STS_HCE) {
31973197 xhci_warn(xhci, "WARNING: Host Controller Error\n");
3198+ xhci_halt(xhci);
31983199 goto out;
31993200 }
32003201
drivers/usb/host/xhci.c+2−2
@@ -4146,7 +4146,7 @@ int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id) · 4145 unmodified lines
41464146 if (state == 0xffffffff || (xhci->xhc_state & XHCI_STATE_DYING) ||
41474147 (xhci->xhc_state & XHCI_STATE_HALTED)) {
41484148 spin_unlock_irqrestore(&xhci->lock, flags);
4149− kfree(command);
4149+ xhci_free_command(xhci, command);
41504150 return -ENODEV;
41514151 }
41524152
@@ -4154,7 +4154,7 @@ int xhci_disable_slot(struct xhci_hcd *xhci, u32 slot_id) · 1 unmodified line
41544154 slot_id);
41554155 if (ret) {
41564156 spin_unlock_irqrestore(&xhci->lock, flags);
4157− kfree(command);
4157+ xhci_free_command(xhci, command);
41584158 return ret;
41594159 }
41604160 xhci_ring_cmd_db(xhci);
drivers/usb/image/mdc800.c+4−2
@@ -707,7 +707,7 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l · 706 unmodified lines
707707 if (signal_pending (current))
708708 {
709709 mutex_unlock(&mdc800->io_lock);
710− return -EINTR;
710+ return len == left ? -EINTR : len-left;
711711 }
712712
713713 sts=left > (mdc800->out_count-mdc800->out_ptr)?mdc800->out_count-mdc800->out_ptr:left;
@@ -730,9 +730,11 @@ static ssize_t mdc800_device_read (struct file *file, char __user *buf, size_t l · 16 unmodified lines
730730 mutex_unlock(&mdc800->io_lock);
731731 return len-left;
732732 }
733− wait_event_timeout(mdc800->download_wait,
733+ retval = wait_event_timeout(mdc800->download_wait,
734734 mdc800->downloaded,
735735 msecs_to_jiffies(TO_DOWNLOAD_GET_READY));
736+ if (!retval)
737+ usb_kill_urb(mdc800->download_urb);
736738 mdc800->downloaded = 0;
737739 if (mdc800->download_urb->status != 0)
738740 {
drivers/usb/misc/uss720.c+1−1
@@ -736,7 +736,7 @@ static int uss720_probe(struct usb_interface *intf, · 735 unmodified lines
736736 ret = get_1284_register(pp, 0, &reg, GFP_KERNEL);
737737 dev_dbg(&intf->dev, "reg: %7ph\n", priv->reg);
738738 if (ret < 0)
739− return ret;
739+ goto probe_abort;
740740
741741 ret = usb_find_last_int_in_endpoint(interface, &epd);
742742 if (!ret) {
drivers/usb/misc/yurex.c+1−1
@@ -272,6 +272,7 @@ static int yurex_probe(struct usb_interface *interface, const struct usb_device_ · 271 unmodified lines
272272 dev->int_buffer, YUREX_BUF_SIZE, yurex_interrupt,
273273 dev, 1);
274274 dev->urb->transfer_flags |= URB_NO_TRANSFER_DMA_MAP;
275+ dev->bbu = -1;
275276 if (usb_submit_urb(dev->urb, GFP_KERNEL)) {
276277 retval = -EIO;
277278 dev_err(&interface->dev, "Could not submitting URB\n");
@@ -280,7 +281,6 @@ static int yurex_probe(struct usb_interface *interface, const struct usb_device_ · 2 unmodified lines
280281
281282 /* save our data pointer in this interface device */
282283 usb_set_intfdata(interface, dev);
283− dev->bbu = -1;
284284
285285 /* we can register the device now, as it is ready */
286286 retval = usb_register_dev(interface, &yurex_class);
drivers/usb/renesas_usbhs/common.c+9−0
@@ -815,6 +815,15 @@ static void usbhs_remove(struct platform_device *pdev) · 814 unmodified lines
815815
816816 usbhs_platform_call(priv, hardware_exit, pdev);
817817 reset_control_assert(priv->rsts);
818+
819+ /*
820+ * Explicitly free the IRQ to ensure the interrupt handler is
821+ * disabled and synchronized before freeing resources.
822+ * devm_free_irq() calls free_irq() which waits for any running
823+ * ISR to complete, preventing UAF.
824+ */
825+ devm_free_irq(&pdev->dev, priv->irq, priv);
826+
818827 usbhs_mod_remove(priv);
819828 usbhs_fifo_remove(priv);
820829 usbhs_pipe_remove(priv);
drivers/usb/roles/class.c+6−1
@@ -139,9 +139,14 @@ static void *usb_role_switch_match(const struct fwnode_handle *fwnode, const cha · 138 unmodified lines
139139 static struct usb_role_switch *
140140 usb_role_switch_is_parent(struct fwnode_handle *fwnode)
141141 {
142− struct fwnode_handle *parent = fwnode_get_parent(fwnode);
142+ struct fwnode_handle *parent;
143143 struct device *dev;
144144
145+ if (!fwnode_device_is_compatible(fwnode, "usb-b-connector"))
146+ return NULL;
147+
148+ parent = fwnode_get_parent(fwnode);
149+
145150 if (!fwnode_property_present(parent, "usb-role-switch")) {
146151 fwnode_handle_put(parent);
147152 return NULL;
drivers/usb/typec/altmodes/displayport.c+6−1
@@ -100,9 +100,14 @@ static int dp_altmode_configure(struct dp_altmode *dp, u8 con) · 99 unmodified lines
100100 {
101101 u8 pin_assign = 0;
102102 u32 conf;
103+ u32 signal;
103104
104105 /* DP Signalling */
105− conf = (dp->data.conf & DP_CONF_SIGNALLING_MASK) >> DP_CONF_SIGNALLING_SHIFT;
106+ signal = DP_CAP_DP_SIGNALLING(dp->port->vdo) & DP_CAP_DP_SIGNALLING(dp->alt->vdo);
107+ if (dp->plug_prime)
108+ signal &= DP_CAP_DP_SIGNALLING(dp->plug_prime->vdo);
109+
110+ conf = signal << DP_CONF_SIGNALLING_SHIFT;
106111
107112 switch (con) {
108113 case DP_STATUS_CON_DISABLED:
drivers/usb/typec/tcpm/tcpm.c+1−1
@@ -7890,7 +7890,7 @@ struct tcpm_port *tcpm_register_port(struct device *dev, struct tcpc_dev *tcpc) · 7889 unmodified lines
78907890 port->partner_desc.identity = &port->partner_ident;
78917891
78927892 port->role_sw = fwnode_usb_role_switch_get(tcpc->fwnode);
7893− if (IS_ERR_OR_NULL(port->role_sw))
7893+ if (!port->role_sw)
78947894 port->role_sw = usb_role_switch_get(port->dev);
78957895 if (IS_ERR(port->role_sw)) {
78967896 err = PTR_ERR(port->role_sw);
fs/btrfs/disk-io.c+6−1
@@ -3594,7 +3594,6 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device · 3593 unmodified lines
35943594 }
35953595 }
35963596
3597− btrfs_zoned_reserve_data_reloc_bg(fs_info);
35983597 btrfs_free_zone_cache(fs_info);
35993598
36003599 btrfs_check_active_zone_reservation(fs_info);
@@ -3622,6 +3621,12 @@ int __cold open_ctree(struct super_block *sb, struct btrfs_fs_devices *fs_device · 21 unmodified lines
36223621 goto fail_cleaner;
36233622 }
36243623
3624+ /*
3625+ * Starts a transaction, must be called after the transaction kthread
3626+ * is initialized.
3627+ */
3628+ btrfs_zoned_reserve_data_reloc_bg(fs_info);
3629+
36253630 ret = btrfs_read_qgroup_config(fs_info);
36263631 if (ret)
36273632 goto fail_trans_kthread;
fs/btrfs/extent_io.c+1−0
@@ -4507,6 +4507,7 @@ static int try_release_subpage_extent_buffer(struct folio *folio) · 4506 unmodified lines
45074507 */
45084508 if (!test_and_clear_bit(EXTENT_BUFFER_TREE_REF, &eb->bflags)) {
45094509 spin_unlock(&eb->refs_lock);
4510+ rcu_read_lock();
45104511 break;
45114512 }
45124513
fs/btrfs/inode.c+19−0
@@ -6612,6 +6612,25 @@ int btrfs_create_new_inode(struct btrfs_trans_handle *trans, · 6611 unmodified lines
66126612 int ret;
66136613 bool xa_reserved = false;
66146614
6615+ if (!args->orphan && !args->subvol) {
6616+ /*
6617+ * Before anything else, check if we can add the name to the
6618+ * parent directory. We want to avoid a dir item overflow in
6619+ * case we have an existing dir item due to existing name
6620+ * hash collisions. We do this check here before we call
6621+ * btrfs_add_link() down below so that we can avoid a
6622+ * transaction abort (which could be exploited by malicious
6623+ * users).
6624+ *
6625+ * For subvolumes we already do this in btrfs_mksubvol().
6626+ */
6627+ ret = btrfs_check_dir_item_collision(BTRFS_I(dir)->root,
6628+ btrfs_ino(BTRFS_I(dir)),
6629+ name);
6630+ if (ret < 0)
6631+ return ret;
6632+ }
6633+
66156634 path = btrfs_alloc_path();
66166635 if (!path)
66176636 return -ENOMEM;
fs/btrfs/ioctl.c+28−4
@@ -672,6 +672,13 @@ static noinline int create_subvol(struct mnt_idmap *idmap, · 671 unmodified lines
672672 goto out;
673673 }
674674
675+ /*
676+ * Subvolumes have orphans cleaned on first dentry lookup. A new
677+ * subvolume cannot have any orphans, so we should set the bit before we
678+ * add the subvolume dentry to the dentry cache, so that it is in the
679+ * same state as a subvolume after first lookup.
680+ */
681+ set_bit(BTRFS_ROOT_ORPHAN_CLEANUP, &new_root->state);
675682 d_instantiate_new(dentry, new_inode_args.inode);
676683 new_inode_args.inode = NULL;
677684
@@ -3852,6 +3859,25 @@ static long _btrfs_ioctl_set_received_subvol(struct file *file, · 3174 unmodified lines
38523859 goto out;
38533860 }
38543861
3862+ received_uuid_changed = memcmp(root_item->received_uuid, sa->uuid,
3863+ BTRFS_UUID_SIZE);
3864+
3865+ /*
3866+ * Before we attempt to add the new received uuid, check if we have room
3867+ * for it in case there's already an item. If the size of the existing
3868+ * item plus this root's ID (u64) exceeds the maximum item size, we can
3869+ * return here without the need to abort a transaction. If we don't do
3870+ * this check, the btrfs_uuid_tree_add() call below would fail with
3871+ * -EOVERFLOW and result in a transaction abort. Malicious users could
3872+ * exploit this to turn the fs into RO mode.
3873+ */
3874+ if (received_uuid_changed && !btrfs_is_empty_uuid(sa->uuid)) {
3875+ ret = btrfs_uuid_tree_check_overflow(fs_info, sa->uuid,
3876+ BTRFS_UUID_KEY_RECEIVED_SUBVOL);
3877+ if (ret < 0)
3878+ goto out;
3879+ }
3880+
38553881 /*
38563882 * 1 - root item
38573883 * 2 - uuid items (received uuid + subvol uuid)
@@ -3867,15 +3893,12 @@ static long _btrfs_ioctl_set_received_subvol(struct file *file, · 9 unmodified lines
38673893 sa->rtime.sec = ct.tv_sec;
38683894 sa->rtime.nsec = ct.tv_nsec;
38693895
3870− received_uuid_changed = memcmp(root_item->received_uuid, sa->uuid,
3871− BTRFS_UUID_SIZE);
38723896 if (received_uuid_changed &&
38733897 !btrfs_is_empty_uuid(root_item->received_uuid)) {
38743898 ret = btrfs_uuid_tree_remove(trans, root_item->received_uuid,
38753899 BTRFS_UUID_KEY_RECEIVED_SUBVOL,
38763900 btrfs_root_id(root));
38773901 if (unlikely(ret && ret != -ENOENT)) {
3878− btrfs_abort_transaction(trans, ret);
38793902 btrfs_end_transaction(trans);
38803903 goto out;
38813904 }
@@ -3890,7 +3913,8 @@ static long _btrfs_ioctl_set_received_subvol(struct file *file, · 8 unmodified lines
38903913
38913914 ret = btrfs_update_root(trans, fs_info->tree_root,
38923915 &root->root_key, &root->root_item);
3893− if (ret < 0) {
3916+ if (unlikely(ret < 0)) {
3917+ btrfs_abort_transaction(trans, ret);
38943918 btrfs_end_transaction(trans);
38953919 goto out;
38963920 }
fs/btrfs/messages.h+0−3
@@ -28,9 +28,6 @@ void _btrfs_printk(const struct btrfs_fs_info *fs_info, unsigned int level, cons · 27 unmodified lines
2828
2929 #else
3030
31−#define btrfs_printk_in_rcu(fs_info, level, fmt, args...) \
32− btrfs_no_printk(fs_info, fmt, ##args)
33−
3431 #define btrfs_printk_in_rcu(fs_info, level, fmt, args...) \
3532 btrfs_no_printk(fs_info, fmt, ##args)
3633
fs/btrfs/print-tree.c+10−0
@@ -38,6 +38,7 @@ static const struct root_name_map root_map[] = { · 37 unmodified lines
3838 { BTRFS_BLOCK_GROUP_TREE_OBJECTID, "BLOCK_GROUP_TREE" },
3939 { BTRFS_DATA_RELOC_TREE_OBJECTID, "DATA_RELOC_TREE" },
4040 { BTRFS_RAID_STRIPE_TREE_OBJECTID, "RAID_STRIPE_TREE" },
41+ { BTRFS_REMAP_TREE_OBJECTID, "REMAP_TREE" },
4142 };
4243
4344 const char *btrfs_root_name(const struct btrfs_key *key, char *buf)
@@ -415,6 +416,9 @@ static void key_type_string(const struct btrfs_key *key, char *buf, int buf_size · 371 unmodified lines
415416 [BTRFS_UUID_KEY_SUBVOL] = "UUID_KEY_SUBVOL",
416417 [BTRFS_UUID_KEY_RECEIVED_SUBVOL] = "UUID_KEY_RECEIVED_SUBVOL",
417418 [BTRFS_RAID_STRIPE_KEY] = "RAID_STRIPE",
419+ [BTRFS_IDENTITY_REMAP_KEY] = "IDENTITY_REMAP",
420+ [BTRFS_REMAP_KEY] = "REMAP",
421+ [BTRFS_REMAP_BACKREF_KEY] = "REMAP_BACKREF",
418422 };
419423
420424 if (key->type == 0 && key->objectid == BTRFS_FREE_SPACE_OBJECTID)
@@ -435,6 +439,7 @@ void btrfs_print_leaf(const struct extent_buffer *l) · 14 unmodified lines
435439 struct btrfs_extent_data_ref *dref;
436440 struct btrfs_shared_data_ref *sref;
437441 struct btrfs_dev_extent *dev_extent;
442+ struct btrfs_remap_item *remap;
438443 struct btrfs_key key;
439444
440445 if (!l)
@@ -569,6 +574,11 @@ void btrfs_print_leaf(const struct extent_buffer *l) · 128 unmodified lines
569574 print_raid_stripe_key(l, btrfs_item_size(l, i),
570575 btrfs_item_ptr(l, i, struct btrfs_stripe_extent));
571576 break;
577+ case BTRFS_REMAP_KEY:
578+ case BTRFS_REMAP_BACKREF_KEY:
579+ remap = btrfs_item_ptr(l, i, struct btrfs_remap_item);
580+ pr_info("\t\taddress %llu\n", btrfs_remap_address(l, remap));
581+ break;
572582 }
573583 }
574584 }
fs/btrfs/relocation.c+2−0
@@ -4399,6 +4399,8 @@ static int move_existing_remaps(struct btrfs_fs_info *fs_info, · 4398 unmodified lines
43994399
44004400 leaf = path->nodes[0];
44014401 }
4402+
4403+ btrfs_item_key_to_cpu(leaf, &key, path->slots[0]);
44024404 }
44034405
44044406 remap = btrfs_item_ptr(leaf, path->slots[0], struct btrfs_remap_item);
fs/btrfs/space-info.c+4−1
@@ -2194,8 +2194,11 @@ void btrfs_reclaim_sweep(const struct btrfs_fs_info *fs_info) · 2193 unmodified lines
21942194 if (!btrfs_should_periodic_reclaim(space_info))
21952195 continue;
21962196 for (raid = 0; raid < BTRFS_NR_RAID_TYPES; raid++) {
2197− if (do_reclaim_sweep(space_info, raid))
2197+ if (do_reclaim_sweep(space_info, raid)) {
2198+ spin_lock(&space_info->lock);
21982199 btrfs_set_periodic_reclaim_ready(space_info, false);
2200+ spin_unlock(&space_info->lock);
2201+ }
21992202 }
22002203 }
22012204 }
fs/btrfs/transaction.c+16−0
@@ -1905,6 +1905,22 @@ static noinline int create_pending_snapshot(struct btrfs_trans_handle *trans, · 1904 unmodified lines
19051905 ret = btrfs_uuid_tree_add(trans, new_root_item->received_uuid,
19061906 BTRFS_UUID_KEY_RECEIVED_SUBVOL,
19071907 objectid);
1908+ /*
1909+ * We are creating of lot of snapshots of the same root that was
1910+ * received (has a received UUID) and reached a leaf's limit for
1911+ * an item. We can safely ignore this and avoid a transaction
1912+ * abort. A deletion of this snapshot will still work since we
1913+ * ignore if an item with a BTRFS_UUID_KEY_RECEIVED_SUBVOL key
1914+ * is missing (see btrfs_delete_subvolume()). Send/receive will
1915+ * work too since it peeks the first root id from the existing
1916+ * item (it could peek any), and in case it's missing it
1917+ * falls back to search by BTRFS_UUID_KEY_SUBVOL keys.
1918+ * Creation of a snapshot does not require CAP_SYS_ADMIN, so
1919+ * we don't want users triggering transaction aborts, either
1920+ * intentionally or not.
1921+ */
1922+ if (ret == -EOVERFLOW)
1923+ ret = 0;
19081924 if (unlikely(ret && ret != -EEXIST)) {
19091925 btrfs_abort_transaction(trans, ret);
19101926 goto fail;
fs/btrfs/tree-checker.c+1−1
@@ -1284,7 +1284,7 @@ static int check_root_item(struct extent_buffer *leaf, struct btrfs_key *key, · 1283 unmodified lines
12841284 }
12851285 if (unlikely(btrfs_root_drop_level(&ri) >= BTRFS_MAX_LEVEL)) {
12861286 generic_err(leaf, slot,
1287− "invalid root level, have %u expect [0, %u]",
1287+ "invalid root drop_level, have %u expect [0, %u]",
12881288 btrfs_root_drop_level(&ri), BTRFS_MAX_LEVEL - 1);
12891289 return -EUCLEAN;
12901290 }
fs/btrfs/tree-log.c+6−0
@@ -6195,6 +6195,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, · 6194 unmodified lines
61956195 struct btrfs_root *root,
61966196 struct btrfs_log_ctx *ctx)
61976197 {
6198+ const bool orig_log_new_dentries = ctx->log_new_dentries;
61986199 int ret = 0;
61996200
62006201 /*
@@ -6256,7 +6257,11 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, · 55 unmodified lines
62566257 * dir index key range logged for the directory. So we
62576258 * must make sure the deletion is recorded.
62586259 */
6260+ ctx->log_new_dentries = false;
62596261 ret = btrfs_log_inode(trans, inode, LOG_INODE_ALL, ctx);
6262+ if (!ret && ctx->log_new_dentries)
6263+ ret = log_new_dir_dentries(trans, inode, ctx);
6264+
62606265 btrfs_add_delayed_iput(inode);
62616266 if (ret)
62626267 break;
@@ -6291,6 +6296,7 @@ static int log_conflicting_inodes(struct btrfs_trans_handle *trans, · 28 unmodified lines
62916296 break;
62926297 }
62936298
6299+ ctx->log_new_dentries = orig_log_new_dentries;
62946300 ctx->logging_conflict_inodes = false;
62956301 if (ret)
62966302 free_conflicting_inodes(ctx);
fs/btrfs/uuid-tree.c+38−0
@@ -199,6 +199,44 @@ int btrfs_uuid_tree_remove(struct btrfs_trans_handle *trans, const u8 *uuid, u8 · 198 unmodified lines
199199 return 0;
200200 }
201201
202+/*
203+ * Check if we can add one root ID to a UUID key.
204+ * If the key does not yet exists, we can, otherwise only if extended item does
205+ * not exceeds the maximum item size permitted by the leaf size.
206+ *
207+ * Returns 0 on success, negative value on error.
208+ */
209+int btrfs_uuid_tree_check_overflow(struct btrfs_fs_info *fs_info,
210+ const u8 *uuid, u8 type)
211+{
212+ BTRFS_PATH_AUTO_FREE(path);
213+ int ret;
214+ u32 item_size;
215+ struct btrfs_key key;
216+
217+ if (WARN_ON_ONCE(!fs_info->uuid_root))
218+ return -EINVAL;
219+
220+ path = btrfs_alloc_path();
221+ if (!path)
222+ return -ENOMEM;
223+
224+ btrfs_uuid_to_key(uuid, type, &key);
225+ ret = btrfs_search_slot(NULL, fs_info->uuid_root, &key, path, 0, 0);
226+ if (ret < 0)
227+ return ret;
228+ if (ret > 0)
229+ return 0;
230+
231+ item_size = btrfs_item_size(path->nodes[0], path->slots[0]);
232+
233+ if (sizeof(struct btrfs_item) + item_size + sizeof(u64) >
234+ BTRFS_LEAF_DATA_SIZE(fs_info))
235+ return -EOVERFLOW;
236+
237+ return 0;
238+}
239+
202240 static int btrfs_uuid_iter_rem(struct btrfs_root *uuid_root, u8 *uuid, u8 type,
203241 u64 subid)
204242 {
fs/btrfs/uuid-tree.h+2−0
@@ -12,6 +12,8 @@ int btrfs_uuid_tree_add(struct btrfs_trans_handle *trans, const u8 *uuid, u8 typ · 11 unmodified lines
1212 u64 subid);
1313 int btrfs_uuid_tree_remove(struct btrfs_trans_handle *trans, const u8 *uuid, u8 type,
1414 u64 subid);
15+int btrfs_uuid_tree_check_overflow(struct btrfs_fs_info *fs_info,
16+ const u8 *uuid, u8 type);
1517 int btrfs_uuid_tree_iterate(struct btrfs_fs_info *fs_info);
1618 int btrfs_create_uuid_tree(struct btrfs_fs_info *fs_info);
1719 int btrfs_uuid_scan_kthread(void *data);
fs/btrfs/volumes.c+1−1
@@ -3587,7 +3587,7 @@ int btrfs_relocate_chunk(struct btrfs_fs_info *fs_info, u64 chunk_offset, bool v · 3586 unmodified lines
35873587
35883588 /* step one, relocate all the extents inside this chunk */
35893589 btrfs_scrub_pause(fs_info);
3590− ret = btrfs_relocate_block_group(fs_info, chunk_offset, true);
3590+ ret = btrfs_relocate_block_group(fs_info, chunk_offset, verbose);
35913591 btrfs_scrub_continue(fs_info);
35923592 if (ret) {
35933593 /*
fs/btrfs/zoned.c+4−2
@@ -337,7 +337,10 @@ int btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_info) · 336 unmodified lines
337337 if (!btrfs_fs_incompat(fs_info, ZONED))
338338 return 0;
339339
340− mutex_lock(&fs_devices->device_list_mutex);
340+ /*
341+ * No need to take the device_list mutex here, we're still in the mount
342+ * path and devices cannot be added to or removed from the list yet.
343+ */
341344 list_for_each_entry(device, &fs_devices->devices, dev_list) {
342345 /* We can skip reading of zone info for missing devices */
343346 if (!device->bdev)
@@ -347,7 +350,6 @@ int btrfs_get_dev_zone_info_all_devices(struct btrfs_fs_info *fs_info) · 3 unmodified lines
347350 if (ret)
348351 break;
349352 }
350− mutex_unlock(&fs_devices->device_list_mutex);
351353
352354 return ret;
353355 }
fs/ceph/addr.c+0−1
@@ -1326,7 +1326,6 @@ void ceph_process_folio_batch(struct address_space *mapping, · 1325 unmodified lines
13261326 continue;
13271327 } else if (rc == -E2BIG) {
13281328 folio_unlock(folio);
1329− ceph_wbc->fbatch.folios[i] = NULL;
13301329 break;
13311330 }
13321331
fs/ceph/debugfs.c+2−2
@@ -79,7 +79,7 @@ static int mdsc_show(struct seq_file *s, void *p) · 78 unmodified lines
7979 if (req->r_inode) {
8080 seq_printf(s, " #%llx", ceph_ino(req->r_inode));
8181 } else if (req->r_dentry) {
82− struct ceph_path_info path_info;
82+ struct ceph_path_info path_info = {0};
8383 path = ceph_mdsc_build_path(mdsc, req->r_dentry, &path_info, 0);
8484 if (IS_ERR(path))
8585 path = NULL;
@@ -98,7 +98,7 @@ static int mdsc_show(struct seq_file *s, void *p) · 12 unmodified lines
9898 }
9999
100100 if (req->r_old_dentry) {
101− struct ceph_path_info path_info;
101+ struct ceph_path_info path_info = {0};
102102 path = ceph_mdsc_build_path(mdsc, req->r_old_dentry, &path_info, 0);
103103 if (IS_ERR(path))
104104 path = NULL;
fs/ceph/dir.c+15−2
@@ -1339,6 +1339,7 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry) · 1338 unmodified lines
13391339 struct ceph_client *cl = fsc->client;
13401340 struct ceph_mds_client *mdsc = fsc->mdsc;
13411341 struct inode *inode = d_inode(dentry);
1342+ struct ceph_inode_info *ci = ceph_inode(inode);
13421343 struct ceph_mds_request *req;
13431344 bool try_async = ceph_test_mount_opt(fsc, ASYNC_DIROPS);
13441345 struct dentry *dn;
@@ -1363,7 +1364,7 @@ static int ceph_unlink(struct inode *dir, struct dentry *dentry) · 18 unmodified lines
13631364 if (!dn) {
13641365 try_async = false;
13651366 } else {
1366− struct ceph_path_info path_info;
1367+ struct ceph_path_info path_info = {0};
13671368 path = ceph_mdsc_build_path(mdsc, dn, &path_info, 0);
13681369 if (IS_ERR(path)) {
13691370 try_async = false;
@@ -1424,7 +1425,19 @@ retry: · 54 unmodified lines
14241425 * We have enough caps, so we assume that the unlink
14251426 * will succeed. Fix up the target inode and dcache.
14261427 */
1427− drop_nlink(inode);
1428+
1429+ /*
1430+ * Protect the i_nlink update with i_ceph_lock
1431+ * to precent racing against ceph_fill_inode()
1432+ * handling our completion on a worker thread
1433+ * and don't decrement if i_nlink has already
1434+ * been updated to zero by this completion.
1435+ */
1436+ spin_lock(&ci->i_ceph_lock);
1437+ if (inode->i_nlink > 0)
1438+ drop_nlink(inode);
1439+ spin_unlock(&ci->i_ceph_lock);
1440+
14281441 d_delete(dentry);
14291442 } else {
14301443 spin_lock(&fsc->async_unlink_conflict_lock);
fs/ceph/file.c+2−2
@@ -397,7 +397,7 @@ int ceph_open(struct inode *inode, struct file *file) · 396 unmodified lines
397397 if (!dentry) {
398398 do_sync = true;
399399 } else {
400− struct ceph_path_info path_info;
400+ struct ceph_path_info path_info = {0};
401401 path = ceph_mdsc_build_path(mdsc, dentry, &path_info, 0);
402402 if (IS_ERR(path)) {
403403 do_sync = true;
@@ -807,7 +807,7 @@ int ceph_atomic_open(struct inode *dir, struct dentry *dentry, · 403 unmodified lines
807807 if (!dn) {
808808 try_async = false;
809809 } else {
810− struct ceph_path_info path_info;
810+ struct ceph_path_info path_info = {0};
811811 path = ceph_mdsc_build_path(mdsc, dn, &path_info, 0);
812812 if (IS_ERR(path)) {
813813 try_async = false;
fs/ceph/inode.c+1−1
@@ -2551,7 +2551,7 @@ int __ceph_setattr(struct mnt_idmap *idmap, struct inode *inode, · 2550 unmodified lines
25512551 if (!dentry) {
25522552 do_sync = true;
25532553 } else {
2554− struct ceph_path_info path_info;
2554+ struct ceph_path_info path_info = {0};
25552555 path = ceph_mdsc_build_path(mdsc, dentry, &path_info, 0);
25562556 if (IS_ERR(path)) {
25572557 do_sync = true;
fs/ceph/mds_client.c+3−0
@@ -2768,6 +2768,7 @@ retry: · 2767 unmodified lines
27682768 if (ret < 0) {
27692769 dput(parent);
27702770 dput(cur);
2771+ __putname(path);
27712772 return ERR_PTR(ret);
27722773 }
27732774
@@ -2777,6 +2778,7 @@ retry: · 3 unmodified lines
27772778 if (len < 0) {
27782779 dput(parent);
27792780 dput(cur);
2781+ __putname(path);
27802782 return ERR_PTR(len);
27812783 }
27822784 }
@@ -2813,6 +2815,7 @@ retry: · 30 unmodified lines
28132815 * cannot ever succeed. Creating paths that long is
28142816 * possible with Ceph, but Linux cannot use them.
28152817 */
2818+ __putname(path);
28162819 return ERR_PTR(-ENAMETOOLONG);
28172820 }
28182821
fs/nfs/Kconfig+2−1
@@ -87,7 +87,7 @@ config NFS_V4 · 86 unmodified lines
8787 space programs which can be found in the Linux nfs-utils package,
8888 available from http://linux-nfs.org/.
8989
90− If unsure, say Y.
90+ If unsure, say N.
9191
9292 config NFS_SWAP
9393 bool "Provide swap over NFS support"
@@ -100,6 +100,7 @@ config NFS_SWAP · 6 unmodified lines
100100 config NFS_V4_0
101101 bool "NFS client support for NFSv4.0"
102102 depends on NFS_V4
103+ default y
103104 help
104105 This option enables support for minor version 0 of the NFSv4 protocol
105106 (RFC 3530) in the kernel's NFS client.
fs/nfs/nfs3proc.c+6−1
@@ -392,8 +392,13 @@ nfs3_proc_create(struct inode *dir, struct dentry *dentry, struct iattr *sattr, · 391 unmodified lines
392392 if (status != 0)
393393 goto out_release_acls;
394394
395− if (d_alias)
395+ if (d_alias) {
396+ if (d_is_dir(d_alias)) {
397+ status = -EISDIR;
398+ goto out_dput;
399+ }
396400 dentry = d_alias;
401+ }
397402
398403 /* When we created the file with exclusive semantics, make
399404 * sure we set the attributes afterwards. */
fs/nfsd/export.c+54−9
@@ -36,19 +36,30 @@ · 35 unmodified lines
3636 * second map contains a reference to the entry in the first map.
3737 */
3838
39+static struct workqueue_struct *nfsd_export_wq;
40+
3941 #define EXPKEY_HASHBITS 8
4042 #define EXPKEY_HASHMAX (1 << EXPKEY_HASHBITS)
4143 #define EXPKEY_HASHMASK (EXPKEY_HASHMAX -1)
4244
43−static void expkey_put(struct kref *ref)
45+static void expkey_release(struct work_struct *work)
4446 {
45− struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref);
47+ struct svc_expkey *key = container_of(to_rcu_work(work),
48+ struct svc_expkey, ek_rwork);
4649
4750 if (test_bit(CACHE_VALID, &key->h.flags) &&
4851 !test_bit(CACHE_NEGATIVE, &key->h.flags))
4952 path_put(&key->ek_path);
5053 auth_domain_put(key->ek_client);
51− kfree_rcu(key, ek_rcu);
54+ kfree(key);
55+}
56+
57+static void expkey_put(struct kref *ref)
58+{
59+ struct svc_expkey *key = container_of(ref, struct svc_expkey, h.ref);
60+
61+ INIT_RCU_WORK(&key->ek_rwork, expkey_release);
62+ queue_rcu_work(nfsd_export_wq, &key->ek_rwork);
5263 }
5364
5465 static int expkey_upcall(struct cache_detail *cd, struct cache_head *h)
@@ -353,11 +364,13 @@ static void export_stats_destroy(struct export_stats *stats) · 298 unmodified lines
353364 EXP_STATS_COUNTERS_NUM);
354365 }
355366
356−static void svc_export_release(struct rcu_head *rcu_head)
367+static void svc_export_release(struct work_struct *work)
357368 {
358− struct svc_export *exp = container_of(rcu_head, struct svc_export,
359− ex_rcu);
369+ struct svc_export *exp = container_of(to_rcu_work(work),
370+ struct svc_export, ex_rwork);
360371
372+ path_put(&exp->ex_path);
373+ auth_domain_put(exp->ex_client);
361374 nfsd4_fslocs_free(&exp->ex_fslocs);
362375 export_stats_destroy(exp->ex_stats);
363376 kfree(exp->ex_stats);
@@ -369,9 +382,8 @@ static void svc_export_put(struct kref *ref) · 5 unmodified lines
369382 {
370383 struct svc_export *exp = container_of(ref, struct svc_export, h.ref);
371384
372− path_put(&exp->ex_path);
373− auth_domain_put(exp->ex_client);
374− call_rcu(&exp->ex_rcu, svc_export_release);
385+ INIT_RCU_WORK(&exp->ex_rwork, svc_export_release);
386+ queue_rcu_work(nfsd_export_wq, &exp->ex_rwork);
375387 }
376388
377389 static int svc_export_upcall(struct cache_detail *cd, struct cache_head *h)
@@ -1479,6 +1491,36 @@ const struct seq_operations nfs_exports_op = { · 1101 unmodified lines
14791491 .show = e_show,
14801492 };
14811493
1494+/**
1495+ * nfsd_export_wq_init - allocate the export release workqueue
1496+ *
1497+ * Called once at module load. The workqueue runs deferred svc_export and
1498+ * svc_expkey release work scheduled by queue_rcu_work() in the cache put
1499+ * callbacks.
1500+ *
1501+ * Return values:
1502+ * %0: workqueue allocated
1503+ * %-ENOMEM: allocation failed
1504+ */
1505+int nfsd_export_wq_init(void)
1506+{
1507+ nfsd_export_wq = alloc_workqueue("nfsd_export", WQ_UNBOUND, 0);
1508+ if (!nfsd_export_wq)
1509+ return -ENOMEM;
1510+ return 0;
1511+}
1512+
1513+/**
1514+ * nfsd_export_wq_shutdown - drain and free the export release workqueue
1515+ *
1516+ * Called once at module unload. Per-namespace teardown in
1517+ * nfsd_export_shutdown() has already drained all deferred work.
1518+ */
1519+void nfsd_export_wq_shutdown(void)
1520+{
1521+ destroy_workqueue(nfsd_export_wq);
1522+}
1523+
14821524 /*
14831525 * Initialize the exports module.
14841526 */
@@ -1540,6 +1582,9 @@ nfsd_export_shutdown(struct net *net) · 55 unmodified lines
15401582
15411583 cache_unregister_net(nn->svc_expkey_cache, net);
15421584 cache_unregister_net(nn->svc_export_cache, net);
1585+ /* Drain deferred export and expkey release work. */
1586+ rcu_barrier();
1587+ flush_workqueue(nfsd_export_wq);
15431588 cache_destroy_net(nn->svc_expkey_cache, net);
15441589 cache_destroy_net(nn->svc_export_cache, net);
15451590 svcauth_unix_purge(net);
fs/nfsd/export.h+5−2
@@ -7,6 +7,7 @@ · 6 unmodified lines
77
88 #include <linux/sunrpc/cache.h>
99 #include <linux/percpu_counter.h>
10+#include <linux/workqueue.h>
1011 #include <uapi/linux/nfsd/export.h>
1112 #include <linux/nfs4.h>
1213
@@ -75,7 +76,7 @@ struct svc_export { · 62 unmodified lines
7576 u32 ex_layout_types;
7677 struct nfsd4_deviceid_map *ex_devid_map;
7778 struct cache_detail *cd;
78− struct rcu_head ex_rcu;
79+ struct rcu_work ex_rwork;
7980 unsigned long ex_xprtsec_modes;
8081 struct export_stats *ex_stats;
8182 };
@@ -92,7 +93,7 @@ struct svc_expkey { · 10 unmodified lines
9293 u32 ek_fsid[6];
9394
9495 struct path ek_path;
95− struct rcu_head ek_rcu;
96+ struct rcu_work ek_rwork;
9697 };
9798
9899 #define EX_ISSYNC(exp) (!((exp)->ex_flags & NFSEXP_ASYNC))
@@ -110,6 +111,8 @@ __be32 check_nfsd_access(struct svc_export *exp, struct svc_rqst *rqstp, · 11 unmodified lines
110111 /*
111112 * Function declarations
112113 */
114+int nfsd_export_wq_init(void);
115+void nfsd_export_wq_shutdown(void);
113116 int nfsd_export_init(struct net *);
114117 void nfsd_export_shutdown(struct net *);
115118 void nfsd_export_flush(struct net *);
fs/nfsd/nfs4xdr.c+7−2
@@ -6281,9 +6281,14 @@ nfsd4_encode_operation(struct nfsd4_compoundres *resp, struct nfsd4_op *op) · 6280 unmodified lines
62816281 int len = xdr->buf->len - (op_status_offset + XDR_UNIT);
62826282
62836283 so->so_replay.rp_status = op->status;
6284− so->so_replay.rp_buflen = len;
6285− read_bytes_from_xdr_buf(xdr->buf, op_status_offset + XDR_UNIT,
6284+ if (len <= NFSD4_REPLAY_ISIZE) {
6285+ so->so_replay.rp_buflen = len;
6286+ read_bytes_from_xdr_buf(xdr->buf,
6287+ op_status_offset + XDR_UNIT,
62866288 so->so_replay.rp_buf, len);
6289+ } else {
6290+ so->so_replay.rp_buflen = 0;
6291+ }
62876292 }
62886293 status:
62896294 op->status = nfsd4_map_status(op->status,
fs/nfsd/nfsctl.c+19−3
@@ -149,9 +149,19 @@ static int exports_net_open(struct net *net, struct file *file) · 148 unmodified lines
149149
150150 seq = file->private_data;
151151 seq->private = nn->svc_export_cache;
152+ get_net(net);
152153 return 0;
153154 }
154155
156+static int exports_release(struct inode *inode, struct file *file)
157+{
158+ struct seq_file *seq = file->private_data;
159+ struct cache_detail *cd = seq->private;
160+
161+ put_net(cd->net);
162+ return seq_release(inode, file);
163+}
164+
155165 static int exports_nfsd_open(struct inode *inode, struct file *file)
156166 {
157167 return exports_net_open(inode->i_sb->s_fs_info, file);
@@ -161,7 +171,7 @@ static const struct file_operations exports_nfsd_operations = { · 3 unmodified lines
161171 .open = exports_nfsd_open,
162172 .read = seq_read,
163173 .llseek = seq_lseek,
164− .release = seq_release,
174+ .release = exports_release,
165175 };
166176
167177 static int export_features_show(struct seq_file *m, void *v)
@@ -1376,7 +1386,7 @@ static const struct proc_ops exports_proc_ops = { · 1208 unmodified lines
13761386 .proc_open = exports_proc_open,
13771387 .proc_read = seq_read,
13781388 .proc_lseek = seq_lseek,
1379− .proc_release = seq_release,
1389+ .proc_release = exports_release,
13801390 };
13811391
13821392 static int create_proc_exports_entry(void)
@@ -2259,9 +2269,12 @@ static int __init init_nfsd(void) · 876 unmodified lines
22592269 if (retval)
22602270 goto out_free_pnfs;
22612271 nfsd_lockd_init(); /* lockd->nfsd callbacks */
2272+ retval = nfsd_export_wq_init();
2273+ if (retval)
2274+ goto out_free_lockd;
22622275 retval = register_pernet_subsys(&nfsd_net_ops);
22632276 if (retval < 0)
2264− goto out_free_lockd;
2277+ goto out_free_export_wq;
22652278 retval = register_cld_notifier();
22662279 if (retval)
22672280 goto out_free_subsys;
@@ -2290,6 +2303,8 @@ out_free_cld: · 22 unmodified lines
22902303 unregister_cld_notifier();
22912304 out_free_subsys:
22922305 unregister_pernet_subsys(&nfsd_net_ops);
2306+out_free_export_wq:
2307+ nfsd_export_wq_shutdown();
22932308 out_free_lockd:
22942309 nfsd_lockd_shutdown();
22952310 nfsd_drc_slab_free();
@@ -2310,6 +2325,7 @@ static void __exit exit_nfsd(void) · 14 unmodified lines
23102325 nfsd4_destroy_laundry_wq();
23112326 unregister_cld_notifier();
23122327 unregister_pernet_subsys(&nfsd_net_ops);
2328+ nfsd_export_wq_shutdown();
23132329 nfsd_drc_slab_free();
23142330 nfsd_lockd_shutdown();
23152331 nfsd4_free_slabs();
fs/nfsd/state.h+12−5
@@ -541,11 +541,18 @@ struct nfs4_client_reclaim { · 540 unmodified lines
541541 struct xdr_netobj cr_princhash;
542542 };
543543
544−/* A reasonable value for REPLAY_ISIZE was estimated as follows:
545− * The OPEN response, typically the largest, requires
546− * 4(status) + 8(stateid) + 20(changeinfo) + 4(rflags) + 8(verifier) +
547− * 4(deleg. type) + 8(deleg. stateid) + 4(deleg. recall flag) +
548− * 20(deleg. space limit) + ~32(deleg. ace) = 112 bytes
544+/*
545+ * REPLAY_ISIZE is sized for an OPEN response with delegation:
546+ * 4(status) + 8(stateid) + 20(changeinfo) + 4(rflags) +
547+ * 8(verifier) + 4(deleg. type) + 8(deleg. stateid) +
548+ * 4(deleg. recall flag) + 20(deleg. space limit) +
549+ * ~32(deleg. ace) = 112 bytes
550+ *
551+ * Some responses can exceed this. A LOCK denial includes the conflicting
552+ * lock owner, which can be up to 1024 bytes (NFS4_OPAQUE_LIMIT). Responses
553+ * larger than REPLAY_ISIZE are not cached in rp_ibuf; only rp_status is
554+ * saved. Enlarging this constant increases the size of every
555+ * nfs4_stateowner.
549556 */
550557
551558 #define NFSD4_REPLAY_ISIZE 112
fs/smb/client/cifsacl.c+1−1
@@ -1489,7 +1489,7 @@ struct smb_ntsd *get_cifs_acl(struct cifs_sb_info *cifs_sb, · 1488 unmodified lines
14891489 struct cifsFileInfo *open_file = NULL;
14901490
14911491 if (inode)
1492− open_file = find_readable_file(CIFS_I(inode), true);
1492+ open_file = find_readable_file(CIFS_I(inode), FIND_FSUID_ONLY);
14931493 if (!open_file)
14941494 return get_cifs_acl_by_path(cifs_sb, path, pacllen, info);
14951495
fs/smb/client/cifsfs.c+1−1
@@ -1269,7 +1269,7 @@ static int cifs_precopy_set_eof(struct inode *src_inode, struct cifsInodeInfo *s · 1268 unmodified lines
12691269 struct cifsFileInfo *writeable_srcfile;
12701270 int rc = -EINVAL;
12711271
1272− writeable_srcfile = find_writable_file(src_cifsi, FIND_WR_FSUID_ONLY);
1272+ writeable_srcfile = find_writable_file(src_cifsi, FIND_FSUID_ONLY);
12731273 if (writeable_srcfile) {
12741274 if (src_tcon->ses->server->ops->set_file_size)
12751275 rc = src_tcon->ses->server->ops->set_file_size(
fs/smb/client/cifsglob.h+17−6
@@ -20,6 +20,7 @@ · 19 unmodified lines
2020 #include <linux/utsname.h>
2121 #include <linux/sched/mm.h>
2222 #include <linux/netfs.h>
23+#include <linux/fcntl.h>
2324 #include "cifs_fs_sb.h"
2425 #include "cifsacl.h"
2526 #include <crypto/internal/hash.h>
@@ -1884,12 +1885,12 @@ static inline bool is_replayable_error(int error) · 1858 unmodified lines
18841885 }
18851886
18861887
1887−/* cifs_get_writable_file() flags */
1888−enum cifs_writable_file_flags {
1889− FIND_WR_ANY = 0U,
1890− FIND_WR_FSUID_ONLY = (1U << 0),
1891− FIND_WR_WITH_DELETE = (1U << 1),
1892− FIND_WR_NO_PENDING_DELETE = (1U << 2),
1888+enum cifs_find_flags {
1889+ FIND_ANY = 0U,
1890+ FIND_FSUID_ONLY = (1U << 0),
1891+ FIND_WITH_DELETE = (1U << 1),
1892+ FIND_NO_PENDING_DELETE = (1U << 2),
1893+ FIND_OPEN_FLAGS = (1U << 3),
18931894 };
18941895
18951896 #define MID_FREE 0
@@ -2375,4 +2376,14 @@ static inline bool cifs_forced_shutdown(const struct cifs_sb_info *sbi) · 479 unmodified lines
23752376 return cifs_sb_flags(sbi) & CIFS_MOUNT_SHUTDOWN;
23762377 }
23772378
2379+static inline int cifs_open_create_options(unsigned int oflags, int opts)
2380+{
2381+ /* O_SYNC also has bit for O_DSYNC so following check picks up either */
2382+ if (oflags & O_SYNC)
2383+ opts |= CREATE_WRITE_THROUGH;
2384+ if (oflags & O_DIRECT)
2385+ opts |= CREATE_NO_BUFFER;
2386+ return opts;
2387+}
2388+
23782389 #endif /* _CIFS_GLOB_H */
fs/smb/client/cifsproto.h+22−4
@@ -138,12 +138,14 @@ void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, · 137 unmodified lines
138138 ssize_t result);
139139 struct cifsFileInfo *find_writable_file(struct cifsInodeInfo *cifs_inode,
140140 int flags);
141−int cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, int flags,
142− struct cifsFileInfo **ret_file);
141+int __cifs_get_writable_file(struct cifsInodeInfo *cifs_inode,
142+ unsigned int find_flags, unsigned int open_flags,
143+ struct cifsFileInfo **ret_file);
143144 int cifs_get_writable_path(struct cifs_tcon *tcon, const char *name, int flags,
144145 struct cifsFileInfo **ret_file);
145−struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
146− bool fsuid_only);
146+struct cifsFileInfo *__find_readable_file(struct cifsInodeInfo *cifs_inode,
147+ unsigned int find_flags,
148+ unsigned int open_flags);
147149 int cifs_get_readable_path(struct cifs_tcon *tcon, const char *name,
148150 struct cifsFileInfo **ret_file);
149151 int cifs_get_hardlink_path(struct cifs_tcon *tcon, struct inode *inode,
@@ -596,4 +598,20 @@ static inline void cifs_sg_set_buf(struct sg_table *sgtable, · 446 unmodified lines
596598 }
597599 }
598600
601+static inline int cifs_get_writable_file(struct cifsInodeInfo *cifs_inode,
602+ unsigned int find_flags,
603+ struct cifsFileInfo **ret_file)
604+{
605+ find_flags &= ~FIND_OPEN_FLAGS;
606+ return __cifs_get_writable_file(cifs_inode, find_flags, 0, ret_file);
607+}
608+
609+static inline struct cifsFileInfo *
610+find_readable_file(struct cifsInodeInfo *cinode, unsigned int find_flags)
611+{
612+ find_flags &= ~FIND_OPEN_FLAGS;
613+ find_flags |= FIND_NO_PENDING_DELETE;
614+ return __find_readable_file(cinode, find_flags, 0);
615+}
616+
599617 #endif /* _CIFSPROTO_H */
fs/smb/client/dir.c+2−2
@@ -187,7 +187,7 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned · 186 unmodified lines
187187 const char *full_path;
188188 void *page = alloc_dentry_path();
189189 struct inode *newinode = NULL;
190− unsigned int sbflags;
190+ unsigned int sbflags = cifs_sb_flags(cifs_sb);
191191 int disposition;
192192 struct TCP_Server_Info *server = tcon->ses->server;
193193 struct cifs_open_parms oparms;
@@ -308,6 +308,7 @@ static int cifs_do_create(struct inode *inode, struct dentry *direntry, unsigned · 114 unmodified lines
308308 goto out;
309309 }
310310
311+ create_options |= cifs_open_create_options(oflags, create_options);
311312 /*
312313 * if we're not using unix extensions, see if we need to set
313314 * ATTR_READONLY on the create call
@@ -367,7 +368,6 @@ retry_open: · 53 unmodified lines
367368 * If Open reported that we actually created a file then we now have to
368369 * set the mode if possible.
369370 */
370− sbflags = cifs_sb_flags(cifs_sb);
371371 if ((tcon->unix_ext) && (*oplock & CIFS_CREATE_ACTION)) {
372372 struct cifs_unix_set_info_args args = {
373373 .mode = mode,
fs/smb/client/file.c+70−61
@@ -255,7 +255,7 @@ static void cifs_begin_writeback(struct netfs_io_request *wreq) · 254 unmodified lines
255255 struct cifs_io_request *req = container_of(wreq, struct cifs_io_request, rreq);
256256 int ret;
257257
258− ret = cifs_get_writable_file(CIFS_I(wreq->inode), FIND_WR_ANY, &req->cfile);
258+ ret = cifs_get_writable_file(CIFS_I(wreq->inode), FIND_ANY, &req->cfile);
259259 if (ret) {
260260 cifs_dbg(VFS, "No writable handle in writepages ret=%d\n", ret);
261261 return;
@@ -584,15 +584,8 @@ static int cifs_nt_open(const char *full_path, struct inode *inode, struct cifs_ · 322 unmodified lines
584584 *********************************************************************/
585585
586586 disposition = cifs_get_disposition(f_flags);
587−
588587 /* BB pass O_SYNC flag through on file attributes .. BB */
589−
590− /* O_SYNC also has bit for O_DSYNC so following check picks up either */
591− if (f_flags & O_SYNC)
592− create_options |= CREATE_WRITE_THROUGH;
593−
594− if (f_flags & O_DIRECT)
595− create_options |= CREATE_NO_BUFFER;
588+ create_options |= cifs_open_create_options(f_flags, create_options);
596589
597590 retry_open:
598591 oparms = (struct cifs_open_parms) {
@@ -963,7 +956,7 @@ int cifs_file_flush(const unsigned int xid, struct inode *inode, · 364 unmodified lines
963956 return tcon->ses->server->ops->flush(xid, tcon,
964957 &cfile->fid);
965958 }
966− rc = cifs_get_writable_file(CIFS_I(inode), FIND_WR_ANY, &cfile);
959+ rc = cifs_get_writable_file(CIFS_I(inode), FIND_ANY, &cfile);
967960 if (!rc) {
968961 tcon = tlink_tcon(cfile->tlink);
969962 rc = tcon->ses->server->ops->flush(xid, tcon, &cfile->fid);
@@ -988,7 +981,7 @@ static int cifs_do_truncate(const unsigned int xid, struct dentry *dentry) · 18 unmodified lines
988981 return -ERESTARTSYS;
989982 mapping_set_error(inode->i_mapping, rc);
990983
991− cfile = find_writable_file(cinode, FIND_WR_FSUID_ONLY);
984+ cfile = find_writable_file(cinode, FIND_FSUID_ONLY);
992985 rc = cifs_file_flush(xid, inode, cfile);
993986 if (!rc) {
994987 if (cfile) {
@@ -1068,32 +1061,29 @@ int cifs_open(struct inode *inode, struct file *file) · 73 unmodified lines
10681061
10691062 /* Get the cached handle as SMB2 close is deferred */
10701063 if (OPEN_FMODE(file->f_flags) & FMODE_WRITE) {
1071− rc = cifs_get_writable_path(tcon, full_path,
1072− FIND_WR_FSUID_ONLY |
1073− FIND_WR_NO_PENDING_DELETE,
1074− &cfile);
1064+ rc = __cifs_get_writable_file(CIFS_I(inode),
1065+ FIND_FSUID_ONLY |
1066+ FIND_NO_PENDING_DELETE |
1067+ FIND_OPEN_FLAGS,
1068+ file->f_flags, &cfile);
10751069 } else {
1076− rc = cifs_get_readable_path(tcon, full_path, &cfile);
1070+ cfile = __find_readable_file(CIFS_I(inode),
1071+ FIND_NO_PENDING_DELETE |
1072+ FIND_OPEN_FLAGS,
1073+ file->f_flags);
1074+ rc = cfile ? 0 : -ENOENT;
10771075 }
10781076 if (rc == 0) {
1079− unsigned int oflags = file->f_flags & ~(O_CREAT|O_EXCL|O_TRUNC);
1080− unsigned int cflags = cfile->f_flags & ~(O_CREAT|O_EXCL|O_TRUNC);
1081−
1082− if (cifs_convert_flags(oflags, 0) == cifs_convert_flags(cflags, 0) &&
1083− (oflags & (O_SYNC|O_DIRECT)) == (cflags & (O_SYNC|O_DIRECT))) {
1084− file->private_data = cfile;
1085− spin_lock(&CIFS_I(inode)->deferred_lock);
1086− cifs_del_deferred_close(cfile);
1087− spin_unlock(&CIFS_I(inode)->deferred_lock);
1088− goto use_cache;
1089− }
1090− _cifsFileInfo_put(cfile, true, false);
1091− } else {
1092− /* hard link on the defeered close file */
1093− rc = cifs_get_hardlink_path(tcon, inode, file);
1094− if (rc)
1095− cifs_close_deferred_file(CIFS_I(inode));
1096− }
1077+ file->private_data = cfile;
1078+ spin_lock(&CIFS_I(inode)->deferred_lock);
1079+ cifs_del_deferred_close(cfile);
1080+ spin_unlock(&CIFS_I(inode)->deferred_lock);
1081+ goto use_cache;
1082+ }
1083+ /* hard link on the deferred close file */
1084+ rc = cifs_get_hardlink_path(tcon, inode, file);
1085+ if (rc)
1086+ cifs_close_deferred_file(CIFS_I(inode));
10971087
10981088 if (server->oplocks)
10991089 oplock = REQ_OPLOCK;
@@ -1314,13 +1304,8 @@ cifs_reopen_file(struct cifsFileInfo *cfile, bool can_flush) · 214 unmodified lines
13141304 rdwr_for_fscache = 1;
13151305
13161306 desired_access = cifs_convert_flags(cfile->f_flags, rdwr_for_fscache);
1317−
1318− /* O_SYNC also has bit for O_DSYNC so following check picks up either */
1319− if (cfile->f_flags & O_SYNC)
1320− create_options |= CREATE_WRITE_THROUGH;
1321−
1322− if (cfile->f_flags & O_DIRECT)
1323− create_options |= CREATE_NO_BUFFER;
1307+ create_options |= cifs_open_create_options(cfile->f_flags,
1308+ create_options);
13241309
13251310 if (server->ops->get_lease_key)
13261311 server->ops->get_lease_key(inode, &cfile->fid);
@@ -2524,10 +2509,33 @@ void cifs_write_subrequest_terminated(struct cifs_io_subrequest *wdata, ssize_t · 1197 unmodified lines
25242509 netfs_write_subrequest_terminated(&wdata->subreq, result);
25252510 }
25262511
2527−struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode,
2528− bool fsuid_only)
2512+static bool open_flags_match(struct cifsInodeInfo *cinode,
2513+ unsigned int oflags, unsigned int cflags)
2514+{
2515+ struct inode *inode = &cinode->netfs.inode;
2516+ int crw = 0, orw = 0;
2517+
2518+ oflags &= ~(O_CREAT | O_EXCL | O_TRUNC);
2519+ cflags &= ~(O_CREAT | O_EXCL | O_TRUNC);
2520+
2521+ if (cifs_fscache_enabled(inode)) {
2522+ if (OPEN_FMODE(cflags) & FMODE_WRITE)
2523+ crw = 1;
2524+ if (OPEN_FMODE(oflags) & FMODE_WRITE)
2525+ orw = 1;
2526+ }
2527+ if (cifs_convert_flags(oflags, orw) != cifs_convert_flags(cflags, crw))
2528+ return false;
2529+
2530+ return (oflags & (O_SYNC | O_DIRECT)) == (cflags & (O_SYNC | O_DIRECT));
2531+}
2532+
2533+struct cifsFileInfo *__find_readable_file(struct cifsInodeInfo *cifs_inode,
2534+ unsigned int find_flags,
2535+ unsigned int open_flags)
25292536 {
25302537 struct cifs_sb_info *cifs_sb = CIFS_SB(cifs_inode);
2538+ bool fsuid_only = find_flags & FIND_FSUID_ONLY;
25312539 struct cifsFileInfo *open_file = NULL;
25322540
25332541 /* only filter by fsuid on multiuser mounts */
@@ -2541,6 +2549,13 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, · 7 unmodified lines
25412549 list_for_each_entry(open_file, &cifs_inode->openFileList, flist) {
25422550 if (fsuid_only && !uid_eq(open_file->uid, current_fsuid()))
25432551 continue;
2552+ if ((find_flags & FIND_NO_PENDING_DELETE) &&
2553+ open_file->status_file_deleted)
2554+ continue;
2555+ if ((find_flags & FIND_OPEN_FLAGS) &&
2556+ !open_flags_match(cifs_inode, open_flags,
2557+ open_file->f_flags))
2558+ continue;
25442559 if (OPEN_FMODE(open_file->f_flags) & FMODE_READ) {
25452560 if ((!open_file->invalidHandle)) {
25462561 /* found a good file */
@@ -2559,17 +2574,17 @@ struct cifsFileInfo *find_readable_file(struct cifsInodeInfo *cifs_inode, · 12 unmodified lines
25592574 }
25602575
25612576 /* Return -EBADF if no handle is found and general rc otherwise */
2562−int
2563−cifs_get_writable_file(struct cifsInodeInfo *cifs_inode, int flags,
2564− struct cifsFileInfo **ret_file)
2577+int __cifs_get_writable_file(struct cifsInodeInfo *cifs_inode,
2578+ unsigned int find_flags, unsigned int open_flags,
2579+ struct cifsFileInfo **ret_file)
25652580 {
25662581 struct cifsFileInfo *open_file, *inv_file = NULL;
25672582 struct cifs_sb_info *cifs_sb;
25682583 bool any_available = false;
25692584 int rc = -EBADF;
25702585 unsigned int refind = 0;
2571− bool fsuid_only = flags & FIND_WR_FSUID_ONLY;
2572− bool with_delete = flags & FIND_WR_WITH_DELETE;
2586+ bool fsuid_only = find_flags & FIND_FSUID_ONLY;
2587+ bool with_delete = find_flags & FIND_WITH_DELETE;
25732588 *ret_file = NULL;
25742589
25752590 /*
@@ -2603,9 +2618,13 @@ refind_writable: · 27 unmodified lines
26032618 continue;
26042619 if (with_delete && !(open_file->fid.access & DELETE))
26052620 continue;
2606− if ((flags & FIND_WR_NO_PENDING_DELETE) &&
2621+ if ((find_flags & FIND_NO_PENDING_DELETE) &&
26072622 open_file->status_file_deleted)
26082623 continue;
2624+ if ((find_flags & FIND_OPEN_FLAGS) &&
2625+ !open_flags_match(cifs_inode, open_flags,
2626+ open_file->f_flags))
2627+ continue;
26092628 if (OPEN_FMODE(open_file->f_flags) & FMODE_WRITE) {
26102629 if (!open_file->invalidHandle) {
26112630 /* found a good writable file */
@@ -2722,17 +2741,7 @@ cifs_get_readable_path(struct cifs_tcon *tcon, const char *name, · 110 unmodified lines
27222741 cinode = CIFS_I(d_inode(cfile->dentry));
27232742 spin_unlock(&tcon->open_file_lock);
27242743 free_dentry_path(page);
2725− *ret_file = find_readable_file(cinode, 0);
2726− if (*ret_file) {
2727− spin_lock(&cinode->open_file_lock);
2728− if ((*ret_file)->status_file_deleted) {
2729− spin_unlock(&cinode->open_file_lock);
2730− cifsFileInfo_put(*ret_file);
2731− *ret_file = NULL;
2732− } else {
2733− spin_unlock(&cinode->open_file_lock);
2734− }
2735− }
2744+ *ret_file = find_readable_file(cinode, FIND_ANY);
27362745 return *ret_file ? 0 : -ENOENT;
27372746 }
27382747
@@ -2804,7 +2813,7 @@ int cifs_fsync(struct file *file, loff_t start, loff_t end, int datasync) · 65 unmodified lines
28042813 }
28052814
28062815 if ((OPEN_FMODE(smbfile->f_flags) & FMODE_WRITE) == 0) {
2807− smbfile = find_writable_file(CIFS_I(inode), FIND_WR_ANY);
2816+ smbfile = find_writable_file(CIFS_I(inode), FIND_ANY);
28082817 if (smbfile) {
28092818 rc = server->ops->flush(xid, tcon, &smbfile->fid);
28102819 cifsFileInfo_put(smbfile);
fs/smb/client/fs_context.c+1−1
@@ -1997,7 +1997,7 @@ int smb3_init_fs_context(struct fs_context *fc) · 1996 unmodified lines
19971997 ctx->backupuid_specified = false; /* no backup intent for a user */
19981998 ctx->backupgid_specified = false; /* no backup intent for a group */
19991999
2000− ctx->retrans = 1;
2000+ ctx->retrans = 0;
20012001 ctx->reparse_type = CIFS_REPARSE_TYPE_DEFAULT;
20022002 ctx->symlink_type = CIFS_SYMLINK_TYPE_DEFAULT;
20032003 ctx->nonativesocket = 0;
fs/smb/client/inode.c+3−3
@@ -2997,7 +2997,7 @@ int cifs_fiemap(struct inode *inode, struct fiemap_extent_info *fei, u64 start, · 2996 unmodified lines
29972997 }
29982998 }
29992999
3000− cfile = find_readable_file(cifs_i, false);
3000+ cfile = find_readable_file(cifs_i, FIND_ANY);
30013001 if (cfile == NULL)
30023002 return -EINVAL;
30033003
@@ -3050,7 +3050,7 @@ int cifs_file_set_size(const unsigned int xid, struct dentry *dentry, · 46 unmodified lines
30503050 size, false);
30513051 cifs_dbg(FYI, "%s: set_file_size: rc = %d\n", __func__, rc);
30523052 } else {
3053− open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
3053+ open_file = find_writable_file(cifsInode, FIND_FSUID_ONLY);
30543054 if (open_file) {
30553055 tcon = tlink_tcon(open_file->tlink);
30563056 server = tcon->ses->server;
@@ -3219,7 +3219,7 @@ cifs_setattr_unix(struct dentry *direntry, struct iattr *attrs) · 162 unmodified lines
32193219 open_file->fid.netfid,
32203220 open_file->pid);
32213221 } else {
3222− open_file = find_writable_file(cifsInode, FIND_WR_FSUID_ONLY);
3222+ open_file = find_writable_file(cifsInode, FIND_FSUID_ONLY);
32233223 if (open_file) {
32243224 pTcon = tlink_tcon(open_file->tlink);
32253225 rc = CIFSSMBUnixSetFileInfo(xid, pTcon, args,
fs/smb/client/smb1ops.c+1−1
@@ -960,7 +960,7 @@ smb_set_file_info(struct inode *inode, const char *full_path, · 959 unmodified lines
960960 struct cifs_tcon *tcon;
961961
962962 /* if the file is already open for write, just use that fileid */
963− open_file = find_writable_file(cinode, FIND_WR_FSUID_ONLY);
963+ open_file = find_writable_file(cinode, FIND_FSUID_ONLY);
964964
965965 if (open_file) {
966966 fid.netfid = open_file->fid.netfid;
fs/smb/client/smb2inode.c+10−12
@@ -1156,7 +1156,7 @@ smb2_mkdir_setinfo(struct inode *inode, const char *name, · 1155 unmodified lines
11561156 cifs_i = CIFS_I(inode);
11571157 dosattrs = cifs_i->cifsAttrs | ATTR_READONLY;
11581158 data.Attributes = cpu_to_le32(dosattrs);
1159− cifs_get_writable_path(tcon, name, FIND_WR_ANY, &cfile);
1159+ cifs_get_writable_path(tcon, name, FIND_ANY, &cfile);
11601160 oparms = CIFS_OPARMS(cifs_sb, tcon, name, FILE_WRITE_ATTRIBUTES,
11611161 FILE_CREATE, CREATE_NOT_FILE, ACL_NO_MODE);
11621162 tmprc = smb2_compound_op(xid, tcon, cifs_sb, name,
@@ -1336,14 +1336,13 @@ int smb2_rename_path(const unsigned int xid, · 173 unmodified lines
13361336 __u32 co = file_create_options(source_dentry);
13371337
13381338 drop_cached_dir_by_name(xid, tcon, from_name, cifs_sb);
1339− cifs_get_writable_path(tcon, from_name, FIND_WR_WITH_DELETE, &cfile);
1339+ cifs_get_writable_path(tcon, from_name, FIND_WITH_DELETE, &cfile);
13401340
13411341 int rc = smb2_set_path_attr(xid, tcon, from_name, to_name, cifs_sb,
13421342 co, DELETE, SMB2_OP_RENAME, cfile, source_dentry);
13431343 if (rc == -EINVAL) {
13441344 cifs_dbg(FYI, "invalid lease key, resending request without lease");
1345− cifs_get_writable_path(tcon, from_name,
1346− FIND_WR_WITH_DELETE, &cfile);
1345+ cifs_get_writable_path(tcon, from_name, FIND_WITH_DELETE, &cfile);
13471346 rc = smb2_set_path_attr(xid, tcon, from_name, to_name, cifs_sb,
13481347 co, DELETE, SMB2_OP_RENAME, cfile, NULL);
13491348 }
@@ -1377,7 +1376,7 @@ smb2_set_path_size(const unsigned int xid, struct cifs_tcon *tcon, · 27 unmodified lines
13771376
13781377 in_iov.iov_base = &eof;
13791378 in_iov.iov_len = sizeof(eof);
1380− cifs_get_writable_path(tcon, full_path, FIND_WR_ANY, &cfile);
1379+ cifs_get_writable_path(tcon, full_path, FIND_ANY, &cfile);
13811380
13821381 oparms = CIFS_OPARMS(cifs_sb, tcon, full_path, FILE_WRITE_DATA,
13831382 FILE_OPEN, 0, ACL_NO_MODE);
@@ -1387,7 +1386,7 @@ smb2_set_path_size(const unsigned int xid, struct cifs_tcon *tcon, · 3 unmodified lines
13871386 cfile, NULL, NULL, dentry);
13881387 if (rc == -EINVAL) {
13891388 cifs_dbg(FYI, "invalid lease key, resending request without lease");
1390− cifs_get_writable_path(tcon, full_path, FIND_WR_ANY, &cfile);
1389+ cifs_get_writable_path(tcon, full_path, FIND_ANY, &cfile);
13911390 rc = smb2_compound_op(xid, tcon, cifs_sb,
13921391 full_path, &oparms, &in_iov,
13931392 &(int){SMB2_OP_SET_EOF}, 1,
@@ -1417,7 +1416,7 @@ smb2_set_file_info(struct inode *inode, const char *full_path, · 23 unmodified lines
14171416 (buf->LastWriteTime == 0) && (buf->ChangeTime == 0)) {
14181417 if (buf->Attributes == 0)
14191418 goto out; /* would be a no op, no sense sending this */
1420− cifs_get_writable_path(tcon, full_path, FIND_WR_ANY, &cfile);
1419+ cifs_get_writable_path(tcon, full_path, FIND_ANY, &cfile);
14211420 }
14221421
14231422 oparms = CIFS_OPARMS(cifs_sb, tcon, full_path, FILE_WRITE_ATTRIBUTES,
@@ -1476,7 +1475,7 @@ struct inode *smb2_create_reparse_inode(struct cifs_open_info_data *data, · 52 unmodified lines
14761475
14771476 if (tcon->posix_extensions) {
14781477 cmds[1] = SMB2_OP_POSIX_QUERY_INFO;
1479− cifs_get_writable_path(tcon, full_path, FIND_WR_ANY, &cfile);
1478+ cifs_get_writable_path(tcon, full_path, FIND_ANY, &cfile);
14801479 rc = smb2_compound_op(xid, tcon, cifs_sb, full_path, &oparms,
14811480 in_iov, cmds, 2, cfile, out_iov, out_buftype, NULL);
14821481 if (!rc) {
@@ -1485,7 +1484,7 @@ struct inode *smb2_create_reparse_inode(struct cifs_open_info_data *data, · 2 unmodified lines
14851484 }
14861485 } else {
14871486 cmds[1] = SMB2_OP_QUERY_INFO;
1488− cifs_get_writable_path(tcon, full_path, FIND_WR_ANY, &cfile);
1487+ cifs_get_writable_path(tcon, full_path, FIND_ANY, &cfile);
14891488 rc = smb2_compound_op(xid, tcon, cifs_sb, full_path, &oparms,
14901489 in_iov, cmds, 2, cfile, out_iov, out_buftype, NULL);
14911490 if (!rc) {
@@ -1636,13 +1635,12 @@ int smb2_rename_pending_delete(const char *full_path, · 144 unmodified lines
16361635 iov[1].iov_base = utf16_path;
16371636 iov[1].iov_len = sizeof(*utf16_path) * UniStrlen((wchar_t *)utf16_path);
16381637
1639− cifs_get_writable_path(tcon, full_path, FIND_WR_WITH_DELETE, &cfile);
1638+ cifs_get_writable_path(tcon, full_path, FIND_WITH_DELETE, &cfile);
16401639 rc = smb2_compound_op(xid, tcon, cifs_sb, full_path, &oparms, iov,
16411640 cmds, num_cmds, cfile, NULL, NULL, dentry);
16421641 if (rc == -EINVAL) {
16431642 cifs_dbg(FYI, "invalid lease key, resending request without lease\n");
1644− cifs_get_writable_path(tcon, full_path,
1645− FIND_WR_WITH_DELETE, &cfile);
1643+ cifs_get_writable_path(tcon, full_path, FIND_WITH_DELETE, &cfile);
16461644 rc = smb2_compound_op(xid, tcon, cifs_sb, full_path, &oparms, iov,
16471645 cmds, num_cmds, cfile, NULL, NULL, NULL);
16481646 }
fs/smb/client/smb2maperror.c+6−3
@@ -109,6 +109,9 @@ int __init smb2_init_maperror(void) · 108 unmodified lines
109109 }
110110
111111 #if IS_ENABLED(CONFIG_SMB_KUNIT_TESTS)
112+#define EXPORT_SYMBOL_FOR_SMB_TEST(sym) \
113+ EXPORT_SYMBOL_FOR_MODULES(sym, "smb2maperror_test")
114+
112115 /* Previous prototype for eliminating the build warning. */
113116 const struct status_to_posix_error *smb2_get_err_map_test(__u32 smb2_status);
114117
@@ -116,11 +119,11 @@ const struct status_to_posix_error *smb2_get_err_map_test(__u32 smb2_status) · 1 unmodified line
116119 {
117120 return smb2_get_err_map(smb2_status);
118121 }
119−EXPORT_SYMBOL_GPL(smb2_get_err_map_test);
122+EXPORT_SYMBOL_FOR_SMB_TEST(smb2_get_err_map_test);
120123
121124 const struct status_to_posix_error *smb2_error_map_table_test = smb2_error_map_table;
122−EXPORT_SYMBOL_GPL(smb2_error_map_table_test);
125+EXPORT_SYMBOL_FOR_SMB_TEST(smb2_error_map_table_test);
123126
124127 unsigned int smb2_error_map_num = ARRAY_SIZE(smb2_error_map_table);
125−EXPORT_SYMBOL_GPL(smb2_error_map_num);
128+EXPORT_SYMBOL_FOR_SMB_TEST(smb2_error_map_num);
126129 #endif
fs/smb/client/smb2ops.c+14−4
@@ -628,6 +628,7 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf, · 627 unmodified lines
628628 struct smb_sockaddr_in6 *p6;
629629 struct cifs_server_iface *info = NULL, *iface = NULL, *niface = NULL;
630630 struct cifs_server_iface tmp_iface;
631+ __be16 port;
631632 ssize_t bytes_left;
632633 size_t next = 0;
633634 int nb_iface = 0;
@@ -662,6 +663,15 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf, · 28 unmodified lines
662663 goto out;
663664 }
664665
666+ spin_lock(&ses->server->srv_lock);
667+ if (ses->server->dstaddr.ss_family == AF_INET)
668+ port = ((struct sockaddr_in *)&ses->server->dstaddr)->sin_port;
669+ else if (ses->server->dstaddr.ss_family == AF_INET6)
670+ port = ((struct sockaddr_in6 *)&ses->server->dstaddr)->sin6_port;
671+ else
672+ port = cpu_to_be16(CIFS_PORT);
673+ spin_unlock(&ses->server->srv_lock);
674+
665675 while (bytes_left >= (ssize_t)sizeof(*p)) {
666676 memset(&tmp_iface, 0, sizeof(tmp_iface));
667677 /* default to 1Gbps when link speed is unset */
@@ -682,7 +692,7 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf, · 14 unmodified lines
682692 memcpy(&addr4->sin_addr, &p4->IPv4Address, 4);
683693
684694 /* [MS-SMB2] 2.2.32.5.1.1 Clients MUST ignore these */
685− addr4->sin_port = cpu_to_be16(CIFS_PORT);
695+ addr4->sin_port = port;
686696
687697 cifs_dbg(FYI, "%s: ipv4 %pI4\n", __func__,
688698 &addr4->sin_addr);
@@ -696,7 +706,7 @@ parse_server_interfaces(struct network_interface_info_ioctl_rsp *buf, · 7 unmodified lines
696706 /* [MS-SMB2] 2.2.32.5.1.2 Clients MUST ignore these */
697707 addr6->sin6_flowinfo = 0;
698708 addr6->sin6_scope_id = 0;
699− addr6->sin6_port = cpu_to_be16(CIFS_PORT);
709+ addr6->sin6_port = port;
700710
701711 cifs_dbg(FYI, "%s: ipv6 %pI6\n", __func__,
702712 &addr6->sin6_addr);
@@ -3352,7 +3362,7 @@ get_smb2_acl(struct cifs_sb_info *cifs_sb, · 2649 unmodified lines
33523362 struct cifsFileInfo *open_file = NULL;
33533363
33543364 if (inode && !(info & SACL_SECINFO))
3355− open_file = find_readable_file(CIFS_I(inode), true);
3365+ open_file = find_readable_file(CIFS_I(inode), FIND_FSUID_ONLY);
33563366 if (!open_file || (info & SACL_SECINFO))
33573367 return get_smb2_acl_by_path(cifs_sb, path, pacllen, info);
33583368
@@ -3898,7 +3908,7 @@ static loff_t smb3_llseek(struct file *file, struct cifs_tcon *tcon, loff_t offs · 539 unmodified lines
38983908 * some servers (Windows2016) will not reflect recent writes in
38993909 * QUERY_ALLOCATED_RANGES until SMB2_flush is called.
39003910 */
3901− wrcfile = find_writable_file(cifsi, FIND_WR_ANY);
3911+ wrcfile = find_writable_file(cifsi, FIND_ANY);
39023912 if (wrcfile) {
39033913 filemap_write_and_wait(inode->i_mapping);
39043914 smb2_flush_file(xid, tcon, &wrcfile->fid);
fs/smb/client/smb2pdu.c+4−1
@@ -5307,7 +5307,10 @@ replay_again: · 5306 unmodified lines
53075307
53085308 memset(&rqst, 0, sizeof(struct smb_rqst));
53095309 rqst.rq_iov = iov;
5310− rqst.rq_nvec = n_vec + 1;
5310+ /* iov[0] is the SMB header; move payload to rq_iter for encryption safety */
5311+ rqst.rq_nvec = 1;
5312+ iov_iter_kvec(&rqst.rq_iter, ITER_SOURCE, &iov[1], n_vec,
5313+ io_parms->length);
53115314
53125315 if (retries) {
53135316 /* Back-off before retry */
fs/xfs/libxfs/xfs_da_btree.c+2−6
@@ -2716,12 +2716,8 @@ xfs_dabuf_map( · 2715 unmodified lines
27162716 * larger one that needs to be free by the caller.
27172717 */
27182718 if (nirecs > 1) {
2719− map = kzalloc(nirecs * sizeof(struct xfs_buf_map),
2720− GFP_KERNEL | __GFP_NOLOCKDEP | __GFP_NOFAIL);
2721− if (!map) {
2722− error = -ENOMEM;
2723− goto out_free_irecs;
2724− }
2719+ map = kcalloc(nirecs, sizeof(struct xfs_buf_map),
2720+ GFP_KERNEL | __GFP_NOLOCKDEP | __GFP_NOFAIL);
27252721 *mapp = map;
27262722 }
27272723
fs/xfs/libxfs/xfs_defer.c+1−1
@@ -809,7 +809,7 @@ xfs_defer_can_append( · 808 unmodified lines
809809
810810 /* Paused items cannot absorb more work */
811811 if (dfp->dfp_flags & XFS_DEFER_PAUSED)
812− return NULL;
812+ return false;
813813
814814 /* Already full? */
815815 if (ops->max_items && dfp->dfp_count >= ops->max_items)
fs/xfs/xfs_bmap_item.c+1−1
@@ -245,7 +245,7 @@ xfs_bmap_update_diff_items( · 244 unmodified lines
245245 struct xfs_bmap_intent *ba = bi_entry(a);
246246 struct xfs_bmap_intent *bb = bi_entry(b);
247247
248− return ba->bi_owner->i_ino - bb->bi_owner->i_ino;
248+ return cmp_int(ba->bi_owner->i_ino, bb->bi_owner->i_ino);
249249 }
250250
251251 /* Log bmap updates in the intent item. */
fs/xfs/xfs_dquot.c+7−1
@@ -1439,9 +1439,15 @@ xfs_qm_dqflush( · 1438 unmodified lines
14391439 return 0;
14401440
14411441 out_abort:
1442+ /*
1443+ * Shut down the log before removing the dquot item from the AIL.
1444+ * Otherwise, the log tail may advance past this item's LSN while
1445+ * log writes are still in progress, making these unflushed changes
1446+ * unrecoverable on the next mount.
1447+ */
1448+ xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
14421449 dqp->q_flags &= ~XFS_DQFLAG_DIRTY;
14431450 xfs_trans_ail_delete(lip, 0);
1444− xfs_force_shutdown(mp, SHUTDOWN_CORRUPT_INCORE);
14451451 xfs_dqfunlock(dqp);
14461452 return error;
14471453 }
fs/xfs/xfs_healthmon.c+10−7
@@ -141,6 +141,16 @@ xfs_healthmon_detach( · 140 unmodified lines
141141 hm->mount_cookie = DETACHED_MOUNT_COOKIE;
142142 spin_unlock(&xfs_healthmon_lock);
143143
144+ /*
145+ * Wake up any readers that might remain. This can happen if unmount
146+ * races with the healthmon fd owner entering ->read_iter, having
147+ * already emptied the event queue.
148+ *
149+ * In the ->release case there shouldn't be any readers because the
150+ * only users of the waiter are read and poll.
151+ */
152+ wake_up_all(&hm->wait);
153+
144154 trace_xfs_healthmon_detach(hm);
145155 xfs_healthmon_put(hm);
146156 }
@@ -1027,13 +1037,6 @@ xfs_healthmon_release( · 880 unmodified lines
10271037 * process can create another health monitor file.
10281038 */
10291039 xfs_healthmon_detach(hm);
1030−
1031− /*
1032− * Wake up any readers that might be left. There shouldn't be any
1033− * because the only users of the waiter are read and poll.
1034− */
1035− wake_up_all(&hm->wait);
1036−
10371040 xfs_healthmon_put(hm);
10381041 return 0;
10391042 }
fs/xfs/xfs_icache.c+0−1
@@ -159,7 +159,6 @@ xfs_inode_free_callback( · 158 unmodified lines
159159 ASSERT(!test_bit(XFS_LI_IN_AIL,
160160 &ip->i_itemp->ili_item.li_flags));
161161 xfs_inode_item_destroy(ip);
162− ip->i_itemp = NULL;
163162 }
164163
165164 kmem_cache_free(xfs_inode_cache, ip);
fs/xfs/xfs_log.c+2−0
@@ -1357,6 +1357,8 @@ xlog_alloc_log( · 1356 unmodified lines
13571357
13581358 if (xfs_has_logv2(mp) && mp->m_sb.sb_logsunit > 1)
13591359 log->l_iclog_roundoff = mp->m_sb.sb_logsunit;
1360+ else if (mp->m_sb.sb_logsectsize > 0)
1361+ log->l_iclog_roundoff = mp->m_sb.sb_logsectsize;
13601362 else
13611363 log->l_iclog_roundoff = BBSIZE;
13621364
fs/xfs/xfs_zone_gc.c+0−2
@@ -96,7 +96,6 @@ struct xfs_gc_bio { · 95 unmodified lines
9696 */
9797 xfs_fsblock_t old_startblock;
9898 xfs_daddr_t new_daddr;
99− struct xfs_zone_scratch *scratch;
10099
101100 /* Are we writing to a sequential write required zone? */
102101 bool is_seq;
@@ -779,7 +778,6 @@ xfs_zone_gc_split_write( · 676 unmodified lines
779778 ihold(VFS_I(chunk->ip));
780779 split_chunk->ip = chunk->ip;
781780 split_chunk->is_seq = chunk->is_seq;
782− split_chunk->scratch = chunk->scratch;
783781 split_chunk->offset = chunk->offset;
784782 split_chunk->len = split_len;
785783 split_chunk->old_startblock = chunk->old_startblock;
include/linux/build_bug.h+3−1
@@ -32,7 +32,8 @@ · 31 unmodified lines
3232 /**
3333 * BUILD_BUG_ON_MSG - break compile if a condition is true & emit supplied
3434 * error message.
35− * @condition: the condition which the compiler should know is false.
35+ * @cond: the condition which the compiler should know is false.
36+ * @msg: build-time error message
3637 *
3738 * See BUILD_BUG_ON for description.
3839 */
@@ -60,6 +61,7 @@ · 21 unmodified lines
6061
6162 /**
6263 * static_assert - check integer constant expression at build time
64+ * @expr: expression to be checked
6365 *
6466 * static_assert() is a wrapper for the C11 _Static_assert, with a
6567 * little macro magic to make the message optional (defaulting to the
include/linux/etherdevice.h+2−1
@@ -42,7 +42,8 @@ extern const struct header_ops eth_header_ops; · 41 unmodified lines
4242
4343 int eth_header(struct sk_buff *skb, struct net_device *dev, unsigned short type,
4444 const void *daddr, const void *saddr, unsigned len);
45−int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr);
45+int eth_header_parse(const struct sk_buff *skb, const struct net_device *dev,
46+ unsigned char *haddr);
4647 int eth_header_cache(const struct neighbour *neigh, struct hh_cache *hh,
4748 __be16 type);
4849 void eth_header_cache_update(struct hh_cache *hh, const struct net_device *dev,
include/linux/firmware/intel/stratix10-svc-client.h+4−4
@@ -68,12 +68,12 @@ · 67 unmodified lines
6868 * timeout value used in Stratix10 FPGA manager driver.
6969 * timeout value used in RSU driver
7070 */
71−#define SVC_RECONFIG_REQUEST_TIMEOUT_MS 300
72−#define SVC_RECONFIG_BUFFER_TIMEOUT_MS 720
73−#define SVC_RSU_REQUEST_TIMEOUT_MS 300
71+#define SVC_RECONFIG_REQUEST_TIMEOUT_MS 5000
72+#define SVC_RECONFIG_BUFFER_TIMEOUT_MS 5000
73+#define SVC_RSU_REQUEST_TIMEOUT_MS 2000
7474 #define SVC_FCS_REQUEST_TIMEOUT_MS 2000
7575 #define SVC_COMPLETED_TIMEOUT_MS 30000
76−#define SVC_HWMON_REQUEST_TIMEOUT_MS 300
76+#define SVC_HWMON_REQUEST_TIMEOUT_MS 2000
7777
7878 struct stratix10_svc_chan;
7979
include/linux/hid.h+1−0
@@ -682,6 +682,7 @@ struct hid_device { · 681 unmodified lines
682682 __s32 battery_charge_status;
683683 enum hid_battery_status battery_status;
684684 bool battery_avoid_query;
685+ bool battery_present;
685686 ktime_t battery_ratelimit_time;
686687 #endif
687688
include/linux/if_ether.h+2−1
@@ -40,7 +40,8 @@ static inline struct ethhdr *inner_eth_hdr(const struct sk_buff *skb) · 39 unmodified lines
4040 return (struct ethhdr *)skb_inner_mac_header(skb);
4141 }
4242
43−int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr);
43+int eth_header_parse(const struct sk_buff *skb, const struct net_device *dev,
44+ unsigned char *haddr);
4445
4546 extern ssize_t sysfs_format_mac(char *buf, const unsigned char *addr, int len);
4647
include/linux/io_uring_types.h+1−0
@@ -388,6 +388,7 @@ struct io_ring_ctx { · 387 unmodified lines
388388 * regularly bounce b/w CPUs.
389389 */
390390 struct {
391+ struct io_rings __rcu *rings_rcu;
391392 struct llist_head work_llist;
392393 struct llist_head retry_llist;
393394 unsigned long check_cq;
include/linux/kvm_host.h+35−48
@@ -1940,56 +1940,43 @@ enum kvm_stat_kind { · 1939 unmodified lines
19401940
19411941 struct kvm_stat_data {
19421942 struct kvm *kvm;
1943− const struct _kvm_stats_desc *desc;
1943+ const struct kvm_stats_desc *desc;
19441944 enum kvm_stat_kind kind;
19451945 };
19461946
1947−struct _kvm_stats_desc {
1948− struct kvm_stats_desc desc;
1949− char name[KVM_STATS_NAME_SIZE];
1950−};
1951−
1952−#define STATS_DESC_COMMON(type, unit, base, exp, sz, bsz) \
1953− .flags = type | unit | base | \
1954− BUILD_BUG_ON_ZERO(type & ~KVM_STATS_TYPE_MASK) | \
1955− BUILD_BUG_ON_ZERO(unit & ~KVM_STATS_UNIT_MASK) | \
1956− BUILD_BUG_ON_ZERO(base & ~KVM_STATS_BASE_MASK), \
1957− .exponent = exp, \
1958− .size = sz, \
1947+#define STATS_DESC_COMMON(type, unit, base, exp, sz, bsz) \
1948+ .flags = type | unit | base | \
1949+ BUILD_BUG_ON_ZERO(type & ~KVM_STATS_TYPE_MASK) | \
1950+ BUILD_BUG_ON_ZERO(unit & ~KVM_STATS_UNIT_MASK) | \
1951+ BUILD_BUG_ON_ZERO(base & ~KVM_STATS_BASE_MASK), \
1952+ .exponent = exp, \
1953+ .size = sz, \
19591954 .bucket_size = bsz
19601955
1961−#define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1962− { \
1963− { \
1964− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1965− .offset = offsetof(struct kvm_vm_stat, generic.stat) \
1966− }, \
1967− .name = #stat, \
1968− }
1969−#define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1970− { \
1971− { \
1972− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1973− .offset = offsetof(struct kvm_vcpu_stat, generic.stat) \
1974− }, \
1975− .name = #stat, \
1976− }
1977−#define VM_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1978− { \
1979− { \
1980− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1981− .offset = offsetof(struct kvm_vm_stat, stat) \
1982− }, \
1983− .name = #stat, \
1984− }
1985−#define VCPU_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1986− { \
1987− { \
1988− STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1989− .offset = offsetof(struct kvm_vcpu_stat, stat) \
1990− }, \
1991− .name = #stat, \
1992− }
1956+#define VM_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1957+{ \
1958+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1959+ .offset = offsetof(struct kvm_vm_stat, generic.stat), \
1960+ .name = #stat, \
1961+}
1962+#define VCPU_GENERIC_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1963+{ \
1964+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1965+ .offset = offsetof(struct kvm_vcpu_stat, generic.stat), \
1966+ .name = #stat, \
1967+}
1968+#define VM_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1969+{ \
1970+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1971+ .offset = offsetof(struct kvm_vm_stat, stat), \
1972+ .name = #stat, \
1973+}
1974+#define VCPU_STATS_DESC(stat, type, unit, base, exp, sz, bsz) \
1975+{ \
1976+ STATS_DESC_COMMON(type, unit, base, exp, sz, bsz), \
1977+ .offset = offsetof(struct kvm_vcpu_stat, stat), \
1978+ .name = #stat, \
1979+}
19931980 /* SCOPE: VM, VM_GENERIC, VCPU, VCPU_GENERIC */
19941981 #define STATS_DESC(SCOPE, stat, type, unit, base, exp, sz, bsz) \
19951982 SCOPE##_STATS_DESC(stat, type, unit, base, exp, sz, bsz)
@@ -2066,7 +2053,7 @@ struct _kvm_stats_desc { · 70 unmodified lines
20662053 STATS_DESC_IBOOLEAN(VCPU_GENERIC, blocking)
20672054
20682055 ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
2069− const struct _kvm_stats_desc *desc,
2056+ const struct kvm_stats_desc *desc,
20702057 void *stats, size_t size_stats,
20712058 char __user *user_buffer, size_t size, loff_t *offset);
20722059
@@ -2111,9 +2098,9 @@ static inline void kvm_stats_log_hist_update(u64 *data, size_t size, u64 value) · 38 unmodified lines
21112098
21122099
21132100 extern const struct kvm_stats_header kvm_vm_stats_header;
2114−extern const struct _kvm_stats_desc kvm_vm_stats_desc[];
2101+extern const struct kvm_stats_desc kvm_vm_stats_desc[];
21152102 extern const struct kvm_stats_header kvm_vcpu_stats_header;
2116−extern const struct _kvm_stats_desc kvm_vcpu_stats_desc[];
2103+extern const struct kvm_stats_desc kvm_vcpu_stats_desc[];
21172104
21182105 static inline int mmu_invalidate_retry(struct kvm *kvm, unsigned long mmu_seq)
21192106 {
include/linux/netdevice.h+5−4
@@ -311,7 +311,9 @@ struct header_ops { · 310 unmodified lines
311311 int (*create) (struct sk_buff *skb, struct net_device *dev,
312312 unsigned short type, const void *daddr,
313313 const void *saddr, unsigned int len);
314− int (*parse)(const struct sk_buff *skb, unsigned char *haddr);
314+ int (*parse)(const struct sk_buff *skb,
315+ const struct net_device *dev,
316+ unsigned char *haddr);
315317 int (*cache)(const struct neighbour *neigh, struct hh_cache *hh, __be16 type);
316318 void (*cache_update)(struct hh_cache *hh,
317319 const struct net_device *dev,
@@ -2155,6 +2157,7 @@ struct net_device { · 1837 unmodified lines
21552157 unsigned long state;
21562158 unsigned int flags;
21572159 unsigned short hard_header_len;
2160+ enum netdev_stat_type pcpu_stat_type:8;
21582161 netdev_features_t features;
21592162 struct inet6_dev __rcu *ip6_ptr;
21602163 __cacheline_group_end(net_device_read_txrx);
@@ -2404,8 +2407,6 @@ struct net_device { · 243 unmodified lines
24042407 void *ml_priv;
24052408 enum netdev_ml_priv_type ml_priv_type;
24062409
2407− enum netdev_stat_type pcpu_stat_type:8;
2408−
24092410 #if IS_ENABLED(CONFIG_GARP)
24102411 struct garp_port __rcu *garp_port;
24112412 #endif
@@ -3446,7 +3447,7 @@ static inline int dev_parse_header(const struct sk_buff *skb, · 1034 unmodified lines
34463447
34473448 if (!dev->header_ops || !dev->header_ops->parse)
34483449 return 0;
3449− return dev->header_ops->parse(skb, haddr);
3450+ return dev->header_ops->parse(skb, dev, haddr);
34503451 }
34513452
34523453 static inline __be16 dev_parse_header_protocol(const struct sk_buff *skb)
include/linux/nvme-auth.h+1−1
@@ -11,7 +11,7 @@ · 10 unmodified lines
1111 struct nvme_dhchap_key {
1212 size_t len;
1313 u8 hash;
14− u8 key[];
14+ u8 key[] __counted_by(len);
1515 };
1616
1717 u32 nvme_auth_get_seqnum(void);
include/linux/rseq_types.h+5−1
@@ -133,10 +133,12 @@ struct rseq_data { }; · 132 unmodified lines
133133 * @active: MM CID is active for the task
134134 * @cid: The CID associated to the task either permanently or
135135 * borrowed from the CPU
136+ * @node: Queued in the per MM MMCID list
136137 */
137138 struct sched_mm_cid {
138139 unsigned int active;
139140 unsigned int cid;
141+ struct hlist_node node;
140142 };
141143
142144 /**
@@ -157,6 +159,7 @@ struct mm_cid_pcpu { · 14 unmodified lines
157159 * @work: Regular work to handle the affinity mode change case
158160 * @lock: Spinlock to protect against affinity setting which can't take @mutex
159161 * @mutex: Mutex to serialize forks and exits related to this mm
162+ * @user_list: List of the MM CID users of a MM
160163 * @nr_cpus_allowed: The number of CPUs in the per MM allowed CPUs map. The map
161164 * is growth only.
162165 * @users: The number of tasks sharing this MM. Separate from mm::mm_users
@@ -177,13 +180,14 @@ struct mm_mm_cid { · 14 unmodified lines
177180
178181 raw_spinlock_t lock;
179182 struct mutex mutex;
183+ struct hlist_head user_list;
180184
181185 /* Low frequency modified */
182186 unsigned int nr_cpus_allowed;
183187 unsigned int users;
184188 unsigned int pcpu_thrs;
185189 unsigned int update_deferred;
186−}____cacheline_aligned_in_smp;
190+} ____cacheline_aligned;
187191 #else /* CONFIG_SCHED_MM_CID */
188192 struct mm_mm_cid { };
189193 struct sched_mm_cid { };
include/linux/sched.h+0−2
@@ -2354,7 +2354,6 @@ static __always_inline void alloc_tag_restore(struct alloc_tag *tag, struct allo · 2353 unmodified lines
23542354 #ifdef CONFIG_SCHED_MM_CID
23552355 void sched_mm_cid_before_execve(struct task_struct *t);
23562356 void sched_mm_cid_after_execve(struct task_struct *t);
2357−void sched_mm_cid_fork(struct task_struct *t);
23582357 void sched_mm_cid_exit(struct task_struct *t);
23592358 static __always_inline int task_mm_cid(struct task_struct *t)
23602359 {
@@ -2363,7 +2362,6 @@ static __always_inline int task_mm_cid(struct task_struct *t) · 2 unmodified lines
23632362 #else
23642363 static inline void sched_mm_cid_before_execve(struct task_struct *t) { }
23652364 static inline void sched_mm_cid_after_execve(struct task_struct *t) { }
2366−static inline void sched_mm_cid_fork(struct task_struct *t) { }
23672365 static inline void sched_mm_cid_exit(struct task_struct *t) { }
23682366 static __always_inline int task_mm_cid(struct task_struct *t)
23692367 {
include/linux/usb.h+6−2
@@ -1862,14 +1862,18 @@ void usb_free_noncoherent(struct usb_device *dev, size_t size, · 1861 unmodified lines
18621862 * SYNCHRONOUS CALL SUPPORT *
18631863 *-------------------------------------------------------------------*/
18641864
1865+/* Maximum value allowed for timeout in synchronous routines below */
1866+#define USB_MAX_SYNCHRONOUS_TIMEOUT 60000 /* ms */
1867+
18651868 extern int usb_control_msg(struct usb_device *dev, unsigned int pipe,
18661869 __u8 request, __u8 requesttype, __u16 value, __u16 index,
18671870 void *data, __u16 size, int timeout);
18681871 extern int usb_interrupt_msg(struct usb_device *usb_dev, unsigned int pipe,
18691872 void *data, int len, int *actual_length, int timeout);
18701873 extern int usb_bulk_msg(struct usb_device *usb_dev, unsigned int pipe,
1871− void *data, int len, int *actual_length,
1872− int timeout);
1874+ void *data, int len, int *actual_length, int timeout);
1875+extern int usb_bulk_msg_killable(struct usb_device *usb_dev, unsigned int pipe,
1876+ void *data, int len, int *actual_length, int timeout);
18731877
18741878 /* wrappers around usb_control_msg() for the most common standard requests */
18751879 int usb_control_msg_send(struct usb_device *dev, __u8 endpoint, __u8 request,
include/linux/usb/quirks.h+3−0
@@ -78,4 +78,7 @@ · 77 unmodified lines
7878 /* skip BOS descriptor request */
7979 #define USB_QUIRK_NO_BOS BIT(17)
8080
81+/* Device claims zero configurations, forcing to 1 */
82+#define USB_QUIRK_FORCE_ONE_CONFIG BIT(18)
83+
8184 #endif /* __LINUX_USB_QUIRKS_H */
include/net/ip_tunnels.h+23−7
@@ -665,13 +665,29 @@ static inline int iptunnel_pull_offloads(struct sk_buff *skb) · 664 unmodified lines
665665 static inline void iptunnel_xmit_stats(struct net_device *dev, int pkt_len)
666666 {
667667 if (pkt_len > 0) {
668− struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats);
669−
670− u64_stats_update_begin(&tstats->syncp);
671− u64_stats_add(&tstats->tx_bytes, pkt_len);
672− u64_stats_inc(&tstats->tx_packets);
673− u64_stats_update_end(&tstats->syncp);
674− put_cpu_ptr(tstats);
668+ if (dev->pcpu_stat_type == NETDEV_PCPU_STAT_DSTATS) {
669+ struct pcpu_dstats *dstats = get_cpu_ptr(dev->dstats);
670+
671+ u64_stats_update_begin(&dstats->syncp);
672+ u64_stats_add(&dstats->tx_bytes, pkt_len);
673+ u64_stats_inc(&dstats->tx_packets);
674+ u64_stats_update_end(&dstats->syncp);
675+ put_cpu_ptr(dstats);
676+ return;
677+ }
678+ if (dev->pcpu_stat_type == NETDEV_PCPU_STAT_TSTATS) {
679+ struct pcpu_sw_netstats *tstats = get_cpu_ptr(dev->tstats);
680+
681+ u64_stats_update_begin(&tstats->syncp);
682+ u64_stats_add(&tstats->tx_bytes, pkt_len);
683+ u64_stats_inc(&tstats->tx_packets);
684+ u64_stats_update_end(&tstats->syncp);
685+ put_cpu_ptr(tstats);
686+ return;
687+ }
688+ pr_err_once("iptunnel_xmit_stats pcpu_stat_type=%d\n",
689+ dev->pcpu_stat_type);
690+ WARN_ON_ONCE(1);
675691 return;
676692 }
677693
include/net/mac80211.h+3−1
@@ -7411,7 +7411,9 @@ void ieee80211_report_wowlan_wakeup(struct ieee80211_vif *vif, · 7410 unmodified lines
74117411 * @band: the band to transmit on
74127412 * @sta: optional pointer to get the station to send the frame to
74137413 *
7414− * Return: %true if the skb was prepared, %false otherwise
7414+ * Return: %true if the skb was prepared, %false otherwise.
7415+ * On failure, the skb is freed by this function; callers must not
7416+ * free it again.
74157417 *
74167418 * Note: must be called under RCU lock
74177419 */
include/net/netfilter/nf_tables.h+2−4
@@ -266,8 +266,6 @@ struct nft_userdata { · 265 unmodified lines
266266 unsigned char data[];
267267 };
268268
269−#define NFT_SET_ELEM_INTERNAL_LAST 0x1
270−
271269 /* placeholder structure for opaque set element backend representation. */
272270 struct nft_elem_priv { };
273271
@@ -277,7 +275,6 @@ struct nft_elem_priv { }; · 3 unmodified lines
277275 * @key: element key
278276 * @key_end: closing element key
279277 * @data: element data
280− * @flags: flags
281278 * @priv: element private data and extensions
282279 */
283280 struct nft_set_elem {
@@ -293,7 +290,6 @@ struct nft_set_elem { · 9 unmodified lines
293290 u32 buf[NFT_DATA_VALUE_MAXLEN / sizeof(u32)];
294291 struct nft_data val;
295292 } data;
296− u32 flags;
297293 struct nft_elem_priv *priv;
298294 };
299295
@@ -865,6 +861,8 @@ struct nft_elem_priv *nft_set_elem_init(const struct nft_set *set, · 565 unmodified lines
865861 u64 timeout, u64 expiration, gfp_t gfp);
866862 int nft_set_elem_expr_clone(const struct nft_ctx *ctx, struct nft_set *set,
867863 struct nft_expr *expr_array[]);
864+void nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
865+ struct nft_set_elem_expr *elem_expr);
868866 void nft_set_elem_destroy(const struct nft_set *set,
869867 const struct nft_elem_priv *elem_priv,
870868 bool destroy_expr);
include/net/sch_generic.h+33−0
@@ -719,6 +719,34 @@ void qdisc_destroy(struct Qdisc *qdisc); · 718 unmodified lines
719719 void qdisc_put(struct Qdisc *qdisc);
720720 void qdisc_put_unlocked(struct Qdisc *qdisc);
721721 void qdisc_tree_reduce_backlog(struct Qdisc *qdisc, int n, int len);
722+
723+static inline void dev_reset_queue(struct net_device *dev,
724+ struct netdev_queue *dev_queue,
725+ void *_unused)
726+{
727+ struct Qdisc *qdisc;
728+ bool nolock;
729+
730+ qdisc = rtnl_dereference(dev_queue->qdisc_sleeping);
731+ if (!qdisc)
732+ return;
733+
734+ nolock = qdisc->flags & TCQ_F_NOLOCK;
735+
736+ if (nolock)
737+ spin_lock_bh(&qdisc->seqlock);
738+ spin_lock_bh(qdisc_lock(qdisc));
739+
740+ qdisc_reset(qdisc);
741+
742+ spin_unlock_bh(qdisc_lock(qdisc));
743+ if (nolock) {
744+ clear_bit(__QDISC_STATE_MISSED, &qdisc->state);
745+ clear_bit(__QDISC_STATE_DRAINING, &qdisc->state);
746+ spin_unlock_bh(&qdisc->seqlock);
747+ }
748+}
749+
722750 #ifdef CONFIG_NET_SCHED
723751 int qdisc_offload_dump_helper(struct Qdisc *q, enum tc_setup_type type,
724752 void *type_data);
@@ -1446,6 +1474,11 @@ void mini_qdisc_pair_init(struct mini_Qdisc_pair *miniqp, struct Qdisc *qdisc, · 721 unmodified lines
14461474 void mini_qdisc_pair_block_init(struct mini_Qdisc_pair *miniqp,
14471475 struct tcf_block *block);
14481476
1477+static inline bool mini_qdisc_pair_inited(struct mini_Qdisc_pair *miniqp)
1478+{
1479+ return !!miniqp->p_miniq;
1480+}
1481+
14491482 void mq_change_real_num_tx(struct Qdisc *sch, unsigned int new_real_tx);
14501483
14511484 int sch_frag_xmit_hook(struct sk_buff *skb, int (*xmit)(struct sk_buff *skb));
include/net/udp_tunnel.h+1−1
@@ -52,7 +52,7 @@ int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg, · 51 unmodified lines
5252 static inline int udp_sock_create6(struct net *net, struct udp_port_cfg *cfg,
5353 struct socket **sockp)
5454 {
55− return 0;
55+ return -EPFNOSUPPORT;
5656 }
5757 #endif
5858
include/uapi/linux/kvm.h+8−0
@@ -14,6 +14,10 @@ · 13 unmodified lines
1414 #include <linux/ioctl.h>
1515 #include <asm/kvm.h>
1616
17+#ifdef __KERNEL__
18+#include <linux/kvm_types.h>
19+#endif
20+
1721 #define KVM_API_VERSION 12
1822
1923 /*
@@ -1601,7 +1605,11 @@ struct kvm_stats_desc { · 1581 unmodified lines
16011605 __u16 size;
16021606 __u32 offset;
16031607 __u32 bucket_size;
1608+#ifdef __KERNEL__
1609+ char name[KVM_STATS_NAME_SIZE];
1610+#else
16041611 char name[];
1612+#endif
16051613 };
16061614
16071615 #define KVM_GET_STATS_FD _IO(KVMIO, 0xce)
io_uring/bpf_filter.c+1−1
@@ -85,7 +85,7 @@ int __io_uring_run_bpf_filters(struct io_bpf_filter __rcu **filters, · 84 unmodified lines
8585 do {
8686 if (filter == &dummy_filter)
8787 return -EACCES;
88− ret = bpf_prog_run(filter->prog, &bpf_ctx);
88+ ret = bpf_prog_run_pin_on_cpu(filter->prog, &bpf_ctx);
8989 if (!ret)
9090 return -EACCES;
9191 filter = filter->next;
io_uring/eventfd.c+7−3
@@ -76,11 +76,15 @@ void io_eventfd_signal(struct io_ring_ctx *ctx, bool cqe_event) · 75 unmodified lines
7676 {
7777 bool skip = false;
7878 struct io_ev_fd *ev_fd;
79−
80− if (READ_ONCE(ctx->rings->cq_flags) & IORING_CQ_EVENTFD_DISABLED)
81− return;
79+ struct io_rings *rings;
8280
8381 guard(rcu)();
82+
83+ rings = rcu_dereference(ctx->rings_rcu);
84+ if (!rings)
85+ return;
86+ if (READ_ONCE(rings->cq_flags) & IORING_CQ_EVENTFD_DISABLED)
87+ return;
8488 ev_fd = rcu_dereference(ctx->io_ev_fd);
8589 /*
8690 * Check again if ev_fd exists in case an io_eventfd_unregister call
io_uring/io_uring.c+3−1
@@ -1745,7 +1745,7 @@ static int io_init_req(struct io_ring_ctx *ctx, struct io_kiocb *req, · 1744 unmodified lines
17451745 * well as 2 contiguous entries.
17461746 */
17471747 if (!(ctx->flags & IORING_SETUP_SQE_MIXED) || *left < 2 ||
1748− !(ctx->cached_sq_head & (ctx->sq_entries - 1)))
1748+ (unsigned)(sqe - ctx->sq_sqes) >= ctx->sq_entries - 1)
17491749 return io_init_fail_req(req, -EINVAL);
17501750 /*
17511751 * A 128b operation on a mixed SQ uses two entries, so we have
@@ -2066,6 +2066,7 @@ static void io_rings_free(struct io_ring_ctx *ctx) · 314 unmodified lines
20662066 io_free_region(ctx->user, &ctx->sq_region);
20672067 io_free_region(ctx->user, &ctx->ring_region);
20682068 ctx->rings = NULL;
2069+ RCU_INIT_POINTER(ctx->rings_rcu, NULL);
20692070 ctx->sq_sqes = NULL;
20702071 }
20712072
@@ -2703,6 +2704,7 @@ static __cold int io_allocate_scq_urings(struct io_ring_ctx *ctx, · 631 unmodified lines
27032704 if (ret)
27042705 return ret;
27052706 ctx->rings = rings = io_region_get_ptr(&ctx->ring_region);
2707+ rcu_assign_pointer(ctx->rings_rcu, rings);
27062708 if (!(ctx->flags & IORING_SETUP_NO_SQARRAY))
27072709 ctx->sq_array = (u32 *)((char *)rings + rl->sq_array_offset);
27082710
io_uring/kbuf.c+11−2
@@ -111,9 +111,18 @@ bool io_kbuf_recycle_legacy(struct io_kiocb *req, unsigned issue_flags) · 110 unmodified lines
111111
112112 buf = req->kbuf;
113113 bl = io_buffer_get_list(ctx, buf->bgid);
114− list_add(&buf->list, &bl->buf_list);
115− bl->nbufs++;
114+ /*
115+ * If the buffer list was upgraded to a ring-based one, or removed,
116+ * while the request was in-flight in io-wq, drop it.
117+ */
118+ if (bl && !(bl->flags & IOBL_BUF_RING)) {
119+ list_add(&buf->list, &bl->buf_list);
120+ bl->nbufs++;
121+ } else {
122+ kfree(buf);
123+ }
116124 req->flags &= ~REQ_F_BUFFER_SELECTED;
125+ req->kbuf = NULL;
117126
118127 io_ring_submit_unlock(ctx, issue_flags);
119128 return true;
io_uring/register.c+13−2
@@ -202,7 +202,7 @@ static int io_register_restrictions_task(void __user *arg, unsigned int nr_args) · 201 unmodified lines
202202 return -EPERM;
203203 /*
204204 * Similar to seccomp, disallow setting a filter if task_no_new_privs
205− * is true and we're not CAP_SYS_ADMIN.
205+ * is false and we're not CAP_SYS_ADMIN.
206206 */
207207 if (!task_no_new_privs(current) &&
208208 !ns_capable_noaudit(current_user_ns(), CAP_SYS_ADMIN))
@@ -238,7 +238,7 @@ static int io_register_bpf_filter_task(void __user *arg, unsigned int nr_args) · 29 unmodified lines
238238
239239 /*
240240 * Similar to seccomp, disallow setting a filter if task_no_new_privs
241− * is true and we're not CAP_SYS_ADMIN.
241+ * is false and we're not CAP_SYS_ADMIN.
242242 */
243243 if (!task_no_new_privs(current) &&
244244 !ns_capable_noaudit(current_user_ns(), CAP_SYS_ADMIN))
@@ -633,7 +633,15 @@ overflow: · 388 unmodified lines
633633 ctx->sq_entries = p->sq_entries;
634634 ctx->cq_entries = p->cq_entries;
635635
636+ /*
637+ * Just mark any flag we may have missed and that the application
638+ * should act on unconditionally. Worst case it'll be an extra
639+ * syscall.
640+ */
641+ atomic_or(IORING_SQ_TASKRUN | IORING_SQ_NEED_WAKEUP, &n.rings->sq_flags);
636642 ctx->rings = n.rings;
643+ rcu_assign_pointer(ctx->rings_rcu, n.rings);
644+
637645 ctx->sq_sqes = n.sq_sqes;
638646 swap_old(ctx, o, n, ring_region);
639647 swap_old(ctx, o, n, sq_region);
@@ -642,6 +650,9 @@ overflow: · 2 unmodified lines
642650 out:
643651 spin_unlock(&ctx->completion_lock);
644652 mutex_unlock(&ctx->mmap_lock);
653+ /* Wait for concurrent io_ctx_mark_taskrun() */
654+ if (to_free == &o)
655+ synchronize_rcu_expedited();
645656 io_register_free_rings(ctx, to_free);
646657
647658 if (ctx->sq_data)
io_uring/tw.c+20−2
@@ -152,6 +152,21 @@ void tctx_task_work(struct callback_head *cb) · 151 unmodified lines
152152 WARN_ON_ONCE(ret);
153153 }
154154
155+/*
156+ * Sets IORING_SQ_TASKRUN in the sq_flags shared with userspace, using the
157+ * RCU protected rings pointer to be safe against concurrent ring resizing.
158+ */
159+static void io_ctx_mark_taskrun(struct io_ring_ctx *ctx)
160+{
161+ lockdep_assert_in_rcu_read_lock();
162+
163+ if (ctx->flags & IORING_SETUP_TASKRUN_FLAG) {
164+ struct io_rings *rings = rcu_dereference(ctx->rings_rcu);
165+
166+ atomic_or(IORING_SQ_TASKRUN, &rings->sq_flags);
167+ }
168+}
169+
155170 void io_req_local_work_add(struct io_kiocb *req, unsigned flags)
156171 {
157172 struct io_ring_ctx *ctx = req->ctx;
@@ -206,8 +221,7 @@ void io_req_local_work_add(struct io_kiocb *req, unsigned flags) · 48 unmodified lines
206221 */
207222
208223 if (!head) {
209− if (ctx->flags & IORING_SETUP_TASKRUN_FLAG)
210− atomic_or(IORING_SQ_TASKRUN, &ctx->rings->sq_flags);
224+ io_ctx_mark_taskrun(ctx);
211225 if (ctx->has_evfd)
212226 io_eventfd_signal(ctx, false);
213227 }
@@ -231,6 +245,10 @@ void io_req_normal_work_add(struct io_kiocb *req) · 17 unmodified lines
231245 if (!llist_add(&req->io_task_work.node, &tctx->task_list))
232246 return;
233247
248+ /*
249+ * Doesn't need to use ->rings_rcu, as resizing isn't supported for
250+ * !DEFER_TASKRUN.
251+ */
234252 if (ctx->flags & IORING_SETUP_TASKRUN_FLAG)
235253 atomic_or(IORING_SQ_TASKRUN, &ctx->rings->sq_flags);
236254
kernel/cgroup/cgroup.c+6−0
@@ -5109,6 +5109,12 @@ repeat: · 5108 unmodified lines
51095109 return;
51105110
51115111 task = list_entry(it->task_pos, struct task_struct, cg_list);
5112+ /*
5113+ * Hide tasks that are exiting but not yet removed. Keep zombie
5114+ * leaders with live threads visible.
5115+ */
5116+ if ((task->flags & PF_EXITING) && !atomic_read(&task->signal->live))
5117+ goto repeat;
51125118
51135119 if (it->flags & CSS_TASK_ITER_PROCS) {
51145120 /* if PROCS, skip over tasks which aren't group leaders */
kernel/cgroup/cpuset.c+31−28
@@ -879,7 +879,7 @@ generate_doms: · 878 unmodified lines
879879 /*
880880 * Cgroup v2 doesn't support domain attributes, just set all of them
881881 * to SD_ATTR_INIT. Also non-isolating partition root CPUs are a
882− * subset of HK_TYPE_DOMAIN housekeeping CPUs.
882+ * subset of HK_TYPE_DOMAIN_BOOT housekeeping CPUs.
883883 */
884884 for (i = 0; i < ndoms; i++) {
885885 /*
@@ -888,7 +888,7 @@ generate_doms: · 2 unmodified lines
888888 */
889889 if (!csa || csa[i] == &top_cpuset)
890890 cpumask_and(doms[i], top_cpuset.effective_cpus,
891− housekeeping_cpumask(HK_TYPE_DOMAIN));
891+ housekeeping_cpumask(HK_TYPE_DOMAIN_BOOT));
892892 else
893893 cpumask_copy(doms[i], csa[i]->effective_cpus);
894894 if (dattr)
@@ -1329,17 +1329,22 @@ static bool prstate_housekeeping_conflict(int prstate, struct cpumask *new_cpus) · 434 unmodified lines
13291329 }
13301330
13311331 /*
1332− * update_hk_sched_domains - Update HK cpumasks & rebuild sched domains
1332+ * cpuset_update_sd_hk_unlock - Rebuild sched domains, update HK & unlock
13331333 *
1334− * Update housekeeping cpumasks and rebuild sched domains if necessary.
1335− * This should be called at the end of cpuset or hotplug actions.
1334+ * Update housekeeping cpumasks and rebuild sched domains if necessary and
1335+ * then do a cpuset_full_unlock().
1336+ * This should be called at the end of cpuset operation.
13361337 */
1337−static void update_hk_sched_domains(void)
1338+static void cpuset_update_sd_hk_unlock(void)
1339+ __releases(&cpuset_mutex)
1340+ __releases(&cpuset_top_mutex)
13381341 {
1342+ /* force_sd_rebuild will be cleared in rebuild_sched_domains_locked() */
1343+ if (force_sd_rebuild)
1344+ rebuild_sched_domains_locked();
1345+
13391346 if (update_housekeeping) {
1340− /* Updating HK cpumasks implies rebuild sched domains */
13411347 update_housekeeping = false;
1342− force_sd_rebuild = true;
13431348 cpumask_copy(isolated_hk_cpus, isolated_cpus);
13441349
13451350 /*
@@ -1350,22 +1355,19 @@ static void update_hk_sched_domains(void) · 4 unmodified lines
13501355 mutex_unlock(&cpuset_mutex);
13511356 cpus_read_unlock();
13521357 WARN_ON_ONCE(housekeeping_update(isolated_hk_cpus));
1353− cpus_read_lock();
1354− mutex_lock(&cpuset_mutex);
1358+ mutex_unlock(&cpuset_top_mutex);
1359+ } else {
1360+ cpuset_full_unlock();
13551361 }
1356− /* force_sd_rebuild will be cleared in rebuild_sched_domains_locked() */
1357− if (force_sd_rebuild)
1358− rebuild_sched_domains_locked();
13591362 }
13601363
13611364 /*
1362− * Work function to invoke update_hk_sched_domains()
1365+ * Work function to invoke cpuset_update_sd_hk_unlock()
13631366 */
13641367 static void hk_sd_workfn(struct work_struct *work)
13651368 {
13661369 cpuset_full_lock();
1367− update_hk_sched_domains();
1368− cpuset_full_unlock();
1370+ cpuset_update_sd_hk_unlock();
13691371 }
13701372
13711373 /**
@@ -3230,8 +3232,7 @@ ssize_t cpuset_write_resmask(struct kernfs_open_file *of, · 1858 unmodified lines
32303232
32313233 free_cpuset(trialcs);
32323234 out_unlock:
3233− update_hk_sched_domains();
3234− cpuset_full_unlock();
3235+ cpuset_update_sd_hk_unlock();
32353236 if (of_cft(of)->private == FILE_MEMLIST)
32363237 schedule_flush_migrate_mm();
32373238 return retval ?: nbytes;
@@ -3338,8 +3339,7 @@ static ssize_t cpuset_partition_write(struct kernfs_open_file *of, char *buf, · 100 unmodified lines
33383339 cpuset_full_lock();
33393340 if (is_cpuset_online(cs))
33403341 retval = update_prstate(cs, val);
3341− update_hk_sched_domains();
3342− cpuset_full_unlock();
3342+ cpuset_update_sd_hk_unlock();
33433343 return retval ?: nbytes;
33443344 }
33453345
@@ -3513,8 +3513,7 @@ static void cpuset_css_killed(struct cgroup_subsys_state *css) · 167 unmodified lines
35133513 /* Reset valid partition back to member */
35143514 if (is_partition_valid(cs))
35153515 update_prstate(cs, PRS_MEMBER);
3516− update_hk_sched_domains();
3517− cpuset_full_unlock();
3516+ cpuset_update_sd_hk_unlock();
35183517 }
35193518
35203519 static void cpuset_css_free(struct cgroup_subsys_state *css)
@@ -3923,11 +3922,13 @@ static void cpuset_handle_hotplug(void) · 402 unmodified lines
39233922 rcu_read_unlock();
39243923 }
39253924
3926−
39273925 /*
3928− * Queue a work to call housekeeping_update() & rebuild_sched_domains()
3929− * There will be a slight delay before the HK_TYPE_DOMAIN housekeeping
3930− * cpumask can correctly reflect what is in isolated_cpus.
3926+ * rebuild_sched_domains() will always be called directly if needed
3927+ * to make sure that newly added or removed CPU will be reflected in
3928+ * the sched domains. However, if isolated partition invalidation
3929+ * or recreation is being done (update_housekeeping set), a work item
3930+ * will be queued to call housekeeping_update() to update the
3931+ * corresponding housekeeping cpumasks after some slight delay.
39313932 *
39323933 * We rely on WORK_STRUCT_PENDING_BIT to not requeue a work item that
39333934 * is still pending. Before the pending bit is cleared, the work data
@@ -3936,8 +3937,10 @@ static void cpuset_handle_hotplug(void) · 2 unmodified lines
39363937 * previously queued work. Since hk_sd_workfn() doesn't use the work
39373938 * item at all, this is not a problem.
39383939 */
3939− if (update_housekeeping || force_sd_rebuild)
3940− queue_work(system_unbound_wq, &hk_sd_work);
3940+ if (force_sd_rebuild)
3941+ rebuild_sched_domains_cpuslocked();
3942+ if (update_housekeeping)
3943+ queue_work(system_dfl_wq, &hk_sd_work);
39413944
39423945 free_tmpmasks(ptmp);
39433946 }
kernel/crash_dump_dm_crypt.c+2−2
@@ -168,8 +168,8 @@ static int read_key_from_user_keying(struct dm_crypt_key *dm_key) · 167 unmodified lines
168168
169169 memcpy(dm_key->data, ukp->data, ukp->datalen);
170170 dm_key->key_size = ukp->datalen;
171− kexec_dprintk("Get dm crypt key (size=%u) %s: %8ph\n", dm_key->key_size,
172− dm_key->key_desc, dm_key->data);
171+ kexec_dprintk("Get dm crypt key (size=%u) %s\n", dm_key->key_size,
172+ dm_key->key_desc);
173173
174174 out:
175175 up_read(&key->sem);
kernel/fork.c+1−2
@@ -1000,6 +1000,7 @@ static struct task_struct *dup_task_struct(struct task_struct *orig, int node) · 999 unmodified lines
10001000 #ifdef CONFIG_SCHED_MM_CID
10011001 tsk->mm_cid.cid = MM_CID_UNSET;
10021002 tsk->mm_cid.active = 0;
1003+ INIT_HLIST_NODE(&tsk->mm_cid.node);
10031004 #endif
10041005 return tsk;
10051006
@@ -1586,7 +1587,6 @@ static int copy_mm(u64 clone_flags, struct task_struct *tsk) · 580 unmodified lines
15861587
15871588 tsk->mm = mm;
15881589 tsk->active_mm = mm;
1589− sched_mm_cid_fork(tsk);
15901590 return 0;
15911591 }
15921592
@@ -2498,7 +2498,6 @@ bad_fork_cleanup_namespaces: · 905 unmodified lines
24982498 exit_nsproxy_namespaces(p);
24992499 bad_fork_cleanup_mm:
25002500 if (p->mm) {
2501− sched_mm_cid_exit(p);
25022501 mm_clear_owner(p->mm, p);
25032502 mmput(p->mm);
25042503 }
kernel/kprobes.c+6−2
@@ -1144,12 +1144,12 @@ static int __arm_kprobe_ftrace(struct kprobe *p, struct ftrace_ops *ops, · 1143 unmodified lines
11441144 lockdep_assert_held(&kprobe_mutex);
11451145
11461146 ret = ftrace_set_filter_ip(ops, (unsigned long)p->addr, 0, 0);
1147− if (WARN_ONCE(ret < 0, "Failed to arm kprobe-ftrace at %pS (error %d)\n", p->addr, ret))
1147+ if (ret < 0)
11481148 return ret;
11491149
11501150 if (*cnt == 0) {
11511151 ret = register_ftrace_function(ops);
1152− if (WARN(ret < 0, "Failed to register kprobe-ftrace (error %d)\n", ret)) {
1152+ if (ret < 0) {
11531153 /*
11541154 * At this point, sinec ops is not registered, we should be sefe from
11551155 * registering empty filter.
@@ -1178,6 +1178,10 @@ static int __disarm_kprobe_ftrace(struct kprobe *p, struct ftrace_ops *ops, · 22 unmodified lines
11781178 int ret;
11791179
11801180 lockdep_assert_held(&kprobe_mutex);
1181+ if (unlikely(kprobe_ftrace_disabled)) {
1182+ /* Now ftrace is disabled forever, disarm is already done. */
1183+ return 0;
1184+ }
11811185
11821186 if (*cnt == 1) {
11831187 ret = unregister_ftrace_function(ops);
kernel/sched/core.c+28−51
@@ -4729,8 +4729,11 @@ void sched_cancel_fork(struct task_struct *p) · 4728 unmodified lines
47294729 scx_cancel_fork(p);
47304730 }
47314731
4732+static void sched_mm_cid_fork(struct task_struct *t);
4733+
47324734 void sched_post_fork(struct task_struct *p)
47334735 {
4736+ sched_mm_cid_fork(p);
47344737 uclamp_post_fork(p);
47354738 scx_post_fork(p);
47364739 }
@@ -10617,13 +10620,10 @@ static inline void mm_cid_transit_to_cpu(struct task_struct *t, struct mm_cid_pc · 5880 unmodified lines
1061710620 }
1061810621 }
1061910622
10620−static bool mm_cid_fixup_task_to_cpu(struct task_struct *t, struct mm_struct *mm)
10623+static void mm_cid_fixup_task_to_cpu(struct task_struct *t, struct mm_struct *mm)
1062110624 {
1062210625 /* Remote access to mm::mm_cid::pcpu requires rq_lock */
1062310626 guard(task_rq_lock)(t);
10624− /* If the task is not active it is not in the users count */
10625− if (!t->mm_cid.active)
10626− return false;
1062710627 if (cid_on_task(t->mm_cid.cid)) {
1062810628 /* If running on the CPU, put the CID in transit mode, otherwise drop it */
1062910629 if (task_rq(t)->curr == t)
@@ -10631,69 +10631,43 @@ static bool mm_cid_fixup_task_to_cpu(struct task_struct *t, struct mm_struct *mm · 1 unmodified line
1063110631 else
1063210632 mm_unset_cid_on_task(t);
1063310633 }
10634− return true;
1063510634 }
1063610635
10637−static void mm_cid_do_fixup_tasks_to_cpus(struct mm_struct *mm)
10636+static void mm_cid_fixup_tasks_to_cpus(void)
1063810637 {
10639− struct task_struct *p, *t;
10640− unsigned int users;
10638+ struct mm_struct *mm = current->mm;
10639+ struct task_struct *t;
1064110640
10642− /*
10643− * This can obviously race with a concurrent affinity change, which
10644− * increases the number of allowed CPUs for this mm, but that does
10645− * not affect the mode and only changes the CID constraints. A
10646− * possible switch back to per task mode happens either in the
10647− * deferred handler function or in the next fork()/exit().
10648− *
10649− * The caller has already transferred. The newly incoming task is
10650− * already accounted for, but not yet visible.
10651− */
10652− users = mm->mm_cid.users - 2;
10653− if (!users)
10654− return;
10641+ lockdep_assert_held(&mm->mm_cid.mutex);
1065510642
10656− guard(rcu)();
10657− for_other_threads(current, t) {
10658− if (mm_cid_fixup_task_to_cpu(t, mm))
10659− users--;
10643+ hlist_for_each_entry(t, &mm->mm_cid.user_list, mm_cid.node) {
10644+ /* Current has already transferred before invoking the fixup. */
10645+ if (t != current)
10646+ mm_cid_fixup_task_to_cpu(t, mm);
1066010647 }
1066110648
10662− if (!users)
10663− return;
10664−
10665− /* Happens only for VM_CLONE processes. */
10666− for_each_process_thread(p, t) {
10667− if (t == current || t->mm != mm)
10668− continue;
10669− if (mm_cid_fixup_task_to_cpu(t, mm)) {
10670− if (--users == 0)
10671− return;
10672− }
10673− }
10674−}
10675−
10676−static void mm_cid_fixup_tasks_to_cpus(void)
10677−{
10678− struct mm_struct *mm = current->mm;
10679−
10680− mm_cid_do_fixup_tasks_to_cpus(mm);
1068110649 mm_cid_complete_transit(mm, MM_CID_ONCPU);
1068210650 }
1068310651
1068410652 static bool sched_mm_cid_add_user(struct task_struct *t, struct mm_struct *mm)
1068510653 {
10654+ lockdep_assert_held(&mm->mm_cid.lock);
10655+
1068610656 t->mm_cid.active = 1;
10657+ hlist_add_head(&t->mm_cid.node, &mm->mm_cid.user_list);
1068710658 mm->mm_cid.users++;
1068810659 return mm_update_max_cids(mm);
1068910660 }
1069010661
10691−void sched_mm_cid_fork(struct task_struct *t)
10662+static void sched_mm_cid_fork(struct task_struct *t)
1069210663 {
1069310664 struct mm_struct *mm = t->mm;
1069410665 bool percpu;
1069510666
10696− WARN_ON_ONCE(!mm || t->mm_cid.cid != MM_CID_UNSET);
10667+ if (!mm)
10668+ return;
10669+
10670+ WARN_ON_ONCE(t->mm_cid.cid != MM_CID_UNSET);
1069710671
1069810672 guard(mutex)(&mm->mm_cid.mutex);
1069910673 scoped_guard(raw_spinlock_irq, &mm->mm_cid.lock) {
@@ -10732,12 +10706,13 @@ void sched_mm_cid_fork(struct task_struct *t) · 32 unmodified lines
1073210706
1073310707 static bool sched_mm_cid_remove_user(struct task_struct *t)
1073410708 {
10709+ lockdep_assert_held(&t->mm->mm_cid.lock);
10710+
1073510711 t->mm_cid.active = 0;
10736− scoped_guard(preempt) {
10737− /* Clear the transition bit */
10738− t->mm_cid.cid = cid_from_transit_cid(t->mm_cid.cid);
10739− mm_unset_cid_on_task(t);
10740− }
10712+ /* Clear the transition bit */
10713+ t->mm_cid.cid = cid_from_transit_cid(t->mm_cid.cid);
10714+ mm_unset_cid_on_task(t);
10715+ hlist_del_init(&t->mm_cid.node);
1074110716 t->mm->mm_cid.users--;
1074210717 return mm_update_max_cids(t->mm);
1074310718 }
@@ -10880,11 +10855,13 @@ void mm_init_cid(struct mm_struct *mm, struct task_struct *p) · 136 unmodified lines
1088010855 mutex_init(&mm->mm_cid.mutex);
1088110856 mm->mm_cid.irq_work = IRQ_WORK_INIT_HARD(mm_cid_irq_work);
1088210857 INIT_WORK(&mm->mm_cid.work, mm_cid_work_fn);
10858+ INIT_HLIST_HEAD(&mm->mm_cid.user_list);
1088310859 cpumask_copy(mm_cpus_allowed(mm), &p->cpus_mask);
1088410860 bitmap_zero(mm_cidmask(mm), num_possible_cpus());
1088510861 }
1088610862 #else /* CONFIG_SCHED_MM_CID */
1088710863 static inline void mm_update_cpus_allowed(struct mm_struct *mm, const struct cpumask *affmsk) { }
10864+static inline void sched_mm_cid_fork(struct task_struct *t) { }
1088810865 #endif /* !CONFIG_SCHED_MM_CID */
1088910866
1089010867 static DEFINE_PER_CPU(struct sched_change_ctx, sched_change_ctx);
kernel/sched/ext.c+11−11
@@ -1103,7 +1103,7 @@ static void dispatch_enqueue(struct scx_sched *sch, struct scx_dispatch_q *dsq, · 1102 unmodified lines
11031103 }
11041104
11051105 /* seq records the order tasks are queued, used by BPF DSQ iterator */
1106− dsq->seq++;
1106+ WRITE_ONCE(dsq->seq, dsq->seq + 1);
11071107 p->scx.dsq_seq = dsq->seq;
11081108
11091109 dsq_mod_nr(dsq, 1);
@@ -1470,16 +1470,15 @@ static void clr_task_runnable(struct task_struct *p, bool reset_runnable_at) · 360 unmodified lines
14701470 p->scx.flags |= SCX_TASK_RESET_RUNNABLE_AT;
14711471 }
14721472
1473−static void enqueue_task_scx(struct rq *rq, struct task_struct *p, int enq_flags)
1473+static void enqueue_task_scx(struct rq *rq, struct task_struct *p, int core_enq_flags)
14741474 {
14751475 struct scx_sched *sch = scx_root;
14761476 int sticky_cpu = p->scx.sticky_cpu;
1477+ u64 enq_flags = core_enq_flags | rq->scx.extra_enq_flags;
14771478
14781479 if (enq_flags & ENQUEUE_WAKEUP)
14791480 rq->scx.flags |= SCX_RQ_IN_WAKEUP;
14801481
1481− enq_flags |= rq->scx.extra_enq_flags;
1482−
14831482 if (sticky_cpu >= 0)
14841483 p->scx.sticky_cpu = -1;
14851484
@@ -3908,8 +3907,8 @@ static u32 bypass_lb_cpu(struct scx_sched *sch, struct rq *rq, · 2422 unmodified lines
39083907 * consider offloading iff the total queued duration is over the
39093908 * threshold.
39103909 */
3911− min_delta_us = scx_bypass_lb_intv_us / SCX_BYPASS_LB_MIN_DELTA_DIV;
3912− if (delta < DIV_ROUND_UP(min_delta_us, scx_slice_bypass_us))
3910+ min_delta_us = READ_ONCE(scx_bypass_lb_intv_us) / SCX_BYPASS_LB_MIN_DELTA_DIV;
3911+ if (delta < DIV_ROUND_UP(min_delta_us, READ_ONCE(scx_slice_bypass_us)))
39133912 return 0;
39143913
39153914 raw_spin_rq_lock_irq(rq);
@@ -4137,7 +4136,7 @@ static void scx_bypass(bool bypass) · 221 unmodified lines
41374136 WARN_ON_ONCE(scx_bypass_depth <= 0);
41384137 if (scx_bypass_depth != 1)
41394138 goto unlock;
4140− WRITE_ONCE(scx_slice_dfl, scx_slice_bypass_us * NSEC_PER_USEC);
4139+ WRITE_ONCE(scx_slice_dfl, READ_ONCE(scx_slice_bypass_us) * NSEC_PER_USEC);
41414140 bypass_timestamp = ktime_get_ns();
41424141 if (sch)
41434142 scx_add_event(sch, SCX_EV_BYPASS_ACTIVATE, 1);
@@ -5259,13 +5258,14 @@ static int scx_enable(struct sched_ext_ops *ops, struct bpf_link *link) · 1115 unmodified lines
52595258 if (!READ_ONCE(helper)) {
52605259 mutex_lock(&helper_mutex);
52615260 if (!helper) {
5262− helper = kthread_run_worker(0, "scx_enable_helper");
5263− if (IS_ERR_OR_NULL(helper)) {
5264− helper = NULL;
5261+ struct kthread_worker *w =
5262+ kthread_run_worker(0, "scx_enable_helper");
5263+ if (IS_ERR_OR_NULL(w)) {
52655264 mutex_unlock(&helper_mutex);
52665265 return -ENOMEM;
52675266 }
5268− sched_set_fifo(helper->task);
5267+ sched_set_fifo(w->task);
5268+ WRITE_ONCE(helper, w);
52695269 }
52705270 mutex_unlock(&helper_mutex);
52715271 }
kernel/sched/ext_internal.h+98−16
@@ -1035,26 +1035,108 @@ static const char *scx_enable_state_str[] = { · 1034 unmodified lines
10351035 };
10361036
10371037 /*
1038− * sched_ext_entity->ops_state
1038+ * Task Ownership State Machine (sched_ext_entity->ops_state)
10391039 *
1040− * Used to track the task ownership between the SCX core and the BPF scheduler.
1041− * State transitions look as follows:
1040+ * The sched_ext core uses this state machine to track task ownership
1041+ * between the SCX core and the BPF scheduler. This allows the BPF
1042+ * scheduler to dispatch tasks without strict ordering requirements, while
1043+ * the SCX core safely rejects invalid dispatches.
10421044 *
1043− * NONE -> QUEUEING -> QUEUED -> DISPATCHING
1044− * ^ | |
1045− * | v v
1046− * \-------------------------------/
1045+ * State Transitions
10471046 *
1048− * QUEUEING and DISPATCHING states can be waited upon. See wait_ops_state() call
1049− * sites for explanations on the conditions being waited upon and why they are
1050− * safe. Transitions out of them into NONE or QUEUED must store_release and the
1051− * waiters should load_acquire.
1047+ * .------------> NONE (owned by SCX core)
1048+ * | | ^
1049+ * | enqueue | | direct dispatch
1050+ * | v |
1051+ * | QUEUEING -------'
1052+ * | |
1053+ * | enqueue |
1054+ * | completes |
1055+ * | v
1056+ * | QUEUED (owned by BPF scheduler)
1057+ * | |
1058+ * | dispatch |
1059+ * | |
1060+ * | v
1061+ * | DISPATCHING
1062+ * | |
1063+ * | dispatch |
1064+ * | completes |
1065+ * `---------------'
10521066 *
1053− * Tracking scx_ops_state enables sched_ext core to reliably determine whether
1054− * any given task can be dispatched by the BPF scheduler at all times and thus
1055− * relaxes the requirements on the BPF scheduler. This allows the BPF scheduler
1056− * to try to dispatch any task anytime regardless of its state as the SCX core
1057− * can safely reject invalid dispatches.
1067+ * State Descriptions
1068+ *
1069+ * - %SCX_OPSS_NONE:
1070+ * Task is owned by the SCX core. It's either on a run queue, running,
1071+ * or being manipulated by the core scheduler. The BPF scheduler has no
1072+ * claim on this task.
1073+ *
1074+ * - %SCX_OPSS_QUEUEING:
1075+ * Transitional state while transferring a task from the SCX core to
1076+ * the BPF scheduler. The task's rq lock is held during this state.
1077+ * Since QUEUEING is both entered and exited under the rq lock, dequeue
1078+ * can never observe this state (it would be a BUG). When finishing a
1079+ * dispatch, if the task is still in %SCX_OPSS_QUEUEING the completion
1080+ * path busy-waits for it to leave this state (via wait_ops_state())
1081+ * before retrying.
1082+ *
1083+ * - %SCX_OPSS_QUEUED:
1084+ * Task is owned by the BPF scheduler. It's on a DSQ (dispatch queue)
1085+ * and the BPF scheduler is responsible for dispatching it. A QSEQ
1086+ * (queue sequence number) is embedded in this state to detect
1087+ * dispatch/dequeue races: if a task is dequeued and re-enqueued, the
1088+ * QSEQ changes and any in-flight dispatch operations targeting the old
1089+ * QSEQ are safely ignored.
1090+ *
1091+ * - %SCX_OPSS_DISPATCHING:
1092+ * Transitional state while transferring a task from the BPF scheduler
1093+ * back to the SCX core. This state indicates the BPF scheduler has
1094+ * selected the task for execution. When dequeue needs to take the task
1095+ * off a DSQ and it is still in %SCX_OPSS_DISPATCHING, the dequeue path
1096+ * busy-waits for it to leave this state (via wait_ops_state()) before
1097+ * proceeding. Exits to %SCX_OPSS_NONE when dispatch completes.
1098+ *
1099+ * Memory Ordering
1100+ *
1101+ * Transitions out of %SCX_OPSS_QUEUEING and %SCX_OPSS_DISPATCHING into
1102+ * %SCX_OPSS_NONE or %SCX_OPSS_QUEUED must use atomic_long_set_release()
1103+ * and waiters must use atomic_long_read_acquire(). This ensures proper
1104+ * synchronization between concurrent operations.
1105+ *
1106+ * Cross-CPU Task Migration
1107+ *
1108+ * When moving a task in the %SCX_OPSS_DISPATCHING state, we can't simply
1109+ * grab the target CPU's rq lock because a concurrent dequeue might be
1110+ * waiting on %SCX_OPSS_DISPATCHING while holding the source rq lock
1111+ * (deadlock).
1112+ *
1113+ * The sched_ext core uses a "lock dancing" protocol coordinated by
1114+ * p->scx.holding_cpu. When moving a task to a different rq:
1115+ *
1116+ * 1. Verify task can be moved (CPU affinity, migration_disabled, etc.)
1117+ * 2. Set p->scx.holding_cpu to the current CPU
1118+ * 3. Set task state to %SCX_OPSS_NONE; dequeue waits while DISPATCHING
1119+ * is set, so clearing DISPATCHING first prevents the circular wait
1120+ * (safe to lock the rq we need)
1121+ * 4. Unlock the current CPU's rq
1122+ * 5. Lock src_rq (where the task currently lives)
1123+ * 6. Verify p->scx.holding_cpu == current CPU, if not, dequeue won the
1124+ * race (dequeue clears holding_cpu to -1 when it takes the task), in
1125+ * this case migration is aborted
1126+ * 7. If src_rq == dst_rq: clear holding_cpu and enqueue directly
1127+ * into dst_rq's local DSQ (no lock swap needed)
1128+ * 8. Otherwise: call move_remote_task_to_local_dsq(), which releases
1129+ * src_rq, locks dst_rq, and performs the deactivate/activate
1130+ * migration cycle (dst_rq is held on return)
1131+ * 9. Unlock dst_rq and re-lock the current CPU's rq to restore
1132+ * the lock state expected by the caller
1133+ *
1134+ * If any verification fails, abort the migration.
1135+ *
1136+ * This state tracking allows the BPF scheduler to try to dispatch any task
1137+ * at any time regardless of its state. The SCX core can safely
1138+ * reject/ignore invalid dispatches, simplifying the BPF scheduler
1139+ * implementation.
10581140 */
10591141 enum scx_ops_state {
10601142 SCX_OPSS_NONE, /* owned by the SCX core */
kernel/sched/idle.c+30−9
@@ -161,6 +161,14 @@ static int call_cpuidle(struct cpuidle_driver *drv, struct cpuidle_device *dev, · 160 unmodified lines
161161 return cpuidle_enter(drv, dev, next_state);
162162 }
163163
164+static void idle_call_stop_or_retain_tick(bool stop_tick)
165+{
166+ if (stop_tick || tick_nohz_tick_stopped())
167+ tick_nohz_idle_stop_tick();
168+ else
169+ tick_nohz_idle_retain_tick();
170+}
171+
164172 /**
165173 * cpuidle_idle_call - the main idle function
166174 *
@@ -170,7 +178,7 @@ static int call_cpuidle(struct cpuidle_driver *drv, struct cpuidle_device *dev, · 3 unmodified lines
170178 * set, and it returns with polling set. If it ever stops polling, it
171179 * must clear the polling bit.
172180 */
173−static void cpuidle_idle_call(void)
181+static void cpuidle_idle_call(bool stop_tick)
174182 {
175183 struct cpuidle_device *dev = cpuidle_get_device();
176184 struct cpuidle_driver *drv = cpuidle_get_cpu_driver(dev);
@@ -186,7 +194,7 @@ static void cpuidle_idle_call(void) · 9 unmodified lines
186194 }
187195
188196 if (cpuidle_not_available(drv, dev)) {
189− tick_nohz_idle_stop_tick();
197+ idle_call_stop_or_retain_tick(stop_tick);
190198
191199 default_idle_call();
192200 goto exit_idle;
@@ -221,24 +229,35 @@ static void cpuidle_idle_call(void) · 28 unmodified lines
221229
222230 next_state = cpuidle_find_deepest_state(drv, dev, max_latency_ns);
223231 call_cpuidle(drv, dev, next_state);
224− } else {
225− bool stop_tick = true;
232+ } else if (drv->state_count > 1) {
233+ /*
234+ * stop_tick is expected to be true by default by cpuidle
235+ * governors, which allows them to select idle states with
236+ * target residency above the tick period length.
237+ */
238+ stop_tick = true;
226239
227240 /*
228241 * Ask the cpuidle framework to choose a convenient idle state.
229242 */
230243 next_state = cpuidle_select(drv, dev, &stop_tick);
231244
232− if (stop_tick || tick_nohz_tick_stopped())
233− tick_nohz_idle_stop_tick();
234− else
235− tick_nohz_idle_retain_tick();
245+ idle_call_stop_or_retain_tick(stop_tick);
236246
237247 entered_state = call_cpuidle(drv, dev, next_state);
238248 /*
239249 * Give the governor an opportunity to reflect on the outcome
240250 */
241251 cpuidle_reflect(dev, entered_state);
252+ } else {
253+ idle_call_stop_or_retain_tick(stop_tick);
254+
255+ /*
256+ * If there is only a single idle state (or none), there is
257+ * nothing meaningful for the governor to choose. Skip the
258+ * governor and always use state 0.
259+ */
260+ call_cpuidle(drv, dev, 0);
242261 }
243262
244263 exit_idle:
@@ -259,6 +278,7 @@ exit_idle: · 14 unmodified lines
259278 static void do_idle(void)
260279 {
261280 int cpu = smp_processor_id();
281+ bool got_tick = false;
262282
263283 /*
264284 * Check if we need to update blocked load
@@ -329,8 +349,9 @@ static void do_idle(void) · 64 unmodified lines
329349 tick_nohz_idle_restart_tick();
330350 cpu_idle_poll();
331351 } else {
332− cpuidle_idle_call();
352+ cpuidle_idle_call(got_tick);
333353 }
354+ got_tick = tick_nohz_idle_got_tick();
334355 arch_cpu_idle_exit();
335356 }
336357
kernel/time/time.c+1−1
@@ -697,7 +697,7 @@ EXPORT_SYMBOL(clock_t_to_jiffies); · 696 unmodified lines
697697 *
698698 * Return: jiffies_64 value converted to 64-bit "clock_t" (CLOCKS_PER_SEC)
699699 */
700−u64 jiffies_64_to_clock_t(u64 x)
700+notrace u64 jiffies_64_to_clock_t(u64 x)
701701 {
702702 #if (TICK_NSEC % (NSEC_PER_SEC / USER_HZ)) == 0
703703 # if HZ < USER_HZ
kernel/workqueue.c+28−27
@@ -190,7 +190,7 @@ struct worker_pool { · 189 unmodified lines
190190 int id; /* I: pool ID */
191191 unsigned int flags; /* L: flags */
192192
193− unsigned long watchdog_ts; /* L: watchdog timestamp */
193+ unsigned long last_progress_ts; /* L: last forward progress timestamp */
194194 bool cpu_stall; /* WD: stalled cpu bound pool */
195195
196196 /*
@@ -1697,7 +1697,7 @@ static void __pwq_activate_work(struct pool_workqueue *pwq, · 1500 unmodified lines
16971697 WARN_ON_ONCE(!(*wdb & WORK_STRUCT_INACTIVE));
16981698 trace_workqueue_activate_work(work);
16991699 if (list_empty(&pwq->pool->worklist))
1700− pwq->pool->watchdog_ts = jiffies;
1700+ pwq->pool->last_progress_ts = jiffies;
17011701 move_linked_works(work, &pwq->pool->worklist, NULL);
17021702 __clear_bit(WORK_STRUCT_INACTIVE_BIT, wdb);
17031703 }
@@ -2348,7 +2348,7 @@ retry: · 644 unmodified lines
23482348 */
23492349 if (list_empty(&pwq->inactive_works) && pwq_tryinc_nr_active(pwq, false)) {
23502350 if (list_empty(&pool->worklist))
2351− pool->watchdog_ts = jiffies;
2351+ pool->last_progress_ts = jiffies;
23522352
23532353 trace_workqueue_activate_work(work);
23542354 insert_work(pwq, work, &pool->worklist, work_flags);
@@ -3204,6 +3204,7 @@ __acquires(&pool->lock) · 849 unmodified lines
32043204 worker->current_pwq = pwq;
32053205 if (worker->task)
32063206 worker->current_at = worker->task->se.sum_exec_runtime;
3207+ worker->current_start = jiffies;
32073208 work_data = *work_data_bits(work);
32083209 worker->current_color = get_work_color(work_data);
32093210
@@ -3352,7 +3353,7 @@ static void process_scheduled_works(struct worker *worker) · 142 unmodified lines
33523353 while ((work = list_first_entry_or_null(&worker->scheduled,
33533354 struct work_struct, entry))) {
33543355 if (first) {
3355− worker->pool->watchdog_ts = jiffies;
3356+ worker->pool->last_progress_ts = jiffies;
33563357 first = false;
33573358 }
33583359 process_one_work(worker, work);
@@ -4850,7 +4851,7 @@ static int init_worker_pool(struct worker_pool *pool) · 1491 unmodified lines
48504851 pool->cpu = -1;
48514852 pool->node = NUMA_NO_NODE;
48524853 pool->flags |= POOL_DISASSOCIATED;
4853− pool->watchdog_ts = jiffies;
4854+ pool->last_progress_ts = jiffies;
48544855 INIT_LIST_HEAD(&pool->worklist);
48554856 INIT_LIST_HEAD(&pool->idle_list);
48564857 hash_init(pool->busy_hash);
@@ -6274,7 +6275,7 @@ static void pr_cont_worker_id(struct worker *worker) · 1417 unmodified lines
62746275 {
62756276 struct worker_pool *pool = worker->pool;
62766277
6277− if (pool->flags & WQ_BH)
6278+ if (pool->flags & POOL_BH)
62786279 pr_cont("bh%s",
62796280 pool->attrs->nice == HIGHPRI_NICE_LEVEL ? "-hi" : "");
62806281 else
@@ -6359,6 +6360,8 @@ static void show_pwq(struct pool_workqueue *pwq) · 78 unmodified lines
63596360 pr_cont(" %s", comma ? "," : "");
63606361 pr_cont_worker_id(worker);
63616362 pr_cont(":%ps", worker->current_func);
6363+ pr_cont(" for %us",
6364+ jiffies_to_msecs(jiffies - worker->current_start) / 1000);
63626365 list_for_each_entry(work, &worker->scheduled, entry)
63636366 pr_cont_work(false, work, &pcws);
63646367 pr_cont_work_flush(comma, (work_func_t)-1L, &pcws);
@@ -6462,7 +6465,7 @@ static void show_one_worker_pool(struct worker_pool *pool) · 97 unmodified lines
64626465
64636466 /* How long the first pending work is waiting for a worker. */
64646467 if (!list_empty(&pool->worklist))
6465− hung = jiffies_to_msecs(jiffies - pool->watchdog_ts) / 1000;
6468+ hung = jiffies_to_msecs(jiffies - pool->last_progress_ts) / 1000;
64666469
64676470 /*
64686471 * Defer printing to avoid deadlocks in console drivers that
@@ -7580,11 +7583,11 @@ MODULE_PARM_DESC(panic_on_stall_time, "Panic if stall exceeds this many seconds · 1111 unmodified lines
75807583
75817584 /*
75827585 * Show workers that might prevent the processing of pending work items.
7583− * The only candidates are CPU-bound workers in the running state.
7584− * Pending work items should be handled by another idle worker
7585− * in all other situations.
7586+ * A busy worker that is not running on the CPU (e.g. sleeping in
7587+ * wait_event_idle() with PF_WQ_WORKER cleared) can stall the pool just as
7588+ * effectively as a CPU-bound one, so dump every in-flight worker.
75867589 */
7587−static void show_cpu_pool_hog(struct worker_pool *pool)
7590+static void show_cpu_pool_busy_workers(struct worker_pool *pool)
75887591 {
75897592 struct worker *worker;
75907593 unsigned long irq_flags;
@@ -7593,36 +7596,34 @@ static void show_cpu_pool_hog(struct worker_pool *pool) · 2 unmodified lines
75937596 raw_spin_lock_irqsave(&pool->lock, irq_flags);
75947597
75957598 hash_for_each(pool->busy_hash, bkt, worker, hentry) {
7596− if (task_is_running(worker->task)) {
7597− /*
7598− * Defer printing to avoid deadlocks in console
7599− * drivers that queue work while holding locks
7600− * also taken in their write paths.
7601− */
7602− printk_deferred_enter();
7599+ /*
7600+ * Defer printing to avoid deadlocks in console
7601+ * drivers that queue work while holding locks
7602+ * also taken in their write paths.
7603+ */
7604+ printk_deferred_enter();
76037605
7604− pr_info("pool %d:\n", pool->id);
7605− sched_show_task(worker->task);
7606+ pr_info("pool %d:\n", pool->id);
7607+ sched_show_task(worker->task);
76067608
7607− printk_deferred_exit();
7608− }
7609+ printk_deferred_exit();
76097610 }
76107611
76117612 raw_spin_unlock_irqrestore(&pool->lock, irq_flags);
76127613 }
76137614
7614−static void show_cpu_pools_hogs(void)
7615+static void show_cpu_pools_busy_workers(void)
76157616 {
76167617 struct worker_pool *pool;
76177618 int pi;
76187619
7619− pr_info("Showing backtraces of running workers in stalled CPU-bound worker pools:\n");
7620+ pr_info("Showing backtraces of busy workers in stalled worker pools:\n");
76207621
76217622 rcu_read_lock();
76227623
76237624 for_each_pool(pool, pi) {
76247625 if (pool->cpu_stall)
7625− show_cpu_pool_hog(pool);
7626+ show_cpu_pool_busy_workers(pool);
76267627
76277628 }
76287629
@@ -7691,7 +7692,7 @@ static void wq_watchdog_timer_fn(struct timer_list *unused) · 62 unmodified lines
76917692 touched = READ_ONCE(per_cpu(wq_watchdog_touched_cpu, pool->cpu));
76927693 else
76937694 touched = READ_ONCE(wq_watchdog_touched);
7694− pool_ts = READ_ONCE(pool->watchdog_ts);
7695+ pool_ts = READ_ONCE(pool->last_progress_ts);
76957696
76967697 if (time_after(pool_ts, touched))
76977698 ts = pool_ts;
@@ -7719,7 +7720,7 @@ static void wq_watchdog_timer_fn(struct timer_list *unused) · 21 unmodified lines
77197720 show_all_workqueues();
77207721
77217722 if (cpu_pool_stall)
7722− show_cpu_pools_hogs();
7723+ show_cpu_pools_busy_workers();
77237724
77247725 if (lockup_detected)
77257726 panic_on_wq_watchdog(max_stall_time);
kernel/workqueue_internal.h+1−0
@@ -32,6 +32,7 @@ struct worker { · 31 unmodified lines
3232 work_func_t current_func; /* K: function */
3333 struct pool_workqueue *current_pwq; /* K: pwq */
3434 u64 current_at; /* K: runtime at start or last wakeup */
35+ unsigned long current_start; /* K: start time of current work item */
3536 unsigned int current_color; /* K: color */
3637
3738 int sleeping; /* S: is worker sleeping? */
lib/bootconfig.c+3−3
@@ -316,7 +316,7 @@ int __init xbc_node_compose_key_after(struct xbc_node *root, · 315 unmodified lines
316316 depth ? "." : "");
317317 if (ret < 0)
318318 return ret;
319− if (ret > size) {
319+ if (ret >= size) {
320320 size = 0;
321321 } else {
322322 size -= ret;
@@ -532,9 +532,9 @@ static char *skip_spaces_until_newline(char *p) · 209 unmodified lines
532532 static int __init __xbc_open_brace(char *p)
533533 {
534534 /* Push the last key as open brace */
535− open_brace[brace_index++] = xbc_node_index(last_parent);
536535 if (brace_index >= XBC_DEPTH_MAX)
537536 return xbc_parse_error("Exceed max depth of braces", p);
537+ open_brace[brace_index++] = xbc_node_index(last_parent);
538538
539539 return 0;
540540 }
@@ -802,7 +802,7 @@ static int __init xbc_verify_tree(void) · 261 unmodified lines
802802
803803 /* Brace closing */
804804 if (brace_index) {
805− n = &xbc_nodes[open_brace[brace_index]];
805+ n = &xbc_nodes[open_brace[brace_index - 1]];
806806 return xbc_parse_error("Brace is not closed",
807807 xbc_node_get_data(n));
808808 }
lib/crypto/Makefile+3−0
@@ -55,6 +55,9 @@ libaes-$(CONFIG_SPARC) += sparc/aes_asm.o · 54 unmodified lines
5555 libaes-$(CONFIG_X86) += x86/aes-aesni.o
5656 endif # CONFIG_CRYPTO_LIB_AES_ARCH
5757
58+# clean-files must be defined unconditionally
59+clean-files += powerpc/aesp8-ppc.S
60+
5861 ################################################################################
5962
6063 obj-$(CONFIG_CRYPTO_LIB_AESCFB) += libaescfb.o
mm/huge_memory.c+2−1
@@ -2797,7 +2797,8 @@ int move_pages_huge_pmd(struct mm_struct *mm, pmd_t *dst_pmd, pmd_t *src_pmd, pm · 2796 unmodified lines
27972797 _dst_pmd = pmd_mkwrite(pmd_mkdirty(_dst_pmd), dst_vma);
27982798 } else {
27992799 src_pmdval = pmdp_huge_clear_flush(src_vma, src_addr, src_pmd);
2800− _dst_pmd = folio_mk_pmd(src_folio, dst_vma->vm_page_prot);
2800+ _dst_pmd = move_soft_dirty_pmd(src_pmdval);
2801+ _dst_pmd = clear_uffd_wp_pmd(_dst_pmd);
28012802 }
28022803 set_pmd_at(mm, dst_addr, dst_pmd, _dst_pmd);
28032804
mm/rmap.c+17−4
@@ -1955,7 +1955,14 @@ static inline unsigned int folio_unmap_pte_batch(struct folio *folio, · 1954 unmodified lines
19551955 if (userfaultfd_wp(vma))
19561956 return 1;
19571957
1958− return folio_pte_batch(folio, pvmw->pte, pte, max_nr);
1958+ /*
1959+ * If unmap fails, we need to restore the ptes. To avoid accidentally
1960+ * upgrading write permissions for ptes that were not originally
1961+ * writable, and to avoid losing the soft-dirty bit, use the
1962+ * appropriate FPB flags.
1963+ */
1964+ return folio_pte_batch_flags(folio, vma, pvmw->pte, &pte, max_nr,
1965+ FPB_RESPECT_WRITE | FPB_RESPECT_SOFT_DIRTY);
19591966 }
19601967
19611968 /*
@@ -2443,11 +2450,17 @@ static bool try_to_migrate_one(struct folio *folio, struct vm_area_struct *vma, · 481 unmodified lines
24432450 __maybe_unused pmd_t pmdval;
24442451
24452452 if (flags & TTU_SPLIT_HUGE_PMD) {
2453+ /*
2454+ * split_huge_pmd_locked() might leave the
2455+ * folio mapped through PTEs. Retry the walk
2456+ * so we can detect this scenario and properly
2457+ * abort the walk.
2458+ */
24462459 split_huge_pmd_locked(vma, pvmw.address,
24472460 pvmw.pmd, true);
2448− ret = false;
2449− page_vma_mapped_walk_done(&pvmw);
2450− break;
2461+ flags &= ~TTU_SPLIT_HUGE_PMD;
2462+ page_vma_mapped_walk_restart(&pvmw);
2463+ continue;
24512464 }
24522465 #ifdef CONFIG_ARCH_ENABLE_THP_MIGRATION
24532466 pmdval = pmdp_get(pvmw.pmd);
mm/slub.c+4−7
@@ -2119,13 +2119,6 @@ static inline size_t obj_exts_alloc_size(struct kmem_cache *s, · 2118 unmodified lines
21192119 size_t sz = sizeof(struct slabobj_ext) * slab->objects;
21202120 struct kmem_cache *obj_exts_cache;
21212121
2122− /*
2123− * slabobj_ext array for KMALLOC_CGROUP allocations
2124− * are served from KMALLOC_NORMAL caches.
2125− */
2126− if (!mem_alloc_profiling_enabled())
2127− return sz;
2128−
21292122 if (sz > KMALLOC_MAX_CACHE_SIZE)
21302123 return sz;
21312124
@@ -2797,6 +2790,7 @@ static void free_empty_sheaf(struct kmem_cache *s, struct slab_sheaf *sheaf) · 665 unmodified lines
27972790 if (s->flags & SLAB_KMALLOC)
27982791 mark_obj_codetag_empty(sheaf);
27992792
2793+ VM_WARN_ON_ONCE(sheaf->size > 0);
28002794 kfree(sheaf);
28012795
28022796 stat(s, SHEAF_FREE);
@@ -2828,6 +2822,7 @@ static int refill_sheaf(struct kmem_cache *s, struct slab_sheaf *sheaf, · 25 unmodified lines
28282822 return 0;
28292823 }
28302824
2825+static void sheaf_flush_unused(struct kmem_cache *s, struct slab_sheaf *sheaf);
28312826
28322827 static struct slab_sheaf *alloc_full_sheaf(struct kmem_cache *s, gfp_t gfp)
28332828 {
@@ -2837,6 +2832,7 @@ static struct slab_sheaf *alloc_full_sheaf(struct kmem_cache *s, gfp_t gfp) · 3 unmodified lines
28372832 return NULL;
28382833
28392834 if (refill_sheaf(s, sheaf, gfp | __GFP_NOMEMALLOC | __GFP_NOWARN)) {
2835+ sheaf_flush_unused(s, sheaf);
28402836 free_empty_sheaf(s, sheaf);
28412837 return NULL;
28422838 }
@@ -4623,6 +4619,7 @@ __pcs_replace_empty_main(struct kmem_cache *s, struct slub_percpu_sheaves *pcs, · 1780 unmodified lines
46234619 * we must be very low on memory so don't bother
46244620 * with the barn
46254621 */
4622+ sheaf_flush_unused(s, empty);
46264623 free_empty_sheaf(s, empty);
46274624 }
46284625 } else {
net/atm/lec.c+47−25
@@ -154,10 +154,19 @@ static void lec_handle_bridge(struct sk_buff *skb, struct net_device *dev) · 153 unmodified lines
154154 /* 0x01 is topology change */
155155
156156 priv = netdev_priv(dev);
157− atm_force_charge(priv->lecd, skb2->truesize);
158− sk = sk_atm(priv->lecd);
159− skb_queue_tail(&sk->sk_receive_queue, skb2);
160− sk->sk_data_ready(sk);
157+ struct atm_vcc *vcc;
158+
159+ rcu_read_lock();
160+ vcc = rcu_dereference(priv->lecd);
161+ if (vcc) {
162+ atm_force_charge(vcc, skb2->truesize);
163+ sk = sk_atm(vcc);
164+ skb_queue_tail(&sk->sk_receive_queue, skb2);
165+ sk->sk_data_ready(sk);
166+ } else {
167+ dev_kfree_skb(skb2);
168+ }
169+ rcu_read_unlock();
161170 }
162171 }
163172 #endif /* IS_ENABLED(CONFIG_BRIDGE) */
@@ -216,7 +225,7 @@ static netdev_tx_t lec_start_xmit(struct sk_buff *skb, · 52 unmodified lines
216225 int is_rdesc;
217226
218227 pr_debug("called\n");
219− if (!priv->lecd) {
228+ if (!rcu_access_pointer(priv->lecd)) {
220229 pr_info("%s:No lecd attached\n", dev->name);
221230 dev->stats.tx_errors++;
222231 netif_stop_queue(dev);
@@ -449,10 +458,19 @@ static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) · 226 unmodified lines
449458 break;
450459 skb2->len = sizeof(struct atmlec_msg);
451460 skb_copy_to_linear_data(skb2, mesg, sizeof(*mesg));
452− atm_force_charge(priv->lecd, skb2->truesize);
453− sk = sk_atm(priv->lecd);
454− skb_queue_tail(&sk->sk_receive_queue, skb2);
455− sk->sk_data_ready(sk);
461+ struct atm_vcc *vcc;
462+
463+ rcu_read_lock();
464+ vcc = rcu_dereference(priv->lecd);
465+ if (vcc) {
466+ atm_force_charge(vcc, skb2->truesize);
467+ sk = sk_atm(vcc);
468+ skb_queue_tail(&sk->sk_receive_queue, skb2);
469+ sk->sk_data_ready(sk);
470+ } else {
471+ dev_kfree_skb(skb2);
472+ }
473+ rcu_read_unlock();
456474 }
457475 }
458476 #endif /* IS_ENABLED(CONFIG_BRIDGE) */
@@ -468,23 +486,16 @@ static int lec_atm_send(struct atm_vcc *vcc, struct sk_buff *skb) · 9 unmodified lines
468486
469487 static void lec_atm_close(struct atm_vcc *vcc)
470488 {
471− struct sk_buff *skb;
472489 struct net_device *dev = (struct net_device *)vcc->proto_data;
473490 struct lec_priv *priv = netdev_priv(dev);
474491
475− priv->lecd = NULL;
492+ rcu_assign_pointer(priv->lecd, NULL);
493+ synchronize_rcu();
476494 /* Do something needful? */
477495
478496 netif_stop_queue(dev);
479497 lec_arp_destroy(priv);
480498
481− if (skb_peek(&sk_atm(vcc)->sk_receive_queue))
482− pr_info("%s closing with messages pending\n", dev->name);
483− while ((skb = skb_dequeue(&sk_atm(vcc)->sk_receive_queue))) {
484− atm_return(vcc, skb->truesize);
485− dev_kfree_skb(skb);
486− }
487−
488499 pr_info("%s: Shut down!\n", dev->name);
489500 module_put(THIS_MODULE);
490501 }
@@ -510,12 +521,14 @@ send_to_lecd(struct lec_priv *priv, atmlec_msg_type type, · 19 unmodified lines
510521 const unsigned char *mac_addr, const unsigned char *atm_addr,
511522 struct sk_buff *data)
512523 {
524+ struct atm_vcc *vcc;
513525 struct sock *sk;
514526 struct sk_buff *skb;
515527 struct atmlec_msg *mesg;
516528
517− if (!priv || !priv->lecd)
529+ if (!priv || !rcu_access_pointer(priv->lecd))
518530 return -1;
531+
519532 skb = alloc_skb(sizeof(struct atmlec_msg), GFP_ATOMIC);
520533 if (!skb)
521534 return -1;
@@ -532,18 +545,27 @@ send_to_lecd(struct lec_priv *priv, atmlec_msg_type type, · 10 unmodified lines
532545 if (atm_addr)
533546 memcpy(&mesg->content.normal.atm_addr, atm_addr, ATM_ESA_LEN);
534547
535− atm_force_charge(priv->lecd, skb->truesize);
536− sk = sk_atm(priv->lecd);
548+ rcu_read_lock();
549+ vcc = rcu_dereference(priv->lecd);
550+ if (!vcc) {
551+ rcu_read_unlock();
552+ kfree_skb(skb);
553+ return -1;
554+ }
555+
556+ atm_force_charge(vcc, skb->truesize);
557+ sk = sk_atm(vcc);
537558 skb_queue_tail(&sk->sk_receive_queue, skb);
538559 sk->sk_data_ready(sk);
539560
540561 if (data != NULL) {
541562 pr_debug("about to send %d bytes of data\n", data->len);
542− atm_force_charge(priv->lecd, data->truesize);
563+ atm_force_charge(vcc, data->truesize);
543564 skb_queue_tail(&sk->sk_receive_queue, data);
544565 sk->sk_data_ready(sk);
545566 }
546567
568+ rcu_read_unlock();
547569 return 0;
548570 }
549571
@@ -618,7 +640,7 @@ static void lec_push(struct atm_vcc *vcc, struct sk_buff *skb) · 68 unmodified lines
618640
619641 atm_return(vcc, skb->truesize);
620642 if (*(__be16 *) skb->data == htons(priv->lecid) ||
621− !priv->lecd || !(dev->flags & IFF_UP)) {
643+ !rcu_access_pointer(priv->lecd) || !(dev->flags & IFF_UP)) {
622644 /*
623645 * Probably looping back, or if lecd is missing,
624646 * lecd has gone down
@@ -753,12 +775,12 @@ static int lecd_attach(struct atm_vcc *vcc, int arg) · 128 unmodified lines
753775 priv = netdev_priv(dev_lec[i]);
754776 } else {
755777 priv = netdev_priv(dev_lec[i]);
756− if (priv->lecd)
778+ if (rcu_access_pointer(priv->lecd))
757779 return -EADDRINUSE;
758780 }
759781 lec_arp_init(priv);
760782 priv->itfnum = i; /* LANE2 addition */
761− priv->lecd = vcc;
783+ rcu_assign_pointer(priv->lecd, vcc);
762784 vcc->dev = &lecatm_dev;
763785 vcc_insert_socket(sk_atm(vcc));
764786
net/atm/lec.h+1−1
@@ -91,7 +91,7 @@ struct lec_priv { · 90 unmodified lines
9191 */
9292 spinlock_t lec_arp_lock;
9393 struct atm_vcc *mcast_vcc; /* Default Multicast Send VCC */
94− struct atm_vcc *lecd;
94+ struct atm_vcc __rcu *lecd;
9595 struct delayed_work lec_arp_work; /* C10 */
9696 unsigned int maximum_unknown_frame_count;
9797 /*
net/batman-adv/bat_iv_ogm.c+3−0
@@ -473,6 +473,9 @@ batadv_iv_ogm_can_aggregate(const struct batadv_ogm_packet *new_bat_ogm_packet, · 472 unmodified lines
473473 if (aggregated_bytes > max_bytes)
474474 return false;
475475
476+ if (skb_tailroom(forw_packet->skb) < packet_len)
477+ return false;
478+
476479 if (packet_num >= BATADV_MAX_AGGREGATION_PACKETS)
477480 return false;
478481
net/bluetooth/hci_conn.c+2−2
@@ -1944,6 +1944,8 @@ static bool hci_le_set_cig_params(struct hci_conn *conn, struct bt_iso_qos *qos) · 1943 unmodified lines
19441944 return false;
19451945
19461946 done:
1947+ conn->iso_qos = *qos;
1948+
19471949 if (hci_cmd_sync_queue(hdev, set_cig_params_sync,
19481950 UINT_PTR(qos->ucast.cig), NULL) < 0)
19491951 return false;
@@ -2013,8 +2015,6 @@ struct hci_conn *hci_bind_cis(struct hci_dev *hdev, bdaddr_t *dst, · 63 unmodified lines
20132015 }
20142016
20152017 hci_conn_hold(cis);
2016−
2017− cis->iso_qos = *qos;
20182018 cis->state = BT_BOUND;
20192019
20202020 return cis;
net/bluetooth/hci_sync.c+1−1
@@ -6627,8 +6627,8 @@ static int hci_le_create_conn_sync(struct hci_dev *hdev, void *data) · 6626 unmodified lines
66276627 * state.
66286628 */
66296629 if (hci_dev_test_flag(hdev, HCI_LE_SCAN)) {
6630− hci_scan_disable_sync(hdev);
66316630 hci_dev_set_flag(hdev, HCI_LE_SCAN_INTERRUPTED);
6631+ hci_scan_disable_sync(hdev);
66326632 }
66336633
66346634 /* Update random address, but set require_privacy to false so
net/bluetooth/hidp/core.c+14−2
@@ -986,7 +986,8 @@ static void session_free(struct kref *ref) · 985 unmodified lines
986986 skb_queue_purge(&session->intr_transmit);
987987 fput(session->intr_sock->file);
988988 fput(session->ctrl_sock->file);
989− l2cap_conn_put(session->conn);
989+ if (session->conn)
990+ l2cap_conn_put(session->conn);
990991 kfree(session);
991992 }
992993
@@ -1164,6 +1165,15 @@ static void hidp_session_remove(struct l2cap_conn *conn, · 171 unmodified lines
11641165
11651166 down_write(&hidp_session_sem);
11661167
1168+ /* Drop L2CAP reference immediately to indicate that
1169+ * l2cap_unregister_user() shall not be called as it is already
1170+ * considered removed.
1171+ */
1172+ if (session->conn) {
1173+ l2cap_conn_put(session->conn);
1174+ session->conn = NULL;
1175+ }
1176+
11671177 hidp_session_terminate(session);
11681178
11691179 cancel_work_sync(&session->dev_init);
@@ -1301,7 +1311,9 @@ static int hidp_session_thread(void *arg) · 131 unmodified lines
13011311 * Instead, this call has the same semantics as if user-space tried to
13021312 * delete the session.
13031313 */
1304− l2cap_unregister_user(session->conn, &session->user);
1314+ if (session->conn)
1315+ l2cap_unregister_user(session->conn, &session->user);
1316+
13051317 hidp_session_put(session);
13061318
13071319 module_put_and_kthread_exit(0);
net/bluetooth/l2cap_core.c+31−20
@@ -1678,17 +1678,15 @@ static void l2cap_info_timeout(struct work_struct *work) · 1677 unmodified lines
16781678
16791679 int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user)
16801680 {
1681− struct hci_dev *hdev = conn->hcon->hdev;
16821681 int ret;
16831682
16841683 /* We need to check whether l2cap_conn is registered. If it is not, we
1685− * must not register the l2cap_user. l2cap_conn_del() is unregisters
1686− * l2cap_conn objects, but doesn't provide its own locking. Instead, it
1687− * relies on the parent hci_conn object to be locked. This itself relies
1688− * on the hci_dev object to be locked. So we must lock the hci device
1689− * here, too. */
1684+ * must not register the l2cap_user. l2cap_conn_del() unregisters
1685+ * l2cap_conn objects under conn->lock, and we use the same lock here
1686+ * to protect access to conn->users and conn->hchan.
1687+ */
16901688
1691− hci_dev_lock(hdev);
1689+ mutex_lock(&conn->lock);
16921690
16931691 if (!list_empty(&user->list)) {
16941692 ret = -EINVAL;
@@ -1709,16 +1707,14 @@ int l2cap_register_user(struct l2cap_conn *conn, struct l2cap_user *user) · 14 unmodified lines
17091707 ret = 0;
17101708
17111709 out_unlock:
1712− hci_dev_unlock(hdev);
1710+ mutex_unlock(&conn->lock);
17131711 return ret;
17141712 }
17151713 EXPORT_SYMBOL(l2cap_register_user);
17161714
17171715 void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user)
17181716 {
1719− struct hci_dev *hdev = conn->hcon->hdev;
1720−
1721− hci_dev_lock(hdev);
1717+ mutex_lock(&conn->lock);
17221718
17231719 if (list_empty(&user->list))
17241720 goto out_unlock;
@@ -1727,7 +1723,7 @@ void l2cap_unregister_user(struct l2cap_conn *conn, struct l2cap_user *user) · 2 unmodified lines
17271723 user->remove(conn, user);
17281724
17291725 out_unlock:
1730− hci_dev_unlock(hdev);
1726+ mutex_unlock(&conn->lock);
17311727 }
17321728 EXPORT_SYMBOL(l2cap_unregister_user);
17331729
@@ -4616,7 +4612,8 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, · 2882 unmodified lines
46164612
46174613 switch (type) {
46184614 case L2CAP_IT_FEAT_MASK:
4619− conn->feat_mask = get_unaligned_le32(rsp->data);
4615+ if (cmd_len >= sizeof(*rsp) + sizeof(u32))
4616+ conn->feat_mask = get_unaligned_le32(rsp->data);
46204617
46214618 if (conn->feat_mask & L2CAP_FEAT_FIXED_CHAN) {
46224619 struct l2cap_info_req req;
@@ -4635,7 +4632,8 @@ static inline int l2cap_information_rsp(struct l2cap_conn *conn, · 12 unmodified lines
46354632 break;
46364633
46374634 case L2CAP_IT_FIXED_CHAN:
4638− conn->remote_fixed_chan = rsp->data[0];
4635+ if (cmd_len >= sizeof(*rsp) + sizeof(rsp->data[0]))
4636+ conn->remote_fixed_chan = rsp->data[0];
46394637 conn->info_state |= L2CAP_INFO_FEAT_MASK_REQ_DONE;
46404638 conn->info_ident = 0;
46414639
@@ -5059,7 +5057,7 @@ static inline int l2cap_ecred_conn_req(struct l2cap_conn *conn, · 417 unmodified lines
50595057 u16 mtu, mps;
50605058 __le16 psm;
50615059 u8 result, rsp_len = 0;
5062− int i, num_scid;
5060+ int i, num_scid = 0;
50635061 bool defer = false;
50645062
50655063 if (!enable_ecred)
@@ -5072,6 +5070,14 @@ static inline int l2cap_ecred_conn_req(struct l2cap_conn *conn, · 6 unmodified lines
50725070 goto response;
50735071 }
50745072
5073+ /* Check if there are no pending channels with the same ident */
5074+ __l2cap_chan_list_id(conn, cmd->ident, l2cap_ecred_list_defer,
5075+ &num_scid);
5076+ if (num_scid) {
5077+ result = L2CAP_CR_LE_INVALID_PARAMS;
5078+ goto response;
5079+ }
5080+
50755081 cmd_len -= sizeof(*req);
50765082 num_scid = cmd_len / sizeof(u16);
50775083
@@ -5424,7 +5430,7 @@ static inline int l2cap_ecred_reconf_rsp(struct l2cap_conn *conn, · 346 unmodified lines
54245430 u8 *data)
54255431 {
54265432 struct l2cap_chan *chan, *tmp;
5427− struct l2cap_ecred_conn_rsp *rsp = (void *) data;
5433+ struct l2cap_ecred_reconf_rsp *rsp = (void *)data;
54285434 u16 result;
54295435
54305436 if (cmd_len < sizeof(*rsp))
@@ -5432,7 +5438,7 @@ static inline int l2cap_ecred_reconf_rsp(struct l2cap_conn *conn, · 1 unmodified line
54325438
54335439 result = __le16_to_cpu(rsp->result);
54345440
5435− BT_DBG("result 0x%4.4x", rsp->result);
5441+ BT_DBG("result 0x%4.4x", result);
54365442
54375443 if (!result)
54385444 return 0;
@@ -6662,8 +6668,10 @@ static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) · 1223 unmodified lines
66626668 return -ENOBUFS;
66636669 }
66646670
6665− if (chan->imtu < skb->len) {
6666− BT_ERR("Too big LE L2CAP PDU");
6671+ if (skb->len > chan->imtu) {
6672+ BT_ERR("Too big LE L2CAP PDU: len %u > %u", skb->len,
6673+ chan->imtu);
6674+ l2cap_send_disconn_req(chan, ECONNRESET);
66676675 return -ENOBUFS;
66686676 }
66696677
@@ -6689,7 +6697,9 @@ static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) · 19 unmodified lines
66896697 sdu_len, skb->len, chan->imtu);
66906698
66916699 if (sdu_len > chan->imtu) {
6692− BT_ERR("Too big LE L2CAP SDU length received");
6700+ BT_ERR("Too big LE L2CAP SDU length: len %u > %u",
6701+ skb->len, sdu_len);
6702+ l2cap_send_disconn_req(chan, ECONNRESET);
66936703 err = -EMSGSIZE;
66946704 goto failed;
66956705 }
@@ -6725,6 +6735,7 @@ static int l2cap_ecred_data_rcv(struct l2cap_chan *chan, struct sk_buff *skb) · 29 unmodified lines
67256735
67266736 if (chan->sdu->len + skb->len > chan->sdu_len) {
67276737 BT_ERR("Too much LE L2CAP data received");
6738+ l2cap_send_disconn_req(chan, ECONNRESET);
67286739 err = -EINVAL;
67296740 goto failed;
67306741 }
net/bluetooth/mgmt.c+2−5
@@ -2195,10 +2195,7 @@ static void set_mesh_complete(struct hci_dev *hdev, void *data, int err) · 2194 unmodified lines
21952195 sk = cmd->sk;
21962196
21972197 if (status) {
2198− mgmt_cmd_status(cmd->sk, hdev->id, MGMT_OP_SET_MESH_RECEIVER,
2199− status);
2200− mgmt_pending_foreach(MGMT_OP_SET_MESH_RECEIVER, hdev, true,
2201− cmd_status_rsp, &status);
2198+ mgmt_cmd_status(cmd->sk, hdev->id, cmd->opcode, status);
22022199 goto done;
22032200 }
22042201
@@ -5377,7 +5374,7 @@ static void mgmt_add_adv_patterns_monitor_complete(struct hci_dev *hdev, · 3172 unmodified lines
53775374
53785375 mgmt_cmd_complete(cmd->sk, cmd->hdev->id, cmd->opcode,
53795376 mgmt_status(status), &rp, sizeof(rp));
5380− mgmt_pending_remove(cmd);
5377+ mgmt_pending_free(cmd);
53815378
53825379 hci_dev_unlock(hdev);
53835380 bt_dev_dbg(hdev, "add monitor %d complete, status %d",
net/bluetooth/smp.c+1−1
@@ -2743,7 +2743,7 @@ static int smp_cmd_public_key(struct l2cap_conn *conn, struct sk_buff *skb) · 2742 unmodified lines
27432743 if (!test_bit(SMP_FLAG_DEBUG_KEY, &smp->flags) &&
27442744 !crypto_memneq(key, smp->local_pk, 64)) {
27452745 bt_dev_err(hdev, "Remote and local public keys are identical");
2746− return SMP_UNSPECIFIED;
2746+ return SMP_DHKEY_CHECK_FAILED;
27472747 }
27482748
27492749 memcpy(smp->remote_pk, key, 64);
net/bridge/br_cfm.c+2−2
@@ -576,7 +576,7 @@ static void mep_delete_implementation(struct net_bridge *br, · 575 unmodified lines
576576
577577 /* Empty and free peer MEP list */
578578 hlist_for_each_entry_safe(peer_mep, n_store, &mep->peer_mep_list, head) {
579− cancel_delayed_work_sync(&peer_mep->ccm_rx_dwork);
579+ disable_delayed_work_sync(&peer_mep->ccm_rx_dwork);
580580 hlist_del_rcu(&peer_mep->head);
581581 kfree_rcu(peer_mep, rcu);
582582 }
@@ -732,7 +732,7 @@ int br_cfm_cc_peer_mep_remove(struct net_bridge *br, const u32 instance, · 149 unmodified lines
732732 return -ENOENT;
733733 }
734734
735− cc_peer_disable(peer_mep);
735+ disable_delayed_work_sync(&peer_mep->ccm_rx_dwork);
736736
737737 hlist_del_rcu(&peer_mep->head);
738738 kfree_rcu(peer_mep, rcu);
net/ceph/auth.c+4−2
@@ -205,9 +205,9 @@ int ceph_handle_auth_reply(struct ceph_auth_client *ac, · 204 unmodified lines
205205 s32 result;
206206 u64 global_id;
207207 void *payload, *payload_end;
208− int payload_len;
208+ u32 payload_len;
209209 char *result_msg;
210− int result_msg_len;
210+ u32 result_msg_len;
211211 int ret = -EINVAL;
212212
213213 mutex_lock(&ac->mutex);
@@ -217,10 +217,12 @@ int ceph_handle_auth_reply(struct ceph_auth_client *ac, · 3 unmodified lines
217217 result = ceph_decode_32(&p);
218218 global_id = ceph_decode_64(&p);
219219 payload_len = ceph_decode_32(&p);
220+ ceph_decode_need(&p, end, payload_len, bad);
220221 payload = p;
221222 p += payload_len;
222223 ceph_decode_need(&p, end, sizeof(u32), bad);
223224 result_msg_len = ceph_decode_32(&p);
225+ ceph_decode_need(&p, end, result_msg_len, bad);
224226 result_msg = p;
225227 p += result_msg_len;
226228 if (p != end)
net/ceph/messenger_v2.c+21−10
@@ -392,7 +392,7 @@ static int head_onwire_len(int ctrl_len, bool secure) · 391 unmodified lines
392392 int head_len;
393393 int rem_len;
394394
395− BUG_ON(ctrl_len < 0 || ctrl_len > CEPH_MSG_MAX_CONTROL_LEN);
395+ BUG_ON(ctrl_len < 1 || ctrl_len > CEPH_MSG_MAX_CONTROL_LEN);
396396
397397 if (secure) {
398398 head_len = CEPH_PREAMBLE_SECURE_LEN;
@@ -401,9 +401,7 @@ static int head_onwire_len(int ctrl_len, bool secure) · 2 unmodified lines
401401 head_len += padded_len(rem_len) + CEPH_GCM_TAG_LEN;
402402 }
403403 } else {
404− head_len = CEPH_PREAMBLE_PLAIN_LEN;
405− if (ctrl_len)
406− head_len += ctrl_len + CEPH_CRC_LEN;
404+ head_len = CEPH_PREAMBLE_PLAIN_LEN + ctrl_len + CEPH_CRC_LEN;
407405 }
408406 return head_len;
409407 }
@@ -528,11 +526,16 @@ static int decode_preamble(void *p, struct ceph_frame_desc *desc) · 118 unmodified lines
528526 desc->fd_aligns[i] = ceph_decode_16(&p);
529527 }
530528
531− if (desc->fd_lens[0] < 0 ||
529+ /*
530+ * This would fire for FRAME_TAG_WAIT (it has one empty
531+ * segment), but we should never get it as client.
532+ */
533+ if (desc->fd_lens[0] < 1 ||
532534 desc->fd_lens[0] > CEPH_MSG_MAX_CONTROL_LEN) {
533535 pr_err("bad control segment length %d\n", desc->fd_lens[0]);
534536 return -EINVAL;
535537 }
538+
536539 if (desc->fd_lens[1] < 0 ||
537540 desc->fd_lens[1] > CEPH_MSG_MAX_FRONT_LEN) {
538541 pr_err("bad front segment length %d\n", desc->fd_lens[1]);
@@ -549,10 +552,6 @@ static int decode_preamble(void *p, struct ceph_frame_desc *desc) · 10 unmodified lines
549552 return -EINVAL;
550553 }
551554
552− /*
553− * This would fire for FRAME_TAG_WAIT (it has one empty
554− * segment), but we should never get it as client.
555− */
556555 if (!desc->fd_lens[desc->fd_seg_cnt - 1]) {
557556 pr_err("last segment empty, segment count %d\n",
558557 desc->fd_seg_cnt);
@@ -2833,12 +2832,15 @@ static int process_message_header(struct ceph_connection *con, · 2274 unmodified lines
28332832 void *p, void *end)
28342833 {
28352834 struct ceph_frame_desc *desc = &con->v2.in_desc;
2836− struct ceph_msg_header2 *hdr2 = p;
2835+ struct ceph_msg_header2 *hdr2;
28372836 struct ceph_msg_header hdr;
28382837 int skip;
28392838 int ret;
28402839 u64 seq;
28412840
2841+ ceph_decode_need(&p, end, sizeof(*hdr2), bad);
2842+ hdr2 = p;
2843+
28422844 /* verify seq# */
28432845 seq = le64_to_cpu(hdr2->seq);
28442846 if ((s64)seq - (s64)con->in_seq < 1) {
@@ -2869,6 +2871,10 @@ static int process_message_header(struct ceph_connection *con, · 24 unmodified lines
28692871 WARN_ON(!con->in_msg);
28702872 WARN_ON(con->in_msg->con != con);
28712873 return 1;
2874+
2875+bad:
2876+ pr_err("failed to decode message header\n");
2877+ return -EINVAL;
28722878 }
28732879
28742880 static int process_message(struct ceph_connection *con)
@@ -2898,6 +2904,11 @@ static int __handle_control(struct ceph_connection *con, void *p) · 23 unmodified lines
28982904 if (con->v2.in_desc.fd_tag != FRAME_TAG_MESSAGE)
28992905 return process_control(con, p, end);
29002906
2907+ if (con->state != CEPH_CON_S_OPEN) {
2908+ con->error_msg = "protocol error, unexpected message";
2909+ return -EINVAL;
2910+ }
2911+
29012912 ret = process_message_header(con, p, end);
29022913 if (ret < 0)
29032914 return ret;
net/ceph/mon_client.c+3−3
@@ -72,8 +72,8 @@ static struct ceph_monmap *ceph_monmap_decode(void **p, void *end, bool msgr2) · 71 unmodified lines
7272 struct ceph_monmap *monmap = NULL;
7373 struct ceph_fsid fsid;
7474 u32 struct_len;
75− int blob_len;
76− int num_mon;
75+ u32 blob_len;
76+ u32 num_mon;
7777 u8 struct_v;
7878 u32 epoch;
7979 int ret;
@@ -112,7 +112,7 @@ static struct ceph_monmap *ceph_monmap_decode(void **p, void *end, bool msgr2) · 32 unmodified lines
112112 }
113113 ceph_decode_32_safe(p, end, num_mon, e_inval);
114114
115− dout("%s fsid %pU epoch %u num_mon %d\n", __func__, &fsid, epoch,
115+ dout("%s fsid %pU epoch %u num_mon %u\n", __func__, &fsid, epoch,
116116 num_mon);
117117 if (num_mon > CEPH_MAX_MON)
118118 goto e_inval;
net/ethernet/eth.c+3−6
@@ -193,14 +193,11 @@ __be16 eth_type_trans(struct sk_buff *skb, struct net_device *dev) · 192 unmodified lines
193193 }
194194 EXPORT_SYMBOL(eth_type_trans);
195195
196−/**
197− * eth_header_parse - extract hardware address from packet
198− * @skb: packet to extract header from
199− * @haddr: destination buffer
200− */
201−int eth_header_parse(const struct sk_buff *skb, unsigned char *haddr)
196+int eth_header_parse(const struct sk_buff *skb, const struct net_device *dev,
197+ unsigned char *haddr)
202198 {
203199 const struct ethhdr *eth = eth_hdr(skb);
200+
204201 memcpy(haddr, eth->h_source, ETH_ALEN);
205202 return ETH_ALEN;
206203 }
net/ipv4/icmp.c+3−1
@@ -1078,10 +1078,12 @@ out: · 1077 unmodified lines
10781078
10791079 static bool icmp_tag_validation(int proto)
10801080 {
1081+ const struct net_protocol *ipprot;
10811082 bool ok;
10821083
10831084 rcu_read_lock();
1084− ok = rcu_dereference(inet_protos[proto])->icmp_strict_tag_validation;
1085+ ipprot = rcu_dereference(inet_protos[proto]);
1086+ ok = ipprot ? ipprot->icmp_strict_tag_validation : false;
10851087 rcu_read_unlock();
10861088 return ok;
10871089 }
net/ipv4/ip_gre.c+2−1
@@ -919,7 +919,8 @@ static int ipgre_header(struct sk_buff *skb, struct net_device *dev, · 918 unmodified lines
919919 return -(t->hlen + sizeof(*iph));
920920 }
921921
922−static int ipgre_header_parse(const struct sk_buff *skb, unsigned char *haddr)
922+static int ipgre_header_parse(const struct sk_buff *skb, const struct net_device *dev,
923+ unsigned char *haddr)
923924 {
924925 const struct iphdr *iph = (const struct iphdr *) skb_mac_header(skb);
925926 memcpy(haddr, &iph->saddr, 4);
net/ipv6/exthdrs.c+4−0
@@ -379,6 +379,10 @@ static int ipv6_srh_rcv(struct sk_buff *skb) · 378 unmodified lines
379379 hdr = (struct ipv6_sr_hdr *)skb_transport_header(skb);
380380
381381 idev = __in6_dev_get(skb->dev);
382+ if (!idev) {
383+ kfree_skb(skb);
384+ return -1;
385+ }
382386
383387 accept_seg6 = min(READ_ONCE(net->ipv6.devconf_all->seg6_enabled),
384388 READ_ONCE(idev->cnf.seg6_enabled));
net/ipv6/seg6_hmac.c+2−0
@@ -184,6 +184,8 @@ bool seg6_hmac_validate_skb(struct sk_buff *skb) · 183 unmodified lines
184184 int require_hmac;
185185
186186 idev = __in6_dev_get(skb->dev);
187+ if (!idev)
188+ return false;
187189
188190 srh = (struct ipv6_sr_hdr *)skb_transport_header(skb);
189191
net/mac80211/cfg.c+6−6
@@ -1897,12 +1897,6 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev, · 1896 unmodified lines
18971897
18981898 __sta_info_flush(sdata, true, link_id, NULL);
18991899
1900− ieee80211_remove_link_keys(link, &keys);
1901− if (!list_empty(&keys)) {
1902− synchronize_net();
1903− ieee80211_free_key_list(local, &keys);
1904− }
1905−
19061900 ieee80211_stop_mbssid(sdata);
19071901 RCU_INIT_POINTER(link_conf->tx_bss_conf, NULL);
19081902
@@ -1914,6 +1908,12 @@ static int ieee80211_stop_ap(struct wiphy *wiphy, struct net_device *dev, · 5 unmodified lines
19141908 ieee80211_link_info_change_notify(sdata, link,
19151909 BSS_CHANGED_BEACON_ENABLED);
19161910
1911+ ieee80211_remove_link_keys(link, &keys);
1912+ if (!list_empty(&keys)) {
1913+ synchronize_net();
1914+ ieee80211_free_key_list(local, &keys);
1915+ }
1916+
19171917 if (sdata->wdev.links[link_id].cac_started) {
19181918 chandef = link_conf->chanreq.oper;
19191919 wiphy_hrtimer_work_cancel(wiphy, &link->dfs_cac_timer_work);
net/mac80211/chan.c+4−2
@@ -582,14 +582,16 @@ static void ieee80211_chan_bw_change(struct ieee80211_local *local, · 581 unmodified lines
582582 rcu_read_lock();
583583 list_for_each_entry_rcu(sta, &local->sta_list,
584584 list) {
585− struct ieee80211_sub_if_data *sdata = sta->sdata;
585+ struct ieee80211_sub_if_data *sdata;
586586 enum ieee80211_sta_rx_bandwidth new_sta_bw;
587587 unsigned int link_id;
588588
589589 if (!ieee80211_sdata_running(sta->sdata))
590590 continue;
591591
592− for (link_id = 0; link_id < ARRAY_SIZE(sta->sdata->link); link_id++) {
592+ sdata = get_bss_sdata(sta->sdata);
593+
594+ for (link_id = 0; link_id < ARRAY_SIZE(sdata->link); link_id++) {
593595 struct ieee80211_link_data *link =
594596 rcu_dereference(sdata->link[link_id]);
595597 struct ieee80211_bss_conf *link_conf;
net/mac80211/debugfs.c+5−9
@@ -320,7 +320,6 @@ static ssize_t aql_enable_read(struct file *file, char __user *user_buf, · 319 unmodified lines
320320 static ssize_t aql_enable_write(struct file *file, const char __user *user_buf,
321321 size_t count, loff_t *ppos)
322322 {
323− bool aql_disabled = static_key_false(&aql_disable.key);
324323 char buf[3];
325324 size_t len;
326325
@@ -335,15 +334,12 @@ static ssize_t aql_enable_write(struct file *file, const char __user *user_buf, · 8 unmodified lines
335334 if (len > 0 && buf[len - 1] == '\n')
336335 buf[len - 1] = 0;
337336
338− if (buf[0] == '0' && buf[1] == '\0') {
339− if (!aql_disabled)
340− static_branch_inc(&aql_disable);
341− } else if (buf[0] == '1' && buf[1] == '\0') {
342− if (aql_disabled)
343− static_branch_dec(&aql_disable);
344− } else {
337+ if (buf[0] == '0' && buf[1] == '\0')
338+ static_branch_enable(&aql_disable);
339+ else if (buf[0] == '1' && buf[1] == '\0')
340+ static_branch_disable(&aql_disable);
341+ else
345342 return -EINVAL;
346− }
347343
348344 return count;
349345 }
net/mac80211/mesh.c+3−0
@@ -78,6 +78,9 @@ bool mesh_matches_local(struct ieee80211_sub_if_data *sdata, · 77 unmodified lines
7878 * - MDA enabled
7979 * - Power management control on fc
8080 */
81+ if (!ie->mesh_config)
82+ return false;
83+
8184 if (!(ifmsh->mesh_id_len == ie->mesh_id_len &&
8285 memcmp(ifmsh->mesh_id, ie->mesh_id, ie->mesh_id_len) == 0 &&
8386 (ifmsh->mesh_pp_id == ie->mesh_config->meshconf_psel) &&
net/mac80211/sta_info.c+5−2
@@ -2782,7 +2782,9 @@ static void sta_set_link_sinfo(struct sta_info *sta, · 2781 unmodified lines
27822782 }
27832783
27842784 link_sinfo->inactive_time =
2785− jiffies_to_msecs(jiffies - ieee80211_sta_last_active(sta, link_id));
2785+ jiffies_delta_to_msecs(jiffies -
2786+ ieee80211_sta_last_active(sta,
2787+ link_id));
27862788
27872789 if (!(link_sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES64) |
27882790 BIT_ULL(NL80211_STA_INFO_TX_BYTES)))) {
@@ -3015,7 +3017,8 @@ void sta_set_sinfo(struct sta_info *sta, struct station_info *sinfo, · 226 unmodified lines
30153017 sinfo->connected_time = ktime_get_seconds() - sta->last_connected;
30163018 sinfo->assoc_at = sta->assoc_at;
30173019 sinfo->inactive_time =
3018− jiffies_to_msecs(jiffies - ieee80211_sta_last_active(sta, -1));
3020+ jiffies_delta_to_msecs(jiffies -
3021+ ieee80211_sta_last_active(sta, -1));
30193022
30203023 if (!(sinfo->filled & (BIT_ULL(NL80211_STA_INFO_TX_BYTES64) |
30213024 BIT_ULL(NL80211_STA_INFO_TX_BYTES)))) {
net/mac80211/tdls.c+1−1
@@ -1444,7 +1444,7 @@ int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, · 1443 unmodified lines
14441444 }
14451445
14461446 sta = sta_info_get(sdata, peer);
1447− if (!sta)
1447+ if (!sta || !sta->sta.tdls)
14481448 return -ENOLINK;
14491449
14501450 iee80211_tdls_recalc_chanctx(sdata, sta);
net/mac80211/tx.c+3−1
@@ -1896,8 +1896,10 @@ bool ieee80211_tx_prepare_skb(struct ieee80211_hw *hw, · 1895 unmodified lines
18961896 struct ieee80211_tx_data tx;
18971897 struct sk_buff *skb2;
18981898
1899− if (ieee80211_tx_prepare(sdata, &tx, NULL, skb) == TX_DROP)
1899+ if (ieee80211_tx_prepare(sdata, &tx, NULL, skb) == TX_DROP) {
1900+ kfree_skb(skb);
19001901 return false;
1902+ }
19011903
19021904 info->band = band;
19031905 info->control.vif = vif;
net/mac802154/iface.c+3−1
@@ -469,7 +469,9 @@ static int mac802154_header_create(struct sk_buff *skb, · 468 unmodified lines
469469 }
470470
471471 static int
472−mac802154_header_parse(const struct sk_buff *skb, unsigned char *haddr)
472+mac802154_header_parse(const struct sk_buff *skb,
473+ const struct net_device *dev,
474+ unsigned char *haddr)
473475 {
474476 struct ieee802154_hdr hdr;
475477
net/mpls/af_mpls.c+1−0
@@ -2851,6 +2851,7 @@ out_unregister_rtnl_af: · 2850 unmodified lines
28512851 rtnl_af_unregister(&mpls_af_ops);
28522852 out_unregister_dev_type:
28532853 dev_remove_pack(&mpls_packet_type);
2854+ unregister_netdevice_notifier(&mpls_dev_notifier);
28542855 out_unregister_pernet:
28552856 unregister_pernet_subsys(&mpls_net_ops);
28562857 goto out;
net/mptcp/pm_kernel.c+1−1
@@ -838,7 +838,7 @@ static struct lock_class_key mptcp_keys[2]; · 837 unmodified lines
838838 static int mptcp_pm_nl_create_listen_socket(struct sock *sk,
839839 struct mptcp_pm_addr_entry *entry)
840840 {
841− bool is_ipv6 = sk->sk_family == AF_INET6;
841+ bool is_ipv6 = entry->addr.family == AF_INET6;
842842 int addrlen = sizeof(struct sockaddr_in);
843843 struct sockaddr_storage addr;
844844 struct sock *newsk, *ssk;
net/netfilter/nf_bpf_link.c+1−1
@@ -170,7 +170,7 @@ static int bpf_nf_link_update(struct bpf_link *link, struct bpf_prog *new_prog, · 169 unmodified lines
170170
171171 static const struct bpf_link_ops bpf_nf_link_lops = {
172172 .release = bpf_nf_link_release,
173− .dealloc = bpf_nf_link_dealloc,
173+ .dealloc_deferred = bpf_nf_link_dealloc,
174174 .detach = bpf_nf_link_detach,
175175 .show_fdinfo = bpf_nf_link_show_info,
176176 .fill_link_info = bpf_nf_link_fill_link_info,
net/netfilter/nf_conntrack_h323_asn1.c+4−0
@@ -331,6 +331,8 @@ static int decode_int(struct bitstr *bs, const struct field_t *f, · 330 unmodified lines
331331 if (nf_h323_error_boundary(bs, 0, 2))
332332 return H323_ERROR_BOUND;
333333 len = get_bits(bs, 2) + 1;
334+ if (nf_h323_error_boundary(bs, len, 0))
335+ return H323_ERROR_BOUND;
334336 BYTE_ALIGN(bs);
335337 if (base && (f->attr & DECODE)) { /* timeToLive */
336338 unsigned int v = get_uint(bs, len) + f->lb;
@@ -922,6 +924,8 @@ int DecodeQ931(unsigned char *buf, size_t sz, Q931 *q931) · 585 unmodified lines
922924 break;
923925 p++;
924926 len--;
927+ if (len <= 0)
928+ break;
925929 return DecodeH323_UserInformation(buf, p, len,
926930 &q931->UUIE);
927931 }
net/netfilter/nf_conntrack_netlink.c+26−2
@@ -3210,7 +3210,7 @@ ctnetlink_exp_ct_dump_table(struct sk_buff *skb, struct netlink_callback *cb) · 3209 unmodified lines
32103210 {
32113211 struct nfgenmsg *nfmsg = nlmsg_data(cb->nlh);
32123212 struct nf_conn *ct = cb->data;
3213− struct nf_conn_help *help = nfct_help(ct);
3213+ struct nf_conn_help *help;
32143214 u_int8_t l3proto = nfmsg->nfgen_family;
32153215 unsigned long last_id = cb->args[1];
32163216 struct nf_conntrack_expect *exp;
@@ -3218,6 +3218,10 @@ ctnetlink_exp_ct_dump_table(struct sk_buff *skb, struct netlink_callback *cb) · 1 unmodified line
32183218 if (cb->args[0])
32193219 return 0;
32203220
3221+ help = nfct_help(ct);
3222+ if (!help)
3223+ return 0;
3224+
32213225 rcu_read_lock();
32223226
32233227 restart:
@@ -3247,6 +3251,24 @@ out: · 23 unmodified lines
32473251 return skb->len;
32483252 }
32493253
3254+static int ctnetlink_dump_exp_ct_start(struct netlink_callback *cb)
3255+{
3256+ struct nf_conn *ct = cb->data;
3257+
3258+ if (!refcount_inc_not_zero(&ct->ct_general.use))
3259+ return -ENOENT;
3260+ return 0;
3261+}
3262+
3263+static int ctnetlink_dump_exp_ct_done(struct netlink_callback *cb)
3264+{
3265+ struct nf_conn *ct = cb->data;
3266+
3267+ if (ct)
3268+ nf_ct_put(ct);
3269+ return 0;
3270+}
3271+
32503272 static int ctnetlink_dump_exp_ct(struct net *net, struct sock *ctnl,
32513273 struct sk_buff *skb,
32523274 const struct nlmsghdr *nlh,
@@ -3262,6 +3284,8 @@ static int ctnetlink_dump_exp_ct(struct net *net, struct sock *ctnl, · 9 unmodified lines
32623284 struct nf_conntrack_zone zone;
32633285 struct netlink_dump_control c = {
32643286 .dump = ctnetlink_exp_ct_dump_table,
3287+ .start = ctnetlink_dump_exp_ct_start,
3288+ .done = ctnetlink_dump_exp_ct_done,
32653289 };
32663290
32673291 err = ctnetlink_parse_tuple(cda, &tuple, CTA_EXPECT_MASTER,
@@ -3463,7 +3487,7 @@ ctnetlink_change_expect(struct nf_conntrack_expect *x, · 195 unmodified lines
34633487
34643488 #if IS_ENABLED(CONFIG_NF_NAT)
34653489 static const struct nla_policy exp_nat_nla_policy[CTA_EXPECT_NAT_MAX+1] = {
3466− [CTA_EXPECT_NAT_DIR] = { .type = NLA_U32 },
3490+ [CTA_EXPECT_NAT_DIR] = NLA_POLICY_MAX(NLA_BE32, IP_CT_DIR_REPLY),
34673491 [CTA_EXPECT_NAT_TUPLE] = { .type = NLA_NESTED },
34683492 };
34693493 #endif
net/netfilter/nf_conntrack_proto_sctp.c+2−1
@@ -582,7 +582,8 @@ nla_put_failure: · 581 unmodified lines
582582 }
583583
584584 static const struct nla_policy sctp_nla_policy[CTA_PROTOINFO_SCTP_MAX+1] = {
585− [CTA_PROTOINFO_SCTP_STATE] = { .type = NLA_U8 },
585+ [CTA_PROTOINFO_SCTP_STATE] = NLA_POLICY_MAX(NLA_U8,
586+ SCTP_CONNTRACK_HEARTBEAT_SENT),
586587 [CTA_PROTOINFO_SCTP_VTAG_ORIGINAL] = { .type = NLA_U32 },
587588 [CTA_PROTOINFO_SCTP_VTAG_REPLY] = { .type = NLA_U32 },
588589 };
net/netfilter/nf_conntrack_sip.c+5−1
@@ -1534,11 +1534,12 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff, · 1533 unmodified lines
15341534 {
15351535 struct tcphdr *th, _tcph;
15361536 unsigned int dataoff, datalen;
1537− unsigned int matchoff, matchlen, clen;
1537+ unsigned int matchoff, matchlen;
15381538 unsigned int msglen, origlen;
15391539 const char *dptr, *end;
15401540 s16 diff, tdiff = 0;
15411541 int ret = NF_ACCEPT;
1542+ unsigned long clen;
15421543 bool term;
15431544
15441545 if (ctinfo != IP_CT_ESTABLISHED &&
@@ -1573,6 +1574,9 @@ static int sip_help_tcp(struct sk_buff *skb, unsigned int protoff, · 28 unmodified lines
15731574 if (dptr + matchoff == end)
15741575 break;
15751576
1577+ if (clen > datalen)
1578+ break;
1579+
15761580 term = false;
15771581 for (; end + strlen("\r\n\r\n") <= dptr + datalen; end++) {
15781582 if (end[0] == '\r' && end[1] == '\n' &&
net/netfilter/nf_flow_table_ip.c+1−0
@@ -738,6 +738,7 @@ static int nf_flow_encap_push(struct sk_buff *skb, · 737 unmodified lines
738738 switch (tuple->encap[i].proto) {
739739 case htons(ETH_P_8021Q):
740740 case htons(ETH_P_8021AD):
741+ skb_reset_mac_header(skb);
741742 if (skb_vlan_push(skb, tuple->encap[i].proto,
742743 tuple->encap[i].id) < 0)
743744 return -1;
net/netfilter/nf_tables_api.c+7−19
@@ -6686,8 +6686,8 @@ static void __nft_set_elem_expr_destroy(const struct nft_ctx *ctx, · 6685 unmodified lines
66866686 }
66876687 }
66886688
6689−static void nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
6690− struct nft_set_elem_expr *elem_expr)
6689+void nft_set_elem_expr_destroy(const struct nft_ctx *ctx,
6690+ struct nft_set_elem_expr *elem_expr)
66916691 {
66926692 struct nft_expr *expr;
66936693 u32 size;
@@ -7096,8 +7096,7 @@ static u32 nft_set_maxsize(const struct nft_set *set) · 402 unmodified lines
70967096 }
70977097
70987098 static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set,
7099− const struct nlattr *attr, u32 nlmsg_flags,
7100− bool last)
7099+ const struct nlattr *attr, u32 nlmsg_flags)
71017100 {
71027101 struct nft_expr *expr_array[NFT_SET_EXPR_MAX] = {};
71037102 struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
@@ -7384,11 +7383,6 @@ static int nft_add_set_elem(struct nft_ctx *ctx, struct nft_set *set, · 280 unmodified lines
73847383 if (flags)
73857384 *nft_set_ext_flags(ext) = flags;
73867385
7387− if (last)
7388− elem.flags = NFT_SET_ELEM_INTERNAL_LAST;
7389− else
7390− elem.flags = 0;
7391−
73927386 if (obj)
73937387 *nft_set_ext_obj(ext) = obj;
73947388
@@ -7553,8 +7547,7 @@ static int nf_tables_newsetelem(struct sk_buff *skb, · 158 unmodified lines
75537547 nft_ctx_init(&ctx, net, skb, info->nlh, family, table, NULL, nla);
75547548
75557549 nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
7556− err = nft_add_set_elem(&ctx, set, attr, info->nlh->nlmsg_flags,
7557− nla_is_last(attr, rem));
7550+ err = nft_add_set_elem(&ctx, set, attr, info->nlh->nlmsg_flags);
75587551 if (err < 0) {
75597552 NL_SET_BAD_ATTR(extack, attr);
75607553 return err;
@@ -7678,7 +7671,7 @@ static void nft_trans_elems_destroy_abort(const struct nft_ctx *ctx, · 117 unmodified lines
76787671 }
76797672
76807673 static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set,
7681− const struct nlattr *attr, bool last)
7674+ const struct nlattr *attr)
76827675 {
76837676 struct nlattr *nla[NFTA_SET_ELEM_MAX + 1];
76847677 struct nft_set_ext_tmpl tmpl;
@@ -7746,11 +7739,6 @@ static int nft_del_setelem(struct nft_ctx *ctx, struct nft_set *set, · 61 unmodified lines
77467739 if (flags)
77477740 *nft_set_ext_flags(ext) = flags;
77487741
7749− if (last)
7750− elem.flags = NFT_SET_ELEM_INTERNAL_LAST;
7751− else
7752− elem.flags = 0;
7753−
77547742 trans = nft_trans_elem_alloc(ctx, NFT_MSG_DELSETELEM, set);
77557743 if (trans == NULL)
77567744 goto fail_trans;
@@ -7901,8 +7889,7 @@ static int nf_tables_delsetelem(struct sk_buff *skb, · 144 unmodified lines
79017889 return nft_set_flush(&ctx, set, genmask);
79027890
79037891 nla_for_each_nested(attr, nla[NFTA_SET_ELEM_LIST_ELEMENTS], rem) {
7904− err = nft_del_setelem(&ctx, set, attr,
7905− nla_is_last(attr, rem));
7892+ err = nft_del_setelem(&ctx, set, attr);
79067893 if (err == -ENOENT &&
79077894 NFNL_MSG_TYPE(info->nlh->nlmsg_type) == NFT_MSG_DESTROYSETELEM)
79087895 continue;
@@ -9155,6 +9142,7 @@ static int nf_tables_newflowtable(struct sk_buff *skb, · 1246 unmodified lines
91559142 return 0;
91569143
91579144 err_flowtable_hooks:
9145+ synchronize_rcu();
91589146 nft_trans_destroy(trans);
91599147 err_flowtable_trans:
91609148 nft_hooks_destroy(&flowtable->hook_list);
net/netfilter/nfnetlink_osf.c+13−0
@@ -302,7 +302,9 @@ static int nfnl_osf_add_callback(struct sk_buff *skb, · 301 unmodified lines
302302 {
303303 struct nf_osf_user_finger *f;
304304 struct nf_osf_finger *kf = NULL, *sf;
305+ unsigned int tot_opt_len = 0;
305306 int err = 0;
307+ int i;
306308
307309 if (!capable(CAP_NET_ADMIN))
308310 return -EPERM;
@@ -318,6 +320,17 @@ static int nfnl_osf_add_callback(struct sk_buff *skb, · 9 unmodified lines
318320 if (f->opt_num > ARRAY_SIZE(f->opt))
319321 return -EINVAL;
320322
323+ for (i = 0; i < f->opt_num; i++) {
324+ if (!f->opt[i].length || f->opt[i].length > MAX_IPOPTLEN)
325+ return -EINVAL;
326+ if (f->opt[i].kind == OSFOPT_MSS && f->opt[i].length < 4)
327+ return -EINVAL;
328+
329+ tot_opt_len += f->opt[i].length;
330+ if (tot_opt_len > MAX_IPOPTLEN)
331+ return -EINVAL;
332+ }
333+
321334 if (!memchr(f->genre, 0, MAXGENRELEN) ||
322335 !memchr(f->subtype, 0, MAXGENRELEN) ||
323336 !memchr(f->version, 0, MAXGENRELEN))
net/netfilter/nft_ct.c+4−0
@@ -23,6 +23,7 @@ · 22 unmodified lines
2323 #include <net/netfilter/nf_conntrack_l4proto.h>
2424 #include <net/netfilter/nf_conntrack_expect.h>
2525 #include <net/netfilter/nf_conntrack_seqadj.h>
26+#include "nf_internals.h"
2627
2728 struct nft_ct_helper_obj {
2829 struct nf_conntrack_helper *helper4;
@@ -543,6 +544,7 @@ static void __nft_ct_set_destroy(const struct nft_ctx *ctx, struct nft_ct *priv) · 514 unmodified lines
543544 #endif
544545 #ifdef CONFIG_NF_CONNTRACK_ZONES
545546 case NFT_CT_ZONE:
547+ nf_queue_nf_hook_drop(ctx->net);
546548 mutex_lock(&nft_ct_pcpu_mutex);
547549 if (--nft_ct_pcpu_template_refcnt == 0)
548550 nft_ct_tmpl_put_pcpu();
@@ -969,6 +971,7 @@ static void nft_ct_timeout_obj_destroy(const struct nft_ctx *ctx, · 420 unmodified lines
969971 struct nft_ct_timeout_obj *priv = nft_obj_data(obj);
970972 struct nf_ct_timeout *timeout = priv->timeout;
971973
974+ nf_queue_nf_hook_drop(ctx->net);
972975 nf_ct_untimeout(ctx->net, timeout);
973976 nf_ct_netns_put(ctx->net, ctx->family);
974977 kfree(priv->timeout);
@@ -1101,6 +1104,7 @@ static void nft_ct_helper_obj_destroy(const struct nft_ctx *ctx, · 126 unmodified lines
11011104 {
11021105 struct nft_ct_helper_obj *priv = nft_obj_data(obj);
11031106
1107+ nf_queue_nf_hook_drop(ctx->net);
11041108 if (priv->helper4)
11051109 nf_conntrack_helper_put(priv->helper4);
11061110 if (priv->helper6)
net/netfilter/nft_dynset.c+9−1
@@ -30,18 +30,26 @@ static int nft_dynset_expr_setup(const struct nft_dynset *priv, · 29 unmodified lines
3030 const struct nft_set_ext *ext)
3131 {
3232 struct nft_set_elem_expr *elem_expr = nft_set_ext_expr(ext);
33+ struct nft_ctx ctx = {
34+ .net = read_pnet(&priv->set->net),
35+ .family = priv->set->table->family,
36+ };
3337 struct nft_expr *expr;
3438 int i;
3539
3640 for (i = 0; i < priv->num_exprs; i++) {
3741 expr = nft_setelem_expr_at(elem_expr, elem_expr->size);
3842 if (nft_expr_clone(expr, priv->expr_array[i], GFP_ATOMIC) < 0)
39− return -1;
43+ goto err_out;
4044
4145 elem_expr->size += priv->expr_array[i]->ops->size;
4246 }
4347
4448 return 0;
49+err_out:
50+ nft_set_elem_expr_destroy(&ctx, elem_expr);
51+
52+ return -1;
4553 }
4654
4755 struct nft_elem_priv *nft_dynset_new(struct nft_set *set,
net/netfilter/nft_set_rbtree.c+10−61
@@ -304,19 +304,10 @@ static void nft_rbtree_set_start_cookie(struct nft_rbtree *priv, · 303 unmodified lines
304304 priv->start_rbe_cookie = (unsigned long)rbe;
305305 }
306306
307−static void nft_rbtree_set_start_cookie_open(struct nft_rbtree *priv,
308− const struct nft_rbtree_elem *rbe,
309− unsigned long open_interval)
310−{
311− priv->start_rbe_cookie = (unsigned long)rbe | open_interval;
312−}
313−
314−#define NFT_RBTREE_OPEN_INTERVAL 1UL
315−
316307 static bool nft_rbtree_cmp_start_cookie(struct nft_rbtree *priv,
317308 const struct nft_rbtree_elem *rbe)
318309 {
319− return (priv->start_rbe_cookie & ~NFT_RBTREE_OPEN_INTERVAL) == (unsigned long)rbe;
310+ return priv->start_rbe_cookie == (unsigned long)rbe;
320311 }
321312
322313 static bool nft_rbtree_insert_same_interval(const struct net *net,
@@ -346,14 +337,13 @@ static bool nft_rbtree_insert_same_interval(const struct net *net, · 23 unmodified lines
346337
347338 static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set,
348339 struct nft_rbtree_elem *new,
349− struct nft_elem_priv **elem_priv, u64 tstamp, bool last)
340+ struct nft_elem_priv **elem_priv, u64 tstamp)
350341 {
351342 struct nft_rbtree_elem *rbe, *rbe_le = NULL, *rbe_ge = NULL, *rbe_prev;
352343 struct rb_node *node, *next, *parent, **p, *first = NULL;
353344 struct nft_rbtree *priv = nft_set_priv(set);
354345 u8 cur_genmask = nft_genmask_cur(net);
355346 u8 genmask = nft_genmask_next(net);
356− unsigned long open_interval = 0;
357347 int d;
358348
359349 /* Descend the tree to search for an existing element greater than the
@@ -459,18 +449,10 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 99 unmodified lines
459449 }
460450 }
461451
462− if (nft_rbtree_interval_null(set, new)) {
452+ if (nft_rbtree_interval_null(set, new))
453+ priv->start_rbe_cookie = 0;
454+ else if (nft_rbtree_interval_start(new) && priv->start_rbe_cookie)
463455 priv->start_rbe_cookie = 0;
464− } else if (nft_rbtree_interval_start(new) && priv->start_rbe_cookie) {
465− if (nft_set_is_anonymous(set)) {
466− priv->start_rbe_cookie = 0;
467− } else if (priv->start_rbe_cookie & NFT_RBTREE_OPEN_INTERVAL) {
468− /* Previous element is an open interval that partially
469− * overlaps with an existing non-open interval.
470− */
471− return -ENOTEMPTY;
472− }
473− }
474456
475457 /* - new start element matching existing start element: full overlap
476458 * reported as -EEXIST, cleared by caller if NLM_F_EXCL is not given.
@@ -478,27 +460,7 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 1 unmodified line
478460 if (rbe_ge && !nft_rbtree_cmp(set, new, rbe_ge) &&
479461 nft_rbtree_interval_start(rbe_ge) == nft_rbtree_interval_start(new)) {
480462 *elem_priv = &rbe_ge->priv;
481−
482− /* - Corner case: new start element of open interval (which
483− * comes as last element in the batch) overlaps the start of
484− * an existing interval with an end element: partial overlap.
485− */
486− node = rb_first(&priv->root);
487− rbe = __nft_rbtree_next_active(node, genmask);
488− if (rbe && nft_rbtree_interval_end(rbe)) {
489− rbe = nft_rbtree_next_active(rbe, genmask);
490− if (rbe &&
491− nft_rbtree_interval_start(rbe) &&
492− !nft_rbtree_cmp(set, new, rbe)) {
493− if (last)
494− return -ENOTEMPTY;
495−
496− /* Maybe open interval? */
497− open_interval = NFT_RBTREE_OPEN_INTERVAL;
498− }
499− }
500− nft_rbtree_set_start_cookie_open(priv, rbe_ge, open_interval);
501−
463+ nft_rbtree_set_start_cookie(priv, rbe_ge);
502464 return -EEXIST;
503465 }
504466
@@ -553,12 +515,6 @@ static int __nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 48 unmodified lines
553515 nft_rbtree_interval_end(rbe_ge) && nft_rbtree_interval_end(new))
554516 return -ENOTEMPTY;
555517
556− /* - start element overlaps an open interval but end element is new:
557− * partial overlap, reported as -ENOEMPTY.
558− */
559− if (!rbe_ge && priv->start_rbe_cookie && nft_rbtree_interval_end(new))
560− return -ENOTEMPTY;
561−
562518 /* Accepted element: pick insertion point depending on key value */
563519 parent = NULL;
564520 p = &priv->root.rb_node;
@@ -668,7 +624,6 @@ static int nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 103 unmodified lines
668624 struct nft_elem_priv **elem_priv)
669625 {
670626 struct nft_rbtree_elem *rbe = nft_elem_priv_cast(elem->priv);
671− bool last = !!(elem->flags & NFT_SET_ELEM_INTERNAL_LAST);
672627 struct nft_rbtree *priv = nft_set_priv(set);
673628 u64 tstamp = nft_net_tstamp(net);
674629 int err;
@@ -685,12 +640,8 @@ static int nft_rbtree_insert(const struct net *net, const struct nft_set *set, · 10 unmodified lines
685640 cond_resched();
686641
687642 write_lock(&priv->lock);
688− err = __nft_rbtree_insert(net, set, rbe, elem_priv, tstamp, last);
643+ err = __nft_rbtree_insert(net, set, rbe, elem_priv, tstamp);
689644 write_unlock(&priv->lock);
690−
691− if (nft_rbtree_interval_end(rbe))
692− priv->start_rbe_cookie = 0;
693−
694645 } while (err == -EAGAIN);
695646
696647 return err;
@@ -773,7 +724,6 @@ nft_rbtree_deactivate(const struct net *net, const struct nft_set *set, · 76 unmodified lines
773724 const struct nft_set_elem *elem)
774725 {
775726 struct nft_rbtree_elem *rbe, *this = nft_elem_priv_cast(elem->priv);
776− bool last = !!(elem->flags & NFT_SET_ELEM_INTERNAL_LAST);
777727 struct nft_rbtree *priv = nft_set_priv(set);
778728 const struct rb_node *parent = priv->root.rb_node;
779729 u8 genmask = nft_genmask_next(net);
@@ -814,10 +764,9 @@ nft_rbtree_deactivate(const struct net *net, const struct nft_set *set, · 34 unmodified lines
814764 continue;
815765 }
816766
817− if (nft_rbtree_interval_start(rbe)) {
818− if (!last)
819− nft_rbtree_set_start_cookie(priv, rbe);
820− } else if (!nft_rbtree_deactivate_same_interval(net, priv, rbe))
767+ if (nft_rbtree_interval_start(rbe))
768+ nft_rbtree_set_start_cookie(priv, rbe);
769+ else if (!nft_rbtree_deactivate_same_interval(net, priv, rbe))
821770 return NULL;
822771
823772 nft_rbtree_flush(net, set, &rbe->priv);
net/netfilter/xt_CT.c+4−0
@@ -16,6 +16,7 @@ · 15 unmodified lines
1616 #include <net/netfilter/nf_conntrack_ecache.h>
1717 #include <net/netfilter/nf_conntrack_timeout.h>
1818 #include <net/netfilter/nf_conntrack_zones.h>
19+#include "nf_internals.h"
1920
2021 static inline int xt_ct_target(struct sk_buff *skb, struct nf_conn *ct)
2122 {
@@ -283,6 +284,9 @@ static void xt_ct_tg_destroy(const struct xt_tgdtor_param *par, · 261 unmodified lines
283284 struct nf_conn_help *help;
284285
285286 if (ct) {
287+ if (info->helper[0] || info->timeout[0])
288+ nf_queue_nf_hook_drop(par->net);
289+
286290 help = nfct_help(ct);
287291 xt_ct_put_helper(help);
288292
net/netfilter/xt_time.c+2−2
@@ -222,13 +222,13 @@ time_mt(const struct sk_buff *skb, struct xt_action_param *par) · 221 unmodified lines
222222
223223 localtime_2(&current_time, stamp);
224224
225− if (!(info->weekdays_match & (1 << current_time.weekday)))
225+ if (!(info->weekdays_match & (1U << current_time.weekday)))
226226 return false;
227227
228228 /* Do not spend time computing monthday if all days match anyway */
229229 if (info->monthdays_match != XT_TIME_ALL_MONTHDAYS) {
230230 localtime_3(&current_time, stamp);
231− if (!(info->monthdays_match & (1 << current_time.monthday)))
231+ if (!(info->monthdays_match & (1U << current_time.monthday)))
232232 return false;
233233 }
234234
net/phonet/af_phonet.c+4−1
@@ -129,9 +129,12 @@ static int pn_header_create(struct sk_buff *skb, struct net_device *dev, · 128 unmodified lines
129129 return 1;
130130 }
131131
132−static int pn_header_parse(const struct sk_buff *skb, unsigned char *haddr)
132+static int pn_header_parse(const struct sk_buff *skb,
133+ const struct net_device *dev,
134+ unsigned char *haddr)
133135 {
134136 const u8 *media = skb_mac_header(skb);
137+
135138 *haddr = *media;
136139 return 1;
137140 }
net/rose/af_rose.c+5−0
@@ -811,6 +811,11 @@ static int rose_connect(struct socket *sock, struct sockaddr_unsized *uaddr, int · 810 unmodified lines
811811 goto out_release;
812812 }
813813
814+ if (sk->sk_state == TCP_SYN_SENT) {
815+ err = -EALREADY;
816+ goto out_release;
817+ }
818+
814819 sk->sk_state = TCP_CLOSE;
815820 sock->state = SS_UNCONNECTED;
816821
net/sched/sch_generic.c+0−27
@@ -1313,33 +1313,6 @@ static void dev_deactivate_queue(struct net_device *dev, · 1312 unmodified lines
13131313 }
13141314 }
13151315
1316−static void dev_reset_queue(struct net_device *dev,
1317− struct netdev_queue *dev_queue,
1318− void *_unused)
1319−{
1320− struct Qdisc *qdisc;
1321− bool nolock;
1322−
1323− qdisc = rtnl_dereference(dev_queue->qdisc_sleeping);
1324− if (!qdisc)
1325− return;
1326−
1327− nolock = qdisc->flags & TCQ_F_NOLOCK;
1328−
1329− if (nolock)
1330− spin_lock_bh(&qdisc->seqlock);
1331− spin_lock_bh(qdisc_lock(qdisc));
1332−
1333− qdisc_reset(qdisc);
1334−
1335− spin_unlock_bh(qdisc_lock(qdisc));
1336− if (nolock) {
1337− clear_bit(__QDISC_STATE_MISSED, &qdisc->state);
1338− clear_bit(__QDISC_STATE_DRAINING, &qdisc->state);
1339− spin_unlock_bh(&qdisc->seqlock);
1340− }
1341−}
1342−
13431316 static bool some_qdisc_is_busy(struct net_device *dev)
13441317 {
13451318 unsigned int i;
net/sched/sch_ingress.c+8−6
@@ -113,14 +113,15 @@ static void ingress_destroy(struct Qdisc *sch) · 112 unmodified lines
113113 {
114114 struct ingress_sched_data *q = qdisc_priv(sch);
115115 struct net_device *dev = qdisc_dev(sch);
116− struct bpf_mprog_entry *entry = rtnl_dereference(dev->tcx_ingress);
116+ struct bpf_mprog_entry *entry;
117117
118118 if (sch->parent != TC_H_INGRESS)
119119 return;
120120
121121 tcf_block_put_ext(q->block, sch, &q->block_info);
122122
123− if (entry) {
123+ if (mini_qdisc_pair_inited(&q->miniqp)) {
124+ entry = rtnl_dereference(dev->tcx_ingress);
124125 tcx_miniq_dec(entry);
125126 if (!tcx_entry_is_active(entry)) {
126127 tcx_entry_update(dev, NULL, true);
@@ -290,10 +291,9 @@ static int clsact_init(struct Qdisc *sch, struct nlattr *opt, · 163 unmodified lines
290291
291292 static void clsact_destroy(struct Qdisc *sch)
292293 {
294+ struct bpf_mprog_entry *ingress_entry, *egress_entry;
293295 struct clsact_sched_data *q = qdisc_priv(sch);
294296 struct net_device *dev = qdisc_dev(sch);
295− struct bpf_mprog_entry *ingress_entry = rtnl_dereference(dev->tcx_ingress);
296− struct bpf_mprog_entry *egress_entry = rtnl_dereference(dev->tcx_egress);
297297
298298 if (sch->parent != TC_H_CLSACT)
299299 return;
@@ -301,7 +301,8 @@ static void clsact_destroy(struct Qdisc *sch) · 1 unmodified line
301301 tcf_block_put_ext(q->ingress_block, sch, &q->ingress_block_info);
302302 tcf_block_put_ext(q->egress_block, sch, &q->egress_block_info);
303303
304− if (ingress_entry) {
304+ if (mini_qdisc_pair_inited(&q->miniqp_ingress)) {
305+ ingress_entry = rtnl_dereference(dev->tcx_ingress);
305306 tcx_miniq_dec(ingress_entry);
306307 if (!tcx_entry_is_active(ingress_entry)) {
307308 tcx_entry_update(dev, NULL, true);
@@ -309,7 +310,8 @@ static void clsact_destroy(struct Qdisc *sch) · 1 unmodified line
309310 }
310311 }
311312
312− if (egress_entry) {
313+ if (mini_qdisc_pair_inited(&q->miniqp_egress)) {
314+ egress_entry = rtnl_dereference(dev->tcx_egress);
313315 tcx_miniq_dec(egress_entry);
314316 if (!tcx_entry_is_active(egress_entry)) {
315317 tcx_entry_update(dev, NULL, false);
net/sched/sch_teql.c+2−5
@@ -146,15 +146,12 @@ teql_destroy(struct Qdisc *sch) · 145 unmodified lines
146146 master->slaves = NEXT_SLAVE(q);
147147 if (q == master->slaves) {
148148 struct netdev_queue *txq;
149− spinlock_t *root_lock;
150149
151150 txq = netdev_get_tx_queue(master->dev, 0);
152151 master->slaves = NULL;
153152
154− root_lock = qdisc_root_sleeping_lock(rtnl_dereference(txq->qdisc));
155− spin_lock_bh(root_lock);
156− qdisc_reset(rtnl_dereference(txq->qdisc));
157− spin_unlock_bh(root_lock);
153+ dev_reset_queue(master->dev,
154+ txq, NULL);
158155 }
159156 }
160157 skb_queue_purge(&dat->q);
net/shaper/shaper.c+93−65
@@ -36,29 +36,26 @@ static struct net_shaper_binding *net_shaper_binding_from_ctx(void *ctx) · 35 unmodified lines
3636 return &((struct net_shaper_nl_ctx *)ctx)->binding;
3737 }
3838
39−static void net_shaper_lock(struct net_shaper_binding *binding)
39+static struct net_shaper_hierarchy *
40+net_shaper_hierarchy(struct net_shaper_binding *binding)
4041 {
41− switch (binding->type) {
42− case NET_SHAPER_BINDING_TYPE_NETDEV:
43− netdev_lock(binding->netdev);
44− break;
45− }
46−}
42+ /* Pairs with WRITE_ONCE() in net_shaper_hierarchy_setup. */
43+ if (binding->type == NET_SHAPER_BINDING_TYPE_NETDEV)
44+ return READ_ONCE(binding->netdev->net_shaper_hierarchy);
4745
48−static void net_shaper_unlock(struct net_shaper_binding *binding)
49−{
50− switch (binding->type) {
51− case NET_SHAPER_BINDING_TYPE_NETDEV:
52− netdev_unlock(binding->netdev);
53− break;
54− }
46+ /* No other type supported yet. */
47+ return NULL;
5548 }
5649
5750 static struct net_shaper_hierarchy *
58−net_shaper_hierarchy(struct net_shaper_binding *binding)
51+net_shaper_hierarchy_rcu(struct net_shaper_binding *binding)
5952 {
60− /* Pairs with WRITE_ONCE() in net_shaper_hierarchy_setup. */
61− if (binding->type == NET_SHAPER_BINDING_TYPE_NETDEV)
53+ /* Readers look up the device and take a ref, then take RCU lock
54+ * later at which point netdev may have been unregistered and flushed.
55+ * READ_ONCE() pairs with WRITE_ONCE() in net_shaper_hierarchy_setup.
56+ */
57+ if (binding->type == NET_SHAPER_BINDING_TYPE_NETDEV &&
58+ READ_ONCE(binding->netdev->reg_state) <= NETREG_REGISTERED)
6259 return READ_ONCE(binding->netdev->net_shaper_hierarchy);
6360
6461 /* No other type supported yet. */
@@ -204,12 +201,49 @@ static int net_shaper_ctx_setup(const struct genl_info *info, int type, · 139 unmodified lines
204201 return 0;
205202 }
206203
204+/* Like net_shaper_ctx_setup(), but for "write" handlers (never for dumps!)
205+ * Acquires the lock protecting the hierarchy (instance lock for netdev).
206+ */
207+static int net_shaper_ctx_setup_lock(const struct genl_info *info, int type,
208+ struct net_shaper_nl_ctx *ctx)
209+{
210+ struct net *ns = genl_info_net(info);
211+ struct net_device *dev;
212+ int ifindex;
213+
214+ if (GENL_REQ_ATTR_CHECK(info, type))
215+ return -EINVAL;
216+
217+ ifindex = nla_get_u32(info->attrs[type]);
218+ dev = netdev_get_by_index_lock(ns, ifindex);
219+ if (!dev) {
220+ NL_SET_BAD_ATTR(info->extack, info->attrs[type]);
221+ return -ENOENT;
222+ }
223+
224+ if (!dev->netdev_ops->net_shaper_ops) {
225+ NL_SET_BAD_ATTR(info->extack, info->attrs[type]);
226+ netdev_unlock(dev);
227+ return -EOPNOTSUPP;
228+ }
229+
230+ ctx->binding.type = NET_SHAPER_BINDING_TYPE_NETDEV;
231+ ctx->binding.netdev = dev;
232+ return 0;
233+}
234+
207235 static void net_shaper_ctx_cleanup(struct net_shaper_nl_ctx *ctx)
208236 {
209237 if (ctx->binding.type == NET_SHAPER_BINDING_TYPE_NETDEV)
210238 netdev_put(ctx->binding.netdev, &ctx->dev_tracker);
211239 }
212240
241+static void net_shaper_ctx_cleanup_unlock(struct net_shaper_nl_ctx *ctx)
242+{
243+ if (ctx->binding.type == NET_SHAPER_BINDING_TYPE_NETDEV)
244+ netdev_unlock(ctx->binding.netdev);
245+}
246+
213247 static u32 net_shaper_handle_to_index(const struct net_shaper_handle *handle)
214248 {
215249 return FIELD_PREP(NET_SHAPER_SCOPE_MASK, handle->scope) |
@@ -251,9 +285,10 @@ static struct net_shaper * · 35 unmodified lines
251285 net_shaper_lookup(struct net_shaper_binding *binding,
252286 const struct net_shaper_handle *handle)
253287 {
254− struct net_shaper_hierarchy *hierarchy = net_shaper_hierarchy(binding);
255288 u32 index = net_shaper_handle_to_index(handle);
289+ struct net_shaper_hierarchy *hierarchy;
256290
291+ hierarchy = net_shaper_hierarchy_rcu(binding);
257292 if (!hierarchy || xa_get_mark(&hierarchy->shapers, index,
258293 NET_SHAPER_NOT_VALID))
259294 return NULL;
@@ -262,7 +297,7 @@ net_shaper_lookup(struct net_shaper_binding *binding, · 2 unmodified lines
262297 }
263298
264299 /* Allocate on demand the per device shaper's hierarchy container.
265− * Called under the net shaper lock
300+ * Called under the lock protecting the hierarchy (instance lock for netdev)
266301 */
267302 static struct net_shaper_hierarchy *
268303 net_shaper_hierarchy_setup(struct net_shaper_binding *binding)
@@ -681,6 +716,22 @@ void net_shaper_nl_post_doit(const struct genl_split_ops *ops, · 412 unmodified lines
681716 net_shaper_generic_post(info);
682717 }
683718
719+int net_shaper_nl_pre_doit_write(const struct genl_split_ops *ops,
720+ struct sk_buff *skb, struct genl_info *info)
721+{
722+ struct net_shaper_nl_ctx *ctx = (struct net_shaper_nl_ctx *)info->ctx;
723+
724+ BUILD_BUG_ON(sizeof(*ctx) > sizeof(info->ctx));
725+
726+ return net_shaper_ctx_setup_lock(info, NET_SHAPER_A_IFINDEX, ctx);
727+}
728+
729+void net_shaper_nl_post_doit_write(const struct genl_split_ops *ops,
730+ struct sk_buff *skb, struct genl_info *info)
731+{
732+ net_shaper_ctx_cleanup_unlock((struct net_shaper_nl_ctx *)info->ctx);
733+}
734+
684735 int net_shaper_nl_pre_dumpit(struct netlink_callback *cb)
685736 {
686737 struct net_shaper_nl_ctx *ctx = (struct net_shaper_nl_ctx *)cb->ctx;
@@ -778,17 +829,19 @@ int net_shaper_nl_get_dumpit(struct sk_buff *skb, · 91 unmodified lines
778829
779830 /* Don't error out dumps performed before any set operation. */
780831 binding = net_shaper_binding_from_ctx(ctx);
781− hierarchy = net_shaper_hierarchy(binding);
782− if (!hierarchy)
783− return 0;
784832
785833 rcu_read_lock();
834+ hierarchy = net_shaper_hierarchy_rcu(binding);
835+ if (!hierarchy)
836+ goto out_unlock;
837+
786838 for (; (shaper = xa_find(&hierarchy->shapers, &ctx->start_index,
787839 U32_MAX, XA_PRESENT)); ctx->start_index++) {
788840 ret = net_shaper_fill_one(skb, binding, shaper, info);
789841 if (ret)
790842 break;
791843 }
844+out_unlock:
792845 rcu_read_unlock();
793846
794847 return ret;
@@ -806,45 +859,38 @@ int net_shaper_nl_set_doit(struct sk_buff *skb, struct genl_info *info) · 11 unmodified lines
806859
807860 binding = net_shaper_binding_from_ctx(info->ctx);
808861
809− net_shaper_lock(binding);
810862 ret = net_shaper_parse_info(binding, info->attrs, info, &shaper,
811863 &exists);
812864 if (ret)
813− goto unlock;
865+ return ret;
814866
815867 if (!exists)
816868 net_shaper_default_parent(&shaper.handle, &shaper.parent);
817869
818870 hierarchy = net_shaper_hierarchy_setup(binding);
819− if (!hierarchy) {
820− ret = -ENOMEM;
821− goto unlock;
822− }
871+ if (!hierarchy)
872+ return -ENOMEM;
823873
824874 /* The 'set' operation can't create node-scope shapers. */
825875 handle = shaper.handle;
826876 if (handle.scope == NET_SHAPER_SCOPE_NODE &&
827− !net_shaper_lookup(binding, &handle)) {
828− ret = -ENOENT;
829− goto unlock;
830− }
877+ !net_shaper_lookup(binding, &handle))
878+ return -ENOENT;
831879
832880 ret = net_shaper_pre_insert(binding, &handle, info->extack);
833881 if (ret)
834− goto unlock;
882+ return ret;
835883
836884 ops = net_shaper_ops(binding);
837885 ret = ops->set(binding, &shaper, info->extack);
838886 if (ret) {
839887 net_shaper_rollback(binding);
840− goto unlock;
888+ return ret;
841889 }
842890
843891 net_shaper_commit(binding, 1, &shaper);
844892
845−unlock:
846− net_shaper_unlock(binding);
847− return ret;
893+ return 0;
848894 }
849895
850896 static int __net_shaper_delete(struct net_shaper_binding *binding,
@@ -1072,35 +1118,26 @@ int net_shaper_nl_delete_doit(struct sk_buff *skb, struct genl_info *info) · 221 unmodified lines
10721118
10731119 binding = net_shaper_binding_from_ctx(info->ctx);
10741120
1075− net_shaper_lock(binding);
10761121 ret = net_shaper_parse_handle(info->attrs[NET_SHAPER_A_HANDLE], info,
10771122 &handle);
10781123 if (ret)
1079− goto unlock;
1124+ return ret;
10801125
10811126 hierarchy = net_shaper_hierarchy(binding);
1082− if (!hierarchy) {
1083− ret = -ENOENT;
1084− goto unlock;
1085− }
1127+ if (!hierarchy)
1128+ return -ENOENT;
10861129
10871130 shaper = net_shaper_lookup(binding, &handle);
1088− if (!shaper) {
1089− ret = -ENOENT;
1090− goto unlock;
1091− }
1131+ if (!shaper)
1132+ return -ENOENT;
10921133
10931134 if (handle.scope == NET_SHAPER_SCOPE_NODE) {
10941135 ret = net_shaper_pre_del_node(binding, shaper, info->extack);
10951136 if (ret)
1096− goto unlock;
1137+ return ret;
10971138 }
10981139
1099− ret = __net_shaper_delete(binding, shaper, info->extack);
1100−
1101−unlock:
1102− net_shaper_unlock(binding);
1103− return ret;
1140+ return __net_shaper_delete(binding, shaper, info->extack);
11041141 }
11051142
11061143 static int net_shaper_group_send_reply(struct net_shaper_binding *binding,
@@ -1149,21 +1186,17 @@ int net_shaper_nl_group_doit(struct sk_buff *skb, struct genl_info *info) · 42 unmodified lines
11491186 if (!net_shaper_ops(binding)->group)
11501187 return -EOPNOTSUPP;
11511188
1152− net_shaper_lock(binding);
11531189 leaves_count = net_shaper_list_len(info, NET_SHAPER_A_LEAVES);
11541190 if (!leaves_count) {
11551191 NL_SET_BAD_ATTR(info->extack,
11561192 info->attrs[NET_SHAPER_A_LEAVES]);
1157− ret = -EINVAL;
1158− goto unlock;
1193+ return -EINVAL;
11591194 }
11601195
11611196 leaves = kcalloc(leaves_count, sizeof(struct net_shaper) +
11621197 sizeof(struct net_shaper *), GFP_KERNEL);
1163− if (!leaves) {
1164− ret = -ENOMEM;
1165− goto unlock;
1166− }
1198+ if (!leaves)
1199+ return -ENOMEM;
11671200 old_nodes = (void *)&leaves[leaves_count];
11681201
11691202 ret = net_shaper_parse_node(binding, info->attrs, info, &node);
@@ -1240,9 +1273,6 @@ int net_shaper_nl_group_doit(struct sk_buff *skb, struct genl_info *info) · 70 unmodified lines
12401273
12411274 free_leaves:
12421275 kfree(leaves);
1243−
1244−unlock:
1245− net_shaper_unlock(binding);
12461276 return ret;
12471277
12481278 free_msg:
@@ -1352,14 +1382,12 @@ static void net_shaper_flush(struct net_shaper_binding *binding) · 103 unmodified lines
13521382 if (!hierarchy)
13531383 return;
13541384
1355− net_shaper_lock(binding);
13561385 xa_lock(&hierarchy->shapers);
13571386 xa_for_each(&hierarchy->shapers, index, cur) {
13581387 __xa_erase(&hierarchy->shapers, index);
13591388 kfree(cur);
13601389 }
13611390 xa_unlock(&hierarchy->shapers);
1362− net_shaper_unlock(binding);
13631391
13641392 kfree(hierarchy);
13651393 }
net/shaper/shaper_nl_gen.c+6−6
@@ -99,27 +99,27 @@ static const struct genl_split_ops net_shaper_nl_ops[] = { · 98 unmodified lines
9999 },
100100 {
101101 .cmd = NET_SHAPER_CMD_SET,
102− .pre_doit = net_shaper_nl_pre_doit,
102+ .pre_doit = net_shaper_nl_pre_doit_write,
103103 .doit = net_shaper_nl_set_doit,
104− .post_doit = net_shaper_nl_post_doit,
104+ .post_doit = net_shaper_nl_post_doit_write,
105105 .policy = net_shaper_set_nl_policy,
106106 .maxattr = NET_SHAPER_A_IFINDEX,
107107 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
108108 },
109109 {
110110 .cmd = NET_SHAPER_CMD_DELETE,
111− .pre_doit = net_shaper_nl_pre_doit,
111+ .pre_doit = net_shaper_nl_pre_doit_write,
112112 .doit = net_shaper_nl_delete_doit,
113− .post_doit = net_shaper_nl_post_doit,
113+ .post_doit = net_shaper_nl_post_doit_write,
114114 .policy = net_shaper_delete_nl_policy,
115115 .maxattr = NET_SHAPER_A_IFINDEX,
116116 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
117117 },
118118 {
119119 .cmd = NET_SHAPER_CMD_GROUP,
120− .pre_doit = net_shaper_nl_pre_doit,
120+ .pre_doit = net_shaper_nl_pre_doit_write,
121121 .doit = net_shaper_nl_group_doit,
122− .post_doit = net_shaper_nl_post_doit,
122+ .post_doit = net_shaper_nl_post_doit_write,
123123 .policy = net_shaper_group_nl_policy,
124124 .maxattr = NET_SHAPER_A_LEAVES,
125125 .flags = GENL_ADMIN_PERM | GENL_CMD_CAP_DO,
net/shaper/shaper_nl_gen.h+5−0
@@ -18,12 +18,17 @@ extern const struct nla_policy net_shaper_leaf_info_nl_policy[NET_SHAPER_A_WEIGH · 17 unmodified lines
1818
1919 int net_shaper_nl_pre_doit(const struct genl_split_ops *ops,
2020 struct sk_buff *skb, struct genl_info *info);
21+int net_shaper_nl_pre_doit_write(const struct genl_split_ops *ops,
22+ struct sk_buff *skb, struct genl_info *info);
2123 int net_shaper_nl_cap_pre_doit(const struct genl_split_ops *ops,
2224 struct sk_buff *skb, struct genl_info *info);
2325 void
2426 net_shaper_nl_post_doit(const struct genl_split_ops *ops, struct sk_buff *skb,
2527 struct genl_info *info);
2628 void
29+net_shaper_nl_post_doit_write(const struct genl_split_ops *ops,
30+ struct sk_buff *skb, struct genl_info *info);
31+void
2732 net_shaper_nl_cap_post_doit(const struct genl_split_ops *ops,
2833 struct sk_buff *skb, struct genl_info *info);
2934 int net_shaper_nl_pre_dumpit(struct netlink_callback *cb);
net/smc/af_smc.c+17−6
@@ -131,7 +131,14 @@ static struct sock *smc_tcp_syn_recv_sock(const struct sock *sk, · 130 unmodified lines
131131 struct smc_sock *smc;
132132 struct sock *child;
133133
134− smc = smc_clcsock_user_data(sk);
134+ rcu_read_lock();
135+ smc = smc_clcsock_user_data_rcu(sk);
136+ if (!smc || !refcount_inc_not_zero(&smc->sk.sk_refcnt)) {
137+ rcu_read_unlock();
138+ smc = NULL;
139+ goto drop;
140+ }
141+ rcu_read_unlock();
135142
136143 if (READ_ONCE(sk->sk_ack_backlog) + atomic_read(&smc->queued_smc_hs) >
137144 sk->sk_max_ack_backlog)
@@ -153,11 +160,14 @@ static struct sock *smc_tcp_syn_recv_sock(const struct sock *sk, · 15 unmodified lines
153160 if (inet_csk(child)->icsk_af_ops == inet_csk(sk)->icsk_af_ops)
154161 inet_csk(child)->icsk_af_ops = smc->ori_af_ops;
155162 }
163+ sock_put(&smc->sk);
156164 return child;
157165
158166 drop:
159167 dst_release(dst);
160168 tcp_listendrop(sk);
169+ if (smc)
170+ sock_put(&smc->sk);
161171 return NULL;
162172 }
163173
@@ -254,7 +264,7 @@ static void smc_fback_restore_callbacks(struct smc_sock *smc) · 90 unmodified lines
254264 struct sock *clcsk = smc->clcsock->sk;
255265
256266 write_lock_bh(&clcsk->sk_callback_lock);
257− clcsk->sk_user_data = NULL;
267+ rcu_assign_sk_user_data(clcsk, NULL);
258268
259269 smc_clcsock_restore_cb(&clcsk->sk_state_change, &smc->clcsk_state_change);
260270 smc_clcsock_restore_cb(&clcsk->sk_data_ready, &smc->clcsk_data_ready);
@@ -902,7 +912,7 @@ static void smc_fback_replace_callbacks(struct smc_sock *smc) · 641 unmodified lines
902912 struct sock *clcsk = smc->clcsock->sk;
903913
904914 write_lock_bh(&clcsk->sk_callback_lock);
905− clcsk->sk_user_data = (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY);
915+ __rcu_assign_sk_user_data_with_flags(clcsk, smc, SK_USER_DATA_NOCOPY);
906916
907917 smc_clcsock_replace_cb(&clcsk->sk_state_change, smc_fback_state_change,
908918 &smc->clcsk_state_change);
@@ -2665,8 +2675,8 @@ int smc_listen(struct socket *sock, int backlog) · 1756 unmodified lines
26652675 * smc-specific sk_data_ready function
26662676 */
26672677 write_lock_bh(&smc->clcsock->sk->sk_callback_lock);
2668− smc->clcsock->sk->sk_user_data =
2669− (void *)((uintptr_t)smc | SK_USER_DATA_NOCOPY);
2678+ __rcu_assign_sk_user_data_with_flags(smc->clcsock->sk, smc,
2679+ SK_USER_DATA_NOCOPY);
26702680 smc_clcsock_replace_cb(&smc->clcsock->sk->sk_data_ready,
26712681 smc_clcsock_data_ready, &smc->clcsk_data_ready);
26722682 write_unlock_bh(&smc->clcsock->sk->sk_callback_lock);
@@ -2687,10 +2697,11 @@ int smc_listen(struct socket *sock, int backlog) · 14 unmodified lines
26872697 write_lock_bh(&smc->clcsock->sk->sk_callback_lock);
26882698 smc_clcsock_restore_cb(&smc->clcsock->sk->sk_data_ready,
26892699 &smc->clcsk_data_ready);
2690− smc->clcsock->sk->sk_user_data = NULL;
2700+ rcu_assign_sk_user_data(smc->clcsock->sk, NULL);
26912701 write_unlock_bh(&smc->clcsock->sk->sk_callback_lock);
26922702 goto out;
26932703 }
2704+ sock_set_flag(sk, SOCK_RCU_FREE);
26942705 sk->sk_max_ack_backlog = backlog;
26952706 sk->sk_ack_backlog = 0;
26962707 sk->sk_state = SMC_LISTEN;
net/smc/smc.h+5−0
@@ -346,6 +346,11 @@ static inline struct smc_sock *smc_clcsock_user_data(const struct sock *clcsk) · 345 unmodified lines
346346 ((uintptr_t)clcsk->sk_user_data & ~SK_USER_DATA_NOCOPY);
347347 }
348348
349+static inline struct smc_sock *smc_clcsock_user_data_rcu(const struct sock *clcsk)
350+{
351+ return (struct smc_sock *)rcu_dereference_sk_user_data(clcsk);
352+}
353+
349354 /* save target_cb in saved_cb, and replace target_cb with new_cb */
350355 static inline void smc_clcsock_replace_cb(void (**target_cb)(struct sock *),
351356 void (*new_cb)(struct sock *),
net/smc/smc_close.c+1−1
@@ -218,7 +218,7 @@ again: · 217 unmodified lines
218218 write_lock_bh(&smc->clcsock->sk->sk_callback_lock);
219219 smc_clcsock_restore_cb(&smc->clcsock->sk->sk_data_ready,
220220 &smc->clcsk_data_ready);
221− smc->clcsock->sk->sk_user_data = NULL;
221+ rcu_assign_sk_user_data(smc->clcsock->sk, NULL);
222222 write_unlock_bh(&smc->clcsock->sk->sk_callback_lock);
223223 rc = kernel_sock_shutdown(smc->clcsock, SHUT_RDWR);
224224 }
net/sunrpc/cache.c+21−5
@@ -1062,14 +1062,25 @@ static int cache_release(struct inode *inode, struct file *filp, · 1061 unmodified lines
10621062 struct cache_reader *rp = filp->private_data;
10631063
10641064 if (rp) {
1065+ struct cache_request *rq = NULL;
1066+
10651067 spin_lock(&queue_lock);
10661068 if (rp->offset) {
10671069 struct cache_queue *cq;
1068− for (cq= &rp->q; &cq->list != &cd->queue;
1069− cq = list_entry(cq->list.next, struct cache_queue, list))
1070+ for (cq = &rp->q; &cq->list != &cd->queue;
1071+ cq = list_entry(cq->list.next,
1072+ struct cache_queue, list))
10701073 if (!cq->reader) {
1071− container_of(cq, struct cache_request, q)
1072− ->readers--;
1074+ struct cache_request *cr =
1075+ container_of(cq,
1076+ struct cache_request, q);
1077+ cr->readers--;
1078+ if (cr->readers == 0 &&
1079+ !test_bit(CACHE_PENDING,
1080+ &cr->item->flags)) {
1081+ list_del(&cr->q.list);
1082+ rq = cr;
1083+ }
10731084 break;
10741085 }
10751086 rp->offset = 0;
@@ -1077,9 +1088,14 @@ static int cache_release(struct inode *inode, struct file *filp, · 1 unmodified line
10771088 list_del(&rp->q.list);
10781089 spin_unlock(&queue_lock);
10791090
1091+ if (rq) {
1092+ cache_put(rq->item, cd);
1093+ kfree(rq->buf);
1094+ kfree(rq);
1095+ }
1096+
10801097 filp->private_data = NULL;
10811098 kfree(rp);
1082−
10831099 }
10841100 if (filp->f_mode & FMODE_WRITE) {
10851101 atomic_dec(&cd->writers);
net/sunrpc/xprtrdma/verbs.c+4−3
@@ -1362,7 +1362,7 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed) · 1361 unmodified lines
13621362 needed += RPCRDMA_MAX_RECV_BATCH;
13631363
13641364 if (atomic_inc_return(&ep->re_receiving) > 1)
1365− goto out;
1365+ goto out_dec;
13661366
13671367 /* fast path: all needed reps can be found on the free list */
13681368 wr = NULL;
@@ -1385,7 +1385,7 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed) · 16 unmodified lines
13851385 ++count;
13861386 }
13871387 if (!wr)
1388− goto out;
1388+ goto out_dec;
13891389
13901390 rc = ib_post_recv(ep->re_id->qp, wr,
13911391 (const struct ib_recv_wr **)&bad_wr);
@@ -1400,9 +1400,10 @@ void rpcrdma_post_recvs(struct rpcrdma_xprt *r_xprt, int needed) · 8 unmodified lines
14001400 --count;
14011401 }
14021402 }
1403+
1404+out_dec:
14031405 if (atomic_dec_return(&ep->re_receiving) > 0)
14041406 complete(&ep->re_done);
1405−
14061407 out:
14071408 trace_xprtrdma_post_recvs(r_xprt, count);
14081409 ep->re_receive_count += count;
net/unix/af_unix.c+2−0
@@ -1958,6 +1958,8 @@ static void unix_detach_fds(struct scm_cookie *scm, struct sk_buff *skb) · 1957 unmodified lines
19581958 static void unix_peek_fds(struct scm_cookie *scm, struct sk_buff *skb)
19591959 {
19601960 scm->fp = scm_fp_dup(UNIXCB(skb).fp);
1961+
1962+ unix_peek_fpl(scm->fp);
19611963 }
19621964
19631965 static void unix_destruct_scm(struct sk_buff *skb)
net/unix/af_unix.h+1−0
@@ -29,6 +29,7 @@ void unix_del_edges(struct scm_fp_list *fpl); · 28 unmodified lines
2929 void unix_update_edges(struct unix_sock *receiver);
3030 int unix_prepare_fpl(struct scm_fp_list *fpl);
3131 void unix_destroy_fpl(struct scm_fp_list *fpl);
32+void unix_peek_fpl(struct scm_fp_list *fpl);
3233 void unix_schedule_gc(struct user_struct *user);
3334
3435 /* SOCK_DIAG */
net/unix/garbage.c+51−28
@@ -318,6 +318,25 @@ void unix_destroy_fpl(struct scm_fp_list *fpl) · 317 unmodified lines
318318 unix_free_vertices(fpl);
319319 }
320320
321+static bool gc_in_progress;
322+static seqcount_t unix_peek_seq = SEQCNT_ZERO(unix_peek_seq);
323+
324+void unix_peek_fpl(struct scm_fp_list *fpl)
325+{
326+ static DEFINE_SPINLOCK(unix_peek_lock);
327+
328+ if (!fpl || !fpl->count_unix)
329+ return;
330+
331+ if (!READ_ONCE(gc_in_progress))
332+ return;
333+
334+ /* Invalidate the final refcnt check in unix_vertex_dead(). */
335+ spin_lock(&unix_peek_lock);
336+ raw_write_seqcount_barrier(&unix_peek_seq);
337+ spin_unlock(&unix_peek_lock);
338+}
339+
321340 static bool unix_vertex_dead(struct unix_vertex *vertex)
322341 {
323342 struct unix_edge *edge;
@@ -351,6 +370,36 @@ static bool unix_vertex_dead(struct unix_vertex *vertex) · 27 unmodified lines
351370 return true;
352371 }
353372
373+static LIST_HEAD(unix_visited_vertices);
374+static unsigned long unix_vertex_grouped_index = UNIX_VERTEX_INDEX_MARK2;
375+
376+static bool unix_scc_dead(struct list_head *scc, bool fast)
377+{
378+ struct unix_vertex *vertex;
379+ bool scc_dead = true;
380+ unsigned int seq;
381+
382+ seq = read_seqcount_begin(&unix_peek_seq);
383+
384+ list_for_each_entry_reverse(vertex, scc, scc_entry) {
385+ /* Don't restart DFS from this vertex. */
386+ list_move_tail(&vertex->entry, &unix_visited_vertices);
387+
388+ /* Mark vertex as off-stack for __unix_walk_scc(). */
389+ if (!fast)
390+ vertex->index = unix_vertex_grouped_index;
391+
392+ if (scc_dead)
393+ scc_dead = unix_vertex_dead(vertex);
394+ }
395+
396+ /* If MSG_PEEK intervened, defer this SCC to the next round. */
397+ if (read_seqcount_retry(&unix_peek_seq, seq))
398+ return false;
399+
400+ return scc_dead;
401+}
402+
354403 static void unix_collect_skb(struct list_head *scc, struct sk_buff_head *hitlist)
355404 {
356405 struct unix_vertex *vertex;
@@ -404,9 +453,6 @@ static bool unix_scc_cyclic(struct list_head *scc) · 47 unmodified lines
404453 return false;
405454 }
406455
407−static LIST_HEAD(unix_visited_vertices);
408−static unsigned long unix_vertex_grouped_index = UNIX_VERTEX_INDEX_MARK2;
409−
410456 static unsigned long __unix_walk_scc(struct unix_vertex *vertex,
411457 unsigned long *last_index,
412458 struct sk_buff_head *hitlist)
@@ -474,9 +520,7 @@ prev_vertex: · 61 unmodified lines
474520 }
475521
476522 if (vertex->index == vertex->scc_index) {
477− struct unix_vertex *v;
478523 struct list_head scc;
479− bool scc_dead = true;
480524
481525 /* SCC finalised.
482526 *
@@ -485,18 +529,7 @@ prev_vertex: · 2 unmodified lines
485529 */
486530 __list_cut_position(&scc, &vertex_stack, &vertex->scc_entry);
487531
488− list_for_each_entry_reverse(v, &scc, scc_entry) {
489− /* Don't restart DFS from this vertex in unix_walk_scc(). */
490− list_move_tail(&v->entry, &unix_visited_vertices);
491−
492− /* Mark vertex as off-stack. */
493− v->index = unix_vertex_grouped_index;
494−
495− if (scc_dead)
496− scc_dead = unix_vertex_dead(v);
497− }
498−
499− if (scc_dead) {
532+ if (unix_scc_dead(&scc, false)) {
500533 unix_collect_skb(&scc, hitlist);
501534 } else {
502535 if (unix_vertex_max_scc_index < vertex->scc_index)
@@ -550,19 +583,11 @@ static void unix_walk_scc_fast(struct sk_buff_head *hitlist) · 47 unmodified lines
550583 while (!list_empty(&unix_unvisited_vertices)) {
551584 struct unix_vertex *vertex;
552585 struct list_head scc;
553− bool scc_dead = true;
554586
555587 vertex = list_first_entry(&unix_unvisited_vertices, typeof(*vertex), entry);
556588 list_add(&scc, &vertex->scc_entry);
557589
558− list_for_each_entry_reverse(vertex, &scc, scc_entry) {
559− list_move_tail(&vertex->entry, &unix_visited_vertices);
560−
561− if (scc_dead)
562− scc_dead = unix_vertex_dead(vertex);
563− }
564−
565− if (scc_dead) {
590+ if (unix_scc_dead(&scc, true)) {
566591 cyclic_sccs--;
567592 unix_collect_skb(&scc, hitlist);
568593 }
@@ -577,8 +602,6 @@ static void unix_walk_scc_fast(struct sk_buff_head *hitlist) · 8 unmodified lines
577602 cyclic_sccs ? UNIX_GRAPH_CYCLIC : UNIX_GRAPH_NOT_CYCLIC);
578603 }
579604
580−static bool gc_in_progress;
581−
582605 static void unix_gc(struct work_struct *work)
583606 {
584607 struct sk_buff_head hitlist;
net/wireless/pmsr.c+1−0
@@ -665,6 +665,7 @@ void cfg80211_pmsr_wdev_down(struct wireless_dev *wdev) · 664 unmodified lines
665665 }
666666 spin_unlock_bh(&wdev->pmsr_lock);
667667
668+ cancel_work_sync(&wdev->pmsr_free_wk);
668669 if (found)
669670 cfg80211_pmsr_process_abort(wdev);
670671
rust/Makefile+5−6
@@ -148,7 +148,8 @@ doctests_modifiers_workaround := $(rustdoc_modifiers_workaround)$(if $(call rust · 147 unmodified lines
148148 quiet_cmd_rustdoc = RUSTDOC $(if $(rustdoc_host),H, ) $<
149149 cmd_rustdoc = \
150150 OBJTREE=$(abspath $(objtree)) \
151− $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=%,$(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
151+ $(RUSTDOC) $(filter-out $(skip_flags) --remap-path-prefix=% --remap-path-scope=%, \
152+ $(if $(rustdoc_host),$(rust_common_flags),$(rust_flags))) \
152153 $(rustc_target_flags) -L$(objtree)/$(obj) \
153154 -Zunstable-options --generate-link-to-definition \
154155 --output $(rustdoc_output) \
@@ -334,7 +335,7 @@ quiet_cmd_rustdoc_test_kernel = RUSTDOC TK $< · 179 unmodified lines
334335 rm -rf $(objtree)/$(obj)/test/doctests/kernel; \
335336 mkdir -p $(objtree)/$(obj)/test/doctests/kernel; \
336337 OBJTREE=$(abspath $(objtree)) \
337− $(RUSTDOC) --test $(filter-out --remap-path-prefix=%,$(rust_flags)) \
338+ $(RUSTDOC) --test $(filter-out --remap-path-prefix=% --remap-path-scope=%,$(rust_flags)) \
338339 -L$(objtree)/$(obj) --extern ffi --extern pin_init \
339340 --extern kernel --extern build_error --extern macros \
340341 --extern bindings --extern uapi \
@@ -526,11 +527,9 @@ quiet_cmd_rustc_procmacrolibrary = $(RUSTC_OR_CLIPPY_QUIET) PL $@ · 185 unmodified lines
526527 cmd_rustc_procmacrolibrary = \
527528 $(if $(skip_clippy),$(RUSTC),$(RUSTC_OR_CLIPPY)) \
528529 $(filter-out $(skip_flags),$(rust_common_flags) $(rustc_target_flags)) \
529− --emit=dep-info,link --crate-type rlib -O \
530+ --emit=dep-info=$(depfile) --emit=link=$@ --crate-type rlib -O \
530531 --out-dir $(objtree)/$(obj) -L$(objtree)/$(obj) \
531− --crate-name $(patsubst lib%.rlib,%,$(notdir $@)) $<; \
532− mv $(objtree)/$(obj)/$(patsubst lib%.rlib,%,$(notdir $@)).d $(depfile); \
533− sed -i '/^\#/d' $(depfile)
532+ --crate-name $(patsubst lib%.rlib,%,$(notdir $@)) $<
534533
535534 $(obj)/libproc_macro2.rlib: private skip_clippy = 1
536535 $(obj)/libproc_macro2.rlib: private rustc_target_flags = $(proc_macro2-flags)
rust/kernel/cpufreq.rs+1−0
@@ -401,6 +401,7 @@ impl TableBuilder { · 400 unmodified lines
401401 /// ```
402402 /// use kernel::cpufreq::{DEFAULT_TRANSITION_LATENCY_NS, Policy};
403403 ///
404+/// #[allow(clippy::double_parens, reason = "False positive before 1.92.0")]
404405 /// fn update_policy(policy: &mut Policy) {
405406 /// policy
406407 /// .set_dvfs_possible_from_any_cpu(true)
rust/kernel/dma.rs+50−64
@@ -461,6 +461,19 @@ impl<T: AsBytes + FromBytes> CoherentAllocation<T> { · 460 unmodified lines
461461 self.count * core::mem::size_of::<T>()
462462 }
463463
464+ /// Returns the raw pointer to the allocated region in the CPU's virtual address space.
465+ #[inline]
466+ pub fn as_ptr(&self) -> *const [T] {
467+ core::ptr::slice_from_raw_parts(self.cpu_addr.as_ptr(), self.count)
468+ }
469+
470+ /// Returns the raw pointer to the allocated region in the CPU's virtual address space as
471+ /// a mutable pointer.
472+ #[inline]
473+ pub fn as_mut_ptr(&self) -> *mut [T] {
474+ core::ptr::slice_from_raw_parts_mut(self.cpu_addr.as_ptr(), self.count)
475+ }
476+
464477 /// Returns the base address to the allocated region in the CPU's virtual address space.
465478 pub fn start_ptr(&self) -> *const T {
466479 self.cpu_addr.as_ptr()
@@ -581,23 +594,6 @@ impl<T: AsBytes + FromBytes> CoherentAllocation<T> { · 114 unmodified lines
581594 Ok(())
582595 }
583596
584− /// Returns a pointer to an element from the region with bounds checking. `offset` is in
585− /// units of `T`, not the number of bytes.
586− ///
587− /// Public but hidden since it should only be used from [`dma_read`] and [`dma_write`] macros.
588− #[doc(hidden)]
589− pub fn item_from_index(&self, offset: usize) -> Result<*mut T> {
590− if offset >= self.count {
591− return Err(EINVAL);
592− }
593− // SAFETY:
594− // - The pointer is valid due to type invariant on `CoherentAllocation`
595− // and we've just checked that the range and index is within bounds.
596− // - `offset` can't overflow since it is smaller than `self.count` and we've checked
597− // that `self.count` won't overflow early in the constructor.
598− Ok(unsafe { self.cpu_addr.as_ptr().add(offset) })
599− }
600−
601597 /// Reads the value of `field` and ensures that its type is [`FromBytes`].
602598 ///
603599 /// # Safety
@@ -670,6 +666,9 @@ unsafe impl<T: AsBytes + FromBytes + Send> Send for CoherentAllocation<T> {} · 66 unmodified lines
670666
671667 /// Reads a field of an item from an allocated region of structs.
672668 ///
669+/// The syntax is of the form `kernel::dma_read!(dma, proj)` where `dma` is an expression evaluating
670+/// to a [`CoherentAllocation`] and `proj` is a [projection specification](kernel::ptr::project!).
671+///
673672 /// # Examples
674673 ///
675674 /// ```
@@ -684,36 +683,29 @@ unsafe impl<T: AsBytes + FromBytes + Send> Send for CoherentAllocation<T> {} · 8 unmodified lines
684683 /// unsafe impl kernel::transmute::AsBytes for MyStruct{};
685684 ///
686685 /// # fn test(alloc: &kernel::dma::CoherentAllocation<MyStruct>) -> Result {
687−/// let whole = kernel::dma_read!(alloc[2]);
688−/// let field = kernel::dma_read!(alloc[1].field);
686+/// let whole = kernel::dma_read!(alloc, [2]?);
687+/// let field = kernel::dma_read!(alloc, [1]?.field);
689688 /// # Ok::<(), Error>(()) }
690689 /// ```
691690 #[macro_export]
692691 macro_rules! dma_read {
693− ($dma:expr, $idx: expr, $($field:tt)*) => {{
694− (|| -> ::core::result::Result<_, $crate::error::Error> {
695− let item = $crate::dma::CoherentAllocation::item_from_index(&$dma, $idx)?;
696− // SAFETY: `item_from_index` ensures that `item` is always a valid pointer and can be
697− // dereferenced. The compiler also further validates the expression on whether `field`
698− // is a member of `item` when expanded by the macro.
699− unsafe {
700− let ptr_field = ::core::ptr::addr_of!((*item) $($field)*);
701− ::core::result::Result::Ok(
702− $crate::dma::CoherentAllocation::field_read(&$dma, ptr_field)
703− )
704− }
705− })()
692+ ($dma:expr, $($proj:tt)*) => {{
693+ let dma = &$dma;
694+ let ptr = $crate::ptr::project!(
695+ $crate::dma::CoherentAllocation::as_ptr(dma), $($proj)*
696+ );
697+ // SAFETY: The pointer created by the projection is within the DMA region.
698+ unsafe { $crate::dma::CoherentAllocation::field_read(dma, ptr) }
706699 }};
707− ($dma:ident [ $idx:expr ] $($field:tt)* ) => {
708− $crate::dma_read!($dma, $idx, $($field)*)
709− };
710− ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) => {
711− $crate::dma_read!($($dma).*, $idx, $($field)*)
712− };
713700 }
714701
715702 /// Writes to a field of an item from an allocated region of structs.
716703 ///
704+/// The syntax is of the form `kernel::dma_write!(dma, proj, val)` where `dma` is an expression
705+/// evaluating to a [`CoherentAllocation`], `proj` is a
706+/// [projection specification](kernel::ptr::project!), and `val` is the value to be written to the
707+/// projected location.
708+///
717709 /// # Examples
718710 ///
719711 /// ```
@@ -728,37 +720,31 @@ macro_rules! dma_read { · 8 unmodified lines
728720 /// unsafe impl kernel::transmute::AsBytes for MyStruct{};
729721 ///
730722 /// # fn test(alloc: &kernel::dma::CoherentAllocation<MyStruct>) -> Result {
731−/// kernel::dma_write!(alloc[2].member = 0xf);
732−/// kernel::dma_write!(alloc[1] = MyStruct { member: 0xf });
723+/// kernel::dma_write!(alloc, [2]?.member, 0xf);
724+/// kernel::dma_write!(alloc, [1]?, MyStruct { member: 0xf });
733725 /// # Ok::<(), Error>(()) }
734726 /// ```
735727 #[macro_export]
736728 macro_rules! dma_write {
737− ($dma:ident [ $idx:expr ] $($field:tt)*) => {{
738− $crate::dma_write!($dma, $idx, $($field)*)
739− }};
740− ($($dma:ident).* [ $idx:expr ] $($field:tt)* ) => {{
741− $crate::dma_write!($($dma).*, $idx, $($field)*)
729+ (@parse [$dma:expr] [$($proj:tt)*] [, $val:expr]) => {{
730+ let dma = &$dma;
731+ let ptr = $crate::ptr::project!(
732+ mut $crate::dma::CoherentAllocation::as_mut_ptr(dma), $($proj)*
733+ );
734+ let val = $val;
735+ // SAFETY: The pointer created by the projection is within the DMA region.
736+ unsafe { $crate::dma::CoherentAllocation::field_write(dma, ptr, val) }
742737 }};
743− ($dma:expr, $idx: expr, = $val:expr) => {
744− (|| -> ::core::result::Result<_, $crate::error::Error> {
745− let item = $crate::dma::CoherentAllocation::item_from_index(&$dma, $idx)?;
746− // SAFETY: `item_from_index` ensures that `item` is always a valid item.
747− unsafe { $crate::dma::CoherentAllocation::field_write(&$dma, item, $val) }
748− ::core::result::Result::Ok(())
749− })()
738+ (@parse [$dma:expr] [$($proj:tt)*] [.$field:tt $($rest:tt)*]) => {
739+ $crate::dma_write!(@parse [$dma] [$($proj)* .$field] [$($rest)*])
740+ };
741+ (@parse [$dma:expr] [$($proj:tt)*] [[$index:expr]? $($rest:tt)*]) => {
742+ $crate::dma_write!(@parse [$dma] [$($proj)* [$index]?] [$($rest)*])
743+ };
744+ (@parse [$dma:expr] [$($proj:tt)*] [[$index:expr] $($rest:tt)*]) => {
745+ $crate::dma_write!(@parse [$dma] [$($proj)* [$index]] [$($rest)*])
750746 };
751− ($dma:expr, $idx: expr, $(.$field:ident)* = $val:expr) => {
752− (|| -> ::core::result::Result<_, $crate::error::Error> {
753− let item = $crate::dma::CoherentAllocation::item_from_index(&$dma, $idx)?;
754− // SAFETY: `item_from_index` ensures that `item` is always a valid pointer and can be
755− // dereferenced. The compiler also further validates the expression on whether `field`
756− // is a member of `item` when expanded by the macro.
757− unsafe {
758− let ptr_field = ::core::ptr::addr_of_mut!((*item) $(.$field)*);
759− $crate::dma::CoherentAllocation::field_write(&$dma, ptr_field, $val)
760− }
761− ::core::result::Result::Ok(())
762− })()
747+ ($dma:expr, $($rest:tt)*) => {
748+ $crate::dma_write!(@parse [$dma] [] [$($rest)*])
763749 };
764750 }
rust/kernel/lib.rs+4−0
@@ -20,6 +20,7 @@ · 19 unmodified lines
2020 #![feature(generic_nonzero)]
2121 #![feature(inline_const)]
2222 #![feature(pointer_is_aligned)]
23+#![feature(slice_ptr_len)]
2324 //
2425 // Stable since Rust 1.80.0.
2526 #![feature(slice_flatten)]
@@ -37,6 +38,9 @@ · 11 unmodified lines
3738 #![feature(const_ptr_write)]
3839 #![feature(const_refs_to_cell)]
3940 //
41+// Stable since Rust 1.84.0.
42+#![feature(strict_provenance)]
43+//
4044 // Expected to become stable.
4145 #![feature(arbitrary_self_types)]
4246 //
rust/kernel/ptr.rs+29−1
@@ -2,7 +2,13 @@ · 1 unmodified line
22
33 //! Types and functions to work with pointers and addresses.
44
5−use core::mem::align_of;
5+pub mod projection;
6+pub use crate::project_pointer as project;
7+
8+use core::mem::{
9+ align_of,
10+ size_of, //
11+};
612 use core::num::NonZero;
713
814 /// Type representing an alignment, which is always a power of two.
@@ -225,3 +231,25 @@ macro_rules! impl_alignable_uint { · 216 unmodified lines
225231 }
226232
227233 impl_alignable_uint!(u8, u16, u32, u64, usize);
234+
235+/// Trait to represent compile-time known size information.
236+///
237+/// This is a generalization of [`size_of`] that works for dynamically sized types.
238+pub trait KnownSize {
239+ /// Get the size of an object of this type in bytes, with the metadata of the given pointer.
240+ fn size(p: *const Self) -> usize;
241+}
242+
243+impl<T> KnownSize for T {
244+ #[inline(always)]
245+ fn size(_: *const Self) -> usize {
246+ size_of::<T>()
247+ }
248+}
249+
250+impl<T> KnownSize for [T] {
251+ #[inline(always)]
252+ fn size(p: *const Self) -> usize {
253+ p.len() * size_of::<T>()
254+ }
255+}
rust/kernel/ptr/projection.rs+305−0
@@ -0,0 +1,305 @@
1+// SPDX-License-Identifier: GPL-2.0
2+
3+//! Infrastructure for handling projections.
4+
5+use core::{
6+ mem::MaybeUninit,
7+ ops::Deref, //
8+};
9+
10+use crate::prelude::*;
11+
12+/// Error raised when a projection is attempted on an array or slice out of bounds.
13+pub struct OutOfBound;
14+
15+impl From<OutOfBound> for Error {
16+ #[inline(always)]
17+ fn from(_: OutOfBound) -> Self {
18+ ERANGE
19+ }
20+}
21+
22+/// A helper trait to perform index projection.
23+///
24+/// This is similar to [`core::slice::SliceIndex`], but operates on raw pointers safely and
25+/// fallibly.
26+///
27+/// # Safety
28+///
29+/// The implementation of `index` and `get` (if [`Some`] is returned) must ensure that, if provided
30+/// input pointer `slice` and returned pointer `output`, then:
31+/// - `output` has the same provenance as `slice`;
32+/// - `output.byte_offset_from(slice)` is between 0 to
33+/// `KnownSize::size(slice) - KnownSize::size(output)`.
34+///
35+/// This means that if the input pointer is valid, then pointer returned by `get` or `index` is
36+/// also valid.
37+#[diagnostic::on_unimplemented(message = "`{Self}` cannot be used to index `{T}`")]
38+#[doc(hidden)]
39+pub unsafe trait ProjectIndex<T: ?Sized>: Sized {
40+ type Output: ?Sized;
41+
42+ /// Returns an index-projected pointer, if in bounds.
43+ fn get(self, slice: *mut T) -> Option<*mut Self::Output>;
44+
45+ /// Returns an index-projected pointer; fail the build if it cannot be proved to be in bounds.
46+ #[inline(always)]
47+ fn index(self, slice: *mut T) -> *mut Self::Output {
48+ Self::get(self, slice).unwrap_or_else(|| build_error!())
49+ }
50+}
51+
52+// Forward array impl to slice impl.
53+//
54+// SAFETY: Safety requirement guaranteed by the forwarded impl.
55+unsafe impl<T, I, const N: usize> ProjectIndex<[T; N]> for I
56+where
57+ I: ProjectIndex<[T]>,
58+{
59+ type Output = <I as ProjectIndex<[T]>>::Output;
60+
61+ #[inline(always)]
62+ fn get(self, slice: *mut [T; N]) -> Option<*mut Self::Output> {
63+ <I as ProjectIndex<[T]>>::get(self, slice)
64+ }
65+
66+ #[inline(always)]
67+ fn index(self, slice: *mut [T; N]) -> *mut Self::Output {
68+ <I as ProjectIndex<[T]>>::index(self, slice)
69+ }
70+}
71+
72+// SAFETY: `get`-returned pointer has the same provenance as `slice` and the offset is checked to
73+// not exceed the required bound.
74+unsafe impl<T> ProjectIndex<[T]> for usize {
75+ type Output = T;
76+
77+ #[inline(always)]
78+ fn get(self, slice: *mut [T]) -> Option<*mut T> {
79+ if self >= slice.len() {
80+ None
81+ } else {
82+ Some(slice.cast::<T>().wrapping_add(self))
83+ }
84+ }
85+}
86+
87+// SAFETY: `get`-returned pointer has the same provenance as `slice` and the offset is checked to
88+// not exceed the required bound.
89+unsafe impl<T> ProjectIndex<[T]> for core::ops::Range<usize> {
90+ type Output = [T];
91+
92+ #[inline(always)]
93+ fn get(self, slice: *mut [T]) -> Option<*mut [T]> {
94+ let new_len = self.end.checked_sub(self.start)?;
95+ if self.end > slice.len() {
96+ return None;
97+ }
98+ Some(core::ptr::slice_from_raw_parts_mut(
99+ slice.cast::<T>().wrapping_add(self.start),
100+ new_len,
101+ ))
102+ }
103+}
104+
105+// SAFETY: Safety requirement guaranteed by the forwarded impl.
106+unsafe impl<T> ProjectIndex<[T]> for core::ops::RangeTo<usize> {
107+ type Output = [T];
108+
109+ #[inline(always)]
110+ fn get(self, slice: *mut [T]) -> Option<*mut [T]> {
111+ (0..self.end).get(slice)
112+ }
113+}
114+
115+// SAFETY: Safety requirement guaranteed by the forwarded impl.
116+unsafe impl<T> ProjectIndex<[T]> for core::ops::RangeFrom<usize> {
117+ type Output = [T];
118+
119+ #[inline(always)]
120+ fn get(self, slice: *mut [T]) -> Option<*mut [T]> {
121+ (self.start..slice.len()).get(slice)
122+ }
123+}
124+
125+// SAFETY: `get` returned the pointer as is, so it always has the same provenance and offset of 0.
126+unsafe impl<T> ProjectIndex<[T]> for core::ops::RangeFull {
127+ type Output = [T];
128+
129+ #[inline(always)]
130+ fn get(self, slice: *mut [T]) -> Option<*mut [T]> {
131+ Some(slice)
132+ }
133+}
134+
135+/// A helper trait to perform field projection.
136+///
137+/// This trait has a `DEREF` generic parameter so it can be implemented twice for types that
138+/// implement [`Deref`]. This will cause an ambiguity error and thus block [`Deref`] types being
139+/// used as base of projection, as they can inject unsoundness. Users therefore must not specify
140+/// `DEREF` and should always leave it to be inferred.
141+///
142+/// # Safety
143+///
144+/// `proj` may only invoke `f` with a valid allocation, as the documentation of [`Self::proj`]
145+/// describes.
146+#[doc(hidden)]
147+pub unsafe trait ProjectField<const DEREF: bool> {
148+ /// Project a pointer to a type to a pointer of a field.
149+ ///
150+ /// `f` may only be invoked with a valid allocation so it can safely obtain raw pointers to
151+ /// fields using `&raw mut`.
152+ ///
153+ /// This is needed because `base` might not point to a valid allocation, while `&raw mut`
154+ /// requires pointers to be in bounds of a valid allocation.
155+ ///
156+ /// # Safety
157+ ///
158+ /// `f` must return a pointer in bounds of the provided pointer.
159+ unsafe fn proj<F>(base: *mut Self, f: impl FnOnce(*mut Self) -> *mut F) -> *mut F;
160+}
161+
162+// NOTE: in theory, this API should work for `T: ?Sized` and `F: ?Sized`, too. However, we cannot
163+// currently support that as we need to obtain a valid allocation that `&raw const` can operate on.
164+//
165+// SAFETY: `proj` invokes `f` with valid allocation.
166+unsafe impl<T> ProjectField<false> for T {
167+ #[inline(always)]
168+ unsafe fn proj<F>(base: *mut Self, f: impl FnOnce(*mut Self) -> *mut F) -> *mut F {
169+ // Create a valid allocation to start projection, as `base` is not necessarily so. The
170+ // memory is never actually used so it will be optimized out, so it should work even for
171+ // very large `T` (`memoffset` crate also relies on this). To be extra certain, we also
172+ // annotate `f` closure with `#[inline(always)]` in the macro.
173+ let mut place = MaybeUninit::uninit();
174+ let place_base = place.as_mut_ptr();
175+ let field = f(place_base);
176+ // SAFETY: `field` is in bounds from `base` per safety requirement.
177+ let offset = unsafe { field.byte_offset_from(place_base) };
178+ // Use `wrapping_byte_offset` as `base` does not need to be of valid allocation.
179+ base.wrapping_byte_offset(offset).cast()
180+ }
181+}
182+
183+// SAFETY: Vacuously satisfied.
184+unsafe impl<T: Deref> ProjectField<true> for T {
185+ #[inline(always)]
186+ unsafe fn proj<F>(_: *mut Self, _: impl FnOnce(*mut Self) -> *mut F) -> *mut F {
187+ build_error!("this function is a guard against `Deref` impl and is never invoked");
188+ }
189+}
190+
191+/// Create a projection from a raw pointer.
192+///
193+/// The projected pointer is within the memory region marked by the input pointer. There is no
194+/// requirement that the input raw pointer needs to be valid, so this macro may be used for
195+/// projecting pointers outside normal address space, e.g. I/O pointers. However, if the input
196+/// pointer is valid, the projected pointer is also valid.
197+///
198+/// Supported projections include field projections and index projections.
199+/// It is not allowed to project into types that implement custom [`Deref`] or
200+/// [`Index`](core::ops::Index).
201+///
202+/// The macro has basic syntax of `kernel::ptr::project!(ptr, projection)`, where `ptr` is an
203+/// expression that evaluates to a raw pointer which serves as the base of projection. `projection`
204+/// can be a projection expression of form `.field` (normally identifier, or numeral in case of
205+/// tuple structs) or of form `[index]`.
206+///
207+/// If a mutable pointer is needed, the macro input can be prefixed with the `mut` keyword, i.e.
208+/// `kernel::ptr::project!(mut ptr, projection)`. By default, a const pointer is created.
209+///
210+/// `ptr::project!` macro can perform both fallible indexing and build-time checked indexing.
211+/// `[index]` form performs build-time bounds checking; if compiler fails to prove `[index]` is in
212+/// bounds, compilation will fail. `[index]?` can be used to perform runtime bounds checking;
213+/// `OutOfBound` error is raised via `?` if the index is out of bounds.
214+///
215+/// # Examples
216+///
217+/// Field projections are performed with `.field_name`:
218+///
219+/// ```
220+/// struct MyStruct { field: u32, }
221+/// let ptr: *const MyStruct = core::ptr::dangling();
222+/// let field_ptr: *const u32 = kernel::ptr::project!(ptr, .field);
223+///
224+/// struct MyTupleStruct(u32, u32);
225+///
226+/// fn proj(ptr: *const MyTupleStruct) {
227+/// let field_ptr: *const u32 = kernel::ptr::project!(ptr, .1);
228+/// }
229+/// ```
230+///
231+/// Index projections are performed with `[index]`:
232+///
233+/// ```
234+/// fn proj(ptr: *const [u8; 32]) -> Result {
235+/// let field_ptr: *const u8 = kernel::ptr::project!(ptr, [1]);
236+/// // The following invocation, if uncommented, would fail the build.
237+/// //
238+/// // kernel::ptr::project!(ptr, [128]);
239+///
240+/// // This will raise an `OutOfBound` error (which is convertible to `ERANGE`).
241+/// kernel::ptr::project!(ptr, [128]?);
242+/// Ok(())
243+/// }
244+/// ```
245+///
246+/// If you need to match on the error instead of propagate, put the invocation inside a closure:
247+///
248+/// ```
249+/// let ptr: *const [u8; 32] = core::ptr::dangling();
250+/// let field_ptr: Result<*const u8> = (|| -> Result<_> {
251+/// Ok(kernel::ptr::project!(ptr, [128]?))
252+/// })();
253+/// assert!(field_ptr.is_err());
254+/// ```
255+///
256+/// For mutable pointers, put `mut` as the first token in macro invocation.
257+///
258+/// ```
259+/// let ptr: *mut [(u8, u16); 32] = core::ptr::dangling_mut();
260+/// let field_ptr: *mut u16 = kernel::ptr::project!(mut ptr, [1].1);
261+/// ```
262+#[macro_export]
263+macro_rules! project_pointer {
264+ (@gen $ptr:ident, ) => {};
265+ // Field projection. `$field` needs to be `tt` to support tuple index like `.0`.
266+ (@gen $ptr:ident, .$field:tt $($rest:tt)*) => {
267+ // SAFETY: The provided closure always returns an in-bounds pointer.
268+ let $ptr = unsafe {
269+ $crate::ptr::projection::ProjectField::proj($ptr, #[inline(always)] |ptr| {
270+ // Check unaligned field. Not all users (e.g. DMA) can handle unaligned
271+ // projections.
272+ if false {
273+ let _ = &(*ptr).$field;
274+ }
275+ // SAFETY: `$field` is in bounds, and no implicit `Deref` is possible (if the
276+ // type implements `Deref`, Rust cannot infer the generic parameter `DEREF`).
277+ &raw mut (*ptr).$field
278+ })
279+ };
280+ $crate::ptr::project!(@gen $ptr, $($rest)*)
281+ };
282+ // Fallible index projection.
283+ (@gen $ptr:ident, [$index:expr]? $($rest:tt)*) => {
284+ let $ptr = $crate::ptr::projection::ProjectIndex::get($index, $ptr)
285+ .ok_or($crate::ptr::projection::OutOfBound)?;
286+ $crate::ptr::project!(@gen $ptr, $($rest)*)
287+ };
288+ // Build-time checked index projection.
289+ (@gen $ptr:ident, [$index:expr] $($rest:tt)*) => {
290+ let $ptr = $crate::ptr::projection::ProjectIndex::index($index, $ptr);
291+ $crate::ptr::project!(@gen $ptr, $($rest)*)
292+ };
293+ (mut $ptr:expr, $($proj:tt)*) => {{
294+ let ptr: *mut _ = $ptr;
295+ $crate::ptr::project!(@gen ptr, $($proj)*);
296+ ptr
297+ }};
298+ ($ptr:expr, $($proj:tt)*) => {{
299+ let ptr = <*const _>::cast_mut($ptr);
300+ // We currently always project using mutable pointer, as it is not decided whether `&raw
301+ // const` allows the resulting pointer to be mutated (see documentation of `addr_of!`).
302+ $crate::ptr::project!(@gen ptr, $($proj)*);
303+ ptr.cast_const()
304+ }};
305+}
rust/kernel/str.rs+2−2
@@ -664,13 +664,13 @@ impl fmt::Write for Formatter<'_> { · 663 unmodified lines
664664 ///
665665 /// * The first byte of `buffer` is always zero.
666666 /// * The length of `buffer` is at least 1.
667−pub(crate) struct NullTerminatedFormatter<'a> {
667+pub struct NullTerminatedFormatter<'a> {
668668 buffer: &'a mut [u8],
669669 }
670670
671671 impl<'a> NullTerminatedFormatter<'a> {
672672 /// Create a new [`Self`] instance.
673− pub(crate) fn new(buffer: &'a mut [u8]) -> Option<NullTerminatedFormatter<'a>> {
673+ pub fn new(buffer: &'a mut [u8]) -> Option<NullTerminatedFormatter<'a>> {
674674 *(buffer.first_mut()?) = 0;
675675
676676 // INVARIANT:
rust/pin-init/internal/src/init.rs+23−46
@@ -62,7 +62,6 @@ impl InitializerKind { · 61 unmodified lines
6262
6363 enum InitializerAttribute {
6464 DefaultError(DefaultErrorAttribute),
65− DisableInitializedFieldAccess,
6665 }
6766
6867 struct DefaultErrorAttribute {
@@ -86,6 +85,7 @@ pub(crate) fn expand( · 17 unmodified lines
8685 let error = error.map_or_else(
8786 || {
8887 if let Some(default_error) = attrs.iter().fold(None, |acc, attr| {
88+ #[expect(irrefutable_let_patterns)]
8989 if let InitializerAttribute::DefaultError(DefaultErrorAttribute { ty }) = attr {
9090 Some(ty.clone())
9191 } else {
@@ -145,22 +145,9 @@ pub(crate) fn expand( · 53 unmodified lines
145145 };
146146 // `mixed_site` ensures that the data is not accessible to the user-controlled code.
147147 let data = Ident::new("__data", Span::mixed_site());
148− let init_fields = init_fields(
149− &fields,
150− pinned,
151− !attrs
152− .iter()
153− .any(|attr| matches!(attr, InitializerAttribute::DisableInitializedFieldAccess)),
154− &data,
155− &slot,
156− );
148+ let init_fields = init_fields(&fields, pinned, &data, &slot);
157149 let field_check = make_field_check(&fields, init_kind, &path);
158150 Ok(quote! {{
159− // We do not want to allow arbitrary returns, so we declare this type as the `Ok` return
160− // type and shadow it later when we insert the arbitrary user code. That way there will be
161− // no possibility of returning without `unsafe`.
162− struct __InitOk;
163−
164151 // Get the data about fields from the supplied type.
165152 // SAFETY: TODO
166153 let #data = unsafe {
@@ -170,18 +157,15 @@ pub(crate) fn expand( · 3 unmodified lines
170157 #path::#get_data()
171158 };
172159 // Ensure that `#data` really is of type `#data` and help with type inference:
173− let init = ::pin_init::__internal::#data_trait::make_closure::<_, __InitOk, #error>(
160+ let init = ::pin_init::__internal::#data_trait::make_closure::<_, #error>(
174161 #data,
175162 move |slot| {
176− {
177− // Shadow the structure so it cannot be used to return early.
178− struct __InitOk;
179− #zeroable_check
180− #this
181− #init_fields
182− #field_check
183− }
184− Ok(__InitOk)
163+ #zeroable_check
164+ #this
165+ #init_fields
166+ #field_check
167+ // SAFETY: we are the `init!` macro that is allowed to call this.
168+ Ok(unsafe { ::pin_init::__internal::InitOk::new() })
185169 }
186170 );
187171 let init = move |slot| -> ::core::result::Result<(), #error> {
@@ -236,7 +220,6 @@ fn get_init_kind(rest: Option<(Token![..], Expr)>, dcx: &mut DiagCtxt) -> InitKi · 48 unmodified lines
236220 fn init_fields(
237221 fields: &Punctuated<InitializerField, Token![,]>,
238222 pinned: bool,
239− generate_initialized_accessors: bool,
240223 data: &Ident,
241224 slot: &Ident,
242225 ) -> TokenStream {
@@ -260,6 +243,10 @@ fn init_fields( · 17 unmodified lines
260243 });
261244 // Again span for better diagnostics
262245 let write = quote_spanned!(ident.span()=> ::core::ptr::write);
246+ // NOTE: the field accessor ensures that the initialized field is properly aligned.
247+ // Unaligned fields will cause the compiler to emit E0793. We do not support
248+ // unaligned fields since `Init::__init` requires an aligned pointer; the call to
249+ // `ptr::write` below has the same requirement.
263250 let accessor = if pinned {
264251 let project_ident = format_ident!("__project_{ident}");
265252 quote! {
@@ -272,13 +259,6 @@ fn init_fields( · 6 unmodified lines
272259 unsafe { &mut (*#slot).#ident }
273260 }
274261 };
275− let accessor = generate_initialized_accessors.then(|| {
276− quote! {
277− #(#cfgs)*
278− #[allow(unused_variables)]
279− let #ident = #accessor;
280− }
281− });
282262 quote! {
283263 #(#attrs)*
284264 {
@@ -286,12 +266,18 @@ fn init_fields( · 1 unmodified line
286266 // SAFETY: TODO
287267 unsafe { #write(::core::ptr::addr_of_mut!((*#slot).#ident), #value_ident) };
288268 }
289− #accessor
269+ #(#cfgs)*
270+ #[allow(unused_variables)]
271+ let #ident = #accessor;
290272 }
291273 }
292274 InitializerKind::Init { ident, value, .. } => {
293275 // Again span for better diagnostics
294276 let init = format_ident!("init", span = value.span());
277+ // NOTE: the field accessor ensures that the initialized field is properly aligned.
278+ // Unaligned fields will cause the compiler to emit E0793. We do not support
279+ // unaligned fields since `Init::__init` requires an aligned pointer; the call to
280+ // `ptr::write` below has the same requirement.
295281 let (value_init, accessor) = if pinned {
296282 let project_ident = format_ident!("__project_{ident}");
297283 (
@@ -326,20 +312,15 @@ fn init_fields( · 28 unmodified lines
326312 },
327313 )
328314 };
329− let accessor = generate_initialized_accessors.then(|| {
330− quote! {
331− #(#cfgs)*
332− #[allow(unused_variables)]
333− let #ident = #accessor;
334− }
335− });
336315 quote! {
337316 #(#attrs)*
338317 {
339318 let #init = #value;
340319 #value_init
341320 }
342− #accessor
321+ #(#cfgs)*
322+ #[allow(unused_variables)]
323+ let #ident = #accessor;
343324 }
344325 }
345326 InitializerKind::Code { block: value, .. } => quote! {
@@ -466,10 +447,6 @@ impl Parse for Initializer { · 120 unmodified lines
466447 if a.path().is_ident("default_error") {
467448 a.parse_args::<DefaultErrorAttribute>()
468449 .map(InitializerAttribute::DefaultError)
469− } else if a.path().is_ident("disable_initialized_field_access") {
470− a.meta
471− .require_path_only()
472− .map(|_| InitializerAttribute::DisableInitializedFieldAccess)
473450 } else {
474451 Err(syn::Error::new_spanned(a, "unknown initializer attribute"))
475452 }
rust/pin-init/src/__internal.rs+24−4
@@ -46,6 +46,24 @@ where · 45 unmodified lines
4646 }
4747 }
4848
49+/// Token type to signify successful initialization.
50+///
51+/// Can only be constructed via the unsafe [`Self::new`] function. The initializer macros use this
52+/// token type to prevent returning `Ok` from an initializer without initializing all fields.
53+pub struct InitOk(());
54+
55+impl InitOk {
56+ /// Creates a new token.
57+ ///
58+ /// # Safety
59+ ///
60+ /// This function may only be called from the `init!` macro in `../internal/src/init.rs`.
61+ #[inline(always)]
62+ pub unsafe fn new() -> Self {
63+ Self(())
64+ }
65+}
66+
4967 /// This trait is only implemented via the `#[pin_data]` proc-macro. It is used to facilitate
5068 /// the pin projections within the initializers.
5169 ///
@@ -68,9 +86,10 @@ pub unsafe trait PinData: Copy { · 16 unmodified lines
6886 type Datee: ?Sized + HasPinData;
6987
7088 /// Type inference helper function.
71− fn make_closure<F, O, E>(self, f: F) -> F
89+ #[inline(always)]
90+ fn make_closure<F, E>(self, f: F) -> F
7291 where
73− F: FnOnce(*mut Self::Datee) -> Result<O, E>,
92+ F: FnOnce(*mut Self::Datee) -> Result<InitOk, E>,
7493 {
7594 f
7695 }
@@ -98,9 +117,10 @@ pub unsafe trait InitData: Copy { · 21 unmodified lines
98117 type Datee: ?Sized + HasInitData;
99118
100119 /// Type inference helper function.
101− fn make_closure<F, O, E>(self, f: F) -> F
120+ #[inline(always)]
121+ fn make_closure<F, E>(self, f: F) -> F
102122 where
103− F: FnOnce(*mut Self::Datee) -> Result<O, E>,
123+ F: FnOnce(*mut Self::Datee) -> Result<InitOk, E>,
104124 {
105125 f
106126 }
samples/rust/rust_dma.rs+16−14
@@ -68,7 +68,7 @@ impl pci::Driver for DmaSampleDriver { · 67 unmodified lines
6868 CoherentAllocation::alloc_coherent(pdev.as_ref(), TEST_VALUES.len(), GFP_KERNEL)?;
6969
7070 for (i, value) in TEST_VALUES.into_iter().enumerate() {
71− kernel::dma_write!(ca[i] = MyStruct::new(value.0, value.1))?;
71+ kernel::dma_write!(ca, [i]?, MyStruct::new(value.0, value.1));
7272 }
7373
7474 let size = 4 * page::PAGE_SIZE;
@@ -85,24 +85,26 @@ impl pci::Driver for DmaSampleDriver { · 10 unmodified lines
8585 }
8686 }
8787
88+impl DmaSampleDriver {
89+ fn check_dma(&self) -> Result {
90+ for (i, value) in TEST_VALUES.into_iter().enumerate() {
91+ let val0 = kernel::dma_read!(self.ca, [i]?.h);
92+ let val1 = kernel::dma_read!(self.ca, [i]?.b);
93+
94+ assert_eq!(val0, value.0);
95+ assert_eq!(val1, value.1);
96+ }
97+
98+ Ok(())
99+ }
100+}
101+
88102 #[pinned_drop]
89103 impl PinnedDrop for DmaSampleDriver {
90104 fn drop(self: Pin<&mut Self>) {
91105 dev_info!(self.pdev, "Unload DMA test driver.\n");
92106
93− for (i, value) in TEST_VALUES.into_iter().enumerate() {
94− let val0 = kernel::dma_read!(self.ca[i].h);
95− let val1 = kernel::dma_read!(self.ca[i].b);
96− assert!(val0.is_ok());
97− assert!(val1.is_ok());
98−
99− if let Ok(val0) = val0 {
100− assert_eq!(val0, value.0);
101− }
102− if let Ok(val1) = val1 {
103− assert_eq!(val1, value.1);
104− }
105− }
107+ assert!(self.check_dma().is_ok());
106108
107109 for (i, entry) in self.sgt.iter().enumerate() {
108110 dev_info!(
samples/workqueue/stall_detector/Makefile+1−0
@@ -0,0 +1 @@
1+obj-m += wq_stall.o
samples/workqueue/stall_detector/wq_stall.c+98−0
@@ -0,0 +1,98 @@
1+// SPDX-License-Identifier: GPL-2.0
2+/*
3+ * wq_stall - Test module for the workqueue stall detector.
4+ *
5+ * Deliberately creates a workqueue stall so the watchdog fires and
6+ * prints diagnostic output. Useful for verifying that the stall
7+ * detector correctly identifies stuck workers and produces useful
8+ * backtraces.
9+ *
10+ * The stall is triggered by clearing PF_WQ_WORKER before sleeping,
11+ * which hides the worker from the concurrency manager. A second
12+ * work item queued on the same pool then sits in the worklist with
13+ * no worker available to process it.
14+ *
15+ * After ~30s the workqueue watchdog fires:
16+ * BUG: workqueue lockup - pool cpus=N ...
17+ *
18+ * Build:
19+ * make -C <kernel tree> M=samples/workqueue/stall_detector modules
20+ *
21+ * Copyright (c) 2026 Meta Platforms, Inc. and affiliates.
22+ * Copyright (c) 2026 Breno Leitao <leitao@debian.org>
23+ */
24+
25+#include <linux/module.h>
26+#include <linux/workqueue.h>
27+#include <linux/wait.h>
28+#include <linux/atomic.h>
29+#include <linux/sched.h>
30+
31+static DECLARE_WAIT_QUEUE_HEAD(stall_wq_head);
32+static atomic_t wake_condition = ATOMIC_INIT(0);
33+static struct work_struct stall_work1;
34+static struct work_struct stall_work2;
35+
36+static void stall_work2_fn(struct work_struct *work)
37+{
38+ pr_info("wq_stall: second work item finally ran\n");
39+}
40+
41+static void stall_work1_fn(struct work_struct *work)
42+{
43+ pr_info("wq_stall: first work item running on cpu %d\n",
44+ raw_smp_processor_id());
45+
46+ /*
47+ * Queue second item while we're still counted as running
48+ * (pool->nr_running > 0). Since schedule_work() on a per-CPU
49+ * workqueue targets raw_smp_processor_id(), item 2 lands on the
50+ * same pool. __queue_work -> kick_pool -> need_more_worker()
51+ * sees nr_running > 0 and does NOT wake a new worker.
52+ */
53+ schedule_work(&stall_work2);
54+
55+ /*
56+ * Hide from the workqueue concurrency manager. Without
57+ * PF_WQ_WORKER, schedule() won't call wq_worker_sleeping(),
58+ * so nr_running is never decremented and no replacement
59+ * worker is created. Item 2 stays stuck in pool->worklist.
60+ */
61+ current->flags &= ~PF_WQ_WORKER;
62+
63+ pr_info("wq_stall: entering wait_event_idle (PF_WQ_WORKER cleared)\n");
64+ pr_info("wq_stall: expect 'BUG: workqueue lockup' in ~30-60s\n");
65+ wait_event_idle(stall_wq_head, atomic_read(&wake_condition) != 0);
66+
67+ /* Restore so process_one_work() cleanup works correctly */
68+ current->flags |= PF_WQ_WORKER;
69+ pr_info("wq_stall: woke up, PF_WQ_WORKER restored\n");
70+}
71+
72+static int __init wq_stall_init(void)
73+{
74+ pr_info("wq_stall: loading\n");
75+
76+ INIT_WORK(&stall_work1, stall_work1_fn);
77+ INIT_WORK(&stall_work2, stall_work2_fn);
78+ schedule_work(&stall_work1);
79+
80+ return 0;
81+}
82+
83+static void __exit wq_stall_exit(void)
84+{
85+ pr_info("wq_stall: unloading\n");
86+ atomic_set(&wake_condition, 1);
87+ wake_up(&stall_wq_head);
88+ flush_work(&stall_work1);
89+ flush_work(&stall_work2);
90+ pr_info("wq_stall: all work flushed, module unloaded\n");
91+}
92+
93+module_init(wq_stall_init);
94+module_exit(wq_stall_exit);
95+
96+MODULE_LICENSE("GPL");
97+MODULE_DESCRIPTION("Reproduce workqueue stall caused by PF_WQ_WORKER misuse");
98+MODULE_AUTHOR("Breno Leitao <leitao@debian.org>");
scripts/Makefile.build+3−1
@@ -310,16 +310,18 @@ $(obj)/%.lst: $(obj)/%.c FORCE · 309 unmodified lines
310310
311311 # The features in this list are the ones allowed for non-`rust/` code.
312312 #
313+# - Stable since Rust 1.79.0: `feature(slice_ptr_len)`.
313314 # - Stable since Rust 1.81.0: `feature(lint_reasons)`.
314315 # - Stable since Rust 1.82.0: `feature(asm_const)`,
315316 # `feature(offset_of_nested)`, `feature(raw_ref_op)`.
317+# - Stable since Rust 1.84.0: `feature(strict_provenance)`.
316318 # - Stable since Rust 1.87.0: `feature(asm_goto)`.
317319 # - Expected to become stable: `feature(arbitrary_self_types)`.
318320 # - To be determined: `feature(used_with_arg)`.
319321 #
320322 # Please see https://github.com/Rust-for-Linux/linux/issues/2 for details on
321323 # the unstable features in use.
322−rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,used_with_arg
324+rust_allowed_features := asm_const,asm_goto,arbitrary_self_types,lint_reasons,offset_of_nested,raw_ref_op,slice_ptr_len,strict_provenance,used_with_arg
323325
324326 # `--out-dir` is required to avoid temporaries being created by `rustc` in the
325327 # current working directory, which may be not accessible in the out-of-tree
sound/core/pcm_native.c+16−3
@@ -2144,6 +2144,10 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream, · 2143 unmodified lines
21442144 for (;;) {
21452145 long tout;
21462146 struct snd_pcm_runtime *to_check;
2147+ unsigned int drain_rate;
2148+ snd_pcm_uframes_t drain_bufsz;
2149+ bool drain_no_period_wakeup;
2150+
21472151 if (signal_pending(current)) {
21482152 result = -ERESTARTSYS;
21492153 break;
@@ -2163,16 +2167,25 @@ static int snd_pcm_drain(struct snd_pcm_substream *substream, · 13 unmodified lines
21632167 snd_pcm_group_unref(group, substream);
21642168 if (!to_check)
21652169 break; /* all drained */
2170+ /*
2171+ * Cache the runtime fields needed after unlock.
2172+ * A concurrent close() on the linked stream may free
2173+ * its runtime via snd_pcm_detach_substream() once we
2174+ * release the stream lock below.
2175+ */
2176+ drain_no_period_wakeup = to_check->no_period_wakeup;
2177+ drain_rate = to_check->rate;
2178+ drain_bufsz = to_check->buffer_size;
21662179 init_waitqueue_entry(&wait, current);
21672180 set_current_state(TASK_INTERRUPTIBLE);
21682181 add_wait_queue(&to_check->sleep, &wait);
21692182 snd_pcm_stream_unlock_irq(substream);
2170− if (runtime->no_period_wakeup)
2183+ if (drain_no_period_wakeup)
21712184 tout = MAX_SCHEDULE_TIMEOUT;
21722185 else {
21732186 tout = 100;
2174− if (runtime->rate) {
2175− long t = runtime->buffer_size * 1100 / runtime->rate;
2187+ if (drain_rate) {
2188+ long t = drain_bufsz * 1100 / drain_rate;
21762189 tout = max(t, tout);
21772190 }
21782191 tout = msecs_to_jiffies(tout);
sound/hda/codecs/realtek/alc269.c+3−0
@@ -6940,6 +6940,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { · 6939 unmodified lines
69406940 SND_PCI_QUIRK(0x103c, 0x89da, "HP Spectre x360 14t-ea100", ALC245_FIXUP_HP_SPECTRE_X360_EU0XXX),
69416941 SND_PCI_QUIRK(0x103c, 0x89e7, "HP Elite x2 G9", ALC245_FIXUP_CS35L41_SPI_2_HP_GPIO_LED),
69426942 SND_PCI_QUIRK(0x103c, 0x8a0f, "HP Pavilion 14-ec1xxx", ALC287_FIXUP_HP_GPIO_LED),
6943+ SND_PCI_QUIRK(0x103c, 0x8a1f, "HP Laptop 14s-dr5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
69436944 SND_PCI_QUIRK(0x103c, 0x8a20, "HP Laptop 15s-fq5xxx", ALC236_FIXUP_HP_MUTE_LED_COEFBIT2),
69446945 SND_PCI_QUIRK(0x103c, 0x8a25, "HP Victus 16-d1xxx (MB 8A25)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
69456946 SND_PCI_QUIRK(0x103c, 0x8a26, "HP Victus 16-d1xxx (MB 8A26)", ALC245_FIXUP_HP_MUTE_LED_COEFBIT),
@@ -7273,6 +7274,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { · 327 unmodified lines
72737274 SND_PCI_QUIRK(0x1043, 0x1e93, "ASUS ExpertBook B9403CVAR", ALC294_FIXUP_ASUS_HPE),
72747275 SND_PCI_QUIRK(0x1043, 0x1eb3, "ASUS Ally RCLA72", ALC287_FIXUP_TAS2781_I2C),
72757276 SND_PCI_QUIRK(0x1043, 0x1ed3, "ASUS HN7306W", ALC287_FIXUP_CS35L41_I2C_2),
7277+ HDA_CODEC_QUIRK(0x1043, 0x1ee2, "ASUS UM6702RA/RC", ALC285_FIXUP_ASUS_I2C_SPEAKER2_TO_DAC1),
72767278 SND_PCI_QUIRK(0x1043, 0x1ee2, "ASUS UM6702RA/RC", ALC287_FIXUP_CS35L41_I2C_2),
72777279 SND_PCI_QUIRK(0x1043, 0x1c52, "ASUS Zephyrus G15 2022", ALC289_FIXUP_ASUS_GA401),
72787280 SND_PCI_QUIRK(0x1043, 0x1f11, "ASUS Zephyrus G14", ALC289_FIXUP_ASUS_GA401),
@@ -7493,6 +7495,7 @@ static const struct hda_quirk alc269_fixup_tbl[] = { · 214 unmodified lines
74937495 SND_PCI_QUIRK(0x17aa, 0x224c, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
74947496 SND_PCI_QUIRK(0x17aa, 0x224d, "Thinkpad", ALC298_FIXUP_TPT470_DOCK),
74957497 SND_PCI_QUIRK(0x17aa, 0x225d, "Thinkpad T480", ALC269_FIXUP_LIMIT_INT_MIC_BOOST),
7498+ SND_PCI_QUIRK(0x17aa, 0x2288, "Thinkpad X390", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
74967499 SND_PCI_QUIRK(0x17aa, 0x2292, "Thinkpad X1 Carbon 7th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
74977500 SND_PCI_QUIRK(0x17aa, 0x22be, "Thinkpad X1 Carbon 8th", ALC285_FIXUP_THINKPAD_HEADSET_JACK),
74987501 SND_PCI_QUIRK(0x17aa, 0x22c1, "Thinkpad P1 Gen 3", ALC285_FIXUP_THINKPAD_NO_BASS_SPK_HEADSET_JACK),
sound/hda/codecs/realtek/alc662.c+9−0
@@ -313,6 +313,7 @@ enum { · 312 unmodified lines
313313 ALC897_FIXUP_HEADSET_MIC_PIN2,
314314 ALC897_FIXUP_UNIS_H3C_X500S,
315315 ALC897_FIXUP_HEADSET_MIC_PIN3,
316+ ALC897_FIXUP_H610M_HP_PIN,
316317 };
317318
318319 static const struct hda_fixup alc662_fixups[] = {
@@ -766,6 +767,13 @@ static const struct hda_fixup alc662_fixups[] = { · 447 unmodified lines
766767 { }
767768 },
768769 },
770+ [ALC897_FIXUP_H610M_HP_PIN] = {
771+ .type = HDA_FIXUP_PINS,
772+ .v.pins = (const struct hda_pintbl[]) {
773+ { 0x19, 0x0321403f }, /* HP out */
774+ { }
775+ },
776+ },
769777 };
770778
771779 static const struct hda_quirk alc662_fixup_tbl[] = {
@@ -815,6 +823,7 @@ static const struct hda_quirk alc662_fixup_tbl[] = { · 43 unmodified lines
815823 SND_PCI_QUIRK(0x1043, 0x8469, "ASUS mobo", ALC662_FIXUP_NO_JACK_DETECT),
816824 SND_PCI_QUIRK(0x105b, 0x0cd6, "Foxconn", ALC662_FIXUP_ASUS_MODE2),
817825 SND_PCI_QUIRK(0x144d, 0xc051, "Samsung R720", ALC662_FIXUP_IDEAPAD),
826+ SND_PCI_QUIRK(0x1458, 0xa194, "H610M H V2 DDR4", ALC897_FIXUP_H610M_HP_PIN),
818827 SND_PCI_QUIRK(0x14cd, 0x5003, "USI", ALC662_FIXUP_USI_HEADSET_MODE),
819828 SND_PCI_QUIRK(0x17aa, 0x1036, "Lenovo P520", ALC662_FIXUP_LENOVO_MULTI_CODECS),
820829 SND_PCI_QUIRK(0x17aa, 0x1057, "Lenovo P360", ALC897_FIXUP_HEADSET_MIC_PIN),
sound/soc/amd/acp/acp-mach-common.c+14−4
@@ -127,8 +127,13 @@ static int acp_card_rt5682_init(struct snd_soc_pcm_runtime *rtd) · 126 unmodified lines
127127 if (drvdata->hs_codec_id != RT5682)
128128 return -EINVAL;
129129
130− drvdata->wclk = clk_get(component->dev, "rt5682-dai-wclk");
131− drvdata->bclk = clk_get(component->dev, "rt5682-dai-bclk");
130+ drvdata->wclk = devm_clk_get(component->dev, "rt5682-dai-wclk");
131+ if (IS_ERR(drvdata->wclk))
132+ return PTR_ERR(drvdata->wclk);
133+
134+ drvdata->bclk = devm_clk_get(component->dev, "rt5682-dai-bclk");
135+ if (IS_ERR(drvdata->bclk))
136+ return PTR_ERR(drvdata->bclk);
132137
133138 ret = snd_soc_dapm_new_controls(dapm, rt5682_widgets,
134139 ARRAY_SIZE(rt5682_widgets));
@@ -370,8 +375,13 @@ static int acp_card_rt5682s_init(struct snd_soc_pcm_runtime *rtd) · 235 unmodified lines
370375 return -EINVAL;
371376
372377 if (!drvdata->soc_mclk) {
373− drvdata->wclk = clk_get(component->dev, "rt5682-dai-wclk");
374− drvdata->bclk = clk_get(component->dev, "rt5682-dai-bclk");
378+ drvdata->wclk = devm_clk_get(component->dev, "rt5682-dai-wclk");
379+ if (IS_ERR(drvdata->wclk))
380+ return PTR_ERR(drvdata->wclk);
381+
382+ drvdata->bclk = devm_clk_get(component->dev, "rt5682-dai-bclk");
383+ if (IS_ERR(drvdata->bclk))
384+ return PTR_ERR(drvdata->bclk);
375385 }
376386
377387 ret = snd_soc_dapm_new_controls(dapm, rt5682s_widgets,
sound/soc/amd/acp3x-rt5682-max9836.c+7−2
@@ -94,8 +94,13 @@ static int acp3x_5682_init(struct snd_soc_pcm_runtime *rtd) · 93 unmodified lines
9494 return ret;
9595 }
9696
97− rt5682_dai_wclk = clk_get(component->dev, "rt5682-dai-wclk");
98− rt5682_dai_bclk = clk_get(component->dev, "rt5682-dai-bclk");
97+ rt5682_dai_wclk = devm_clk_get(component->dev, "rt5682-dai-wclk");
98+ if (IS_ERR(rt5682_dai_wclk))
99+ return PTR_ERR(rt5682_dai_wclk);
100+
101+ rt5682_dai_bclk = devm_clk_get(component->dev, "rt5682-dai-bclk");
102+ if (IS_ERR(rt5682_dai_bclk))
103+ return PTR_ERR(rt5682_dai_bclk);
99104
100105 ret = snd_soc_card_jack_new_pins(card, "Headset Jack",
101106 SND_JACK_HEADSET |
sound/soc/codecs/rt1011.c+1−1
@@ -1047,7 +1047,7 @@ static int rt1011_recv_spk_mode_put(struct snd_kcontrol *kcontrol, · 1046 unmodified lines
10471047 struct snd_ctl_elem_value *ucontrol)
10481048 {
10491049 struct snd_soc_component *component = snd_kcontrol_chip(kcontrol);
1050− struct snd_soc_dapm_context *dapm = snd_soc_dapm_kcontrol_to_dapm(kcontrol);
1050+ struct snd_soc_dapm_context *dapm = snd_soc_component_to_dapm(component);
10511051 struct rt1011_priv *rt1011 =
10521052 snd_soc_component_get_drvdata(component);
10531053
sound/soc/generic/simple-card-utils.c+8−4
@@ -1038,11 +1038,15 @@ int graph_util_is_ports0(struct device_node *np) · 1037 unmodified lines
10381038 else
10391039 port = np;
10401040
1041− struct device_node *ports __free(device_node) = of_get_parent(port);
1042− struct device_node *top __free(device_node) = of_get_parent(ports);
1043− struct device_node *ports0 __free(device_node) = of_get_child_by_name(top, "ports");
1041+ struct device_node *ports __free(device_node) = of_get_parent(port);
1042+ const char *at = strchr(kbasename(ports->full_name), '@');
10441043
1045− return ports0 == ports;
1044+ /*
1045+ * Since child iteration order may differ
1046+ * between a base DT and DT overlays,
1047+ * string match "ports" or "ports@0" in the node name instead.
1048+ */
1049+ return !at || !strcmp(at, "@0");
10461050 }
10471051 EXPORT_SYMBOL_GPL(graph_util_is_ports0);
10481052
sound/soc/qcom/qdsp6/q6apm-dai.c+1−0
@@ -838,6 +838,7 @@ static const struct snd_soc_component_driver q6apm_fe_dai_component = { · 837 unmodified lines
838838 .ack = q6apm_dai_ack,
839839 .compress_ops = &q6apm_dai_compress_ops,
840840 .use_dai_pcm_id = true,
841+ .remove_order = SND_SOC_COMP_ORDER_EARLY,
841842 };
842843
843844 static int q6apm_dai_probe(struct platform_device *pdev)
sound/soc/qcom/qdsp6/q6apm-lpass-dais.c+1−0
@@ -278,6 +278,7 @@ static const struct snd_soc_component_driver q6apm_lpass_dai_component = { · 277 unmodified lines
278278 .of_xlate_dai_name = q6dsp_audio_ports_of_xlate_dai_name,
279279 .be_pcm_base = AUDIOREACH_BE_PCM_BASE,
280280 .use_dai_pcm_id = true,
281+ .remove_order = SND_SOC_COMP_ORDER_FIRST,
281282 };
282283
283284 static int q6apm_lpass_dai_dev_probe(struct platform_device *pdev)
sound/soc/qcom/qdsp6/q6apm.c+1−0
@@ -715,6 +715,7 @@ static const struct snd_soc_component_driver q6apm_audio_component = { · 714 unmodified lines
715715 .name = APM_AUDIO_DRV_NAME,
716716 .probe = q6apm_audio_probe,
717717 .remove = q6apm_audio_remove,
718+ .remove_order = SND_SOC_COMP_ORDER_LAST,
718719 };
719720
720721 static int apm_probe(gpr_device_t *gdev)
sound/soc/soc-core.c+8−3
@@ -462,8 +462,7 @@ static void soc_free_pcm_runtime(struct snd_soc_pcm_runtime *rtd) · 461 unmodified lines
462462
463463 list_del(&rtd->list);
464464
465− if (delayed_work_pending(&rtd->delayed_work))
466− flush_delayed_work(&rtd->delayed_work);
465+ flush_delayed_work(&rtd->delayed_work);
467466 snd_soc_pcm_component_free(rtd);
468467
469468 /*
@@ -1864,12 +1863,15 @@ static void cleanup_dmi_name(char *name) · 1394 unmodified lines
18641863
18651864 /*
18661865 * Check if a DMI field is valid, i.e. not containing any string
1867− * in the black list.
1866+ * in the black list and not the empty string.
18681867 */
18691868 static int is_dmi_valid(const char *field)
18701869 {
18711870 int i = 0;
18721871
1872+ if (!field[0])
1873+ return 0;
1874+
18731875 while (dmi_blacklist[i]) {
18741876 if (strstr(field, dmi_blacklist[i]))
18751877 return 0;
@@ -2122,6 +2124,9 @@ static void soc_cleanup_card_resources(struct snd_soc_card *card) · 246 unmodified lines
21222124 for_each_card_rtds(card, rtd)
21232125 if (rtd->initialized)
21242126 snd_soc_link_exit(rtd);
2127+ /* flush delayed work before removing DAIs and DAPM widgets */
2128+ snd_soc_flush_all_delayed_work(card);
2129+
21252130 /* remove and free each DAI */
21262131 soc_remove_link_dais(card);
21272132 soc_remove_link_components(card);
sound/soc/tegra/tegra_audio_graph_card.c+11−0
@@ -231,6 +231,15 @@ static const struct tegra_audio_cdata tegra186_data = { · 230 unmodified lines
231231 .plla_out0_rates[x11_RATE] = 45158400,
232232 };
233233
234+static const struct tegra_audio_cdata tegra238_data = {
235+ /* PLLA */
236+ .plla_rates[x8_RATE] = 1277952000,
237+ .plla_rates[x11_RATE] = 1264435200,
238+ /* PLLA_OUT0 */
239+ .plla_out0_rates[x8_RATE] = 49152000,
240+ .plla_out0_rates[x11_RATE] = 45158400,
241+};
242+
234243 static const struct tegra_audio_cdata tegra264_data = {
235244 /* PLLA1 */
236245 .plla_rates[x8_RATE] = 983040000,
@@ -245,6 +254,8 @@ static const struct of_device_id graph_of_tegra_match[] = { · 8 unmodified lines
245254 .data = &tegra210_data },
246255 { .compatible = "nvidia,tegra186-audio-graph-card",
247256 .data = &tegra186_data },
257+ { .compatible = "nvidia,tegra238-audio-graph-card",
258+ .data = &tegra238_data },
248259 { .compatible = "nvidia,tegra264-audio-graph-card",
249260 .data = &tegra264_data },
250261 {},
sound/usb/mixer_scarlett2.c+2−0
@@ -8251,6 +8251,8 @@ static int scarlett2_find_fc_interface(struct usb_device *dev, · 8250 unmodified lines
82518251
82528252 if (desc->bInterfaceClass != 255)
82538253 continue;
8254+ if (desc->bNumEndpoints < 1)
8255+ continue;
82548256
82558257 epd = get_endpoint(intf->altsetting, 0);
82568258 private->bInterfaceNumber = desc->bInterfaceNumber;
sound/usb/quirks.c+2−0
@@ -2243,6 +2243,8 @@ static const struct usb_audio_quirk_flags_table quirk_flags_table[] = { · 2242 unmodified lines
22432243 QUIRK_FLAG_IFACE_DELAY | QUIRK_FLAG_FORCE_IFACE_RESET),
22442244 DEVICE_FLG(0x0661, 0x0883, /* iBasso DC04 Ultra */
22452245 QUIRK_FLAG_DSD_RAW),
2246+ DEVICE_FLG(0x0666, 0x0880, /* SPACETOUCH USB Audio */
2247+ QUIRK_FLAG_FORCE_IFACE_RESET | QUIRK_FLAG_IFACE_DELAY),
22462248 DEVICE_FLG(0x06f8, 0xb000, /* Hercules DJ Console (Windows Edition) */
22472249 QUIRK_FLAG_IGNORE_CTL_ERROR),
22482250 DEVICE_FLG(0x06f8, 0xd002, /* Hercules DJ Console (Macintosh Edition) */
tools/arch/x86/include/asm/amd/ibs.h+1−1
@@ -110,7 +110,7 @@ union ibs_op_data3 { · 109 unmodified lines
110110 __u64 ld_op:1, /* 0: load op */
111111 st_op:1, /* 1: store op */
112112 dc_l1tlb_miss:1, /* 2: data cache L1TLB miss */
113− dc_l2tlb_miss:1, /* 3: data cache L2TLB hit in 2M page */
113+ dc_l2tlb_miss:1, /* 3: data cache L2TLB miss in 2M page */
114114 dc_l1tlb_hit_2m:1, /* 4: data cache L1TLB hit in 2M page */
115115 dc_l1tlb_hit_1g:1, /* 5: data cache L1TLB hit in 1G page */
116116 dc_l2tlb_hit_2m:1, /* 6: data cache L2TLB hit in 2M page */
tools/arch/x86/include/asm/cpufeatures.h+3−1
@@ -84,7 +84,7 @@ · 83 unmodified lines
8484 #define X86_FEATURE_PEBS ( 3*32+12) /* "pebs" Precise-Event Based Sampling */
8585 #define X86_FEATURE_BTS ( 3*32+13) /* "bts" Branch Trace Store */
8686 #define X86_FEATURE_SYSCALL32 ( 3*32+14) /* syscall in IA32 userspace */
87−#define X86_FEATURE_SYSENTER32 ( 3*32+15) /* sysenter in IA32 userspace */
87+#define X86_FEATURE_SYSFAST32 ( 3*32+15) /* sysenter/syscall in IA32 userspace */
8888 #define X86_FEATURE_REP_GOOD ( 3*32+16) /* "rep_good" REP microcode works well */
8989 #define X86_FEATURE_AMD_LBR_V2 ( 3*32+17) /* "amd_lbr_v2" AMD Last Branch Record Extension Version 2 */
9090 #define X86_FEATURE_CLEAR_CPU_BUF ( 3*32+18) /* Clear CPU buffers using VERW */
@@ -326,6 +326,7 @@ · 235 unmodified lines
326326 #define X86_FEATURE_AMX_FP16 (12*32+21) /* AMX fp16 Support */
327327 #define X86_FEATURE_AVX_IFMA (12*32+23) /* Support for VPMADD52[H,L]UQ */
328328 #define X86_FEATURE_LAM (12*32+26) /* "lam" Linear Address Masking */
329+#define X86_FEATURE_MOVRS (12*32+31) /* MOVRS instructions */
329330
330331 /* AMD-defined CPU features, CPUID level 0x80000008 (EBX), word 13 */
331332 #define X86_FEATURE_CLZERO (13*32+ 0) /* "clzero" CLZERO instruction */
@@ -472,6 +473,7 @@ · 140 unmodified lines
472473 #define X86_FEATURE_GP_ON_USER_CPUID (20*32+17) /* User CPUID faulting */
473474
474475 #define X86_FEATURE_PREFETCHI (20*32+20) /* Prefetch Data/Instruction to Cache Level */
476+#define X86_FEATURE_ERAPS (20*32+24) /* Enhanced Return Address Predictor Security */
475477 #define X86_FEATURE_SBPB (20*32+27) /* Selective Branch Prediction Barrier */
476478 #define X86_FEATURE_IBPB_BRTYPE (20*32+28) /* MSR_PRED_CMD[IBPB] flushes all branch type predictions */
477479 #define X86_FEATURE_SRSO_NO (20*32+29) /* CPU is not affected by SRSO */
tools/arch/x86/include/asm/msr-index.h+6−0
@@ -263,6 +263,11 @@ · 262 unmodified lines
263263 #define MSR_SNOOP_RSP_0 0x00001328
264264 #define MSR_SNOOP_RSP_1 0x00001329
265265
266+#define MSR_OMR_0 0x000003e0
267+#define MSR_OMR_1 0x000003e1
268+#define MSR_OMR_2 0x000003e2
269+#define MSR_OMR_3 0x000003e3
270+
266271 #define MSR_LBR_SELECT 0x000001c8
267272 #define MSR_LBR_TOS 0x000001c9
268273
@@ -1219,6 +1224,7 @@ · 950 unmodified lines
12191224 #define MSR_CORE_PERF_GLOBAL_STATUS 0x0000038e
12201225 #define MSR_CORE_PERF_GLOBAL_CTRL 0x0000038f
12211226 #define MSR_CORE_PERF_GLOBAL_OVF_CTRL 0x00000390
1227+#define MSR_CORE_PERF_GLOBAL_STATUS_SET 0x00000391
12221228
12231229 #define MSR_PERF_METRICS 0x00000329
12241230
tools/arch/x86/include/uapi/asm/kvm.h+6−2
@@ -503,6 +503,7 @@ struct kvm_sync_regs { · 502 unmodified lines
503503 #define KVM_X86_GRP_SEV 1
504504 # define KVM_X86_SEV_VMSA_FEATURES 0
505505 # define KVM_X86_SNP_POLICY_BITS 1
506+# define KVM_X86_SEV_SNP_REQ_CERTS 2
506507
507508 struct kvm_vmx_nested_state_data {
508509 __u8 vmcs12[KVM_STATE_NESTED_VMX_VMCS_SIZE];
@@ -743,6 +744,7 @@ enum sev_cmd_id { · 234 unmodified lines
743744 KVM_SEV_SNP_LAUNCH_START = 100,
744745 KVM_SEV_SNP_LAUNCH_UPDATE,
745746 KVM_SEV_SNP_LAUNCH_FINISH,
747+ KVM_SEV_SNP_ENABLE_REQ_CERTS,
746748
747749 KVM_SEV_NR_MAX,
748750 };
@@ -914,8 +916,10 @@ struct kvm_sev_snp_launch_finish { · 165 unmodified lines
914916 __u64 pad1[4];
915917 };
916918
917−#define KVM_X2APIC_API_USE_32BIT_IDS (1ULL << 0)
918−#define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK (1ULL << 1)
919+#define KVM_X2APIC_API_USE_32BIT_IDS _BITULL(0)
920+#define KVM_X2APIC_API_DISABLE_BROADCAST_QUIRK _BITULL(1)
921+#define KVM_X2APIC_ENABLE_SUPPRESS_EOI_BROADCAST _BITULL(2)
922+#define KVM_X2APIC_DISABLE_SUPPRESS_EOI_BROADCAST _BITULL(3)
919923
920924 struct kvm_hyperv_eventfd {
921925 __u32 conn_id;
tools/bootconfig/samples/bad-non-closed-brace.bconf+4−0
@@ -0,0 +1,4 @@
1+foo {
2+ bar {
3+ buz
4+ }
tools/bootconfig/samples/bad-over-max-brace.bconf+19−0
@@ -0,0 +1,19 @@
1+key1 {
2+key2 {
3+key3 {
4+key4 {
5+key5 {
6+key6 {
7+key7 {
8+key8 {
9+key9 {
10+key10 {
11+key11 {
12+key12 {
13+key13 {
14+key14 {
15+key15 {
16+key16 {
17+key17 {
18+}}}}}}}}}}}}}}}}}
19+
tools/bootconfig/samples/exp-good-nested-brace.bconf+1−0
@@ -0,0 +1 @@
1+key1.key2.key3.key4.key5.key6.key7.key8.key9.key10.key11.key12.key13.key14.key15.key16;
tools/bootconfig/samples/good-nested-brace.bconf+18−0
@@ -0,0 +1,18 @@
1+key1 {
2+key2 {
3+key3 {
4+key4 {
5+key5 {
6+key6 {
7+key7 {
8+key8 {
9+key9 {
10+key10 {
11+key11 {
12+key12 {
13+key13 {
14+key14 {
15+key15 {
16+key16 {
17+}}}}}}}}}}}}}}}}
18+
tools/bootconfig/test-bootconfig.sh+9−0
@@ -171,6 +171,15 @@ $BOOTCONF $INITRD > $OUTFILE · 170 unmodified lines
171171 xfail grep -q 'val[[:space:]]' $OUTFILE
172172 xpass grep -q 'val2[[:space:]]' $OUTFILE
173173
174+echo "Showing correct line:column of no closing brace"
175+cat > $TEMPCONF << EOF
176+foo {
177+bar {
178+}
179+EOF
180+$BOOTCONF -a $TEMPCONF $INITRD 2> $OUTFILE
181+xpass grep -q "1:1" $OUTFILE
182+
174183 echo "=== expected failure cases ==="
175184 for i in samples/bad-* ; do
176185 xfail $BOOTCONF -a $i $INITRD
tools/build/Build.include+9−0
@@ -98,6 +98,15 @@ c_flags_2 = $(filter-out $(CFLAGS_REMOVE_$(basetarget).o), $(c_flags_1)) · 97 unmodified lines
9898 c_flags = $(filter-out $(CFLAGS_REMOVE_$(obj)), $(c_flags_2))
9999 cxx_flags = -Wp,-MD,$(depfile) -Wp,-MT,$@ $(CXXFLAGS) -D"BUILD_STR(s)=\#s" $(CXXFLAGS_$(basetarget).o) $(CXXFLAGS_$(obj))
100100
101+###
102+# Rust flags to be used on rule definition, includes:
103+# - global $(RUST_FLAGS)
104+# - per target Rust flags
105+# - per object Rust flags
106+rust_flags_1 = $(RUST_FLAGS) $(RUST_FLAGS_$(basetarget).o) $(RUST_FLAGS_$(obj))
107+rust_flags_2 = $(filter-out $(RUST_FLAGS_REMOVE_$(basetarget).o), $(rust_flags_1))
108+rust_flags = $(filter-out $(RUST_FLAGS_REMOVE_$(obj)), $(rust_flags_2))
109+
101110 ###
102111 ## HOSTCC C flags
103112
tools/build/Makefile.build+4−2
@@ -70,11 +70,13 @@ quiet_cmd_gen = GEN $@ · 69 unmodified lines
7070 # If there's nothing to link, create empty $@ object.
7171 quiet_cmd_ld_multi = LD $@
7272 cmd_ld_multi = $(if $(strip $(obj-y)),\
73− $(LD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(AR) rcs $@)
73+ printf "$(objprefix)%s " $(patsubst $(objprefix)%,%,$(filter $(obj-y),$^)) | \
74+ xargs $(LD) -r -o $@,rm -f $@; $(AR) rcs $@)
7475
7576 quiet_cmd_host_ld_multi = HOSTLD $@
7677 cmd_host_ld_multi = $(if $(strip $(obj-y)),\
77− $(HOSTLD) -r -o $@ $(filter $(obj-y),$^),rm -f $@; $(HOSTAR) rcs $@)
78+ printf "$(objprefix)%s " $(patsubst $(objprefix)%,%,$(filter $(obj-y),$^)) | \
79+ xargs $(HOSTLD) -r -o $@,rm -f $@; $(HOSTAR) rcs $@)
7880
7981 rust_common_cmd = \
8082 $(RUSTC) $(rust_flags) \
tools/include/linux/coresight-pmu.h+0−24
@@ -21,30 +21,6 @@ · 20 unmodified lines
2121 */
2222 #define CORESIGHT_LEGACY_CPU_TRACE_ID(cpu) (0x10 + (cpu * 2))
2323
24−/*
25− * Below are the definition of bit offsets for perf option, and works as
26− * arbitrary values for all ETM versions.
27− *
28− * Most of them are orignally from ETMv3.5/PTM's ETMCR config, therefore,
29− * ETMv3.5/PTM doesn't define ETMCR config bits with prefix "ETM3_" and
30− * directly use below macros as config bits.
31− */
32−#define ETM_OPT_BRANCH_BROADCAST 8
33−#define ETM_OPT_CYCACC 12
34−#define ETM_OPT_CTXTID 14
35−#define ETM_OPT_CTXTID2 15
36−#define ETM_OPT_TS 28
37−#define ETM_OPT_RETSTK 29
38−
39−/* ETMv4 CONFIGR programming bits for the ETM OPTs */
40−#define ETM4_CFG_BIT_BB 3
41−#define ETM4_CFG_BIT_CYCACC 4
42−#define ETM4_CFG_BIT_CTXTID 6
43−#define ETM4_CFG_BIT_VMID 7
44−#define ETM4_CFG_BIT_TS 11
45−#define ETM4_CFG_BIT_RETSTK 12
46−#define ETM4_CFG_BIT_VMID_OPT 15
47−
4824 /*
4925 * Interpretation of the PERF_RECORD_AUX_OUTPUT_HW_ID payload.
5026 * Used to associate a CPU with the CoreSight Trace ID.
tools/include/linux/gfp_types.h+7−2
@@ -139,6 +139,8 @@ enum { · 138 unmodified lines
139139 * %__GFP_ACCOUNT causes the allocation to be accounted to kmemcg.
140140 *
141141 * %__GFP_NO_OBJ_EXT causes slab allocation to have no object extension.
142+ * mark_obj_codetag_empty() should be called upon freeing for objects allocated
143+ * with this flag to indicate that their NULL tags are expected and normal.
142144 */
143145 #define __GFP_RECLAIMABLE ((__force gfp_t)___GFP_RECLAIMABLE)
144146 #define __GFP_WRITE ((__force gfp_t)___GFP_WRITE)
@@ -309,8 +311,10 @@ enum { · 164 unmodified lines
309311 *
310312 * %GFP_ATOMIC users can not sleep and need the allocation to succeed. A lower
311313 * watermark is applied to allow access to "atomic reserves".
312− * The current implementation doesn't support NMI and few other strict
313− * non-preemptive contexts (e.g. raw_spin_lock). The same applies to %GFP_NOWAIT.
314+ * The current implementation doesn't support NMI, nor contexts that disable
315+ * preemption under PREEMPT_RT. This includes raw_spin_lock() and plain
316+ * preempt_disable() - see "Memory allocation" in
317+ * Documentation/core-api/real-time/differences.rst for more info.
314318 *
315319 * %GFP_KERNEL is typical for kernel-internal allocations. The caller requires
316320 * %ZONE_NORMAL or a lower zone for direct access but can direct reclaim.
@@ -321,6 +325,7 @@ enum { · 4 unmodified lines
321325 * %GFP_NOWAIT is for kernel allocations that should not stall for direct
322326 * reclaim, start physical IO or use any filesystem callback. It is very
323327 * likely to fail to allocate memory, even for very small allocations.
328+ * The same restrictions on calling contexts apply as for %GFP_ATOMIC.
324329 *
325330 * %GFP_NOIO will use direct reclaim to discard clean pages or slab pages
326331 * that do not require the starting of any physical IO.
tools/include/uapi/asm-generic/unistd.h+4−1
@@ -860,8 +860,11 @@ __SYSCALL(__NR_file_setattr, sys_file_setattr) · 859 unmodified lines
860860 #define __NR_listns 470
861861 __SYSCALL(__NR_listns, sys_listns)
862862
863+#define __NR_rseq_slice_yield 471
864+__SYSCALL(__NR_rseq_slice_yield, sys_rseq_slice_yield)
865+
863866 #undef __NR_syscalls
864−#define __NR_syscalls 471
867+#define __NR_syscalls 472
865868
866869 /*
867870 * 32 bit systems traditionally used different
tools/include/uapi/linux/kvm.h+23−1
@@ -135,6 +135,12 @@ struct kvm_xen_exit { · 134 unmodified lines
135135 } u;
136136 };
137137
138+struct kvm_exit_snp_req_certs {
139+ __u64 gpa;
140+ __u64 npages;
141+ __u64 ret;
142+};
143+
138144 #define KVM_S390_GET_SKEYS_NONE 1
139145 #define KVM_S390_SKEYS_MAX 1048576
140146
@@ -180,6 +186,8 @@ struct kvm_xen_exit { · 39 unmodified lines
180186 #define KVM_EXIT_MEMORY_FAULT 39
181187 #define KVM_EXIT_TDX 40
182188 #define KVM_EXIT_ARM_SEA 41
189+#define KVM_EXIT_ARM_LDST64B 42
190+#define KVM_EXIT_SNP_REQ_CERTS 43
183191
184192 /* For KVM_EXIT_INTERNAL_ERROR */
185193 /* Emulate instruction failed. */
@@ -402,7 +410,7 @@ struct kvm_run { · 216 unmodified lines
402410 } eoi;
403411 /* KVM_EXIT_HYPERV */
404412 struct kvm_hyperv_exit hyperv;
405− /* KVM_EXIT_ARM_NISV */
413+ /* KVM_EXIT_ARM_NISV / KVM_EXIT_ARM_LDST64B */
406414 struct {
407415 __u64 esr_iss;
408416 __u64 fault_ipa;
@@ -482,6 +490,8 @@ struct kvm_run { · 73 unmodified lines
482490 __u64 gva;
483491 __u64 gpa;
484492 } arm_sea;
493+ /* KVM_EXIT_SNP_REQ_CERTS */
494+ struct kvm_exit_snp_req_certs snp_req_certs;
485495 /* Fix the size of the union. */
486496 char padding[256];
487497 };
@@ -974,6 +984,7 @@ struct kvm_enable_cap { · 486 unmodified lines
974984 #define KVM_CAP_GUEST_MEMFD_FLAGS 244
975985 #define KVM_CAP_ARM_SEA_TO_USER 245
976986 #define KVM_CAP_S390_USER_OPEREXEC 246
987+#define KVM_CAP_S390_KEYOP 247
977988
978989 struct kvm_irq_routing_irqchip {
979990 __u32 irqchip;
@@ -1219,6 +1230,16 @@ struct kvm_vfio_spapr_tce { · 239 unmodified lines
12191230 __s32 tablefd;
12201231 };
12211232
1233+#define KVM_S390_KEYOP_ISKE 0x01
1234+#define KVM_S390_KEYOP_RRBE 0x02
1235+#define KVM_S390_KEYOP_SSKE 0x03
1236+struct kvm_s390_keyop {
1237+ __u64 guest_addr;
1238+ __u8 key;
1239+ __u8 operation;
1240+ __u8 pad[6];
1241+};
1242+
12221243 /*
12231244 * KVM_CREATE_VCPU receives as a parameter the vcpu slot, and returns
12241245 * a vcpu fd.
@@ -1238,6 +1259,7 @@ struct kvm_vfio_spapr_tce { · 13 unmodified lines
12381259 #define KVM_S390_UCAS_MAP _IOW(KVMIO, 0x50, struct kvm_s390_ucas_mapping)
12391260 #define KVM_S390_UCAS_UNMAP _IOW(KVMIO, 0x51, struct kvm_s390_ucas_mapping)
12401261 #define KVM_S390_VCPU_FAULT _IOW(KVMIO, 0x52, unsigned long)
1262+#define KVM_S390_KEYOP _IOWR(KVMIO, 0x53, struct kvm_s390_keyop)
12411263
12421264 /* Device model IOC */
12431265 #define KVM_CREATE_IRQCHIP _IO(KVMIO, 0x60)
tools/include/uapi/linux/perf_event.h+1−1
@@ -1396,7 +1396,7 @@ union perf_mem_data_src { · 1395 unmodified lines
13961396 #define PERF_MEM_LVLNUM_L4 0x0004 /* L4 */
13971397 #define PERF_MEM_LVLNUM_L2_MHB 0x0005 /* L2 Miss Handling Buffer */
13981398 #define PERF_MEM_LVLNUM_MSC 0x0006 /* Memory-side Cache */
1399−#define PERF_MEM_LVLNUM_L0 0x0007 /* L0 */
1399+#define PERF_MEM_LVLNUM_L0 0x0007 /* L0 */
14001400 #define PERF_MEM_LVLNUM_UNC 0x0008 /* Uncached */
14011401 #define PERF_MEM_LVLNUM_CXL 0x0009 /* CXL */
14021402 #define PERF_MEM_LVLNUM_IO 0x000a /* I/O */
tools/objtool/Makefile+1−1
@@ -13,7 +13,7 @@ endif · 12 unmodified lines
1313
1414 ifeq ($(ARCH_HAS_KLP),y)
1515 HAVE_XXHASH = $(shell printf "$(pound)include <xxhash.h>\nXXH3_state_t *state;int main() {}" | \
16− $(HOSTCC) -xc - -o /dev/null -lxxhash 2> /dev/null && echo y || echo n)
16+ $(HOSTCC) $(HOSTCFLAGS) -xc - -o /dev/null -lxxhash 2> /dev/null && echo y || echo n)
1717 ifeq ($(HAVE_XXHASH),y)
1818 BUILD_KLP := y
1919 LIBXXHASH_CFLAGS := $(shell $(HOSTPKG_CONFIG) libxxhash --cflags 2>/dev/null) \
tools/objtool/arch/x86/decode.c+23−39
@@ -395,52 +395,36 @@ int arch_decode_instruction(struct objtool_file *file, const struct section *sec · 394 unmodified lines
395395 if (!rex_w)
396396 break;
397397
398− if (modrm_reg == CFI_SP) {
399−
400− if (mod_is_reg()) {
401− /* mov %rsp, reg */
402− ADD_OP(op) {
403− op->src.type = OP_SRC_REG;
404− op->src.reg = CFI_SP;
405− op->dest.type = OP_DEST_REG;
406− op->dest.reg = modrm_rm;
407− }
408− break;
409−
410− } else {
411− /* skip RIP relative displacement */
412− if (is_RIP())
413− break;
414−
415− /* skip nontrivial SIB */
416− if (have_SIB()) {
417− modrm_rm = sib_base;
418− if (sib_index != CFI_SP)
419− break;
420− }
421−
422− /* mov %rsp, disp(%reg) */
423− ADD_OP(op) {
424− op->src.type = OP_SRC_REG;
425− op->src.reg = CFI_SP;
426− op->dest.type = OP_DEST_REG_INDIRECT;
427− op->dest.reg = modrm_rm;
428− op->dest.offset = ins.displacement.value;
429− }
430− break;
398+ if (mod_is_reg()) {
399+ /* mov reg, reg */
400+ ADD_OP(op) {
401+ op->src.type = OP_SRC_REG;
402+ op->src.reg = modrm_reg;
403+ op->dest.type = OP_DEST_REG;
404+ op->dest.reg = modrm_rm;
431405 }
432−
433406 break;
434407 }
435408
436− if (rm_is_reg(CFI_SP)) {
409+ /* skip RIP relative displacement */
410+ if (is_RIP())
411+ break;
437412
438− /* mov reg, %rsp */
413+ /* skip nontrivial SIB */
414+ if (have_SIB()) {
415+ modrm_rm = sib_base;
416+ if (sib_index != CFI_SP)
417+ break;
418+ }
419+
420+ /* mov %rsp, disp(%reg) */
421+ if (modrm_reg == CFI_SP) {
439422 ADD_OP(op) {
440423 op->src.type = OP_SRC_REG;
441− op->src.reg = modrm_reg;
442− op->dest.type = OP_DEST_REG;
443− op->dest.reg = CFI_SP;
424+ op->src.reg = CFI_SP;
425+ op->dest.type = OP_DEST_REG_INDIRECT;
426+ op->dest.reg = modrm_rm;
427+ op->dest.offset = ins.displacement.value;
444428 }
445429 break;
446430 }
tools/objtool/check.c+19−5
@@ -3000,6 +3000,20 @@ static int update_cfi_state(struct instruction *insn, · 2999 unmodified lines
30003000 cfi->stack_size += 8;
30013001 }
30023002
3003+ else if (cfi->vals[op->src.reg].base == CFI_CFA) {
3004+ /*
3005+ * Clang RSP musical chairs:
3006+ *
3007+ * mov %rsp, %rdx [handled above]
3008+ * ...
3009+ * mov %rdx, %rbx [handled here]
3010+ * ...
3011+ * mov %rbx, %rsp [handled above]
3012+ */
3013+ cfi->vals[op->dest.reg].base = CFI_CFA;
3014+ cfi->vals[op->dest.reg].offset = cfi->vals[op->src.reg].offset;
3015+ }
3016+
30033017
30043018 break;
30053019
@@ -3734,7 +3748,7 @@ static void checksum_update_insn(struct objtool_file *file, struct symbol *func, · 728 unmodified lines
37343748 static int validate_branch(struct objtool_file *file, struct symbol *func,
37353749 struct instruction *insn, struct insn_state state);
37363750 static int do_validate_branch(struct objtool_file *file, struct symbol *func,
3737− struct instruction *insn, struct insn_state state);
3751+ struct instruction *insn, struct insn_state *state);
37383752
37393753 static int validate_insn(struct objtool_file *file, struct symbol *func,
37403754 struct instruction *insn, struct insn_state *statep,
@@ -3999,7 +4013,7 @@ static int validate_insn(struct objtool_file *file, struct symbol *func, · 258 unmodified lines
39994013 * tools/objtool/Documentation/objtool.txt.
40004014 */
40014015 static int do_validate_branch(struct objtool_file *file, struct symbol *func,
4002− struct instruction *insn, struct insn_state state)
4016+ struct instruction *insn, struct insn_state *state)
40034017 {
40044018 struct instruction *next_insn, *prev_insn = NULL;
40054019 bool dead_end;
@@ -4030,7 +4044,7 @@ static int do_validate_branch(struct objtool_file *file, struct symbol *func, · 24 unmodified lines
40304044 return 1;
40314045 }
40324046
4033− ret = validate_insn(file, func, insn, &state, prev_insn, next_insn,
4047+ ret = validate_insn(file, func, insn, state, prev_insn, next_insn,
40344048 &dead_end);
40354049
40364050 if (!insn->trace) {
@@ -4041,7 +4055,7 @@ static int do_validate_branch(struct objtool_file *file, struct symbol *func, · 4 unmodified lines
40414055 }
40424056
40434057 if (!dead_end && !next_insn) {
4044− if (state.cfi.cfa.base == CFI_UNDEFINED)
4058+ if (state->cfi.cfa.base == CFI_UNDEFINED)
40454059 return 0;
40464060 if (file->ignore_unreachables)
40474061 return 0;
@@ -4066,7 +4080,7 @@ static int validate_branch(struct objtool_file *file, struct symbol *func, · 18 unmodified lines
40664080 int ret;
40674081
40684082 trace_depth_inc();
4069− ret = do_validate_branch(file, func, insn, state);
4083+ ret = do_validate_branch(file, func, insn, &state);
40704084 trace_depth_dec();
40714085
40724086 return ret;
tools/objtool/elf.c+1−1
@@ -1375,7 +1375,7 @@ void *elf_add_data(struct elf *elf, struct section *sec, const void *data, size_ · 1374 unmodified lines
13751375 memcpy(sec->data->d_buf, data, size);
13761376
13771377 sec->data->d_size = size;
1378− sec->data->d_align = 1;
1378+ sec->data->d_align = sec->sh.sh_addralign;
13791379
13801380 offset = ALIGN(sec->sh.sh_size, sec->sh.sh_addralign);
13811381 sec->sh.sh_size = offset + size;
tools/objtool/include/objtool/warn.h+1−1
@@ -107,7 +107,7 @@ static inline char *offstr(struct section *sec, unsigned long offset) · 106 unmodified lines
107107 #define ERROR_ELF(format, ...) __WARN_ELF(ERROR_STR, format, ##__VA_ARGS__)
108108 #define ERROR_GLIBC(format, ...) __WARN_GLIBC(ERROR_STR, format, ##__VA_ARGS__)
109109 #define ERROR_FUNC(sec, offset, format, ...) __WARN_FUNC(ERROR_STR, sec, offset, format, ##__VA_ARGS__)
110−#define ERROR_INSN(insn, format, ...) WARN_FUNC(insn->sec, insn->offset, format, ##__VA_ARGS__)
110+#define ERROR_INSN(insn, format, ...) ERROR_FUNC(insn->sec, insn->offset, format, ##__VA_ARGS__)
111111
112112 extern bool debug;
113113 extern int indent;
tools/objtool/klp-diff.c+26−13
@@ -1334,25 +1334,25 @@ static bool should_keep_special_sym(struct elf *elf, struct symbol *sym) · 1333 unmodified lines
13341334 * be applied after static branch/call init, resulting in code corruption.
13351335 *
13361336 * Validate a special section entry to avoid that. Note that an inert
1337− * tracepoint is harmless enough, in that case just skip the entry and print a
1338− * warning. Otherwise, return an error.
1337+ * tracepoint or pr_debug() is harmless enough, in that case just skip the
1338+ * entry and print a warning. Otherwise, return an error.
13391339 *
1340− * This is only a temporary limitation which will be fixed when livepatch adds
1341− * support for submodules: fully self-contained modules which are embedded in
1342− * the top-level livepatch module's data and which can be loaded on demand when
1343− * their corresponding to-be-patched module gets loaded. Then klp relocs can
1344− * be retired.
1340+ * TODO: This is only a temporary limitation which will be fixed when livepatch
1341+ * adds support for submodules: fully self-contained modules which are embedded
1342+ * in the top-level livepatch module's data and which can be loaded on demand
1343+ * when their corresponding to-be-patched module gets loaded. Then klp relocs
1344+ * can be retired.
13451345 *
13461346 * Return:
13471347 * -1: error: validation failed
1348− * 1: warning: tracepoint skipped
1348+ * 1: warning: disabled tracepoint or pr_debug()
13491349 * 0: success
13501350 */
13511351 static int validate_special_section_klp_reloc(struct elfs *e, struct symbol *sym)
13521352 {
13531353 bool static_branch = !strcmp(sym->sec->name, "__jump_table");
13541354 bool static_call = !strcmp(sym->sec->name, ".static_call_sites");
1355− struct symbol *code_sym = NULL;
1355+ const char *code_sym = NULL;
13561356 unsigned long code_offset = 0;
13571357 struct reloc *reloc;
13581358 int ret = 0;
@@ -1364,12 +1364,15 @@ static int validate_special_section_klp_reloc(struct elfs *e, struct symbol *sym · 5 unmodified lines
13641364 const char *sym_modname;
13651365 struct export *export;
13661366
1367+ if (convert_reloc_sym(e->patched, reloc))
1368+ continue;
1369+
13671370 /* Static branch/call keys are always STT_OBJECT */
13681371 if (reloc->sym->type != STT_OBJECT) {
13691372
13701373 /* Save code location which can be printed below */
13711374 if (reloc->sym->type == STT_FUNC && !code_sym) {
1372− code_sym = reloc->sym;
1375+ code_sym = reloc->sym->name;
13731376 code_offset = reloc_addend(reloc);
13741377 }
13751378
@@ -1392,16 +1395,26 @@ static int validate_special_section_klp_reloc(struct elfs *e, struct symbol *sym · 16 unmodified lines
13921395 if (!strcmp(sym_modname, "vmlinux"))
13931396 continue;
13941397
1398+ if (!code_sym)
1399+ code_sym = "<unknown>";
1400+
13951401 if (static_branch) {
13961402 if (strstarts(reloc->sym->name, "__tracepoint_")) {
13971403 WARN("%s: disabling unsupported tracepoint %s",
1398− code_sym->name, reloc->sym->name + 13);
1404+ code_sym, reloc->sym->name + 13);
1405+ ret = 1;
1406+ continue;
1407+ }
1408+
1409+ if (strstr(reloc->sym->name, "__UNIQUE_ID_ddebug_")) {
1410+ WARN("%s: disabling unsupported pr_debug()",
1411+ code_sym);
13991412 ret = 1;
14001413 continue;
14011414 }
14021415
14031416 ERROR("%s+0x%lx: unsupported static branch key %s. Use static_key_enabled() instead",
1404− code_sym->name, code_offset, reloc->sym->name);
1417+ code_sym, code_offset, reloc->sym->name);
14051418 return -1;
14061419 }
14071420
@@ -1412,7 +1425,7 @@ static int validate_special_section_klp_reloc(struct elfs *e, struct symbol *sym · 4 unmodified lines
14121425 }
14131426
14141427 ERROR("%s()+0x%lx: unsupported static call key %s. Use KLP_STATIC_CALL() instead",
1415− code_sym->name, code_offset, reloc->sym->name);
1428+ code_sym, code_offset, reloc->sym->name);
14161429 return -1;
14171430 }
14181431
tools/perf/Makefile.config+18−0
@@ -1163,6 +1163,24 @@ ifndef NO_RUST · 1162 unmodified lines
11631163 CFLAGS += -DHAVE_RUST_SUPPORT
11641164 $(call detected,CONFIG_RUST_SUPPORT)
11651165 endif
1166+
1167+ ifneq ($(CROSS_COMPILE),)
1168+ RUST_TARGET_FLAGS_arm := arm-unknown-linux-gnueabi
1169+ RUST_TARGET_FLAGS_arm64 := aarch64-unknown-linux-gnu
1170+ RUST_TARGET_FLAGS_m68k := m68k-unknown-linux-gnu
1171+ RUST_TARGET_FLAGS_mips := mipsel-unknown-linux-gnu
1172+ RUST_TARGET_FLAGS_powerpc := powerpc64le-unknown-linux-gnu
1173+ RUST_TARGET_FLAGS_riscv := riscv64gc-unknown-linux-gnu
1174+ RUST_TARGET_FLAGS_s390 := s390x-unknown-linux-gnu
1175+ RUST_TARGET_FLAGS_x86 := x86_64-unknown-linux-gnu
1176+ RUST_TARGET_FLAGS_x86_64 := x86_64-unknown-linux-gnu
1177+
1178+ ifeq ($(RUST_TARGET_FLAGS_$(ARCH)),)
1179+ $(error Unknown rust cross compilation architecture $(ARCH))
1180+ endif
1181+
1182+ RUST_FLAGS += --target=$(RUST_TARGET_FLAGS_$(ARCH))
1183+ endif
11661184 endif
11671185
11681186 # Among the variables below, these:
tools/perf/Makefile.perf+1−1
@@ -274,7 +274,7 @@ ifeq ($(PYLINT),1) · 273 unmodified lines
274274 PYLINT := $(shell which pylint 2> /dev/null)
275275 endif
276276
277−export srctree OUTPUT RM CC CXX RUSTC LD AR CFLAGS CXXFLAGS V BISON FLEX AWK
277+export srctree OUTPUT RM CC CXX RUSTC LD AR CFLAGS CXXFLAGS RUST_FLAGS V BISON FLEX AWK
278278 export HOSTCC HOSTLD HOSTAR HOSTCFLAGS SHELLCHECK MYPY PYLINT
279279
280280 include $(srctree)/tools/build/Makefile.include
tools/perf/arch/arm/entry/syscalls/syscall.tbl+1−0
@@ -485,3 +485,4 @@ · 484 unmodified lines
485485 468 common file_getattr sys_file_getattr
486486 469 common file_setattr sys_file_setattr
487487 470 common listns sys_listns
488+471 common rseq_slice_yield sys_rseq_slice_yield
tools/perf/arch/arm/util/cs-etm.c+0−14
@@ -68,20 +68,6 @@ static const char * const metadata_ete_ro[] = { · 67 unmodified lines
6868
6969 enum cs_etm_version { CS_NOT_PRESENT, CS_ETMV3, CS_ETMV4, CS_ETE };
7070
71−/* ETMv4 CONFIGR register bits */
72−#define TRCCONFIGR_BB BIT(3)
73−#define TRCCONFIGR_CCI BIT(4)
74−#define TRCCONFIGR_CID BIT(6)
75−#define TRCCONFIGR_VMID BIT(7)
76−#define TRCCONFIGR_TS BIT(11)
77−#define TRCCONFIGR_RS BIT(12)
78−#define TRCCONFIGR_VMIDOPT BIT(15)
79−
80−/* ETMv3 ETMCR register bits */
81−#define ETMCR_CYC_ACC BIT(12)
82−#define ETMCR_TIMESTAMP_EN BIT(28)
83−#define ETMCR_RETURN_STACK BIT(29)
84−
8571 static bool cs_etm_is_ete(struct perf_pmu *cs_etm_pmu, struct perf_cpu cpu);
8672 static int cs_etm_get_ro(struct perf_pmu *pmu, struct perf_cpu cpu, const char *path, __u64 *val);
8773 static bool cs_etm_pmu_path_exists(struct perf_pmu *pmu, struct perf_cpu cpu, const char *path);
tools/perf/arch/mips/entry/syscalls/syscall_n64.tbl+1−0
@@ -385,3 +385,4 @@ · 384 unmodified lines
385385 468 n64 file_getattr sys_file_getattr
386386 469 n64 file_setattr sys_file_setattr
387387 470 n64 listns sys_listns
388+471 n64 rseq_slice_yield sys_rseq_slice_yield
tools/perf/arch/powerpc/entry/syscalls/syscall.tbl+1−0
@@ -561,3 +561,4 @@ · 560 unmodified lines
561561 468 common file_getattr sys_file_getattr
562562 469 common file_setattr sys_file_setattr
563563 470 common listns sys_listns
564+471 nospu rseq_slice_yield sys_rseq_slice_yield
tools/perf/arch/s390/entry/syscalls/syscall.tbl+392−467
@@ -3,473 +3,398 @@ · 2 unmodified lines
33 # System call table for s390
44 #
55 # Format:
6+# <nr> <abi> <syscall> <entry>
67 #
7−# <nr> <abi> <syscall> <entry-64bit> <compat-entry>
8−#
9−# where <abi> can be common, 64, or 32
8+# <abi> is always common.
109
11−1 common exit sys_exit sys_exit
12−2 common fork sys_fork sys_fork
13−3 common read sys_read compat_sys_s390_read
14−4 common write sys_write compat_sys_s390_write
15−5 common open sys_open compat_sys_open
16−6 common close sys_close sys_close
17−7 common restart_syscall sys_restart_syscall sys_restart_syscall
18−8 common creat sys_creat sys_creat
19−9 common link sys_link sys_link
20−10 common unlink sys_unlink sys_unlink
21−11 common execve sys_execve compat_sys_execve
22−12 common chdir sys_chdir sys_chdir
23−13 32 time - sys_time32
24−14 common mknod sys_mknod sys_mknod
25−15 common chmod sys_chmod sys_chmod
26−16 32 lchown - sys_lchown16
27−19 common lseek sys_lseek compat_sys_lseek
28−20 common getpid sys_getpid sys_getpid
29−21 common mount sys_mount sys_mount
30−22 common umount sys_oldumount sys_oldumount
31−23 32 setuid - sys_setuid16
32−24 32 getuid - sys_getuid16
33−25 32 stime - sys_stime32
34−26 common ptrace sys_ptrace compat_sys_ptrace
35−27 common alarm sys_alarm sys_alarm
36−29 common pause sys_pause sys_pause
37−30 common utime sys_utime sys_utime32
38−33 common access sys_access sys_access
39−34 common nice sys_nice sys_nice
40−36 common sync sys_sync sys_sync
41−37 common kill sys_kill sys_kill
42−38 common rename sys_rename sys_rename
43−39 common mkdir sys_mkdir sys_mkdir
44−40 common rmdir sys_rmdir sys_rmdir
45−41 common dup sys_dup sys_dup
46−42 common pipe sys_pipe sys_pipe
47−43 common times sys_times compat_sys_times
48−45 common brk sys_brk sys_brk
49−46 32 setgid - sys_setgid16
50−47 32 getgid - sys_getgid16
51−48 common signal sys_signal sys_signal
52−49 32 geteuid - sys_geteuid16
53−50 32 getegid - sys_getegid16
54−51 common acct sys_acct sys_acct
55−52 common umount2 sys_umount sys_umount
56−54 common ioctl sys_ioctl compat_sys_ioctl
57−55 common fcntl sys_fcntl compat_sys_fcntl
58−57 common setpgid sys_setpgid sys_setpgid
59−60 common umask sys_umask sys_umask
60−61 common chroot sys_chroot sys_chroot
61−62 common ustat sys_ustat compat_sys_ustat
62−63 common dup2 sys_dup2 sys_dup2
63−64 common getppid sys_getppid sys_getppid
64−65 common getpgrp sys_getpgrp sys_getpgrp
65−66 common setsid sys_setsid sys_setsid
66−67 common sigaction sys_sigaction compat_sys_sigaction
67−70 32 setreuid - sys_setreuid16
68−71 32 setregid - sys_setregid16
69−72 common sigsuspend sys_sigsuspend sys_sigsuspend
70−73 common sigpending sys_sigpending compat_sys_sigpending
71−74 common sethostname sys_sethostname sys_sethostname
72−75 common setrlimit sys_setrlimit compat_sys_setrlimit
73−76 32 getrlimit - compat_sys_old_getrlimit
74−77 common getrusage sys_getrusage compat_sys_getrusage
75−78 common gettimeofday sys_gettimeofday compat_sys_gettimeofday
76−79 common settimeofday sys_settimeofday compat_sys_settimeofday
77−80 32 getgroups - sys_getgroups16
78−81 32 setgroups - sys_setgroups16
79−83 common symlink sys_symlink sys_symlink
80−85 common readlink sys_readlink sys_readlink
81−86 common uselib sys_uselib sys_uselib
82−87 common swapon sys_swapon sys_swapon
83−88 common reboot sys_reboot sys_reboot
84−89 common readdir - compat_sys_old_readdir
85−90 common mmap sys_old_mmap compat_sys_s390_old_mmap
86−91 common munmap sys_munmap sys_munmap
87−92 common truncate sys_truncate compat_sys_truncate
88−93 common ftruncate sys_ftruncate compat_sys_ftruncate
89−94 common fchmod sys_fchmod sys_fchmod
90−95 32 fchown - sys_fchown16
91−96 common getpriority sys_getpriority sys_getpriority
92−97 common setpriority sys_setpriority sys_setpriority
93−99 common statfs sys_statfs compat_sys_statfs
94−100 common fstatfs sys_fstatfs compat_sys_fstatfs
95−101 32 ioperm - -
96−102 common socketcall sys_socketcall compat_sys_socketcall
97−103 common syslog sys_syslog sys_syslog
98−104 common setitimer sys_setitimer compat_sys_setitimer
99−105 common getitimer sys_getitimer compat_sys_getitimer
100−106 common stat sys_newstat compat_sys_newstat
101−107 common lstat sys_newlstat compat_sys_newlstat
102−108 common fstat sys_newfstat compat_sys_newfstat
103−110 common lookup_dcookie - -
104−111 common vhangup sys_vhangup sys_vhangup
105−112 common idle - -
106−114 common wait4 sys_wait4 compat_sys_wait4
107−115 common swapoff sys_swapoff sys_swapoff
108−116 common sysinfo sys_sysinfo compat_sys_sysinfo
109−117 common ipc sys_s390_ipc compat_sys_s390_ipc
110−118 common fsync sys_fsync sys_fsync
111−119 common sigreturn sys_sigreturn compat_sys_sigreturn
112−120 common clone sys_clone sys_clone
113−121 common setdomainname sys_setdomainname sys_setdomainname
114−122 common uname sys_newuname sys_newuname
115−124 common adjtimex sys_adjtimex sys_adjtimex_time32
116−125 common mprotect sys_mprotect sys_mprotect
117−126 common sigprocmask sys_sigprocmask compat_sys_sigprocmask
118−127 common create_module - -
119−128 common init_module sys_init_module sys_init_module
120−129 common delete_module sys_delete_module sys_delete_module
121−130 common get_kernel_syms - -
122−131 common quotactl sys_quotactl sys_quotactl
123−132 common getpgid sys_getpgid sys_getpgid
124−133 common fchdir sys_fchdir sys_fchdir
125−134 common bdflush sys_ni_syscall sys_ni_syscall
126−135 common sysfs sys_sysfs sys_sysfs
127−136 common personality sys_s390_personality sys_s390_personality
128−137 common afs_syscall - -
129−138 32 setfsuid - sys_setfsuid16
130−139 32 setfsgid - sys_setfsgid16
131−140 32 _llseek - sys_llseek
132−141 common getdents sys_getdents compat_sys_getdents
133−142 32 _newselect - compat_sys_select
134−142 64 select sys_select -
135−143 common flock sys_flock sys_flock
136−144 common msync sys_msync sys_msync
137−145 common readv sys_readv sys_readv
138−146 common writev sys_writev sys_writev
139−147 common getsid sys_getsid sys_getsid
140−148 common fdatasync sys_fdatasync sys_fdatasync
141−149 common _sysctl - -
142−150 common mlock sys_mlock sys_mlock
143−151 common munlock sys_munlock sys_munlock
144−152 common mlockall sys_mlockall sys_mlockall
145−153 common munlockall sys_munlockall sys_munlockall
146−154 common sched_setparam sys_sched_setparam sys_sched_setparam
147−155 common sched_getparam sys_sched_getparam sys_sched_getparam
148−156 common sched_setscheduler sys_sched_setscheduler sys_sched_setscheduler
149−157 common sched_getscheduler sys_sched_getscheduler sys_sched_getscheduler
150−158 common sched_yield sys_sched_yield sys_sched_yield
151−159 common sched_get_priority_max sys_sched_get_priority_max sys_sched_get_priority_max
152−160 common sched_get_priority_min sys_sched_get_priority_min sys_sched_get_priority_min
153−161 common sched_rr_get_interval sys_sched_rr_get_interval sys_sched_rr_get_interval_time32
154−162 common nanosleep sys_nanosleep sys_nanosleep_time32
155−163 common mremap sys_mremap sys_mremap
156−164 32 setresuid - sys_setresuid16
157−165 32 getresuid - sys_getresuid16
158−167 common query_module - -
159−168 common poll sys_poll sys_poll
160−169 common nfsservctl - -
161−170 32 setresgid - sys_setresgid16
162−171 32 getresgid - sys_getresgid16
163−172 common prctl sys_prctl sys_prctl
164−173 common rt_sigreturn sys_rt_sigreturn compat_sys_rt_sigreturn
165−174 common rt_sigaction sys_rt_sigaction compat_sys_rt_sigaction
166−175 common rt_sigprocmask sys_rt_sigprocmask compat_sys_rt_sigprocmask
167−176 common rt_sigpending sys_rt_sigpending compat_sys_rt_sigpending
168−177 common rt_sigtimedwait sys_rt_sigtimedwait compat_sys_rt_sigtimedwait_time32
169−178 common rt_sigqueueinfo sys_rt_sigqueueinfo compat_sys_rt_sigqueueinfo
170−179 common rt_sigsuspend sys_rt_sigsuspend compat_sys_rt_sigsuspend
171−180 common pread64 sys_pread64 compat_sys_s390_pread64
172−181 common pwrite64 sys_pwrite64 compat_sys_s390_pwrite64
173−182 32 chown - sys_chown16
174−183 common getcwd sys_getcwd sys_getcwd
175−184 common capget sys_capget sys_capget
176−185 common capset sys_capset sys_capset
177−186 common sigaltstack sys_sigaltstack compat_sys_sigaltstack
178−187 common sendfile sys_sendfile64 compat_sys_sendfile
179−188 common getpmsg - -
180−189 common putpmsg - -
181−190 common vfork sys_vfork sys_vfork
182−191 32 ugetrlimit - compat_sys_getrlimit
183−191 64 getrlimit sys_getrlimit -
184−192 32 mmap2 - compat_sys_s390_mmap2
185−193 32 truncate64 - compat_sys_s390_truncate64
186−194 32 ftruncate64 - compat_sys_s390_ftruncate64
187−195 32 stat64 - compat_sys_s390_stat64
188−196 32 lstat64 - compat_sys_s390_lstat64
189−197 32 fstat64 - compat_sys_s390_fstat64
190−198 32 lchown32 - sys_lchown
191−198 64 lchown sys_lchown -
192−199 32 getuid32 - sys_getuid
193−199 64 getuid sys_getuid -
194−200 32 getgid32 - sys_getgid
195−200 64 getgid sys_getgid -
196−201 32 geteuid32 - sys_geteuid
197−201 64 geteuid sys_geteuid -
198−202 32 getegid32 - sys_getegid
199−202 64 getegid sys_getegid -
200−203 32 setreuid32 - sys_setreuid
201−203 64 setreuid sys_setreuid -
202−204 32 setregid32 - sys_setregid
203−204 64 setregid sys_setregid -
204−205 32 getgroups32 - sys_getgroups
205−205 64 getgroups sys_getgroups -
206−206 32 setgroups32 - sys_setgroups
207−206 64 setgroups sys_setgroups -
208−207 32 fchown32 - sys_fchown
209−207 64 fchown sys_fchown -
210−208 32 setresuid32 - sys_setresuid
211−208 64 setresuid sys_setresuid -
212−209 32 getresuid32 - sys_getresuid
213−209 64 getresuid sys_getresuid -
214−210 32 setresgid32 - sys_setresgid
215−210 64 setresgid sys_setresgid -
216−211 32 getresgid32 - sys_getresgid
217−211 64 getresgid sys_getresgid -
218−212 32 chown32 - sys_chown
219−212 64 chown sys_chown -
220−213 32 setuid32 - sys_setuid
221−213 64 setuid sys_setuid -
222−214 32 setgid32 - sys_setgid
223−214 64 setgid sys_setgid -
224−215 32 setfsuid32 - sys_setfsuid
225−215 64 setfsuid sys_setfsuid -
226−216 32 setfsgid32 - sys_setfsgid
227−216 64 setfsgid sys_setfsgid -
228−217 common pivot_root sys_pivot_root sys_pivot_root
229−218 common mincore sys_mincore sys_mincore
230−219 common madvise sys_madvise sys_madvise
231−220 common getdents64 sys_getdents64 sys_getdents64
232−221 32 fcntl64 - compat_sys_fcntl64
233−222 common readahead sys_readahead compat_sys_s390_readahead
234−223 32 sendfile64 - compat_sys_sendfile64
235−224 common setxattr sys_setxattr sys_setxattr
236−225 common lsetxattr sys_lsetxattr sys_lsetxattr
237−226 common fsetxattr sys_fsetxattr sys_fsetxattr
238−227 common getxattr sys_getxattr sys_getxattr
239−228 common lgetxattr sys_lgetxattr sys_lgetxattr
240−229 common fgetxattr sys_fgetxattr sys_fgetxattr
241−230 common listxattr sys_listxattr sys_listxattr
242−231 common llistxattr sys_llistxattr sys_llistxattr
243−232 common flistxattr sys_flistxattr sys_flistxattr
244−233 common removexattr sys_removexattr sys_removexattr
245−234 common lremovexattr sys_lremovexattr sys_lremovexattr
246−235 common fremovexattr sys_fremovexattr sys_fremovexattr
247−236 common gettid sys_gettid sys_gettid
248−237 common tkill sys_tkill sys_tkill
249−238 common futex sys_futex sys_futex_time32
250−239 common sched_setaffinity sys_sched_setaffinity compat_sys_sched_setaffinity
251−240 common sched_getaffinity sys_sched_getaffinity compat_sys_sched_getaffinity
252−241 common tgkill sys_tgkill sys_tgkill
253−243 common io_setup sys_io_setup compat_sys_io_setup
254−244 common io_destroy sys_io_destroy sys_io_destroy
255−245 common io_getevents sys_io_getevents sys_io_getevents_time32
256−246 common io_submit sys_io_submit compat_sys_io_submit
257−247 common io_cancel sys_io_cancel sys_io_cancel
258−248 common exit_group sys_exit_group sys_exit_group
259−249 common epoll_create sys_epoll_create sys_epoll_create
260−250 common epoll_ctl sys_epoll_ctl sys_epoll_ctl
261−251 common epoll_wait sys_epoll_wait sys_epoll_wait
262−252 common set_tid_address sys_set_tid_address sys_set_tid_address
263−253 common fadvise64 sys_fadvise64_64 compat_sys_s390_fadvise64
264−254 common timer_create sys_timer_create compat_sys_timer_create
265−255 common timer_settime sys_timer_settime sys_timer_settime32
266−256 common timer_gettime sys_timer_gettime sys_timer_gettime32
267−257 common timer_getoverrun sys_timer_getoverrun sys_timer_getoverrun
268−258 common timer_delete sys_timer_delete sys_timer_delete
269−259 common clock_settime sys_clock_settime sys_clock_settime32
270−260 common clock_gettime sys_clock_gettime sys_clock_gettime32
271−261 common clock_getres sys_clock_getres sys_clock_getres_time32
272−262 common clock_nanosleep sys_clock_nanosleep sys_clock_nanosleep_time32
273−264 32 fadvise64_64 - compat_sys_s390_fadvise64_64
274−265 common statfs64 sys_statfs64 compat_sys_statfs64
275−266 common fstatfs64 sys_fstatfs64 compat_sys_fstatfs64
276−267 common remap_file_pages sys_remap_file_pages sys_remap_file_pages
277−268 common mbind sys_mbind sys_mbind
278−269 common get_mempolicy sys_get_mempolicy sys_get_mempolicy
279−270 common set_mempolicy sys_set_mempolicy sys_set_mempolicy
280−271 common mq_open sys_mq_open compat_sys_mq_open
281−272 common mq_unlink sys_mq_unlink sys_mq_unlink
282−273 common mq_timedsend sys_mq_timedsend sys_mq_timedsend_time32
283−274 common mq_timedreceive sys_mq_timedreceive sys_mq_timedreceive_time32
284−275 common mq_notify sys_mq_notify compat_sys_mq_notify
285−276 common mq_getsetattr sys_mq_getsetattr compat_sys_mq_getsetattr
286−277 common kexec_load sys_kexec_load compat_sys_kexec_load
287−278 common add_key sys_add_key sys_add_key
288−279 common request_key sys_request_key sys_request_key
289−280 common keyctl sys_keyctl compat_sys_keyctl
290−281 common waitid sys_waitid compat_sys_waitid
291−282 common ioprio_set sys_ioprio_set sys_ioprio_set
292−283 common ioprio_get sys_ioprio_get sys_ioprio_get
293−284 common inotify_init sys_inotify_init sys_inotify_init
294−285 common inotify_add_watch sys_inotify_add_watch sys_inotify_add_watch
295−286 common inotify_rm_watch sys_inotify_rm_watch sys_inotify_rm_watch
296−287 common migrate_pages sys_migrate_pages sys_migrate_pages
297−288 common openat sys_openat compat_sys_openat
298−289 common mkdirat sys_mkdirat sys_mkdirat
299−290 common mknodat sys_mknodat sys_mknodat
300−291 common fchownat sys_fchownat sys_fchownat
301−292 common futimesat sys_futimesat sys_futimesat_time32
302−293 32 fstatat64 - compat_sys_s390_fstatat64
303−293 64 newfstatat sys_newfstatat -
304−294 common unlinkat sys_unlinkat sys_unlinkat
305−295 common renameat sys_renameat sys_renameat
306−296 common linkat sys_linkat sys_linkat
307−297 common symlinkat sys_symlinkat sys_symlinkat
308−298 common readlinkat sys_readlinkat sys_readlinkat
309−299 common fchmodat sys_fchmodat sys_fchmodat
310−300 common faccessat sys_faccessat sys_faccessat
311−301 common pselect6 sys_pselect6 compat_sys_pselect6_time32
312−302 common ppoll sys_ppoll compat_sys_ppoll_time32
313−303 common unshare sys_unshare sys_unshare
314−304 common set_robust_list sys_set_robust_list compat_sys_set_robust_list
315−305 common get_robust_list sys_get_robust_list compat_sys_get_robust_list
316−306 common splice sys_splice sys_splice
317−307 common sync_file_range sys_sync_file_range compat_sys_s390_sync_file_range
318−308 common tee sys_tee sys_tee
319−309 common vmsplice sys_vmsplice sys_vmsplice
320−310 common move_pages sys_move_pages sys_move_pages
321−311 common getcpu sys_getcpu sys_getcpu
322−312 common epoll_pwait sys_epoll_pwait compat_sys_epoll_pwait
323−313 common utimes sys_utimes sys_utimes_time32
324−314 common fallocate sys_fallocate compat_sys_s390_fallocate
325−315 common utimensat sys_utimensat sys_utimensat_time32
326−316 common signalfd sys_signalfd compat_sys_signalfd
327−317 common timerfd - -
328−318 common eventfd sys_eventfd sys_eventfd
329−319 common timerfd_create sys_timerfd_create sys_timerfd_create
330−320 common timerfd_settime sys_timerfd_settime sys_timerfd_settime32
331−321 common timerfd_gettime sys_timerfd_gettime sys_timerfd_gettime32
332−322 common signalfd4 sys_signalfd4 compat_sys_signalfd4
333−323 common eventfd2 sys_eventfd2 sys_eventfd2
334−324 common inotify_init1 sys_inotify_init1 sys_inotify_init1
335−325 common pipe2 sys_pipe2 sys_pipe2
336−326 common dup3 sys_dup3 sys_dup3
337−327 common epoll_create1 sys_epoll_create1 sys_epoll_create1
338−328 common preadv sys_preadv compat_sys_preadv
339−329 common pwritev sys_pwritev compat_sys_pwritev
340−330 common rt_tgsigqueueinfo sys_rt_tgsigqueueinfo compat_sys_rt_tgsigqueueinfo
341−331 common perf_event_open sys_perf_event_open sys_perf_event_open
342−332 common fanotify_init sys_fanotify_init sys_fanotify_init
343−333 common fanotify_mark sys_fanotify_mark compat_sys_fanotify_mark
344−334 common prlimit64 sys_prlimit64 sys_prlimit64
345−335 common name_to_handle_at sys_name_to_handle_at sys_name_to_handle_at
346−336 common open_by_handle_at sys_open_by_handle_at compat_sys_open_by_handle_at
347−337 common clock_adjtime sys_clock_adjtime sys_clock_adjtime32
348−338 common syncfs sys_syncfs sys_syncfs
349−339 common setns sys_setns sys_setns
350−340 common process_vm_readv sys_process_vm_readv sys_process_vm_readv
351−341 common process_vm_writev sys_process_vm_writev sys_process_vm_writev
352−342 common s390_runtime_instr sys_s390_runtime_instr sys_s390_runtime_instr
353−343 common kcmp sys_kcmp sys_kcmp
354−344 common finit_module sys_finit_module sys_finit_module
355−345 common sched_setattr sys_sched_setattr sys_sched_setattr
356−346 common sched_getattr sys_sched_getattr sys_sched_getattr
357−347 common renameat2 sys_renameat2 sys_renameat2
358−348 common seccomp sys_seccomp sys_seccomp
359−349 common getrandom sys_getrandom sys_getrandom
360−350 common memfd_create sys_memfd_create sys_memfd_create
361−351 common bpf sys_bpf sys_bpf
362−352 common s390_pci_mmio_write sys_s390_pci_mmio_write sys_s390_pci_mmio_write
363−353 common s390_pci_mmio_read sys_s390_pci_mmio_read sys_s390_pci_mmio_read
364−354 common execveat sys_execveat compat_sys_execveat
365−355 common userfaultfd sys_userfaultfd sys_userfaultfd
366−356 common membarrier sys_membarrier sys_membarrier
367−357 common recvmmsg sys_recvmmsg compat_sys_recvmmsg_time32
368−358 common sendmmsg sys_sendmmsg compat_sys_sendmmsg
369−359 common socket sys_socket sys_socket
370−360 common socketpair sys_socketpair sys_socketpair
371−361 common bind sys_bind sys_bind
372−362 common connect sys_connect sys_connect
373−363 common listen sys_listen sys_listen
374−364 common accept4 sys_accept4 sys_accept4
375−365 common getsockopt sys_getsockopt sys_getsockopt
376−366 common setsockopt sys_setsockopt sys_setsockopt
377−367 common getsockname sys_getsockname sys_getsockname
378−368 common getpeername sys_getpeername sys_getpeername
379−369 common sendto sys_sendto sys_sendto
380−370 common sendmsg sys_sendmsg compat_sys_sendmsg
381−371 common recvfrom sys_recvfrom compat_sys_recvfrom
382−372 common recvmsg sys_recvmsg compat_sys_recvmsg
383−373 common shutdown sys_shutdown sys_shutdown
384−374 common mlock2 sys_mlock2 sys_mlock2
385−375 common copy_file_range sys_copy_file_range sys_copy_file_range
386−376 common preadv2 sys_preadv2 compat_sys_preadv2
387−377 common pwritev2 sys_pwritev2 compat_sys_pwritev2
388−378 common s390_guarded_storage sys_s390_guarded_storage sys_s390_guarded_storage
389−379 common statx sys_statx sys_statx
390−380 common s390_sthyi sys_s390_sthyi sys_s390_sthyi
391−381 common kexec_file_load sys_kexec_file_load sys_kexec_file_load
392−382 common io_pgetevents sys_io_pgetevents compat_sys_io_pgetevents
393−383 common rseq sys_rseq sys_rseq
394−384 common pkey_mprotect sys_pkey_mprotect sys_pkey_mprotect
395−385 common pkey_alloc sys_pkey_alloc sys_pkey_alloc
396−386 common pkey_free sys_pkey_free sys_pkey_free
10+1 common exit sys_exit
11+2 common fork sys_fork
12+3 common read sys_read
13+4 common write sys_write
14+5 common open sys_open
15+6 common close sys_close
16+7 common restart_syscall sys_restart_syscall
17+8 common creat sys_creat
18+9 common link sys_link
19+10 common unlink sys_unlink
20+11 common execve sys_execve
21+12 common chdir sys_chdir
22+14 common mknod sys_mknod
23+15 common chmod sys_chmod
24+19 common lseek sys_lseek
25+20 common getpid sys_getpid
26+21 common mount sys_mount
27+22 common umount sys_oldumount
28+26 common ptrace sys_ptrace
29+27 common alarm sys_alarm
30+29 common pause sys_pause
31+30 common utime sys_utime
32+33 common access sys_access
33+34 common nice sys_nice
34+36 common sync sys_sync
35+37 common kill sys_kill
36+38 common rename sys_rename
37+39 common mkdir sys_mkdir
38+40 common rmdir sys_rmdir
39+41 common dup sys_dup
40+42 common pipe sys_pipe
41+43 common times sys_times
42+45 common brk sys_brk
43+48 common signal sys_signal
44+51 common acct sys_acct
45+52 common umount2 sys_umount
46+54 common ioctl sys_ioctl
47+55 common fcntl sys_fcntl
48+57 common setpgid sys_setpgid
49+60 common umask sys_umask
50+61 common chroot sys_chroot
51+62 common ustat sys_ustat
52+63 common dup2 sys_dup2
53+64 common getppid sys_getppid
54+65 common getpgrp sys_getpgrp
55+66 common setsid sys_setsid
56+67 common sigaction sys_sigaction
57+72 common sigsuspend sys_sigsuspend
58+73 common sigpending sys_sigpending
59+74 common sethostname sys_sethostname
60+75 common setrlimit sys_setrlimit
61+77 common getrusage sys_getrusage
62+78 common gettimeofday sys_gettimeofday
63+79 common settimeofday sys_settimeofday
64+83 common symlink sys_symlink
65+85 common readlink sys_readlink
66+86 common uselib sys_uselib
67+87 common swapon sys_swapon
68+88 common reboot sys_reboot
69+89 common readdir sys_ni_syscall
70+90 common mmap sys_old_mmap
71+91 common munmap sys_munmap
72+92 common truncate sys_truncate
73+93 common ftruncate sys_ftruncate
74+94 common fchmod sys_fchmod
75+96 common getpriority sys_getpriority
76+97 common setpriority sys_setpriority
77+99 common statfs sys_statfs
78+100 common fstatfs sys_fstatfs
79+102 common socketcall sys_socketcall
80+103 common syslog sys_syslog
81+104 common setitimer sys_setitimer
82+105 common getitimer sys_getitimer
83+106 common stat sys_newstat
84+107 common lstat sys_newlstat
85+108 common fstat sys_newfstat
86+110 common lookup_dcookie sys_ni_syscall
87+111 common vhangup sys_vhangup
88+112 common idle sys_ni_syscall
89+114 common wait4 sys_wait4
90+115 common swapoff sys_swapoff
91+116 common sysinfo sys_sysinfo
92+117 common ipc sys_s390_ipc
93+118 common fsync sys_fsync
94+119 common sigreturn sys_sigreturn
95+120 common clone sys_clone
96+121 common setdomainname sys_setdomainname
97+122 common uname sys_newuname
98+124 common adjtimex sys_adjtimex
99+125 common mprotect sys_mprotect
100+126 common sigprocmask sys_sigprocmask
101+127 common create_module sys_ni_syscall
102+128 common init_module sys_init_module
103+129 common delete_module sys_delete_module
104+130 common get_kernel_syms sys_ni_syscall
105+131 common quotactl sys_quotactl
106+132 common getpgid sys_getpgid
107+133 common fchdir sys_fchdir
108+134 common bdflush sys_ni_syscall
109+135 common sysfs sys_sysfs
110+136 common personality sys_s390_personality
111+137 common afs_syscall sys_ni_syscall
112+141 common getdents sys_getdents
113+142 common select sys_select
114+143 common flock sys_flock
115+144 common msync sys_msync
116+145 common readv sys_readv
117+146 common writev sys_writev
118+147 common getsid sys_getsid
119+148 common fdatasync sys_fdatasync
120+149 common _sysctl sys_ni_syscall
121+150 common mlock sys_mlock
122+151 common munlock sys_munlock
123+152 common mlockall sys_mlockall
124+153 common munlockall sys_munlockall
125+154 common sched_setparam sys_sched_setparam
126+155 common sched_getparam sys_sched_getparam
127+156 common sched_setscheduler sys_sched_setscheduler
128+157 common sched_getscheduler sys_sched_getscheduler
129+158 common sched_yield sys_sched_yield
130+159 common sched_get_priority_max sys_sched_get_priority_max
131+160 common sched_get_priority_min sys_sched_get_priority_min
132+161 common sched_rr_get_interval sys_sched_rr_get_interval
133+162 common nanosleep sys_nanosleep
134+163 common mremap sys_mremap
135+167 common query_module sys_ni_syscall
136+168 common poll sys_poll
137+169 common nfsservctl sys_ni_syscall
138+172 common prctl sys_prctl
139+173 common rt_sigreturn sys_rt_sigreturn
140+174 common rt_sigaction sys_rt_sigaction
141+175 common rt_sigprocmask sys_rt_sigprocmask
142+176 common rt_sigpending sys_rt_sigpending
143+177 common rt_sigtimedwait sys_rt_sigtimedwait
144+178 common rt_sigqueueinfo sys_rt_sigqueueinfo
145+179 common rt_sigsuspend sys_rt_sigsuspend
146+180 common pread64 sys_pread64
147+181 common pwrite64 sys_pwrite64
148+183 common getcwd sys_getcwd
149+184 common capget sys_capget
150+185 common capset sys_capset
151+186 common sigaltstack sys_sigaltstack
152+187 common sendfile sys_sendfile64
153+188 common getpmsg sys_ni_syscall
154+189 common putpmsg sys_ni_syscall
155+190 common vfork sys_vfork
156+191 common getrlimit sys_getrlimit
157+198 common lchown sys_lchown
158+199 common getuid sys_getuid
159+200 common getgid sys_getgid
160+201 common geteuid sys_geteuid
161+202 common getegid sys_getegid
162+203 common setreuid sys_setreuid
163+204 common setregid sys_setregid
164+205 common getgroups sys_getgroups
165+206 common setgroups sys_setgroups
166+207 common fchown sys_fchown
167+208 common setresuid sys_setresuid
168+209 common getresuid sys_getresuid
169+210 common setresgid sys_setresgid
170+211 common getresgid sys_getresgid
171+212 common chown sys_chown
172+213 common setuid sys_setuid
173+214 common setgid sys_setgid
174+215 common setfsuid sys_setfsuid
175+216 common setfsgid sys_setfsgid
176+217 common pivot_root sys_pivot_root
177+218 common mincore sys_mincore
178+219 common madvise sys_madvise
179+220 common getdents64 sys_getdents64
180+222 common readahead sys_readahead
181+224 common setxattr sys_setxattr
182+225 common lsetxattr sys_lsetxattr
183+226 common fsetxattr sys_fsetxattr
184+227 common getxattr sys_getxattr
185+228 common lgetxattr sys_lgetxattr
186+229 common fgetxattr sys_fgetxattr
187+230 common listxattr sys_listxattr
188+231 common llistxattr sys_llistxattr
189+232 common flistxattr sys_flistxattr
190+233 common removexattr sys_removexattr
191+234 common lremovexattr sys_lremovexattr
192+235 common fremovexattr sys_fremovexattr
193+236 common gettid sys_gettid
194+237 common tkill sys_tkill
195+238 common futex sys_futex
196+239 common sched_setaffinity sys_sched_setaffinity
197+240 common sched_getaffinity sys_sched_getaffinity
198+241 common tgkill sys_tgkill
199+243 common io_setup sys_io_setup
200+244 common io_destroy sys_io_destroy
201+245 common io_getevents sys_io_getevents
202+246 common io_submit sys_io_submit
203+247 common io_cancel sys_io_cancel
204+248 common exit_group sys_exit_group
205+249 common epoll_create sys_epoll_create
206+250 common epoll_ctl sys_epoll_ctl
207+251 common epoll_wait sys_epoll_wait
208+252 common set_tid_address sys_set_tid_address
209+253 common fadvise64 sys_fadvise64_64
210+254 common timer_create sys_timer_create
211+255 common timer_settime sys_timer_settime
212+256 common timer_gettime sys_timer_gettime
213+257 common timer_getoverrun sys_timer_getoverrun
214+258 common timer_delete sys_timer_delete
215+259 common clock_settime sys_clock_settime
216+260 common clock_gettime sys_clock_gettime
217+261 common clock_getres sys_clock_getres
218+262 common clock_nanosleep sys_clock_nanosleep
219+265 common statfs64 sys_statfs64
220+266 common fstatfs64 sys_fstatfs64
221+267 common remap_file_pages sys_remap_file_pages
222+268 common mbind sys_mbind
223+269 common get_mempolicy sys_get_mempolicy
224+270 common set_mempolicy sys_set_mempolicy
225+271 common mq_open sys_mq_open
226+272 common mq_unlink sys_mq_unlink
227+273 common mq_timedsend sys_mq_timedsend
228+274 common mq_timedreceive sys_mq_timedreceive
229+275 common mq_notify sys_mq_notify
230+276 common mq_getsetattr sys_mq_getsetattr
231+277 common kexec_load sys_kexec_load
232+278 common add_key sys_add_key
233+279 common request_key sys_request_key
234+280 common keyctl sys_keyctl
235+281 common waitid sys_waitid
236+282 common ioprio_set sys_ioprio_set
237+283 common ioprio_get sys_ioprio_get
238+284 common inotify_init sys_inotify_init
239+285 common inotify_add_watch sys_inotify_add_watch
240+286 common inotify_rm_watch sys_inotify_rm_watch
241+287 common migrate_pages sys_migrate_pages
242+288 common openat sys_openat
243+289 common mkdirat sys_mkdirat
244+290 common mknodat sys_mknodat
245+291 common fchownat sys_fchownat
246+292 common futimesat sys_futimesat
247+293 common newfstatat sys_newfstatat
248+294 common unlinkat sys_unlinkat
249+295 common renameat sys_renameat
250+296 common linkat sys_linkat
251+297 common symlinkat sys_symlinkat
252+298 common readlinkat sys_readlinkat
253+299 common fchmodat sys_fchmodat
254+300 common faccessat sys_faccessat
255+301 common pselect6 sys_pselect6
256+302 common ppoll sys_ppoll
257+303 common unshare sys_unshare
258+304 common set_robust_list sys_set_robust_list
259+305 common get_robust_list sys_get_robust_list
260+306 common splice sys_splice
261+307 common sync_file_range sys_sync_file_range
262+308 common tee sys_tee
263+309 common vmsplice sys_vmsplice
264+310 common move_pages sys_move_pages
265+311 common getcpu sys_getcpu
266+312 common epoll_pwait sys_epoll_pwait
267+313 common utimes sys_utimes
268+314 common fallocate sys_fallocate
269+315 common utimensat sys_utimensat
270+316 common signalfd sys_signalfd
271+317 common timerfd sys_ni_syscall
272+318 common eventfd sys_eventfd
273+319 common timerfd_create sys_timerfd_create
274+320 common timerfd_settime sys_timerfd_settime
275+321 common timerfd_gettime sys_timerfd_gettime
276+322 common signalfd4 sys_signalfd4
277+323 common eventfd2 sys_eventfd2
278+324 common inotify_init1 sys_inotify_init1
279+325 common pipe2 sys_pipe2
280+326 common dup3 sys_dup3
281+327 common epoll_create1 sys_epoll_create1
282+328 common preadv sys_preadv
283+329 common pwritev sys_pwritev
284+330 common rt_tgsigqueueinfo sys_rt_tgsigqueueinfo
285+331 common perf_event_open sys_perf_event_open
286+332 common fanotify_init sys_fanotify_init
287+333 common fanotify_mark sys_fanotify_mark
288+334 common prlimit64 sys_prlimit64
289+335 common name_to_handle_at sys_name_to_handle_at
290+336 common open_by_handle_at sys_open_by_handle_at
291+337 common clock_adjtime sys_clock_adjtime
292+338 common syncfs sys_syncfs
293+339 common setns sys_setns
294+340 common process_vm_readv sys_process_vm_readv
295+341 common process_vm_writev sys_process_vm_writev
296+342 common s390_runtime_instr sys_s390_runtime_instr
297+343 common kcmp sys_kcmp
298+344 common finit_module sys_finit_module
299+345 common sched_setattr sys_sched_setattr
300+346 common sched_getattr sys_sched_getattr
301+347 common renameat2 sys_renameat2
302+348 common seccomp sys_seccomp
303+349 common getrandom sys_getrandom
304+350 common memfd_create sys_memfd_create
305+351 common bpf sys_bpf
306+352 common s390_pci_mmio_write sys_s390_pci_mmio_write
307+353 common s390_pci_mmio_read sys_s390_pci_mmio_read
308+354 common execveat sys_execveat
309+355 common userfaultfd sys_userfaultfd
310+356 common membarrier sys_membarrier
311+357 common recvmmsg sys_recvmmsg
312+358 common sendmmsg sys_sendmmsg
313+359 common socket sys_socket
314+360 common socketpair sys_socketpair
315+361 common bind sys_bind
316+362 common connect sys_connect
317+363 common listen sys_listen
318+364 common accept4 sys_accept4
319+365 common getsockopt sys_getsockopt
320+366 common setsockopt sys_setsockopt
321+367 common getsockname sys_getsockname
322+368 common getpeername sys_getpeername
323+369 common sendto sys_sendto
324+370 common sendmsg sys_sendmsg
325+371 common recvfrom sys_recvfrom
326+372 common recvmsg sys_recvmsg
327+373 common shutdown sys_shutdown
328+374 common mlock2 sys_mlock2
329+375 common copy_file_range sys_copy_file_range
330+376 common preadv2 sys_preadv2
331+377 common pwritev2 sys_pwritev2
332+378 common s390_guarded_storage sys_s390_guarded_storage
333+379 common statx sys_statx
334+380 common s390_sthyi sys_s390_sthyi
335+381 common kexec_file_load sys_kexec_file_load
336+382 common io_pgetevents sys_io_pgetevents
337+383 common rseq sys_rseq
338+384 common pkey_mprotect sys_pkey_mprotect
339+385 common pkey_alloc sys_pkey_alloc
340+386 common pkey_free sys_pkey_free
397341 # room for arch specific syscalls
398−392 64 semtimedop sys_semtimedop -
399−393 common semget sys_semget sys_semget
400−394 common semctl sys_semctl compat_sys_semctl
401−395 common shmget sys_shmget sys_shmget
402−396 common shmctl sys_shmctl compat_sys_shmctl
403−397 common shmat sys_shmat compat_sys_shmat
404−398 common shmdt sys_shmdt sys_shmdt
405−399 common msgget sys_msgget sys_msgget
406−400 common msgsnd sys_msgsnd compat_sys_msgsnd
407−401 common msgrcv sys_msgrcv compat_sys_msgrcv
408−402 common msgctl sys_msgctl compat_sys_msgctl
409−403 32 clock_gettime64 - sys_clock_gettime
410−404 32 clock_settime64 - sys_clock_settime
411−405 32 clock_adjtime64 - sys_clock_adjtime
412−406 32 clock_getres_time64 - sys_clock_getres
413−407 32 clock_nanosleep_time64 - sys_clock_nanosleep
414−408 32 timer_gettime64 - sys_timer_gettime
415−409 32 timer_settime64 - sys_timer_settime
416−410 32 timerfd_gettime64 - sys_timerfd_gettime
417−411 32 timerfd_settime64 - sys_timerfd_settime
418−412 32 utimensat_time64 - sys_utimensat
419−413 32 pselect6_time64 - compat_sys_pselect6_time64
420−414 32 ppoll_time64 - compat_sys_ppoll_time64
421−416 32 io_pgetevents_time64 - compat_sys_io_pgetevents_time64
422−417 32 recvmmsg_time64 - compat_sys_recvmmsg_time64
423−418 32 mq_timedsend_time64 - sys_mq_timedsend
424−419 32 mq_timedreceive_time64 - sys_mq_timedreceive
425−420 32 semtimedop_time64 - sys_semtimedop
426−421 32 rt_sigtimedwait_time64 - compat_sys_rt_sigtimedwait_time64
427−422 32 futex_time64 - sys_futex
428−423 32 sched_rr_get_interval_time64 - sys_sched_rr_get_interval
429−424 common pidfd_send_signal sys_pidfd_send_signal sys_pidfd_send_signal
430−425 common io_uring_setup sys_io_uring_setup sys_io_uring_setup
431−426 common io_uring_enter sys_io_uring_enter sys_io_uring_enter
432−427 common io_uring_register sys_io_uring_register sys_io_uring_register
433−428 common open_tree sys_open_tree sys_open_tree
434−429 common move_mount sys_move_mount sys_move_mount
435−430 common fsopen sys_fsopen sys_fsopen
436−431 common fsconfig sys_fsconfig sys_fsconfig
437−432 common fsmount sys_fsmount sys_fsmount
438−433 common fspick sys_fspick sys_fspick
439−434 common pidfd_open sys_pidfd_open sys_pidfd_open
440−435 common clone3 sys_clone3 sys_clone3
441−436 common close_range sys_close_range sys_close_range
442−437 common openat2 sys_openat2 sys_openat2
443−438 common pidfd_getfd sys_pidfd_getfd sys_pidfd_getfd
444−439 common faccessat2 sys_faccessat2 sys_faccessat2
445−440 common process_madvise sys_process_madvise sys_process_madvise
446−441 common epoll_pwait2 sys_epoll_pwait2 compat_sys_epoll_pwait2
447−442 common mount_setattr sys_mount_setattr sys_mount_setattr
448−443 common quotactl_fd sys_quotactl_fd sys_quotactl_fd
449−444 common landlock_create_ruleset sys_landlock_create_ruleset sys_landlock_create_ruleset
450−445 common landlock_add_rule sys_landlock_add_rule sys_landlock_add_rule
451−446 common landlock_restrict_self sys_landlock_restrict_self sys_landlock_restrict_self
452−447 common memfd_secret sys_memfd_secret sys_memfd_secret
453−448 common process_mrelease sys_process_mrelease sys_process_mrelease
454−449 common futex_waitv sys_futex_waitv sys_futex_waitv
455−450 common set_mempolicy_home_node sys_set_mempolicy_home_node sys_set_mempolicy_home_node
456−451 common cachestat sys_cachestat sys_cachestat
457−452 common fchmodat2 sys_fchmodat2 sys_fchmodat2
458−453 common map_shadow_stack sys_map_shadow_stack sys_map_shadow_stack
459−454 common futex_wake sys_futex_wake sys_futex_wake
460−455 common futex_wait sys_futex_wait sys_futex_wait
461−456 common futex_requeue sys_futex_requeue sys_futex_requeue
462−457 common statmount sys_statmount sys_statmount
463−458 common listmount sys_listmount sys_listmount
464−459 common lsm_get_self_attr sys_lsm_get_self_attr sys_lsm_get_self_attr
465−460 common lsm_set_self_attr sys_lsm_set_self_attr sys_lsm_set_self_attr
466−461 common lsm_list_modules sys_lsm_list_modules sys_lsm_list_modules
467−462 common mseal sys_mseal sys_mseal
468−463 common setxattrat sys_setxattrat sys_setxattrat
469−464 common getxattrat sys_getxattrat sys_getxattrat
470−465 common listxattrat sys_listxattrat sys_listxattrat
471−466 common removexattrat sys_removexattrat sys_removexattrat
472−467 common open_tree_attr sys_open_tree_attr sys_open_tree_attr
473−468 common file_getattr sys_file_getattr sys_file_getattr
474−469 common file_setattr sys_file_setattr sys_file_setattr
475−470 common listns sys_listns sys_listns
342+392 common semtimedop sys_semtimedop
343+393 common semget sys_semget
344+394 common semctl sys_semctl
345+395 common shmget sys_shmget
346+396 common shmctl sys_shmctl
347+397 common shmat sys_shmat
348+398 common shmdt sys_shmdt
349+399 common msgget sys_msgget
350+400 common msgsnd sys_msgsnd
351+401 common msgrcv sys_msgrcv
352+402 common msgctl sys_msgctl
353+424 common pidfd_send_signal sys_pidfd_send_signal
354+425 common io_uring_setup sys_io_uring_setup
355+426 common io_uring_enter sys_io_uring_enter
356+427 common io_uring_register sys_io_uring_register
357+428 common open_tree sys_open_tree
358+429 common move_mount sys_move_mount
359+430 common fsopen sys_fsopen
360+431 common fsconfig sys_fsconfig
361+432 common fsmount sys_fsmount
362+433 common fspick sys_fspick
363+434 common pidfd_open sys_pidfd_open
364+435 common clone3 sys_clone3
365+436 common close_range sys_close_range
366+437 common openat2 sys_openat2
367+438 common pidfd_getfd sys_pidfd_getfd
368+439 common faccessat2 sys_faccessat2
369+440 common process_madvise sys_process_madvise
370+441 common epoll_pwait2 sys_epoll_pwait2
371+442 common mount_setattr sys_mount_setattr
372+443 common quotactl_fd sys_quotactl_fd
373+444 common landlock_create_ruleset sys_landlock_create_ruleset
374+445 common landlock_add_rule sys_landlock_add_rule
375+446 common landlock_restrict_self sys_landlock_restrict_self
376+447 common memfd_secret sys_memfd_secret
377+448 common process_mrelease sys_process_mrelease
378+449 common futex_waitv sys_futex_waitv
379+450 common set_mempolicy_home_node sys_set_mempolicy_home_node
380+451 common cachestat sys_cachestat
381+452 common fchmodat2 sys_fchmodat2
382+453 common map_shadow_stack sys_map_shadow_stack
383+454 common futex_wake sys_futex_wake
384+455 common futex_wait sys_futex_wait
385+456 common futex_requeue sys_futex_requeue
386+457 common statmount sys_statmount
387+458 common listmount sys_listmount
388+459 common lsm_get_self_attr sys_lsm_get_self_attr
389+460 common lsm_set_self_attr sys_lsm_set_self_attr
390+461 common lsm_list_modules sys_lsm_list_modules
391+462 common mseal sys_mseal
392+463 common setxattrat sys_setxattrat
393+464 common getxattrat sys_getxattrat
394+465 common listxattrat sys_listxattrat
395+466 common removexattrat sys_removexattrat
396+467 common open_tree_attr sys_open_tree_attr
397+468 common file_getattr sys_file_getattr
398+469 common file_setattr sys_file_setattr
399+470 common listns sys_listns
400+471 common rseq_slice_yield sys_rseq_slice_yield
tools/perf/arch/sh/entry/syscalls/syscall.tbl+1−0
@@ -474,3 +474,4 @@ · 473 unmodified lines
474474 468 common file_getattr sys_file_getattr
475475 469 common file_setattr sys_file_setattr
476476 470 common listns sys_listns
477+471 common rseq_slice_yield sys_rseq_slice_yield
tools/perf/arch/sparc/entry/syscalls/syscall.tbl+2−1
@@ -480,7 +480,7 @@ · 479 unmodified lines
480480 432 common fsmount sys_fsmount
481481 433 common fspick sys_fspick
482482 434 common pidfd_open sys_pidfd_open
483−# 435 reserved for clone3
483+435 common clone3 __sys_clone3
484484 436 common close_range sys_close_range
485485 437 common openat2 sys_openat2
486486 438 common pidfd_getfd sys_pidfd_getfd
@@ -516,3 +516,4 @@ · 29 unmodified lines
516516 468 common file_getattr sys_file_getattr
517517 469 common file_setattr sys_file_setattr
518518 470 common listns sys_listns
519+471 common rseq_slice_yield sys_rseq_slice_yield
tools/perf/arch/x86/entry/syscalls/syscall_32.tbl+1−0
@@ -476,3 +476,4 @@ · 475 unmodified lines
476476 468 i386 file_getattr sys_file_getattr
477477 469 i386 file_setattr sys_file_setattr
478478 470 i386 listns sys_listns
479+471 i386 rseq_slice_yield sys_rseq_slice_yield
tools/perf/arch/x86/entry/syscalls/syscall_64.tbl+1−0
@@ -395,6 +395,7 @@ · 394 unmodified lines
395395 468 common file_getattr sys_file_getattr
396396 469 common file_setattr sys_file_setattr
397397 470 common listns sys_listns
398+471 common rseq_slice_yield sys_rseq_slice_yield
398399
399400 #
400401 # Due to a historical design error, certain syscalls are numbered differently
tools/perf/arch/xtensa/entry/syscalls/syscall.tbl+1−0
@@ -441,3 +441,4 @@ · 440 unmodified lines
441441 468 common file_getattr sys_file_getattr
442442 469 common file_setattr sys_file_setattr
443443 470 common listns sys_listns
444+471 common rseq_slice_yield sys_rseq_slice_yield
tools/perf/builtin-ftrace.c+7−2
@@ -18,6 +18,7 @@ · 17 unmodified lines
1818 #include <poll.h>
1919 #include <ctype.h>
2020 #include <linux/capability.h>
21+#include <linux/err.h>
2122 #include <linux/string.h>
2223 #include <sys/stat.h>
2324
@@ -1209,8 +1210,12 @@ static int prepare_func_profile(struct perf_ftrace *ftrace) · 1185 unmodified lines
12091210 ftrace->graph_verbose = 0;
12101211
12111212 ftrace->profile_hash = hashmap__new(profile_hash, profile_equal, NULL);
1212− if (ftrace->profile_hash == NULL)
1213− return -ENOMEM;
1213+ if (IS_ERR(ftrace->profile_hash)) {
1214+ int err = PTR_ERR(ftrace->profile_hash);
1215+
1216+ ftrace->profile_hash = NULL;
1217+ return err;
1218+ }
12141219
12151220 return 0;
12161221 }
tools/perf/pmu-events/Build+2−1
@@ -214,7 +214,8 @@ ifneq ($(strip $(ORPHAN_FILES)),) · 213 unmodified lines
214214 quiet_cmd_rm = RM $^
215215
216216 prune_orphans: $(ORPHAN_FILES)
217− $(Q)$(call echo-cmd,rm)rm -f $^
217+ # The list of files can be long. Use xargs to prevent issues.
218+ $(Q)$(call echo-cmd,rm)echo "$^" | xargs rm -f
218219
219220 JEVENTS_DEPS += prune_orphans
220221 endif
tools/perf/trace/beauty/arch/x86/include/asm/irq_vectors.h+1−0
@@ -77,6 +77,7 @@ · 76 unmodified lines
7777 */
7878 #define IRQ_WORK_VECTOR 0xf6
7979
80+/* IRQ vector for PMIs when running a guest with a mediated PMU. */
8081 #define PERF_GUEST_MEDIATED_PMI_VECTOR 0xf5
8182
8283 #define DEFERRED_ERROR_VECTOR 0xf4
tools/perf/trace/beauty/include/uapi/linux/fs.h+1−0
@@ -253,6 +253,7 @@ struct file_attr { · 252 unmodified lines
253253 #define FS_XFLAG_FILESTREAM 0x00004000 /* use filestream allocator */
254254 #define FS_XFLAG_DAX 0x00008000 /* use DAX for IO */
255255 #define FS_XFLAG_COWEXTSIZE 0x00010000 /* CoW extent size allocator hint */
256+#define FS_XFLAG_VERITY 0x00020000 /* fs-verity enabled */
256257 #define FS_XFLAG_HASATTR 0x80000000 /* no DIFLAG for this */
257258
258259 /* the read-only stuff doesn't really belong here, but any other place is
tools/perf/trace/beauty/include/uapi/linux/mount.h+11−2
@@ -61,7 +61,8 @@ · 60 unmodified lines
6161 /*
6262 * open_tree() flags.
6363 */
64−#define OPEN_TREE_CLONE 1 /* Clone the target tree and attach the clone */
64+#define OPEN_TREE_CLONE (1 << 0) /* Clone the target tree and attach the clone */
65+#define OPEN_TREE_NAMESPACE (1 << 1) /* Clone the target tree into a new mount namespace */
6566 #define OPEN_TREE_CLOEXEC O_CLOEXEC /* Close the file on execve() */
6667
6768 /*
@@ -197,7 +198,10 @@ struct statmount { · 129 unmodified lines
197198 */
198199 struct mnt_id_req {
199200 __u32 size;
200− __u32 mnt_ns_fd;
201+ union {
202+ __u32 mnt_ns_fd;
203+ __u32 mnt_fd;
204+ };
201205 __u64 mnt_id;
202206 __u64 param;
203207 __u64 mnt_ns_id;
@@ -232,4 +236,9 @@ struct mnt_id_req { · 28 unmodified lines
232236 #define LSMT_ROOT 0xffffffffffffffff /* root mount */
233237 #define LISTMOUNT_REVERSE (1 << 0) /* List later mounts first */
234238
239+/*
240+ * @flag bits for statmount(2)
241+ */
242+#define STATMOUNT_BY_FD 0x00000001U /* want mountinfo for given fd */
243+
235244 #endif /* _UAPI_LINUX_MOUNT_H */
tools/perf/trace/beauty/include/uapi/linux/prctl.h+37−0
@@ -386,4 +386,41 @@ struct prctl_mm_map { · 385 unmodified lines
386386 # define PR_FUTEX_HASH_SET_SLOTS 1
387387 # define PR_FUTEX_HASH_GET_SLOTS 2
388388
389+/* RSEQ time slice extensions */
390+#define PR_RSEQ_SLICE_EXTENSION 79
391+# define PR_RSEQ_SLICE_EXTENSION_GET 1
392+# define PR_RSEQ_SLICE_EXTENSION_SET 2
393+/*
394+ * Bits for RSEQ_SLICE_EXTENSION_GET/SET
395+ * PR_RSEQ_SLICE_EXT_ENABLE: Enable
396+ */
397+# define PR_RSEQ_SLICE_EXT_ENABLE 0x01
398+
399+/*
400+ * Get the current indirect branch tracking configuration for the current
401+ * thread, this will be the value configured via PR_SET_INDIR_BR_LP_STATUS.
402+ */
403+#define PR_GET_INDIR_BR_LP_STATUS 80
404+
405+/*
406+ * Set the indirect branch tracking configuration. PR_INDIR_BR_LP_ENABLE will
407+ * enable cpu feature for user thread, to track all indirect branches and ensure
408+ * they land on arch defined landing pad instruction.
409+ * x86 - If enabled, an indirect branch must land on an ENDBRANCH instruction.
410+ * arch64 - If enabled, an indirect branch must land on a BTI instruction.
411+ * riscv - If enabled, an indirect branch must land on an lpad instruction.
412+ * PR_INDIR_BR_LP_DISABLE will disable feature for user thread and indirect
413+ * branches will no more be tracked by cpu to land on arch defined landing pad
414+ * instruction.
415+ */
416+#define PR_SET_INDIR_BR_LP_STATUS 81
417+# define PR_INDIR_BR_LP_ENABLE (1UL << 0)
418+
419+/*
420+ * Prevent further changes to the specified indirect branch tracking
421+ * configuration. All bits may be locked via this call, including
422+ * undefined bits.
423+ */
424+#define PR_LOCK_INDIR_BR_LP_STATUS 82
425+
389426 #endif /* _LINUX_PRCTL_H */
tools/perf/util/annotate-arch/annotate-loongarch.c+1−1
@@ -93,7 +93,7 @@ static int loongarch_jump__parse(const struct arch *arch, struct ins_operands *o · 92 unmodified lines
9393 start = map__unmap_ip(map, sym->start);
9494 end = map__unmap_ip(map, sym->end);
9595
96− ops->target.outside = target.addr < start || target.addr > end;
96+ ops->target.outside = target.addr < start || target.addr >= end;
9797
9898 if (maps__find_ams(thread__maps(ms->thread), &target) == 0 &&
9999 map__rip_2objdump(target.ms.map, map__map_ip(target.ms.map, target.addr)) == ops->target.addr)
tools/perf/util/annotate.c+4−1
@@ -44,6 +44,7 @@ · 43 unmodified lines
4444 #include "strbuf.h"
4545 #include <regex.h>
4646 #include <linux/bitops.h>
47+#include <linux/err.h>
4748 #include <linux/kernel.h>
4849 #include <linux/string.h>
4950 #include <linux/zalloc.h>
@@ -137,8 +138,10 @@ static int annotated_source__alloc_histograms(struct annotated_source *src, · 87 unmodified lines
137138 return -1;
138139
139140 src->samples = hashmap__new(sym_hist_hash, sym_hist_equal, NULL);
140− if (src->samples == NULL)
141+ if (IS_ERR(src->samples)) {
141142 zfree(&src->histograms);
143+ src->samples = NULL;
144+ }
142145
143146 return src->histograms ? 0 : -1;
144147 }
tools/perf/util/cs-etm-decoder/cs-etm-decoder.c+1−1
@@ -549,7 +549,7 @@ cs_etm_decoder__set_tid(struct cs_etm_queue *etmq, · 548 unmodified lines
549549 /*
550550 * Process the PE_CONTEXT packets if we have a valid contextID or VMID.
551551 * If the kernel is running at EL2, the PID is traced in CONTEXTIDR_EL2
552− * as VMID, Bit ETM_OPT_CTXTID2 is set in this case.
552+ * as VMID, Format attribute 'contextid2' is set in this case.
553553 */
554554 switch (cs_etm__get_pid_fmt(etmq)) {
555555 case CS_ETM_PIDFMT_CTXTID:
tools/perf/util/cs-etm.c+13−23
@@ -194,7 +194,7 @@ int cs_etm__get_cpu(struct cs_etm_queue *etmq, u8 trace_chan_id, int *cpu) · 193 unmodified lines
194194 * CS_ETM_PIDFMT_CTXTID2: CONTEXTIDR_EL2 is traced.
195195 * CS_ETM_PIDFMT_NONE: No context IDs
196196 *
197− * It's possible that the two bits ETM_OPT_CTXTID and ETM_OPT_CTXTID2
197+ * It's possible that the two format attributes 'contextid1' and 'contextid2'
198198 * are enabled at the same time when the session runs on an EL2 kernel.
199199 * This means the CONTEXTIDR_EL1 and CONTEXTIDR_EL2 both will be
200200 * recorded in the trace data, the tool will selectively use
@@ -210,15 +210,15 @@ static enum cs_etm_pid_fmt cs_etm__init_pid_fmt(u64 *metadata) · 9 unmodified lines
210210 if (metadata[CS_ETM_MAGIC] == __perf_cs_etmv3_magic) {
211211 val = metadata[CS_ETM_ETMCR];
212212 /* CONTEXTIDR is traced */
213− if (val & BIT(ETM_OPT_CTXTID))
213+ if (val & ETMCR_CTXTID)
214214 return CS_ETM_PIDFMT_CTXTID;
215215 } else {
216216 val = metadata[CS_ETMV4_TRCCONFIGR];
217217 /* CONTEXTIDR_EL2 is traced */
218− if (val & (BIT(ETM4_CFG_BIT_VMID) | BIT(ETM4_CFG_BIT_VMID_OPT)))
218+ if (val & (TRCCONFIGR_VMID | TRCCONFIGR_VMIDOPT))
219219 return CS_ETM_PIDFMT_CTXTID2;
220220 /* CONTEXTIDR_EL1 is traced */
221− else if (val & BIT(ETM4_CFG_BIT_CTXTID))
221+ else if (val & TRCCONFIGR_CID)
222222 return CS_ETM_PIDFMT_CTXTID;
223223 }
224224
@@ -2914,29 +2914,21 @@ static int cs_etm__process_auxtrace_event(struct perf_session *session, · 2689 unmodified lines
29142914 return 0;
29152915 }
29162916
2917−static int cs_etm__setup_timeless_decoding(struct cs_etm_auxtrace *etm)
2917+static void cs_etm__setup_timeless_decoding(struct cs_etm_auxtrace *etm)
29182918 {
2919− struct evsel *evsel;
2920− struct evlist *evlist = etm->session->evlist;
2919+ /* Take first ETM as all options will be the same for all ETMs */
2920+ u64 *metadata = etm->metadata[0];
29212921
29222922 /* Override timeless mode with user input from --itrace=Z */
29232923 if (etm->synth_opts.timeless_decoding) {
29242924 etm->timeless_decoding = true;
2925− return 0;
2925+ return;
29262926 }
29272927
2928− /*
2929− * Find the cs_etm evsel and look at what its timestamp setting was
2930− */
2931− evlist__for_each_entry(evlist, evsel)
2932− if (cs_etm__evsel_is_auxtrace(etm->session, evsel)) {
2933− etm->timeless_decoding =
2934− !(evsel->core.attr.config & BIT(ETM_OPT_TS));
2935− return 0;
2936− }
2937−
2938− pr_err("CS ETM: Couldn't find ETM evsel\n");
2939− return -EINVAL;
2928+ if (metadata[CS_ETM_MAGIC] == __perf_cs_etmv3_magic)
2929+ etm->timeless_decoding = !(metadata[CS_ETM_ETMCR] & ETMCR_TIMESTAMP_EN);
2930+ else
2931+ etm->timeless_decoding = !(metadata[CS_ETMV4_TRCCONFIGR] & TRCCONFIGR_TS);
29402932 }
29412933
29422934 /*
@@ -3499,9 +3491,7 @@ int cs_etm__process_auxtrace_info_full(union perf_event *event, · 556 unmodified lines
34993491 etm->auxtrace.evsel_is_auxtrace = cs_etm__evsel_is_auxtrace;
35003492 session->auxtrace = &etm->auxtrace;
35013493
3502− err = cs_etm__setup_timeless_decoding(etm);
3503− if (err)
3504− return err;
3494+ cs_etm__setup_timeless_decoding(etm);
35053495
35063496 etm->tc.time_shift = tc->time_shift;
35073497 etm->tc.time_mult = tc->time_mult;
tools/perf/util/cs-etm.h+15−0
@@ -230,6 +230,21 @@ struct cs_etm_packet_queue { · 229 unmodified lines
230230 /* CoreSight trace ID is currently the bottom 7 bits of the value */
231231 #define CORESIGHT_TRACE_ID_VAL_MASK GENMASK(6, 0)
232232
233+/* ETMv4 CONFIGR register bits */
234+#define TRCCONFIGR_BB BIT(3)
235+#define TRCCONFIGR_CCI BIT(4)
236+#define TRCCONFIGR_CID BIT(6)
237+#define TRCCONFIGR_VMID BIT(7)
238+#define TRCCONFIGR_TS BIT(11)
239+#define TRCCONFIGR_RS BIT(12)
240+#define TRCCONFIGR_VMIDOPT BIT(15)
241+
242+/* ETMv3 ETMCR register bits */
243+#define ETMCR_CYC_ACC BIT(12)
244+#define ETMCR_CTXTID BIT(14)
245+#define ETMCR_TIMESTAMP_EN BIT(28)
246+#define ETMCR_RETURN_STACK BIT(29)
247+
233248 int cs_etm__process_auxtrace_info(union perf_event *event,
234249 struct perf_session *session);
235250 void cs_etm_get_default_config(const struct perf_pmu *pmu, struct perf_event_attr *attr);
tools/perf/util/disasm.c+1−1
@@ -384,7 +384,7 @@ static int jump__parse(const struct arch *arch, struct ins_operands *ops, struct · 383 unmodified lines
384384 start = map__unmap_ip(map, sym->start);
385385 end = map__unmap_ip(map, sym->end);
386386
387− ops->target.outside = target.addr < start || target.addr > end;
387+ ops->target.outside = target.addr < start || target.addr >= end;
388388
389389 /*
390390 * FIXME: things like this in _cpp_lex_token (gcc's cc1 program):
tools/perf/util/synthetic-events.c+5−0
@@ -703,6 +703,11 @@ static int perf_event__synthesize_modules_maps_cb(struct map *map, void *data) · 702 unmodified lines
703703
704704 memcpy(event->mmap2.filename, dso__long_name(dso), dso__long_name_len(dso) + 1);
705705
706+ /* Clear stale build ID from previous module iteration */
707+ event->mmap2.header.misc &= ~PERF_RECORD_MISC_MMAP_BUILD_ID;
708+ memset(event->mmap2.build_id, 0, sizeof(event->mmap2.build_id));
709+ event->mmap2.build_id_size = 0;
710+
706711 perf_record_mmap2__read_build_id(&event->mmap2, args->machine, false);
707712 } else {
708713 size = PERF_ALIGN(dso__long_name_len(dso) + 1, sizeof(u64));
tools/power/cpupower/cpupower-service.conf+5−0
@@ -30,3 +30,8 @@ · 29 unmodified lines
3030 # its policy for the relative importance of performance versus energy savings to
3131 # the processor. See man CPUPOWER-SET(1) for additional details
3232 #PERF_BIAS=
33+
34+# Set the Energy Performance Preference
35+# Available options can be read from
36+# /sys/devices/system/cpu/cpufreq/policy0/energy_performance_available_preferences
37+#EPP=
tools/power/cpupower/cpupower.sh+6−0
@@ -23,4 +23,10 @@ then · 22 unmodified lines
2323 cpupower set -b "$PERF_BIAS" > /dev/null || ESTATUS=1
2424 fi
2525
26+# apply Energy Performance Preference
27+if test -n "$EPP"
28+then
29+ cpupower set -e "$EPP" > /dev/null || ESTATUS=1
30+fi
31+
2632 exit $ESTATUS
tools/power/cpupower/utils/cpupower-set.c+5−1
@@ -124,7 +124,11 @@ int cmd_set(int argc, char **argv) · 123 unmodified lines
124124 }
125125
126126 if (params.turbo_boost) {
127− ret = cpupower_set_turbo_boost(turbo_boost);
127+ if (cpupower_cpu_info.vendor == X86_VENDOR_INTEL)
128+ ret = cpupower_set_intel_turbo_boost(turbo_boost);
129+ else
130+ ret = cpupower_set_generic_turbo_boost(turbo_boost);
131+
128132 if (ret)
129133 fprintf(stderr, "Error setting turbo-boost\n");
130134 }
tools/power/cpupower/utils/helpers/helpers.h+4−1
@@ -104,7 +104,7 @@ extern struct cpupower_cpu_info cpupower_cpu_info; · 103 unmodified lines
104104 /* cpuid and cpuinfo helpers **************************/
105105
106106 int cpufreq_has_generic_boost_support(bool *active);
107−int cpupower_set_turbo_boost(int turbo_boost);
107+int cpupower_set_generic_turbo_boost(int turbo_boost);
108108
109109 /* X86 ONLY ****************************************/
110110 #if defined(__i386__) || defined(__x86_64__)
@@ -143,6 +143,7 @@ extern int decode_pstates(unsigned int cpu, int boost_states, · 32 unmodified lines
143143
144144 int cpufreq_has_x86_boost_support(unsigned int cpu, int *support,
145145 int *active, int *states);
146+int cpupower_set_intel_turbo_boost(int turbo_boost);
146147
147148 /* AMD P-State stuff **************************/
148149 bool cpupower_amd_pstate_enabled(void);
@@ -189,6 +190,8 @@ static inline int cpupower_set_amd_pstate_mode(char *mode) · 40 unmodified lines
189190 static inline int cpufreq_has_x86_boost_support(unsigned int cpu, int *support,
190191 int *active, int *states)
191192 { return -1; }
193+static inline int cpupower_set_intel_turbo_boost(int turbo_boost)
194+{ return -1; }
192195
193196 static inline bool cpupower_amd_pstate_enabled(void)
194197 { return false; }
tools/power/cpupower/utils/helpers/misc.c+39−2
@@ -19,6 +19,9 @@ int cpufreq_has_x86_boost_support(unsigned int cpu, int *support, int *active, · 18 unmodified lines
1919 {
2020 int ret;
2121 unsigned long long val;
22+ char linebuf[MAX_LINE_LEN];
23+ char path[SYSFS_PATH_MAX];
24+ char *endp;
2225
2326 *support = *active = *states = 0;
2427
@@ -42,8 +45,42 @@ int cpufreq_has_x86_boost_support(unsigned int cpu, int *support, int *active, · 17 unmodified lines
4245 }
4346 } else if (cpupower_cpu_info.caps & CPUPOWER_CAP_AMD_PSTATE) {
4447 amd_pstate_boost_init(cpu, support, active);
45− } else if (cpupower_cpu_info.caps & CPUPOWER_CAP_INTEL_IDA)
48+ } else if (cpupower_cpu_info.caps & CPUPOWER_CAP_INTEL_IDA) {
4649 *support = *active = 1;
50+
51+ snprintf(path, sizeof(path), PATH_TO_CPU "intel_pstate/no_turbo");
52+
53+ if (!is_valid_path(path))
54+ return 0;
55+
56+ if (cpupower_read_sysfs(path, linebuf, MAX_LINE_LEN) == 0)
57+ return -1;
58+
59+ val = strtol(linebuf, &endp, 0);
60+ if (endp == linebuf || errno == ERANGE)
61+ return -1;
62+
63+ *active = !val;
64+ }
65+ return 0;
66+}
67+
68+int cpupower_set_intel_turbo_boost(int turbo_boost)
69+{
70+ char path[SYSFS_PATH_MAX];
71+ char linebuf[2] = {};
72+
73+ snprintf(path, sizeof(path), PATH_TO_CPU "intel_pstate/no_turbo");
74+
75+ /* Fallback to generic solution when intel_pstate driver not running */
76+ if (!is_valid_path(path))
77+ return cpupower_set_generic_turbo_boost(turbo_boost);
78+
79+ snprintf(linebuf, sizeof(linebuf), "%d", !turbo_boost);
80+
81+ if (cpupower_write_sysfs(path, linebuf, 2) <= 0)
82+ return -1;
83+
4784 return 0;
4885 }
4986
@@ -274,7 +311,7 @@ void print_speed(unsigned long speed, int no_rounding) · 224 unmodified lines
274311 }
275312 }
276313
277−int cpupower_set_turbo_boost(int turbo_boost)
314+int cpupower_set_generic_turbo_boost(int turbo_boost)
278315 {
279316 char path[SYSFS_PATH_MAX];
280317 char linebuf[2] = {};
tools/power/cpupower/utils/powercap-info.c+2−2
@@ -38,11 +38,11 @@ static int powercap_print_one_zone(struct powercap_zone *zone) · 37 unmodified lines
3838 printf(" (%s)\n", mode ? "enabled" : "disabled");
3939
4040 if (zone->has_power_uw)
41− printf(_("%sPower can be monitored in micro Jules\n"),
41+ printf(_("%sPower can be monitored in micro Watts\n"),
4242 pr_prefix);
4343
4444 if (zone->has_energy_uj)
45− printf(_("%sPower can be monitored in micro Watts\n"),
45+ printf(_("%sPower can be monitored in micro Jules\n"),
4646 pr_prefix);
4747
4848 printf("\n");
tools/scripts/syscall.tbl+1−0
@@ -411,3 +411,4 @@ · 410 unmodified lines
411411 468 common file_getattr sys_file_getattr
412412 469 common file_setattr sys_file_setattr
413413 470 common listns sys_listns
414+471 common rseq_slice_yield sys_rseq_slice_yield
tools/testing/selftests/hid/progs/hid_bpf_helpers.h+12−0
@@ -6,8 +6,10 @@ · 5 unmodified lines
66 #define __HID_BPF_HELPERS_H
77
88 /* "undefine" structs and enums in vmlinux.h, because we "override" them below */
9+#define bpf_wq bpf_wq___not_used
910 #define hid_bpf_ctx hid_bpf_ctx___not_used
1011 #define hid_bpf_ops hid_bpf_ops___not_used
12+#define hid_device hid_device___not_used
1113 #define hid_report_type hid_report_type___not_used
1214 #define hid_class_request hid_class_request___not_used
1315 #define hid_bpf_attach_flags hid_bpf_attach_flags___not_used
@@ -27,8 +29,10 @@ · 13 unmodified lines
2729
2830 #include "vmlinux.h"
2931
32+#undef bpf_wq
3033 #undef hid_bpf_ctx
3134 #undef hid_bpf_ops
35+#undef hid_device
3236 #undef hid_report_type
3337 #undef hid_class_request
3438 #undef hid_bpf_attach_flags
@@ -55,6 +59,14 @@ enum hid_report_type { · 20 unmodified lines
5559 HID_REPORT_TYPES,
5660 };
5761
62+struct hid_device {
63+ unsigned int id;
64+} __attribute__((preserve_access_index));
65+
66+struct bpf_wq {
67+ __u64 __opaque[2];
68+};
69+
5870 struct hid_bpf_ctx {
5971 struct hid_device *hid;
6072 __u32 allocated_size;
tools/testing/selftests/kvm/Makefile.kvm+1−0
@@ -71,6 +71,7 @@ TEST_GEN_PROGS_x86 += x86/cpuid_test · 70 unmodified lines
7171 TEST_GEN_PROGS_x86 += x86/cr4_cpuid_sync_test
7272 TEST_GEN_PROGS_x86 += x86/dirty_log_page_splitting_test
7373 TEST_GEN_PROGS_x86 += x86/feature_msrs_test
74+TEST_GEN_PROGS_x86 += x86/evmcs_smm_controls_test
7475 TEST_GEN_PROGS_x86 += x86/exit_on_emulation_failure_test
7576 TEST_GEN_PROGS_x86 += x86/fastops_test
7677 TEST_GEN_PROGS_x86 += x86/fix_hypercall_test
tools/testing/selftests/kvm/guest_memfd_test.c+1−1
@@ -80,7 +80,7 @@ static void test_mbind(int fd, size_t total_size) · 79 unmodified lines
8080 {
8181 const unsigned long nodemask_0 = 1; /* nid: 0 */
8282 unsigned long nodemask = 0;
83− unsigned long maxnode = 8;
83+ unsigned long maxnode = BITS_PER_TYPE(nodemask);
8484 int policy;
8585 char *mem;
8686 int ret;
tools/testing/selftests/kvm/include/x86/processor.h+23−0
@@ -557,6 +557,11 @@ static inline uint64_t get_cr0(void) · 556 unmodified lines
557557 return cr0;
558558 }
559559
560+static inline void set_cr0(uint64_t val)
561+{
562+ __asm__ __volatile__("mov %0, %%cr0" : : "r" (val) : "memory");
563+}
564+
560565 static inline uint64_t get_cr3(void)
561566 {
562567 uint64_t cr3;
@@ -566,6 +571,11 @@ static inline uint64_t get_cr3(void) · 3 unmodified lines
566571 return cr3;
567572 }
568573
574+static inline void set_cr3(uint64_t val)
575+{
576+ __asm__ __volatile__("mov %0, %%cr3" : : "r" (val) : "memory");
577+}
578+
569579 static inline uint64_t get_cr4(void)
570580 {
571581 uint64_t cr4;
@@ -580,6 +590,19 @@ static inline void set_cr4(uint64_t val) · 8 unmodified lines
580590 __asm__ __volatile__("mov %0, %%cr4" : : "r" (val) : "memory");
581591 }
582592
593+static inline uint64_t get_cr8(void)
594+{
595+ uint64_t cr8;
596+
597+ __asm__ __volatile__("mov %%cr8, %[cr8]" : [cr8]"=r"(cr8));
598+ return cr8;
599+}
600+
601+static inline void set_cr8(uint64_t val)
602+{
603+ __asm__ __volatile__("mov %0, %%cr8" : : "r" (val) : "memory");
604+}
605+
583606 static inline void set_idt(const struct desc_ptr *idt_desc)
584607 {
585608 __asm__ __volatile__("lidt %0"::"m"(*idt_desc));
tools/testing/selftests/kvm/include/x86/smm.h+17−0
@@ -0,0 +1,17 @@
1+// SPDX-License-Identifier: GPL-2.0-only
2+#ifndef SELFTEST_KVM_SMM_H
3+#define SELFTEST_KVM_SMM_H
4+
5+#include "kvm_util.h"
6+
7+#define SMRAM_SIZE 65536
8+#define SMRAM_MEMSLOT ((1 << 16) | 1)
9+#define SMRAM_PAGES (SMRAM_SIZE / PAGE_SIZE)
10+
11+void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu,
12+ uint64_t smram_gpa,
13+ const void *smi_handler, size_t handler_size);
14+
15+void inject_smi(struct kvm_vcpu *vcpu);
16+
17+#endif /* SELFTEST_KVM_SMM_H */
tools/testing/selftests/kvm/lib/x86/processor.c+26−0
@@ -8,6 +8,7 @@ · 7 unmodified lines
88 #include "kvm_util.h"
99 #include "pmu.h"
1010 #include "processor.h"
11+#include "smm.h"
1112 #include "svm_util.h"
1213 #include "sev.h"
1314 #include "vmx.h"
@@ -1444,3 +1445,28 @@ bool kvm_arch_has_default_irqchip(void) · 1430 unmodified lines
14441445 {
14451446 return true;
14461447 }
1448+
1449+void setup_smram(struct kvm_vm *vm, struct kvm_vcpu *vcpu,
1450+ uint64_t smram_gpa,
1451+ const void *smi_handler, size_t handler_size)
1452+{
1453+ vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, smram_gpa,
1454+ SMRAM_MEMSLOT, SMRAM_PAGES, 0);
1455+ TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, smram_gpa,
1456+ SMRAM_MEMSLOT) == smram_gpa,
1457+ "Could not allocate guest physical addresses for SMRAM");
1458+
1459+ memset(addr_gpa2hva(vm, smram_gpa), 0x0, SMRAM_SIZE);
1460+ memcpy(addr_gpa2hva(vm, smram_gpa) + 0x8000, smi_handler, handler_size);
1461+ vcpu_set_msr(vcpu, MSR_IA32_SMBASE, smram_gpa);
1462+}
1463+
1464+void inject_smi(struct kvm_vcpu *vcpu)
1465+{
1466+ struct kvm_vcpu_events events;
1467+
1468+ vcpu_events_get(vcpu, &events);
1469+ events.smi.pending = 1;
1470+ events.flags |= KVM_VCPUEVENT_VALID_SMM;
1471+ vcpu_events_set(vcpu, &events);
1472+}
tools/testing/selftests/kvm/x86/evmcs_smm_controls_test.c+150−0
@@ -0,0 +1,150 @@
1+// SPDX-License-Identifier: GPL-2.0
2+/*
3+ * Copyright (C) 2026, Red Hat, Inc.
4+ *
5+ * Test that vmx_leave_smm() validates vmcs12 controls before re-entering
6+ * nested guest mode on RSM.
7+ */
8+#include <fcntl.h>
9+#include <stdio.h>
10+#include <stdlib.h>
11+#include <string.h>
12+#include <sys/ioctl.h>
13+
14+#include "test_util.h"
15+#include "kvm_util.h"
16+#include "smm.h"
17+#include "hyperv.h"
18+#include "vmx.h"
19+
20+#define SMRAM_GPA 0x1000000
21+#define SMRAM_STAGE 0xfe
22+
23+#define SYNC_PORT 0xe
24+
25+#define STR(x) #x
26+#define XSTR(s) STR(s)
27+
28+/*
29+ * SMI handler: runs in real-address mode.
30+ * Reports SMRAM_STAGE via port IO, then does RSM.
31+ */
32+static uint8_t smi_handler[] = {
33+ 0xb0, SMRAM_STAGE, /* mov $SMRAM_STAGE, %al */
34+ 0xe4, SYNC_PORT, /* in $SYNC_PORT, %al */
35+ 0x0f, 0xaa, /* rsm */
36+};
37+
38+static inline void sync_with_host(uint64_t phase)
39+{
40+ asm volatile("in $" XSTR(SYNC_PORT) ", %%al \n"
41+ : "+a" (phase));
42+}
43+
44+static void l2_guest_code(void)
45+{
46+ sync_with_host(1);
47+
48+ /* After SMI+RSM with invalid controls, we should not reach here. */
49+ vmcall();
50+}
51+
52+static void guest_code(struct vmx_pages *vmx_pages,
53+ struct hyperv_test_pages *hv_pages)
54+{
55+#define L2_GUEST_STACK_SIZE 64
56+ unsigned long l2_guest_stack[L2_GUEST_STACK_SIZE];
57+
58+ /* Set up Hyper-V enlightenments and eVMCS */
59+ wrmsr(HV_X64_MSR_GUEST_OS_ID, HYPERV_LINUX_OS_ID);
60+ enable_vp_assist(hv_pages->vp_assist_gpa, hv_pages->vp_assist);
61+ evmcs_enable();
62+
63+ GUEST_ASSERT(prepare_for_vmx_operation(vmx_pages));
64+ GUEST_ASSERT(load_evmcs(hv_pages));
65+ prepare_vmcs(vmx_pages, l2_guest_code,
66+ &l2_guest_stack[L2_GUEST_STACK_SIZE]);
67+
68+ GUEST_ASSERT(!vmlaunch());
69+
70+ /* L2 exits via vmcall if test fails */
71+ sync_with_host(2);
72+}
73+
74+int main(int argc, char *argv[])
75+{
76+ vm_vaddr_t vmx_pages_gva = 0, hv_pages_gva = 0;
77+ struct hyperv_test_pages *hv;
78+ struct hv_enlightened_vmcs *evmcs;
79+ struct kvm_vcpu *vcpu;
80+ struct kvm_vm *vm;
81+ struct kvm_regs regs;
82+ int stage_reported;
83+
84+ TEST_REQUIRE(kvm_cpu_has(X86_FEATURE_VMX));
85+ TEST_REQUIRE(kvm_has_cap(KVM_CAP_NESTED_STATE));
86+ TEST_REQUIRE(kvm_has_cap(KVM_CAP_HYPERV_ENLIGHTENED_VMCS));
87+ TEST_REQUIRE(kvm_has_cap(KVM_CAP_X86_SMM));
88+
89+ vm = vm_create_with_one_vcpu(&vcpu, guest_code);
90+
91+ setup_smram(vm, vcpu, SMRAM_GPA, smi_handler, sizeof(smi_handler));
92+
93+ vcpu_set_hv_cpuid(vcpu);
94+ vcpu_enable_evmcs(vcpu);
95+ vcpu_alloc_vmx(vm, &vmx_pages_gva);
96+ hv = vcpu_alloc_hyperv_test_pages(vm, &hv_pages_gva);
97+ vcpu_args_set(vcpu, 2, vmx_pages_gva, hv_pages_gva);
98+
99+ vcpu_run(vcpu);
100+
101+ /* L2 is running and syncs with host. */
102+ TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_IO);
103+ vcpu_regs_get(vcpu, &regs);
104+ stage_reported = regs.rax & 0xff;
105+ TEST_ASSERT(stage_reported == 1,
106+ "Expected stage 1, got %d", stage_reported);
107+
108+ /* Inject SMI while L2 is running. */
109+ inject_smi(vcpu);
110+ vcpu_run(vcpu);
111+ TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_IO);
112+ vcpu_regs_get(vcpu, &regs);
113+ stage_reported = regs.rax & 0xff;
114+ TEST_ASSERT(stage_reported == SMRAM_STAGE,
115+ "Expected SMM handler stage %#x, got %#x",
116+ SMRAM_STAGE, stage_reported);
117+
118+ /*
119+ * Guest is now paused in the SMI handler, about to execute RSM.
120+ * Hack the eVMCS page to set-up invalid pin-based execution
121+ * control (PIN_BASED_VIRTUAL_NMIS without PIN_BASED_NMI_EXITING).
122+ */
123+ evmcs = hv->enlightened_vmcs_hva;
124+ evmcs->pin_based_vm_exec_control |= PIN_BASED_VIRTUAL_NMIS;
125+ evmcs->hv_clean_fields = 0;
126+
127+ /*
128+ * Trigger copy_enlightened_to_vmcs12() via KVM_GET_NESTED_STATE,
129+ * copying the invalid pin_based_vm_exec_control into cached_vmcs12.
130+ */
131+ union {
132+ struct kvm_nested_state state;
133+ char state_[16384];
134+ } nested_state_buf;
135+
136+ memset(&nested_state_buf, 0, sizeof(nested_state_buf));
137+ nested_state_buf.state.size = sizeof(nested_state_buf);
138+ vcpu_nested_state_get(vcpu, &nested_state_buf.state);
139+
140+ /*
141+ * Resume the guest. The SMI handler executes RSM, which calls
142+ * vmx_leave_smm(). nested_vmx_check_controls() should detect
143+ * VIRTUAL_NMIS without NMI_EXITING and cause a triple fault.
144+ */
145+ vcpu_run(vcpu);
146+ TEST_ASSERT_KVM_EXIT_REASON(vcpu, KVM_EXIT_SHUTDOWN);
147+
148+ kvm_vm_free(vm);
149+ return 0;
150+}
tools/testing/selftests/kvm/x86/sev_smoke_test.c+30−0
@@ -13,6 +13,30 @@ · 12 unmodified lines
1313 #include "linux/psp-sev.h"
1414 #include "sev.h"
1515
16+static void guest_sev_test_msr(uint32_t msr)
17+{
18+ uint64_t val = rdmsr(msr);
19+
20+ wrmsr(msr, val);
21+ GUEST_ASSERT(val == rdmsr(msr));
22+}
23+
24+#define guest_sev_test_reg(reg) \
25+do { \
26+ uint64_t val = get_##reg(); \
27+ \
28+ set_##reg(val); \
29+ GUEST_ASSERT(val == get_##reg()); \
30+} while (0)
31+
32+static void guest_sev_test_regs(void)
33+{
34+ guest_sev_test_msr(MSR_EFER);
35+ guest_sev_test_reg(cr0);
36+ guest_sev_test_reg(cr3);
37+ guest_sev_test_reg(cr4);
38+ guest_sev_test_reg(cr8);
39+}
1640
1741 #define XFEATURE_MASK_X87_AVX (XFEATURE_MASK_FP | XFEATURE_MASK_SSE | XFEATURE_MASK_YMM)
1842
@@ -24,6 +48,8 @@ static void guest_snp_code(void) · 5 unmodified lines
2448 GUEST_ASSERT(sev_msr & MSR_AMD64_SEV_ES_ENABLED);
2549 GUEST_ASSERT(sev_msr & MSR_AMD64_SEV_SNP_ENABLED);
2650
51+ guest_sev_test_regs();
52+
2753 wrmsr(MSR_AMD64_SEV_ES_GHCB, GHCB_MSR_TERM_REQ);
2854 vmgexit();
2955 }
@@ -34,6 +60,8 @@ static void guest_sev_es_code(void) · 4 unmodified lines
3460 GUEST_ASSERT(rdmsr(MSR_AMD64_SEV) & MSR_AMD64_SEV_ENABLED);
3561 GUEST_ASSERT(rdmsr(MSR_AMD64_SEV) & MSR_AMD64_SEV_ES_ENABLED);
3662
63+ guest_sev_test_regs();
64+
3765 /*
3866 * TODO: Add GHCB and ucall support for SEV-ES guests. For now, simply
3967 * force "termination" to signal "done" via the GHCB MSR protocol.
@@ -47,6 +75,8 @@ static void guest_sev_code(void) · 7 unmodified lines
4775 GUEST_ASSERT(this_cpu_has(X86_FEATURE_SEV));
4876 GUEST_ASSERT(rdmsr(MSR_AMD64_SEV) & MSR_AMD64_SEV_ENABLED);
4977
78+ guest_sev_test_regs();
79+
5080 GUEST_DONE();
5181 }
5282
tools/testing/selftests/kvm/x86/smm_test.c+2−25
@@ -14,13 +14,11 @@ · 13 unmodified lines
1414 #include "test_util.h"
1515
1616 #include "kvm_util.h"
17+#include "smm.h"
1718
1819 #include "vmx.h"
1920 #include "svm_util.h"
2021
21−#define SMRAM_SIZE 65536
22−#define SMRAM_MEMSLOT ((1 << 16) | 1)
23−#define SMRAM_PAGES (SMRAM_SIZE / PAGE_SIZE)
2422 #define SMRAM_GPA 0x1000000
2523 #define SMRAM_STAGE 0xfe
2624
@@ -113,18 +111,6 @@ static void guest_code(void *arg) · 86 unmodified lines
113111 sync_with_host(DONE);
114112 }
115113
116−void inject_smi(struct kvm_vcpu *vcpu)
117−{
118− struct kvm_vcpu_events events;
119−
120− vcpu_events_get(vcpu, &events);
121−
122− events.smi.pending = 1;
123− events.flags |= KVM_VCPUEVENT_VALID_SMM;
124−
125− vcpu_events_set(vcpu, &events);
126−}
127−
128114 int main(int argc, char *argv[])
129115 {
130116 vm_vaddr_t nested_gva = 0;
@@ -140,16 +126,7 @@ int main(int argc, char *argv[]) · 9 unmodified lines
140126 /* Create VM */
141127 vm = vm_create_with_one_vcpu(&vcpu, guest_code);
142128
143− vm_userspace_mem_region_add(vm, VM_MEM_SRC_ANONYMOUS, SMRAM_GPA,
144− SMRAM_MEMSLOT, SMRAM_PAGES, 0);
145− TEST_ASSERT(vm_phy_pages_alloc(vm, SMRAM_PAGES, SMRAM_GPA, SMRAM_MEMSLOT)
146− == SMRAM_GPA, "could not allocate guest physical addresses?");
147−
148− memset(addr_gpa2hva(vm, SMRAM_GPA), 0x0, SMRAM_SIZE);
149− memcpy(addr_gpa2hva(vm, SMRAM_GPA) + 0x8000, smi_handler,
150− sizeof(smi_handler));
151−
152− vcpu_set_msr(vcpu, MSR_IA32_SMBASE, SMRAM_GPA);
129+ setup_smram(vm, vcpu, SMRAM_GPA, smi_handler, sizeof(smi_handler));
153130
154131 if (kvm_has_cap(KVM_CAP_NESTED_STATE)) {
155132 if (kvm_cpu_has(X86_FEATURE_SVM))
tools/testing/selftests/powerpc/copyloops/.gitignore+2−2
@@ -2,8 +2,8 @@ · 1 unmodified line
22 copyuser_64_t0
33 copyuser_64_t1
44 copyuser_64_t2
5−copyuser_p7_t0
6−copyuser_p7_t1
5+copyuser_p7
6+copyuser_p7_vmx
77 memcpy_64_t0
88 memcpy_64_t1
99 memcpy_64_t2
tools/testing/selftests/powerpc/copyloops/Makefile+8−3
@@ -1,6 +1,6 @@
11 # SPDX-License-Identifier: GPL-2.0
22 TEST_GEN_PROGS := copyuser_64_t0 copyuser_64_t1 copyuser_64_t2 \
3− copyuser_p7_t0 copyuser_p7_t1 \
3+ copyuser_p7 copyuser_p7_vmx \
44 memcpy_64_t0 memcpy_64_t1 memcpy_64_t2 \
55 memcpy_p7_t0 memcpy_p7_t1 copy_mc_64 \
66 copyuser_64_exc_t0 copyuser_64_exc_t1 copyuser_64_exc_t2 \
@@ -28,10 +28,15 @@ $(OUTPUT)/copyuser_64_t%: copyuser_64.S $(EXTRA_SOURCES) · 21 unmodified lines
2828 -D SELFTEST_CASE=$(subst copyuser_64_t,,$(notdir $@)) \
2929 -o $@ $^
3030
31−$(OUTPUT)/copyuser_p7_t%: copyuser_power7.S $(EXTRA_SOURCES)
31+$(OUTPUT)/copyuser_p7: copyuser_power7.S $(EXTRA_SOURCES)
3232 $(CC) $(CPPFLAGS) $(CFLAGS) \
3333 -D COPY_LOOP=test___copy_tofrom_user_power7 \
34− -D SELFTEST_CASE=$(subst copyuser_p7_t,,$(notdir $@)) \
34+ -o $@ $^
35+
36+$(OUTPUT)/copyuser_p7_vmx: copyuser_power7.S $(EXTRA_SOURCES) ../utils.c
37+ $(CC) $(CPPFLAGS) $(CFLAGS) \
38+ -D COPY_LOOP=test___copy_tofrom_user_power7_vmx \
39+ -D VMX_TEST \
3540 -o $@ $^
3641
3742 # Strictly speaking, we only need the memcpy_64 test cases for big-endian
tools/testing/selftests/powerpc/copyloops/stubs.S+0−8
@@ -1,13 +1,5 @@
11 #include <asm/ppc_asm.h>
22
3−FUNC_START(enter_vmx_usercopy)
4− li r3,1
5− blr
6−
7−FUNC_START(exit_vmx_usercopy)
8− li r3,0
9− blr
10−
113 FUNC_START(enter_vmx_ops)
124 li r3,1
135 blr
tools/testing/selftests/powerpc/copyloops/validate.c+14−1
@@ -12,6 +12,10 @@ · 11 unmodified lines
1212 #define BUFLEN (MAX_LEN+MAX_OFFSET+2*MIN_REDZONE)
1313 #define POISON 0xa5
1414
15+#ifdef VMX_TEST
16+#define VMX_COPY_THRESHOLD 3328
17+#endif
18+
1519 unsigned long COPY_LOOP(void *to, const void *from, unsigned long size);
1620
1721 static void do_one(char *src, char *dst, unsigned long src_off,
@@ -81,8 +85,12 @@ int test_copy_loop(void) · 63 unmodified lines
8185 /* Fill with sequential bytes */
8286 for (i = 0; i < BUFLEN; i++)
8387 fill[i] = i & 0xff;
84−
88+#ifdef VMX_TEST
89+ /* Force sizes above kernel VMX threshold (3328) */
90+ for (len = VMX_COPY_THRESHOLD + 1; len < MAX_LEN; len++) {
91+#else
8592 for (len = 1; len < MAX_LEN; len++) {
93+#endif
8694 for (src_off = 0; src_off < MAX_OFFSET; src_off++) {
8795 for (dst_off = 0; dst_off < MAX_OFFSET; dst_off++) {
8896 do_one(src, dst, src_off, dst_off, len,
@@ -96,5 +104,10 @@ int test_copy_loop(void) · 7 unmodified lines
96104
97105 int main(void)
98106 {
107+#ifdef VMX_TEST
108+ /* Skip if Altivec not present */
109+ SKIP_IF_MSG(!have_hwcap(PPC_FEATURE_HAS_ALTIVEC), "ALTIVEC not supported");
110+#endif
111+
99112 return test_harness(test_copy_loop, str(COPY_LOOP));
100113 }
tools/testing/selftests/sched_ext/util.c+2−2
@@ -60,11 +60,11 @@ int file_write_long(const char *path, long val) · 59 unmodified lines
6060 char buf[64];
6161 int ret;
6262
63− ret = sprintf(buf, "%lu", val);
63+ ret = sprintf(buf, "%ld", val);
6464 if (ret < 0)
6565 return ret;
6666
67− if (write_text(path, buf, sizeof(buf)) <= 0)
67+ if (write_text(path, buf, ret) <= 0)
6868 return -1;
6969
7070 return 0;
virt/kvm/binary_stats.c+1−1
@@ -50,7 +50,7 @@ · 49 unmodified lines
5050 * Return: the number of bytes that has been successfully read
5151 */
5252 ssize_t kvm_stats_read(char *id, const struct kvm_stats_header *header,
53− const struct _kvm_stats_desc *desc,
53+ const struct kvm_stats_desc *desc,
5454 void *stats, size_t size_stats,
5555 char __user *user_buffer, size_t size, loff_t *offset)
5656 {
virt/kvm/kvm_main.c+10−10
@@ -973,9 +973,9 @@ static void kvm_free_memslots(struct kvm *kvm, struct kvm_memslots *slots) · 972 unmodified lines
973973 kvm_free_memslot(kvm, memslot);
974974 }
975975
976−static umode_t kvm_stats_debugfs_mode(const struct _kvm_stats_desc *pdesc)
976+static umode_t kvm_stats_debugfs_mode(const struct kvm_stats_desc *desc)
977977 {
978− switch (pdesc->desc.flags & KVM_STATS_TYPE_MASK) {
978+ switch (desc->flags & KVM_STATS_TYPE_MASK) {
979979 case KVM_STATS_TYPE_INSTANT:
980980 return 0444;
981981 case KVM_STATS_TYPE_CUMULATIVE:
@@ -1010,7 +1010,7 @@ static int kvm_create_vm_debugfs(struct kvm *kvm, const char *fdname) · 28 unmodified lines
10101010 struct dentry *dent;
10111011 char dir_name[ITOA_MAX_LEN * 2];
10121012 struct kvm_stat_data *stat_data;
1013− const struct _kvm_stats_desc *pdesc;
1013+ const struct kvm_stats_desc *pdesc;
10141014 int i, ret = -ENOMEM;
10151015 int kvm_debugfs_num_entries = kvm_vm_stats_header.num_desc +
10161016 kvm_vcpu_stats_header.num_desc;
@@ -6171,11 +6171,11 @@ static int kvm_stat_data_get(void *data, u64 *val) · 5154 unmodified lines
61716171 switch (stat_data->kind) {
61726172 case KVM_STAT_VM:
61736173 r = kvm_get_stat_per_vm(stat_data->kvm,
6174− stat_data->desc->desc.offset, val);
6174+ stat_data->desc->offset, val);
61756175 break;
61766176 case KVM_STAT_VCPU:
61776177 r = kvm_get_stat_per_vcpu(stat_data->kvm,
6178− stat_data->desc->desc.offset, val);
6178+ stat_data->desc->offset, val);
61796179 break;
61806180 }
61816181
@@ -6193,11 +6193,11 @@ static int kvm_stat_data_clear(void *data, u64 val) · 11 unmodified lines
61936193 switch (stat_data->kind) {
61946194 case KVM_STAT_VM:
61956195 r = kvm_clear_stat_per_vm(stat_data->kvm,
6196− stat_data->desc->desc.offset);
6196+ stat_data->desc->offset);
61976197 break;
61986198 case KVM_STAT_VCPU:
61996199 r = kvm_clear_stat_per_vcpu(stat_data->kvm,
6200− stat_data->desc->desc.offset);
6200+ stat_data->desc->offset);
62016201 break;
62026202 }
62036203
@@ -6345,7 +6345,7 @@ static void kvm_uevent_notify_change(unsigned int type, struct kvm *kvm) · 141 unmodified lines
63456345 static void kvm_init_debug(void)
63466346 {
63476347 const struct file_operations *fops;
6348− const struct _kvm_stats_desc *pdesc;
6348+ const struct kvm_stats_desc *pdesc;
63496349 int i;
63506350
63516351 kvm_debugfs_dir = debugfs_create_dir("kvm", NULL);
@@ -6358,7 +6358,7 @@ static void kvm_init_debug(void) · 6 unmodified lines
63586358 fops = &vm_stat_readonly_fops;
63596359 debugfs_create_file(pdesc->name, kvm_stats_debugfs_mode(pdesc),
63606360 kvm_debugfs_dir,
6361− (void *)(long)pdesc->desc.offset, fops);
6361+ (void *)(long)pdesc->offset, fops);
63626362 }
63636363
63646364 for (i = 0; i < kvm_vcpu_stats_header.num_desc; ++i) {
@@ -6369,7 +6369,7 @@ static void kvm_init_debug(void) · 4 unmodified lines
63696369 fops = &vcpu_stat_readonly_fops;
63706370 debugfs_create_file(pdesc->name, kvm_stats_debugfs_mode(pdesc),
63716371 kvm_debugfs_dir,
6372− (void *)(long)pdesc->desc.offset, fops);
6372+ (void *)(long)pdesc->offset, fops);
63736373 }
63746374 }
63756375

Keyboard shortcuts

General

Show keyboard shortcuts
?
Focus the current search
/

Issues and pull requests

Open filters
f

Issues, pull requests and Inbox

Select next item
j↓
Select previous item
k↑
Open selected item
Enter
Dismiss filters or clear selection
Esc

Repository code

Go to file
t