]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 5.15
authorSasha Levin <sashal@kernel.org>
Sat, 27 Jul 2024 14:04:15 +0000 (10:04 -0400)
committerSasha Levin <sashal@kernel.org>
Sat, 27 Jul 2024 14:04:15 +0000 (10:04 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
166 files changed:
queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch [new file with mode: 0644]
queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch [new file with mode: 0644]
queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch [new file with mode: 0644]
queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch [new file with mode: 0644]
queue-5.15/arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch [new file with mode: 0644]
queue-5.15/arm-pxa-spitz-use-gpio-descriptors-for-audio.patch [new file with mode: 0644]
queue-5.15/arm-spitz-fix-gpio-assignment-for-backlight.patch [new file with mode: 0644]
queue-5.15/arm64-dts-amlogic-gx-correct-hdmi-clocks.patch [new file with mode: 0644]
queue-5.15/arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch [new file with mode: 0644]
queue-5.15/arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch [new file with mode: 0644]
queue-5.15/arm64-dts-mediatek-mt8183-kukui-jacuzzi-add-ports-no.patch [new file with mode: 0644]
queue-5.15/arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch [new file with mode: 0644]
queue-5.15/arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch [new file with mode: 0644]
queue-5.15/arm64-dts-qcom-sm8250-add-power-domain-to-ufs-phy.patch [new file with mode: 0644]
queue-5.15/arm64-dts-qcom-sm8250-switch-ufs-qmp-phy-to-new-styl.patch [new file with mode: 0644]
queue-5.15/arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch [new file with mode: 0644]
queue-5.15/asoc-max98088-check-for-clk_prepare_enable-error.patch [new file with mode: 0644]
queue-5.15/block-cleanup-bio_integrity_prep.patch [new file with mode: 0644]
queue-5.15/block-initialize-integrity-buffer-to-zero-before-wri.patch [new file with mode: 0644]
queue-5.15/block-refactor-to-use-helper.patch [new file with mode: 0644]
queue-5.15/bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch [new file with mode: 0644]
queue-5.15/bnxt_re-fix-imm_data-endianness.patch [new file with mode: 0644]
queue-5.15/bpf-annotate-btf-show-functions-with-__printf.patch [new file with mode: 0644]
queue-5.15/bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch [new file with mode: 0644]
queue-5.15/bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch [new file with mode: 0644]
queue-5.15/clk-qcom-branch-add-helper-functions-for-setting-ret.patch [new file with mode: 0644]
queue-5.15/clk-qcom-gcc-sc7280-update-force-mem-core-bit-for-uf.patch [new file with mode: 0644]
queue-5.15/coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch [new file with mode: 0644]
queue-5.15/drm-amd-pm-fix-aldebaran-pcie-speed-reporting.patch [new file with mode: 0644]
queue-5.15/drm-amdgpu-check-if-nbio-funcs-are-null-in-amdgpu_de.patch [new file with mode: 0644]
queue-5.15/drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch [new file with mode: 0644]
queue-5.15/drm-mediatek-add-drm_mode_rotate_0-to-rotation-prope.patch [new file with mode: 0644]
queue-5.15/drm-mediatek-add-missing-plane-settings-when-async-u.patch [new file with mode: 0644]
queue-5.15/drm-meson-fix-canvas-release-in-bind-function.patch [new file with mode: 0644]
queue-5.15/drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch [new file with mode: 0644]
queue-5.15/drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch [new file with mode: 0644]
queue-5.15/drm-qxl-add-check-for-drm_cvt_mode.patch [new file with mode: 0644]
queue-5.15/edac-i10nm-make-skx_common.o-a-separate-module.patch [new file with mode: 0644]
queue-5.15/ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch [new file with mode: 0644]
queue-5.15/ext4-don-t-track-ranges-in-fast_commit-if-inode-has-.patch [new file with mode: 0644]
queue-5.15/ext4-fix-infinite-loop-when-replaying-fast_commit.patch [new file with mode: 0644]
queue-5.15/ext4-return-early-for-non-eligible-fast_commit-track.patch [new file with mode: 0644]
queue-5.15/firmware-turris-mox-rwtm-do-not-complete-if-there-ar.patch [new file with mode: 0644]
queue-5.15/firmware-turris-mox-rwtm-fix-checking-return-value-o.patch [new file with mode: 0644]
queue-5.15/firmware-turris-mox-rwtm-initialize-completion-befor.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-fix-field-spanning-write-in-index_hdr.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-fix-getting-file-type.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-fix-transform-resident-to-nonresident-for-c.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-merge-synonym-compression_unit-and-ntfs_lzn.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-missed-error-return.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-missed-ni_flag_update_parent-setting.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-replace-inode_trylock-with-inode_lock.patch [new file with mode: 0644]
queue-5.15/fs-ntfs3-use-align-kernel-macro.patch [new file with mode: 0644]
queue-5.15/fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch [new file with mode: 0644]
queue-5.15/gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch [new file with mode: 0644]
queue-5.15/hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch [new file with mode: 0644]
queue-5.15/hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch [new file with mode: 0644]
queue-5.15/hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch [new file with mode: 0644]
queue-5.15/hwmon-max6697-fix-underflow-when-writing-limit-attri.patch [new file with mode: 0644]
queue-5.15/input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch [new file with mode: 0644]
queue-5.15/input-qt1050-handle-chip_id-reading-error.patch [new file with mode: 0644]
queue-5.15/ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch [new file with mode: 0644]
queue-5.15/kvm-s390-fix-race-in-gmap_make_secure.patch [new file with mode: 0644]
queue-5.15/kvm-s390-pv-add-export-before-import.patch [new file with mode: 0644]
queue-5.15/kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch [new file with mode: 0644]
queue-5.15/kvm-s390-pv-properly-handle-page-flags-for-protected.patch [new file with mode: 0644]
queue-5.15/leds-trigger-unregister-sysfs-attributes-before-call.patch [new file with mode: 0644]
queue-5.15/lib-objagg-fix-general-protection-fault.patch [new file with mode: 0644]
queue-5.15/libbpf-checking-the-btf_type-kind-when-fixing-variab.patch [new file with mode: 0644]
queue-5.15/locking-rwsem-add-__always_inline-annotation-to-__do.patch [new file with mode: 0644]
queue-5.15/m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch [new file with mode: 0644]
queue-5.15/m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch [new file with mode: 0644]
queue-5.15/macintosh-therm_windtunnel-fix-module-unload.patch [new file with mode: 0644]
queue-5.15/media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch [new file with mode: 0644]
queue-5.15/media-i2c-fix-imx412-exposure-control.patch [new file with mode: 0644]
queue-5.15/media-imon-fix-race-getting-ictx-lock.patch [new file with mode: 0644]
queue-5.15/media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch [new file with mode: 0644]
queue-5.15/media-renesas-vsp1-store-rpf-partition-configuration.patch [new file with mode: 0644]
queue-5.15/media-uvcvideo-override-default-flags.patch [new file with mode: 0644]
queue-5.15/media-venus-flush-all-buffers-in-output-plane-stream.patch [new file with mode: 0644]
queue-5.15/memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch [new file with mode: 0644]
queue-5.15/mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch [new file with mode: 0644]
queue-5.15/mfd-rsmu-split-core-code-into-separate-module.patch [new file with mode: 0644]
queue-5.15/mips-octeron-remove-source-file-executable-bit.patch [new file with mode: 0644]
queue-5.15/mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch [new file with mode: 0644]
queue-5.15/mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch [new file with mode: 0644]
queue-5.15/mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch [new file with mode: 0644]
queue-5.15/mtd-make-mtd_test.c-a-separate-module.patch [new file with mode: 0644]
queue-5.15/net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch [new file with mode: 0644]
queue-5.15/net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch [new file with mode: 0644]
queue-5.15/net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch [new file with mode: 0644]
queue-5.15/net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch [new file with mode: 0644]
queue-5.15/net-fec-refactor-define-magic-constants.patch [new file with mode: 0644]
queue-5.15/net-missing-check-virtio.patch [new file with mode: 0644]
queue-5.15/net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch [new file with mode: 0644]
queue-5.15/netfilter-ctnetlink-use-helper-function-to-calculate.patch [new file with mode: 0644]
queue-5.15/netfilter-nf_set_pipapo-fix-initial-map-fill.patch [new file with mode: 0644]
queue-5.15/netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch [new file with mode: 0644]
queue-5.15/netfilter-nft_set_pipapo-constify-lookup-fn-args-whe.patch [new file with mode: 0644]
queue-5.15/nfsv4.1-another-fix-for-exchgid4_flag_use_pnfs_ds-fo.patch [new file with mode: 0644]
queue-5.15/nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch [new file with mode: 0644]
queue-5.15/pci-endpoint-clean-up-error-handling-in-vpci_scan_bu.patch [new file with mode: 0644]
queue-5.15/pci-fix-resource-double-counting-on-remove-rescan.patch [new file with mode: 0644]
queue-5.15/perf-fix-default-aux_watermark-calculation.patch [new file with mode: 0644]
queue-5.15/perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch [new file with mode: 0644]
queue-5.15/perf-intel-pt-fix-aux_watermark-calculation-for-64-b.patch [new file with mode: 0644]
queue-5.15/perf-intel-pt-fix-exclude_guest-setting.patch [new file with mode: 0644]
queue-5.15/perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch [new file with mode: 0644]
queue-5.15/perf-report-fix-condition-in-sort__sym_cmp.patch [new file with mode: 0644]
queue-5.15/perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch [new file with mode: 0644]
queue-5.15/pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch [new file with mode: 0644]
queue-5.15/pinctrl-freescale-mxs-fix-refcount-of-child.patch [new file with mode: 0644]
queue-5.15/pinctrl-rockchip-update-rk3308-iomux-routes.patch [new file with mode: 0644]
queue-5.15/pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch [new file with mode: 0644]
queue-5.15/pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch [new file with mode: 0644]
queue-5.15/pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch [new file with mode: 0644]
queue-5.15/platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch [new file with mode: 0644]
queue-5.15/powerpc-xmon-fix-disassembly-cpu-feature-checks.patch [new file with mode: 0644]
queue-5.15/pwm-stm32-always-do-lazy-disabling.patch [new file with mode: 0644]
queue-5.15/rdma-cache-release-gid-table-even-if-leak-is-detecte.patch [new file with mode: 0644]
queue-5.15/rdma-device-return-error-earlier-if-port-in-not-vali.patch [new file with mode: 0644]
queue-5.15/rdma-hns-fix-insufficient-extend-db-for-vfs.patch [new file with mode: 0644]
queue-5.15/rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch [new file with mode: 0644]
queue-5.15/rdma-hns-fix-undifined-behavior-caused-by-invalid-ma.patch [new file with mode: 0644]
queue-5.15/rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch [new file with mode: 0644]
queue-5.15/rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch [new file with mode: 0644]
queue-5.15/rdma-mlx5-set-mkeys-for-dmabuf-at-page_size.patch [new file with mode: 0644]
queue-5.15/rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch [new file with mode: 0644]
queue-5.15/revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch [new file with mode: 0644]
queue-5.15/rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch [new file with mode: 0644]
queue-5.15/s390-dasd-fix-error-checks-in-dasd_copy_pair_store.patch [new file with mode: 0644]
queue-5.15/s390-mm-convert-gmap_make_secure-to-use-a-folio.patch [new file with mode: 0644]
queue-5.15/s390-mm-convert-make_page_secure-to-use-a-folio.patch [new file with mode: 0644]
queue-5.15/s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch [new file with mode: 0644]
queue-5.15/saa7134-unchecked-i2c_transfer-function-result-fixed.patch [new file with mode: 0644]
queue-5.15/selftests-bpf-check-length-of-recv-in-test_sockmap.patch [new file with mode: 0644]
queue-5.15/selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch [new file with mode: 0644]
queue-5.15/selftests-bpf-fix-prog-numbers-in-test_sockmap.patch [new file with mode: 0644]
queue-5.15/selftests-forwarding-devlink_lib-wait-for-udev-event.patch [new file with mode: 0644]
queue-5.15/series [new file with mode: 0644]
queue-5.15/soc-qcom-pdr-fix-parsing-of-domains-lists.patch [new file with mode: 0644]
queue-5.15/soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch [new file with mode: 0644]
queue-5.15/soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch [new file with mode: 0644]
queue-5.15/sparc64-fix-incorrect-function-signature-and-add-pro.patch [new file with mode: 0644]
queue-5.15/sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch [new file with mode: 0644]
queue-5.15/sunrpc-fixup-gss_status-tracepoint-error-output.patch [new file with mode: 0644]
queue-5.15/tcp-add-tcp_done_with_error-helper.patch [new file with mode: 0644]
queue-5.15/tcp-annotate-lockless-access-to-sk-sk_err.patch [new file with mode: 0644]
queue-5.15/tcp-annotate-lockless-accesses-to-sk-sk_err_soft.patch [new file with mode: 0644]
queue-5.15/tcp-fix-race-in-tcp_write_err.patch [new file with mode: 0644]
queue-5.15/tcp-fix-races-in-tcp_v-46-_err.patch [new file with mode: 0644]
queue-5.15/vhost-vsock-always-initialize-seqpacket_allow.patch [new file with mode: 0644]
queue-5.15/vmlinux.lds.h-catch-.bss.l-sections-into-bss.patch [new file with mode: 0644]
queue-5.15/wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch [new file with mode: 0644]
queue-5.15/wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch [new file with mode: 0644]
queue-5.15/wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch [new file with mode: 0644]
queue-5.15/wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch [new file with mode: 0644]
queue-5.15/wifi-virt_wifi-avoid-reporting-connection-success-wi.patch [new file with mode: 0644]
queue-5.15/wifi-virt_wifi-don-t-use-strlen-in-const-context.patch [new file with mode: 0644]
queue-5.15/x86-of-return-consistent-error-type-from-x86_of_pci_.patch [new file with mode: 0644]
queue-5.15/x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch [new file with mode: 0644]
queue-5.15/x86-pci-xen-fix-pcibios_-return-code-handling.patch [new file with mode: 0644]
queue-5.15/x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch [new file with mode: 0644]
queue-5.15/x86-xen-convert-comma-to-semicolon.patch [new file with mode: 0644]
queue-5.15/xdp-fix-invalid-wait-context-of-page_pool_destroy.patch [new file with mode: 0644]
queue-5.15/xprtrdma-fix-rpcrdma_reqs_reset.patch [new file with mode: 0644]

diff --git a/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch b/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch
new file mode 100644 (file)
index 0000000..44adbb2
--- /dev/null
@@ -0,0 +1,36 @@
+From 7f9335a8b7da8904c4296fb1b12db01f0ed00e2a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 11:13:31 +0200
+Subject: ARM: dts: imx6qdl-kontron-samx6i: fix board reset
+
+From: Michael Walle <mwalle@kernel.org>
+
+[ Upstream commit b972d6b3b46345023aee56a95df8e2c137aa4ee4 ]
+
+On i.MX6 the board is reset by the watchdog. But in turn to do a
+complete board reset, we have to assert the WDOG_B output which is
+routed also to the CPLD which then do a complete power-cycle of the
+board.
+
+Fixes: 2125212785c9 ("ARM: dts: imx6qdl-kontron-samx6i: add Kontron SMARC SoM Support")
+Signed-off-by: Michael Walle <mwalle@kernel.org>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+index 0ff80a5013f20..c420a3b80943e 100644
+--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+@@ -817,5 +817,6 @@ &wdog1 {
+       /* CPLD is feeded by watchdog (hardwired) */
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_wdog1>;
++      fsl,ext-reset-output;
+       status = "okay";
+ };
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch b/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch
new file mode 100644 (file)
index 0000000..6873276
--- /dev/null
@@ -0,0 +1,35 @@
+From bcc634290a30bc247bf9ff47d7df23e8acf41fc1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 11:13:38 +0200
+Subject: ARM: dts: imx6qdl-kontron-samx6i: fix PCIe reset polarity
+
+From: Michael Walle <mwalle@kernel.org>
+
+[ Upstream commit df35c6e9027cf9affe699e632a48082ab1bbba4c ]
+
+The PCIe reset line is active low. Fix it.
+
+Fixes: 2a51f9dae13d ("ARM: dts: imx6qdl-kontron-samx6i: Add iMX6-based Kontron SMARC-sAMX6i module")
+Signed-off-by: Michael Walle <mwalle@kernel.org>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+index d9f4321055165..81e9b39bac20b 100644
+--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+@@ -732,7 +732,7 @@ &pcie {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_pcie>;
+       wake-up-gpio = <&gpio6 18 GPIO_ACTIVE_HIGH>;
+-      reset-gpio = <&gpio3 13 GPIO_ACTIVE_HIGH>;
++      reset-gpio = <&gpio3 13 GPIO_ACTIVE_LOW>;
+ };
+ /* LCD_BKLT_PWM */
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch b/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch
new file mode 100644 (file)
index 0000000..715ec90
--- /dev/null
@@ -0,0 +1,49 @@
+From 1b9ba182122f3e6a52dee1c3b8ffc7b5ff82c109 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 11:13:30 +0200
+Subject: ARM: dts: imx6qdl-kontron-samx6i: fix PHY reset
+
+From: Michael Walle <mwalle@kernel.org>
+
+[ Upstream commit edfea889a049abe80f0d55c0365bf60fbade272f ]
+
+The PHY reset line is connected to both the SoC (GPIO1_25) and
+the CPLD. We must not use the GPIO1_25 as it will drive against
+the output buffer of the CPLD. Instead there is another GPIO
+(GPIO2_01), an input to the CPLD, which will tell the CPLD to
+assert the PHY reset line.
+
+Fixes: 2a51f9dae13d ("ARM: dts: imx6qdl-kontron-samx6i: Add iMX6-based Kontron SMARC-sAMX6i module")
+Fixes: 5694eed98cca ("ARM: dts: imx6qdl-kontron-samx6i: move phy reset into phy-node")
+Signed-off-by: Michael Walle <mwalle@kernel.org>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+index 85aeebc9485dd..0ff80a5013f20 100644
+--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+@@ -269,7 +269,7 @@ mdio {
+               ethphy: ethernet-phy@1 {
+                       compatible = "ethernet-phy-ieee802.3-c22";
+                       reg = <1>;
+-                      reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
++                      reset-gpios = <&gpio2 1 GPIO_ACTIVE_LOW>;
+                       reset-assert-us = <1000>;
+               };
+       };
+@@ -516,7 +516,7 @@ MX6QDL_PAD_RGMII_RX_CTL__RGMII_RX_CTL 0x1b0b0
+                       MX6QDL_PAD_ENET_MDIO__ENET_MDIO       0x1b0b0
+                       MX6QDL_PAD_ENET_MDC__ENET_MDC         0x1b0b0
+                       MX6QDL_PAD_ENET_REF_CLK__ENET_TX_CLK  0x1b0b0
+-                      MX6QDL_PAD_ENET_CRS_DV__GPIO1_IO25    0x1b0b0 /* RST_GBE0_PHY# */
++                      MX6QDL_PAD_NANDF_D1__GPIO2_IO01       0x1b0b0 /* RST_GBE0_PHY# */
+               >;
+       };
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch b/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch
new file mode 100644 (file)
index 0000000..8230281
--- /dev/null
@@ -0,0 +1,88 @@
+From f8926297b2e687a39d9bf28988bd4209cbdf7dd6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 11:13:33 +0200
+Subject: ARM: dts: imx6qdl-kontron-samx6i: fix SPI0 chip selects
+
+From: Michael Walle <mwalle@kernel.org>
+
+[ Upstream commit 74e1c956a68a65d642447d852e95b3fbb69bebaa ]
+
+There is a comment in the imx6q variant dtsi claiming that these
+modules will have one more chip select than the imx6dl variant.
+This is wrong. Ordinary GPIOs are used for chip selects and both
+variants of the module share the very same PCB and both have this
+GPIO routed to the SPI0_CS1# pin of the SMARC connector.
+
+Fix it by moving the third chip select description to the common dtsi.
+
+Fixes: 2125212785c9 ("ARM: dts: imx6qdl-kontron-samx6i: add Kontron SMARC SoM Support")
+Signed-off-by: Michael Walle <mwalle@kernel.org>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi   | 23 -------------------
+ arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi |  5 +++-
+ 2 files changed, 4 insertions(+), 24 deletions(-)
+
+diff --git a/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi
+index 4d6a0c3e8455f..ff062f4fd726e 100644
+--- a/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi
++++ b/arch/arm/boot/dts/imx6q-kontron-samx6i.dtsi
+@@ -5,31 +5,8 @@
+ #include "imx6q.dtsi"
+ #include "imx6qdl-kontron-samx6i.dtsi"
+-#include <dt-bindings/gpio/gpio.h>
+ / {
+       model = "Kontron SMARC sAMX6i Quad/Dual";
+       compatible = "kontron,imx6q-samx6i", "fsl,imx6q";
+ };
+-
+-/* Quad/Dual SoMs have 3 chip-select signals */
+-&ecspi4 {
+-      cs-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>,
+-                 <&gpio3 29 GPIO_ACTIVE_LOW>,
+-                 <&gpio3 25 GPIO_ACTIVE_LOW>;
+-};
+-
+-&pinctrl_ecspi4 {
+-      fsl,pins = <
+-              MX6QDL_PAD_EIM_D21__ECSPI4_SCLK 0x100b1
+-              MX6QDL_PAD_EIM_D28__ECSPI4_MOSI 0x100b1
+-              MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1
+-
+-              /* SPI4_IMX_CS2# - connected to internal flash */
+-              MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x1b0b0
+-              /* SPI4_IMX_CS0# - connected to SMARC SPI0_CS0# */
+-              MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x1b0b0
+-              /* SPI4_CS3# - connected to  SMARC SPI0_CS1# */
+-              MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x1b0b0
+-      >;
+-};
+diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+index c420a3b80943e..d9f4321055165 100644
+--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+@@ -244,7 +244,8 @@ &ecspi4 {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_ecspi4>;
+       cs-gpios = <&gpio3 24 GPIO_ACTIVE_LOW>,
+-                 <&gpio3 29 GPIO_ACTIVE_LOW>;
++                 <&gpio3 29 GPIO_ACTIVE_LOW>,
++                 <&gpio3 25 GPIO_ACTIVE_LOW>;
+       status = "okay";
+       /* default boot source: workaround #1 for errata ERR006282 */
+@@ -464,6 +465,8 @@ MX6QDL_PAD_EIM_D22__ECSPI4_MISO 0x100b1
+                       MX6QDL_PAD_EIM_D24__GPIO3_IO24 0x1b0b0
+                       /* SPI_IMX_CS0# - connected to SMARC SPI0_CS0# */
+                       MX6QDL_PAD_EIM_D29__GPIO3_IO29 0x1b0b0
++                      /* SPI4_CS3# - connected to SMARC SPI0_CS1# */
++                      MX6QDL_PAD_EIM_D25__GPIO3_IO25 0x1b0b0
+               >;
+       };
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch b/queue-5.15/arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch
new file mode 100644 (file)
index 0000000..0b4d146
--- /dev/null
@@ -0,0 +1,50 @@
+From 409dc2cf83dcfd84fef8d7a1eae44f86acd6d36c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 Jul 2022 15:05:20 +0200
+Subject: ARM: dts: imx6qdl-kontron-samx6i: move phy reset into phy-node
+
+From: Marco Felsch <m.felsch@pengutronix.de>
+
+[ Upstream commit 5694eed98cca5c164ebb5b831b65b4c9eee4b2d5 ]
+
+Add ethernet-phy node so we can drop the deprecated fec phy-reset-gpios
+property. The reset-assert-us value is taken from the existing logic
+since the fec driver will add an 1ms assert delay per default if
+phy-reset-gpios is used and phy-reset-duration is not specified.
+
+Signed-off-by: Marco Felsch <m.felsch@pengutronix.de>
+Signed-off-by: Shawn Guo <shawnguo@kernel.org>
+Stable-dep-of: edfea889a049 ("ARM: dts: imx6qdl-kontron-samx6i: fix PHY reset")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi | 14 +++++++++++++-
+ 1 file changed, 13 insertions(+), 1 deletion(-)
+
+diff --git a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+index 683f6e58ab230..85aeebc9485dd 100644
+--- a/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
++++ b/arch/arm/boot/dts/imx6qdl-kontron-samx6i.dtsi
+@@ -260,7 +260,19 @@ &fec {
+       pinctrl-names = "default";
+       pinctrl-0 = <&pinctrl_enet>;
+       phy-mode = "rgmii";
+-      phy-reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
++      phy-handle = <&ethphy>;
++
++      mdio {
++              #address-cells = <1>;
++              #size-cells = <0>;
++
++              ethphy: ethernet-phy@1 {
++                      compatible = "ethernet-phy-ieee802.3-c22";
++                      reg = <1>;
++                      reset-gpios = <&gpio1 25 GPIO_ACTIVE_LOW>;
++                      reset-assert-us = <1000>;
++              };
++      };
+ };
+ &hdmi {
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm-pxa-spitz-use-gpio-descriptors-for-audio.patch b/queue-5.15/arm-pxa-spitz-use-gpio-descriptors-for-audio.patch
new file mode 100644 (file)
index 0000000..f8c3dea
--- /dev/null
@@ -0,0 +1,256 @@
+From 5bd78cebfc019bbcbab9cb6e680a35b945126023 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 11 Sep 2019 16:43:59 +0200
+Subject: ARM: pxa: spitz: use gpio descriptors for audio
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 726d8c965bae2d7468445d990849e281dca8cbf7 ]
+
+The audio driver should not use a hardwired gpio number
+from the header. Change it to use a lookup table.
+
+Acked-by: Mark Brown <broonie@kernel.org>
+Cc: alsa-devel@alsa-project.org
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Stable-dep-of: 78ab3d352f29 ("ARM: spitz: fix GPIO assignment for backlight")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-pxa/spitz.c                    | 33 ++++++++++-
+ arch/arm/mach-pxa/{include/mach => }/spitz.h |  2 +-
+ arch/arm/mach-pxa/spitz_pm.c                 |  2 +-
+ sound/soc/pxa/spitz.c                        | 58 ++++++++------------
+ 4 files changed, 57 insertions(+), 38 deletions(-)
+ rename arch/arm/mach-pxa/{include/mach => }/spitz.h (99%)
+
+diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
+index 264de0bc97d68..8f880dbc05fdb 100644
+--- a/arch/arm/mach-pxa/spitz.c
++++ b/arch/arm/mach-pxa/spitz.c
+@@ -43,7 +43,7 @@
+ #include <linux/platform_data/mmc-pxamci.h>
+ #include <linux/platform_data/usb-ohci-pxa27x.h>
+ #include <linux/platform_data/video-pxafb.h>
+-#include <mach/spitz.h>
++#include "spitz.h"
+ #include "sharpsl_pm.h"
+ #include <mach/smemc.h>
+@@ -954,11 +954,42 @@ static void __init spitz_i2c_init(void)
+ static inline void spitz_i2c_init(void) {}
+ #endif
++static struct gpiod_lookup_table spitz_audio_gpio_table = {
++      .dev_id = "spitz-audio",
++      .table = {
++              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE,
++                          "mute-l", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE,
++                          "mute-r", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.1", SPITZ_GPIO_MIC_BIAS - SPITZ_SCP2_GPIO_BASE,
++                          "mic", GPIO_ACTIVE_HIGH),
++              { },
++      },
++};
++
++static struct gpiod_lookup_table akita_audio_gpio_table = {
++      .dev_id = "spitz-audio",
++      .table = {
++              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE,
++                          "mute-l", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE,
++                          "mute-r", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("i2c-max7310", AKITA_GPIO_MIC_BIAS - AKITA_IOEXP_GPIO_BASE,
++                          "mic", GPIO_ACTIVE_HIGH),
++              { },
++      },
++};
++
+ /******************************************************************************
+  * Audio devices
+  ******************************************************************************/
+ static inline void spitz_audio_init(void)
+ {
++      if (machine_is_akita())
++              gpiod_add_lookup_table(&akita_audio_gpio_table);
++      else
++              gpiod_add_lookup_table(&spitz_audio_gpio_table);
++
+       platform_device_register_simple("spitz-audio", -1, NULL, 0);
+ }
+diff --git a/arch/arm/mach-pxa/include/mach/spitz.h b/arch/arm/mach-pxa/spitz.h
+similarity index 99%
+rename from arch/arm/mach-pxa/include/mach/spitz.h
+rename to arch/arm/mach-pxa/spitz.h
+index 04828d8918aa3..f97e3ebd762d5 100644
+--- a/arch/arm/mach-pxa/include/mach/spitz.h
++++ b/arch/arm/mach-pxa/spitz.h
+@@ -11,7 +11,7 @@
+ #define __ASM_ARCH_SPITZ_H  1
+ #endif
+-#include "irqs.h" /* PXA_NR_BUILTIN_GPIO, PXA_GPIO_TO_IRQ */
++#include <mach/irqs.h> /* PXA_NR_BUILTIN_GPIO, PXA_GPIO_TO_IRQ */
+ #include <linux/fb.h>
+ /* Spitz/Akita GPIOs */
+diff --git a/arch/arm/mach-pxa/spitz_pm.c b/arch/arm/mach-pxa/spitz_pm.c
+index 25a1f8c5a7382..6167f96d7b41e 100644
+--- a/arch/arm/mach-pxa/spitz_pm.c
++++ b/arch/arm/mach-pxa/spitz_pm.c
+@@ -20,7 +20,7 @@
+ #include <asm/mach-types.h>
+ #include <mach/hardware.h>
+-#include <mach/spitz.h>
++#include "spitz.h"
+ #include "pxa27x.h"
+ #include "sharpsl_pm.h"
+diff --git a/sound/soc/pxa/spitz.c b/sound/soc/pxa/spitz.c
+index 7c1384a869ca4..44303b6eb228b 100644
+--- a/sound/soc/pxa/spitz.c
++++ b/sound/soc/pxa/spitz.c
+@@ -14,13 +14,12 @@
+ #include <linux/timer.h>
+ #include <linux/interrupt.h>
+ #include <linux/platform_device.h>
+-#include <linux/gpio.h>
++#include <linux/gpio/consumer.h>
+ #include <sound/core.h>
+ #include <sound/pcm.h>
+ #include <sound/soc.h>
+ #include <asm/mach-types.h>
+-#include <mach/spitz.h>
+ #include "../codecs/wm8750.h"
+ #include "pxa2xx-i2s.h"
+@@ -37,7 +36,7 @@
+ static int spitz_jack_func;
+ static int spitz_spk_func;
+-static int spitz_mic_gpio;
++static struct gpio_desc *gpiod_mic, *gpiod_mute_l, *gpiod_mute_r;
+ static void spitz_ext_control(struct snd_soc_dapm_context *dapm)
+ {
+@@ -56,8 +55,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm)
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack");
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
+               snd_soc_dapm_enable_pin_unlocked(dapm, "Headphone Jack");
+-              gpio_set_value(SPITZ_GPIO_MUTE_L, 1);
+-              gpio_set_value(SPITZ_GPIO_MUTE_R, 1);
++              gpiod_set_value(gpiod_mute_l, 1);
++              gpiod_set_value(gpiod_mute_r, 1);
+               break;
+       case SPITZ_MIC:
+               /* enable mic jack and bias, mute hp */
+@@ -65,8 +64,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm)
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
+               snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack");
+-              gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
+-              gpio_set_value(SPITZ_GPIO_MUTE_R, 0);
++              gpiod_set_value(gpiod_mute_l, 0);
++              gpiod_set_value(gpiod_mute_r, 0);
+               break;
+       case SPITZ_LINE:
+               /* enable line jack, disable mic bias and mute hp */
+@@ -74,8 +73,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm)
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack");
+               snd_soc_dapm_enable_pin_unlocked(dapm, "Line Jack");
+-              gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
+-              gpio_set_value(SPITZ_GPIO_MUTE_R, 0);
++              gpiod_set_value(gpiod_mute_l, 0);
++              gpiod_set_value(gpiod_mute_r, 0);
+               break;
+       case SPITZ_HEADSET:
+               /* enable and unmute headset jack enable mic bias, mute L hp */
+@@ -83,8 +82,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm)
+               snd_soc_dapm_enable_pin_unlocked(dapm, "Mic Jack");
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
+               snd_soc_dapm_enable_pin_unlocked(dapm, "Headset Jack");
+-              gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
+-              gpio_set_value(SPITZ_GPIO_MUTE_R, 1);
++              gpiod_set_value(gpiod_mute_l, 0);
++              gpiod_set_value(gpiod_mute_r, 1);
+               break;
+       case SPITZ_HP_OFF:
+@@ -93,8 +92,8 @@ static void spitz_ext_control(struct snd_soc_dapm_context *dapm)
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Headset Jack");
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Mic Jack");
+               snd_soc_dapm_disable_pin_unlocked(dapm, "Line Jack");
+-              gpio_set_value(SPITZ_GPIO_MUTE_L, 0);
+-              gpio_set_value(SPITZ_GPIO_MUTE_R, 0);
++              gpiod_set_value(gpiod_mute_l, 0);
++              gpiod_set_value(gpiod_mute_r, 0);
+               break;
+       }
+@@ -199,7 +198,7 @@ static int spitz_set_spk(struct snd_kcontrol *kcontrol,
+ static int spitz_mic_bias(struct snd_soc_dapm_widget *w,
+       struct snd_kcontrol *k, int event)
+ {
+-      gpio_set_value_cansleep(spitz_mic_gpio, SND_SOC_DAPM_EVENT_ON(event));
++      gpiod_set_value_cansleep(gpiod_mic, SND_SOC_DAPM_EVENT_ON(event));
+       return 0;
+ }
+@@ -287,39 +286,28 @@ static int spitz_probe(struct platform_device *pdev)
+       struct snd_soc_card *card = &snd_soc_spitz;
+       int ret;
+-      if (machine_is_akita())
+-              spitz_mic_gpio = AKITA_GPIO_MIC_BIAS;
+-      else
+-              spitz_mic_gpio = SPITZ_GPIO_MIC_BIAS;
+-
+-      ret = gpio_request(spitz_mic_gpio, "MIC GPIO");
+-      if (ret)
+-              goto err1;
+-
+-      ret = gpio_direction_output(spitz_mic_gpio, 0);
+-      if (ret)
+-              goto err2;
++      gpiod_mic = devm_gpiod_get(&pdev->dev, "mic", GPIOD_OUT_LOW);
++      if (IS_ERR(gpiod_mic))
++              return PTR_ERR(gpiod_mic);
++      gpiod_mute_l = devm_gpiod_get(&pdev->dev, "mute-l", GPIOD_OUT_LOW);
++      if (IS_ERR(gpiod_mute_l))
++              return PTR_ERR(gpiod_mute_l);
++      gpiod_mute_r = devm_gpiod_get(&pdev->dev, "mute-r", GPIOD_OUT_LOW);
++      if (IS_ERR(gpiod_mute_r))
++              return PTR_ERR(gpiod_mute_r);
+       card->dev = &pdev->dev;
+       ret = devm_snd_soc_register_card(&pdev->dev, card);
+-      if (ret) {
++      if (ret)
+               dev_err(&pdev->dev, "snd_soc_register_card() failed: %d\n",
+                       ret);
+-              goto err2;
+-      }
+-
+-      return 0;
+-err2:
+-      gpio_free(spitz_mic_gpio);
+-err1:
+       return ret;
+ }
+ static int spitz_remove(struct platform_device *pdev)
+ {
+-      gpio_free(spitz_mic_gpio);
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm-spitz-fix-gpio-assignment-for-backlight.patch b/queue-5.15/arm-spitz-fix-gpio-assignment-for-backlight.patch
new file mode 100644 (file)
index 0000000..83e019b
--- /dev/null
@@ -0,0 +1,91 @@
+From 225070b50db72083570df70e2211d7e162d78b09 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jun 2024 11:08:41 -0700
+Subject: ARM: spitz: fix GPIO assignment for backlight
+
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+[ Upstream commit 78ab3d352f2982bf3f7e506bfbaba7afee1ed8a9 ]
+
+GPIOs controlling backlight on Spitz and Akita are coming from GPIO
+expanders, not the pxa27xx-gpio block, correct it.
+
+Additionally GPIO lookup tables operate with pin numbers rather than
+legacy GPIO numbers, fix that as well. Use raw numbers instead of legacy
+GPIO names to avoid confusion.
+
+Fixes: ee0c8e494cc3 ("backlight: corgi: Convert to use GPIO descriptors")
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Link: https://lore.kernel.org/r/20240628180852.1738922-2-dmitry.torokhov@gmail.com
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm/mach-pxa/spitz.c | 30 ++++++++++--------------------
+ 1 file changed, 10 insertions(+), 20 deletions(-)
+
+diff --git a/arch/arm/mach-pxa/spitz.c b/arch/arm/mach-pxa/spitz.c
+index 8f880dbc05fdb..9bdc20706d187 100644
+--- a/arch/arm/mach-pxa/spitz.c
++++ b/arch/arm/mach-pxa/spitz.c
+@@ -516,10 +516,8 @@ static struct pxa2xx_spi_chip spitz_ads7846_chip = {
+ static struct gpiod_lookup_table spitz_lcdcon_gpio_table = {
+       .dev_id = "spi2.1",
+       .table = {
+-              GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_CONT,
+-                          "BL_CONT", GPIO_ACTIVE_LOW),
+-              GPIO_LOOKUP("gpio-pxa", SPITZ_GPIO_BACKLIGHT_ON,
+-                          "BL_ON", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.1", 6, "BL_CONT", GPIO_ACTIVE_LOW),
++              GPIO_LOOKUP("sharp-scoop.1", 7, "BL_ON", GPIO_ACTIVE_HIGH),
+               { },
+       },
+ };
+@@ -527,10 +525,8 @@ static struct gpiod_lookup_table spitz_lcdcon_gpio_table = {
+ static struct gpiod_lookup_table akita_lcdcon_gpio_table = {
+       .dev_id = "spi2.1",
+       .table = {
+-              GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_CONT,
+-                          "BL_CONT", GPIO_ACTIVE_LOW),
+-              GPIO_LOOKUP("gpio-pxa", AKITA_GPIO_BACKLIGHT_ON,
+-                          "BL_ON", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("i2c-max7310", 3, "BL_ON", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("i2c-max7310", 4, "BL_CONT", GPIO_ACTIVE_LOW),
+               { },
+       },
+ };
+@@ -957,12 +953,9 @@ static inline void spitz_i2c_init(void) {}
+ static struct gpiod_lookup_table spitz_audio_gpio_table = {
+       .dev_id = "spitz-audio",
+       .table = {
+-              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE,
+-                          "mute-l", GPIO_ACTIVE_HIGH),
+-              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE,
+-                          "mute-r", GPIO_ACTIVE_HIGH),
+-              GPIO_LOOKUP("sharp-scoop.1", SPITZ_GPIO_MIC_BIAS - SPITZ_SCP2_GPIO_BASE,
+-                          "mic", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.0", 3, "mute-l", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.0", 4, "mute-r", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.1", 8, "mic", GPIO_ACTIVE_HIGH),
+               { },
+       },
+ };
+@@ -970,12 +963,9 @@ static struct gpiod_lookup_table spitz_audio_gpio_table = {
+ static struct gpiod_lookup_table akita_audio_gpio_table = {
+       .dev_id = "spitz-audio",
+       .table = {
+-              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_L - SPITZ_SCP_GPIO_BASE,
+-                          "mute-l", GPIO_ACTIVE_HIGH),
+-              GPIO_LOOKUP("sharp-scoop.0", SPITZ_GPIO_MUTE_R - SPITZ_SCP_GPIO_BASE,
+-                          "mute-r", GPIO_ACTIVE_HIGH),
+-              GPIO_LOOKUP("i2c-max7310", AKITA_GPIO_MIC_BIAS - AKITA_IOEXP_GPIO_BASE,
+-                          "mic", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.0", 3, "mute-l", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("sharp-scoop.0", 4, "mute-r", GPIO_ACTIVE_HIGH),
++              GPIO_LOOKUP("i2c-max7310", 2, "mic", GPIO_ACTIVE_HIGH),
+               { },
+       },
+ };
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-amlogic-gx-correct-hdmi-clocks.patch b/queue-5.15/arm64-dts-amlogic-gx-correct-hdmi-clocks.patch
new file mode 100644 (file)
index 0000000..0e84559
--- /dev/null
@@ -0,0 +1,63 @@
+From b9c2b20c22e8d8f172dc132fcf60d00747cd33aa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jun 2024 17:27:30 +0200
+Subject: arm64: dts: amlogic: gx: correct hdmi clocks
+
+From: Jerome Brunet <jbrunet@baylibre.com>
+
+[ Upstream commit 0602ba0dcd0e76067a0b7543e92b2de3fb231073 ]
+
+The clocks provided to HDMI tx are not consistent between gx and g12:
+* gx receives the peripheral clock as 'isfr' while g12 receives it as
+  'iahb'
+* g12 gets the HDMI system clock as 'isfr' but gx does not even get it.
+  It surely needs that clock since the driver is directly poking around
+  the clock controller's registers for that clock.
+
+Align gx SoCs with g12 and provide:
+ * the HDMI peripheral clock as 'iahb'
+ * the HDMI system clock as 'isfr'
+
+Fixes: 6939db7e0dbf ("ARM64: dts: meson-gx: Add support for HDMI output")
+Signed-off-by: Jerome Brunet <jbrunet@baylibre.com>
+Link: https://lore.kernel.org/r/20240626152733.1350376-2-jbrunet@baylibre.com
+Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi | 4 ++--
+ arch/arm64/boot/dts/amlogic/meson-gxl.dtsi  | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
+index 7c029f552a23b..256c46771db78 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-gxbb.dtsi
+@@ -311,8 +311,8 @@ &hdmi_tx {
+                <&reset RESET_HDMI_SYSTEM_RESET>,
+                <&reset RESET_HDMI_TX>;
+       reset-names = "hdmitx_apb", "hdmitx", "hdmitx_phy";
+-      clocks = <&clkc CLKID_HDMI_PCLK>,
+-               <&clkc CLKID_CLK81>,
++      clocks = <&clkc CLKID_HDMI>,
++               <&clkc CLKID_HDMI_PCLK>,
+                <&clkc CLKID_GCLK_VENCI_INT0>;
+       clock-names = "isfr", "iahb", "venci";
+ };
+diff --git a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
+index 3500229350522..a689bd14ece99 100644
+--- a/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
++++ b/arch/arm64/boot/dts/amlogic/meson-gxl.dtsi
+@@ -323,8 +323,8 @@ &hdmi_tx {
+                <&reset RESET_HDMI_SYSTEM_RESET>,
+                <&reset RESET_HDMI_TX>;
+       reset-names = "hdmitx_apb", "hdmitx", "hdmitx_phy";
+-      clocks = <&clkc CLKID_HDMI_PCLK>,
+-               <&clkc CLKID_CLK81>,
++      clocks = <&clkc CLKID_HDMI>,
++               <&clkc CLKID_HDMI_PCLK>,
+                <&clkc CLKID_GCLK_VENCI_INT0>;
+       clock-names = "isfr", "iahb", "venci";
+ };
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch b/queue-5.15/arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch
new file mode 100644 (file)
index 0000000..e91643c
--- /dev/null
@@ -0,0 +1,66 @@
+From 242eb9f841d5ab64a3ac071b81563759eb389771 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Jun 2024 09:49:16 +0200
+Subject: arm64: dts: mediatek: mt7622: fix "emmc" pinctrl mux
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Rafał Miłecki <rafal@milecki.pl>
+
+[ Upstream commit aebba1030a5766cdf894ed4ab0cac7aed5aee9c1 ]
+
+Value "emmc_rst" is a group name and should be part of the "groups"
+property.
+
+This fixes:
+arch/arm64/boot/dts/mediatek/mt7622-rfb1.dtb: pinctrl@10211000: emmc-pins-default:mux:function: ['emmc', 'emmc_rst'] is too long
+        from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt7622-pinctrl.yaml#
+arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dtb: pinctrl@10211000: emmc-pins-default:mux:function: ['emmc', 'emmc_rst'] is too long
+        from schema $id: http://devicetree.org/schemas/pinctrl/mediatek,mt7622-pinctrl.yaml#
+
+Fixes: 3725ba3f5574 ("arm64: dts: mt7622: add pinctrl related device nodes")
+Fixes: 0b6286dd96c0 ("arm64: dts: mt7622: add bananapi BPI-R64 board")
+Signed-off-by: Rafał Miłecki <rafal@milecki.pl>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Link: https://lore.kernel.org/r/20240604074916.7929-1-zajec5@gmail.com
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts | 4 ++--
+ arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts             | 4 ++--
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts
+index 483f7ab4f31c7..b4aa9a9712fe5 100644
+--- a/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts
++++ b/arch/arm64/boot/dts/mediatek/mt7622-bananapi-bpi-r64.dts
+@@ -285,8 +285,8 @@ asm_sel {
+       /* eMMC is shared pin with parallel NAND */
+       emmc_pins_default: emmc-pins-default {
+               mux {
+-                      function = "emmc", "emmc_rst";
+-                      groups = "emmc";
++                      function = "emmc";
++                      groups = "emmc", "emmc_rst";
+               };
+               /* "NDL0","NDL1","NDL2","NDL3","NDL4","NDL5","NDL6","NDL7",
+diff --git a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts
+index 28e17a7e2a5a6..e1ad840dc3175 100644
+--- a/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts
++++ b/arch/arm64/boot/dts/mediatek/mt7622-rfb1.dts
+@@ -249,8 +249,8 @@ &pio {
+       /* eMMC is shared pin with parallel NAND */
+       emmc_pins_default: emmc-pins-default {
+               mux {
+-                      function = "emmc", "emmc_rst";
+-                      groups = "emmc";
++                      function = "emmc";
++                      groups = "emmc", "emmc_rst";
+               };
+               /* "NDL0","NDL1","NDL2","NDL3","NDL4","NDL5","NDL6","NDL7",
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch b/queue-5.15/arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch
new file mode 100644 (file)
index 0000000..813732b
--- /dev/null
@@ -0,0 +1,51 @@
+From 2001174c3c326406a8595d981981c619c26fa84d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Apr 2024 15:56:12 +0800
+Subject: arm64: dts: mediatek: mt8183-kukui: Drop bogus output-enable property
+
+From: Chen-Yu Tsai <wenst@chromium.org>
+
+[ Upstream commit e9a9055fdcdc1e5a27cef118c5b4f09cdd2fa28e ]
+
+The "output-enable" property is set on uart1's RTS pin. This is bogus
+because the hardware does not actually have a controllable output
+buffer. Secondly, the implementation incorrectly treats this property
+as a request to switch the pin to GPIO output. This does not fit the
+intended semantic of "output-enable" and it does not have any affect
+either because the pin is muxed to the UART function, not the GPIO
+function.
+
+Drop the property.
+
+Fixes: cd894e274b74 ("arm64: dts: mt8183: Add krane-sku176 board")
+Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
+Link: https://lore.kernel.org/r/20240412075613.1200048-1-wenst@chromium.org
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi | 2 --
+ 1 file changed, 2 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+index 22a1c66325c29..5e77f3b1b84be 100644
+--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
++++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui.dtsi
+@@ -703,7 +703,6 @@ pins-tx {
+               };
+               pins-rts {
+                       pinmux = <PINMUX_GPIO47__FUNC_URTS1>;
+-                      output-enable;
+               };
+               pins-cts {
+                       pinmux = <PINMUX_GPIO46__FUNC_UCTS1>;
+@@ -722,7 +721,6 @@ pins-tx {
+               };
+               pins-rts {
+                       pinmux = <PINMUX_GPIO47__FUNC_URTS1>;
+-                      output-enable;
+               };
+               pins-cts {
+                       pinmux = <PINMUX_GPIO46__FUNC_UCTS1>;
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-mediatek-mt8183-kukui-jacuzzi-add-ports-no.patch b/queue-5.15/arm64-dts-mediatek-mt8183-kukui-jacuzzi-add-ports-no.patch
new file mode 100644 (file)
index 0000000..73b9b6a
--- /dev/null
@@ -0,0 +1,69 @@
+From f4aa463218492b0c9e3080748353a53fa79f46b1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 31 Jan 2024 16:39:29 +0800
+Subject: arm64: dts: mediatek: mt8183-kukui-jacuzzi: Add ports node for
+ anx7625
+
+From: Chen-Yu Tsai <wenst@chromium.org>
+
+[ Upstream commit 4055416e6c51347e7dd5784065263fe0ced0bb7d ]
+
+The anx7625 binding requires a "ports" node as a container for the
+"port" nodes. The jacuzzi dtsi file is missing it.
+
+Add a "ports" node under the anx7625 node, and move the port related
+nodes and properties under it.
+
+Fixes: cabc71b08eb5 ("arm64: dts: mt8183: Add kukui-jacuzzi-damu board")
+Signed-off-by: Chen-Yu Tsai <wenst@chromium.org>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Link: https://lore.kernel.org/r/20240131083931.3970388-1-wenst@chromium.org
+Signed-off-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../dts/mediatek/mt8183-kukui-jacuzzi.dtsi    | 25 +++++++++++--------
+ 1 file changed, 14 insertions(+), 11 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi
+index 88fca67dead01..13757d7ac792a 100644
+--- a/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi
++++ b/arch/arm64/boot/dts/mediatek/mt8183-kukui-jacuzzi.dtsi
+@@ -169,21 +169,24 @@ anx_bridge: anx7625@58 {
+               vdd18-supply = <&pp1800_mipibrdg>;
+               vdd33-supply = <&vddio_mipibrdg>;
+-              #address-cells = <1>;
+-              #size-cells = <0>;
+-              port@0 {
+-                      reg = <0>;
++              ports {
++                      #address-cells = <1>;
++                      #size-cells = <0>;
+-                      anx7625_in: endpoint {
+-                              remote-endpoint = <&dsi_out>;
++                      port@0 {
++                              reg = <0>;
++
++                              anx7625_in: endpoint {
++                                      remote-endpoint = <&dsi_out>;
++                              };
+                       };
+-              };
+-              port@1 {
+-                      reg = <1>;
++                      port@1 {
++                              reg = <1>;
+-                      anx7625_out: endpoint {
+-                              remote-endpoint = <&panel_in>;
++                              anx7625_out: endpoint {
++                                      remote-endpoint = <&panel_in>;
++                              };
+                       };
+               };
+       };
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch b/queue-5.15/arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch
new file mode 100644 (file)
index 0000000..c26b992
--- /dev/null
@@ -0,0 +1,42 @@
+From 63aef2c63d17fc9a3061b3eee80bffed9701aefd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Apr 2024 03:04:31 +0300
+Subject: arm64: dts: qcom: msm8996: specify UFS core_clk frequencies
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit 02f838b7f8cdfb7a96b7f08e7f6716f230bdecba ]
+
+Follow the example of other platforms and specify core_clk frequencies
+in the frequency table in addition to the core_clk_src frequencies. The
+driver should be setting the leaf frequency instead of some interim
+clock freq.
+
+Suggested-by: Nitin Rawat <quic_nitirawa@quicinc.com>
+Fixes: 57fc67ef0d35 ("arm64: dts: qcom: msm8996: Add ufs related nodes")
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Reviewed-by: Manivannan Sadhasivam <manivannan.sadhasivam@linaro.org>
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20240408-msm8996-fix-ufs-v4-1-ee1a28bf8579@linaro.org
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/msm8996.dtsi | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/msm8996.dtsi b/arch/arm64/boot/dts/qcom/msm8996.dtsi
+index 8b3e753c1a2a1..210016ff50449 100644
+--- a/arch/arm64/boot/dts/qcom/msm8996.dtsi
++++ b/arch/arm64/boot/dts/qcom/msm8996.dtsi
+@@ -1756,7 +1756,7 @@ ufshc: ufshc@624000 {
+                               <&gcc GCC_UFS_RX_SYMBOL_0_CLK>;
+                       freq-table-hz =
+                               <100000000 200000000>,
+-                              <0 0>,
++                              <100000000 200000000>,
+                               <0 0>,
+                               <0 0>,
+                               <0 0>,
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch b/queue-5.15/arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch
new file mode 100644 (file)
index 0000000..78580ba
--- /dev/null
@@ -0,0 +1,38 @@
+From e024854a0424591002c5bbd14f7dbbdc24f7c15e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 May 2024 19:19:32 +0300
+Subject: arm64: dts: qcom: sdm845: add power-domain to UFS PHY
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit fd39ae8b9bc10419b1e4b849cdbc6755a967ade1 ]
+
+The UFS PHY is powered on via the UFS_PHY_GDSC power domain. Add
+corresponding power-domain the the PHY node.
+
+Fixes: cc16687fbd74 ("arm64: dts: qcom: sdm845: add UFS controller")
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Link: https://lore.kernel.org/r/20240501-qcom-phy-fixes-v1-6-f1fd15c33fb3@linaro.org
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/sdm845.dtsi | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/qcom/sdm845.dtsi b/arch/arm64/boot/dts/qcom/sdm845.dtsi
+index 6f7061c878e4a..cff5423e9c88d 100644
+--- a/arch/arm64/boot/dts/qcom/sdm845.dtsi
++++ b/arch/arm64/boot/dts/qcom/sdm845.dtsi
+@@ -2299,6 +2299,8 @@ ufs_mem_phy: phy@1d87000 {
+                       clocks = <&gcc GCC_UFS_MEM_CLKREF_CLK>,
+                                <&gcc GCC_UFS_PHY_PHY_AUX_CLK>;
++                      power-domains = <&gcc UFS_PHY_GDSC>;
++
+                       resets = <&ufs_mem_hc 0>;
+                       reset-names = "ufsphy";
+                       status = "disabled";
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-qcom-sm8250-add-power-domain-to-ufs-phy.patch b/queue-5.15/arm64-dts-qcom-sm8250-add-power-domain-to-ufs-phy.patch
new file mode 100644 (file)
index 0000000..705b19a
--- /dev/null
@@ -0,0 +1,38 @@
+From 95b6ed702ed4433f53fc2f3f2fa11edde2f12f19 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 1 May 2024 19:19:35 +0300
+Subject: arm64: dts: qcom: sm8250: add power-domain to UFS PHY
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit 154ed5ea328d8a97a4ef5d1447e6f06d11fe2bbe ]
+
+The UFS PHY is powered on via the UFS_PHY_GDSC power domain. Add
+corresponding power-domain the the PHY node.
+
+Fixes: b7e2fba06622 ("arm64: dts: qcom: sm8250: Add UFS controller and PHY")
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Link: https://lore.kernel.org/r/20240501-qcom-phy-fixes-v1-9-f1fd15c33fb3@linaro.org
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/sm8250.dtsi | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi
+index 71705b760c8b1..5f504569731a9 100644
+--- a/arch/arm64/boot/dts/qcom/sm8250.dtsi
++++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi
+@@ -1756,6 +1756,8 @@ ufs_mem_phy: phy@1d87000 {
+                       resets = <&ufs_mem_hc 0>;
+                       reset-names = "ufsphy";
++                      power-domains = <&gcc UFS_PHY_GDSC>;
++
+                       #phy-cells = <0>;
+                       status = "disabled";
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-qcom-sm8250-switch-ufs-qmp-phy-to-new-styl.patch b/queue-5.15/arm64-dts-qcom-sm8250-switch-ufs-qmp-phy-to-new-styl.patch
new file mode 100644 (file)
index 0000000..2a30c91
--- /dev/null
@@ -0,0 +1,71 @@
+From b83c1a5f6e0ce87a7ad35fe365e04bc695e62a1e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 5 Dec 2023 06:25:50 +0300
+Subject: arm64: dts: qcom: sm8250: switch UFS QMP PHY to new style of bindings
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit ba865bdcc688932980b8e5ec2154eaa33cd4a981 ]
+
+Change the UFS QMP PHY to use newer style of QMP PHY bindings (single
+resource region, no per-PHY subnodes).
+
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20231205032552.1583336-8-dmitry.baryshkov@linaro.org
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Stable-dep-of: 154ed5ea328d ("arm64: dts: qcom: sm8250: add power-domain to UFS PHY")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/qcom/sm8250.dtsi | 20 ++++++--------------
+ 1 file changed, 6 insertions(+), 14 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/qcom/sm8250.dtsi b/arch/arm64/boot/dts/qcom/sm8250.dtsi
+index 8880e9cbc9743..71705b760c8b1 100644
+--- a/arch/arm64/boot/dts/qcom/sm8250.dtsi
++++ b/arch/arm64/boot/dts/qcom/sm8250.dtsi
+@@ -1702,7 +1702,7 @@ ufs_mem_hc: ufshc@1d84000 {
+                                    "jedec,ufs-2.0";
+                       reg = <0 0x01d84000 0 0x3000>;
+                       interrupts = <GIC_SPI 265 IRQ_TYPE_LEVEL_HIGH>;
+-                      phys = <&ufs_mem_phy_lanes>;
++                      phys = <&ufs_mem_phy>;
+                       phy-names = "ufsphy";
+                       lanes-per-direction = <2>;
+                       #reset-cells = <1>;
+@@ -1746,10 +1746,8 @@ ufs_mem_hc: ufshc@1d84000 {
+               ufs_mem_phy: phy@1d87000 {
+                       compatible = "qcom,sm8250-qmp-ufs-phy";
+-                      reg = <0 0x01d87000 0 0x1c0>;
+-                      #address-cells = <2>;
+-                      #size-cells = <2>;
+-                      ranges;
++                      reg = <0 0x01d87000 0 0x1000>;
++
+                       clock-names = "ref",
+                                     "ref_aux";
+                       clocks = <&rpmhcc RPMH_CXO_CLK>,
+@@ -1757,16 +1755,10 @@ ufs_mem_phy: phy@1d87000 {
+                       resets = <&ufs_mem_hc 0>;
+                       reset-names = "ufsphy";
+-                      status = "disabled";
+-                      ufs_mem_phy_lanes: phy@1d87400 {
+-                              reg = <0 0x01d87400 0 0x16c>,
+-                                    <0 0x01d87600 0 0x200>,
+-                                    <0 0x01d87c00 0 0x200>,
+-                                    <0 0x01d87800 0 0x16c>,
+-                                    <0 0x01d87a00 0 0x200>;
+-                              #phy-cells = <0>;
+-                      };
++                      #phy-cells = <0>;
++
++                      status = "disabled";
+               };
+               ipa_virt: interconnect@1e00000 {
+-- 
+2.43.0
+
diff --git a/queue-5.15/arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch b/queue-5.15/arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch
new file mode 100644 (file)
index 0000000..bab39b1
--- /dev/null
@@ -0,0 +1,42 @@
+From e81ad10bf2afef2ee1622eb344ac1c3779f3f76c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 15 Jun 2024 17:03:52 +0000
+Subject: arm64: dts: rockchip: Increase VOP clk rate on RK3328
+
+From: Jonas Karlman <jonas@kwiboo.se>
+
+[ Upstream commit 0f2ddb128fa20f8441d903285632f2c69e90fae1 ]
+
+The VOP on RK3328 needs to run at a higher rate in order to produce a
+proper 3840x2160 signal.
+
+Change to use 300MHz for VIO clk and 400MHz for VOP clk, same rates used
+by vendor 4.4 kernel.
+
+Fixes: 52e02d377a72 ("arm64: dts: rockchip: add core dtsi file for RK3328 SoCs")
+Signed-off-by: Jonas Karlman <jonas@kwiboo.se>
+Link: https://lore.kernel.org/r/20240615170417.3134517-2-jonas@kwiboo.se
+Signed-off-by: Heiko Stuebner <heiko@sntech.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/arm64/boot/dts/rockchip/rk3328.dtsi | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/arm64/boot/dts/rockchip/rk3328.dtsi b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+index 26f02cc70dc5d..21755dd5b4c45 100644
+--- a/arch/arm64/boot/dts/rockchip/rk3328.dtsi
++++ b/arch/arm64/boot/dts/rockchip/rk3328.dtsi
+@@ -807,8 +807,8 @@ cru: clock-controller@ff440000 {
+                       <0>, <24000000>,
+                       <24000000>, <24000000>,
+                       <15000000>, <15000000>,
+-                      <100000000>, <100000000>,
+-                      <100000000>, <100000000>,
++                      <300000000>, <100000000>,
++                      <400000000>, <100000000>,
+                       <50000000>, <100000000>,
+                       <100000000>, <100000000>,
+                       <50000000>, <50000000>,
+-- 
+2.43.0
+
diff --git a/queue-5.15/asoc-max98088-check-for-clk_prepare_enable-error.patch b/queue-5.15/asoc-max98088-check-for-clk_prepare_enable-error.patch
new file mode 100644 (file)
index 0000000..14b5a6b
--- /dev/null
@@ -0,0 +1,53 @@
+From abf57e594cc767551201579a63bbc3e22fdb68b4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jun 2024 16:05:34 +0800
+Subject: ASoC: max98088: Check for clk_prepare_enable() error
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 1a70579723fde3624a72dfea6e79e55be6e36659 ]
+
+clk_prepare_enable() may fail, so we should better check its return
+value and propagate it in the case of error.
+
+Fixes: 62a7fc32a628 ("ASoC: max98088: Add master clock handling")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Link: https://patch.msgid.link/20240628080534.843815-1-nichen@iscas.ac.cn
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/max98088.c | 10 +++++++---
+ 1 file changed, 7 insertions(+), 3 deletions(-)
+
+diff --git a/sound/soc/codecs/max98088.c b/sound/soc/codecs/max98088.c
+index f8e49e45ce33f..a71fbfddc29a7 100644
+--- a/sound/soc/codecs/max98088.c
++++ b/sound/soc/codecs/max98088.c
+@@ -1319,6 +1319,7 @@ static int max98088_set_bias_level(struct snd_soc_component *component,
+                                   enum snd_soc_bias_level level)
+ {
+       struct max98088_priv *max98088 = snd_soc_component_get_drvdata(component);
++      int ret;
+       switch (level) {
+       case SND_SOC_BIAS_ON:
+@@ -1334,10 +1335,13 @@ static int max98088_set_bias_level(struct snd_soc_component *component,
+                */
+               if (!IS_ERR(max98088->mclk)) {
+                       if (snd_soc_component_get_bias_level(component) ==
+-                          SND_SOC_BIAS_ON)
++                          SND_SOC_BIAS_ON) {
+                               clk_disable_unprepare(max98088->mclk);
+-                      else
+-                              clk_prepare_enable(max98088->mclk);
++                      } else {
++                              ret = clk_prepare_enable(max98088->mclk);
++                              if (ret)
++                                      return ret;
++                      }
+               }
+               break;
+-- 
+2.43.0
+
diff --git a/queue-5.15/block-cleanup-bio_integrity_prep.patch b/queue-5.15/block-cleanup-bio_integrity_prep.patch
new file mode 100644 (file)
index 0000000..e077ad0
--- /dev/null
@@ -0,0 +1,71 @@
+From 26c15ddaee916964bce18ce740f382e8d7c1daa1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jul 2023 14:18:39 +0900
+Subject: block: cleanup bio_integrity_prep
+
+From: Jinyoung Choi <j-young.choi@samsung.com>
+
+[ Upstream commit 51d74ec9b62f5813767a60226acaf943e26e7d7a ]
+
+If a problem occurs in the process of creating an integrity payload, the
+status of bio is always BLK_STS_RESOURCE.
+
+Reviewed-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Jinyoung Choi <j-young.choi@samsung.com>
+Reviewed-by: "Martin K. Petersen" <martin.petersen@oracle.com>
+Link: https://lore.kernel.org/r/20230725051839epcms2p8e4d20ad6c51326ad032e8406f59d0aaa@epcms2p8
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Stable-dep-of: 899ee2c3829c ("block: initialize integrity buffer to zero before writing it to media")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ block/bio-integrity.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/block/bio-integrity.c b/block/bio-integrity.c
+index a11c4cac269f1..3693daa1c894e 100644
+--- a/block/bio-integrity.c
++++ b/block/bio-integrity.c
+@@ -203,7 +203,6 @@ bool bio_integrity_prep(struct bio *bio)
+       unsigned long start, end;
+       unsigned int len, nr_pages;
+       unsigned int bytes, offset, i;
+-      blk_status_t status;
+       if (!bi)
+               return true;
+@@ -231,7 +230,6 @@ bool bio_integrity_prep(struct bio *bio)
+       /* Allocate kernel buffer for protection data */
+       len = bio_integrity_bytes(bi, bio_sectors(bio));
+       buf = kmalloc(len, GFP_NOIO);
+-      status = BLK_STS_RESOURCE;
+       if (unlikely(buf == NULL)) {
+               printk(KERN_ERR "could not allocate integrity buffer\n");
+               goto err_end_io;
+@@ -246,7 +244,6 @@ bool bio_integrity_prep(struct bio *bio)
+       if (IS_ERR(bip)) {
+               printk(KERN_ERR "could not allocate data integrity bioset\n");
+               kfree(buf);
+-              status = BLK_STS_RESOURCE;
+               goto err_end_io;
+       }
+@@ -274,7 +271,6 @@ bool bio_integrity_prep(struct bio *bio)
+               if (ret == 0) {
+                       printk(KERN_ERR "could not attach integrity payload\n");
+-                      status = BLK_STS_RESOURCE;
+                       goto err_end_io;
+               }
+@@ -296,7 +292,7 @@ bool bio_integrity_prep(struct bio *bio)
+       return true;
+ err_end_io:
+-      bio->bi_status = status;
++      bio->bi_status = BLK_STS_RESOURCE;
+       bio_endio(bio);
+       return false;
+-- 
+2.43.0
+
diff --git a/queue-5.15/block-initialize-integrity-buffer-to-zero-before-wri.patch b/queue-5.15/block-initialize-integrity-buffer-to-zero-before-wri.patch
new file mode 100644 (file)
index 0000000..370e0cc
--- /dev/null
@@ -0,0 +1,64 @@
+From 97cc35196930ee25f7b4f56ea01890dafc7cce6a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Jun 2024 10:48:11 +0200
+Subject: block: initialize integrity buffer to zero before writing it to media
+
+From: Christoph Hellwig <hch@lst.de>
+
+[ Upstream commit 899ee2c3829c5ac14bfc7d3c4a5846c0b709b78f ]
+
+Metadata added by bio_integrity_prep is using plain kmalloc, which leads
+to random kernel memory being written media.  For PI metadata this is
+limited to the app tag that isn't used by kernel generated metadata,
+but for non-PI metadata the entire buffer leaks kernel memory.
+
+Fix this by adding the __GFP_ZERO flag to allocations for writes.
+
+Fixes: 7ba1ba12eeef ("block: Block layer data integrity support")
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Reviewed-by: Martin K. Petersen <martin.petersen@oracle.com>
+Reviewed-by: Kanchan Joshi <joshi.k@samsung.com>
+Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
+Link: https://lore.kernel.org/r/20240613084839.1044015-2-hch@lst.de
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ block/bio-integrity.c | 11 ++++++++++-
+ 1 file changed, 10 insertions(+), 1 deletion(-)
+
+diff --git a/block/bio-integrity.c b/block/bio-integrity.c
+index 3693daa1c894e..bb364a25ac869 100644
+--- a/block/bio-integrity.c
++++ b/block/bio-integrity.c
+@@ -203,6 +203,7 @@ bool bio_integrity_prep(struct bio *bio)
+       unsigned long start, end;
+       unsigned int len, nr_pages;
+       unsigned int bytes, offset, i;
++      gfp_t gfp = GFP_NOIO;
+       if (!bi)
+               return true;
+@@ -225,11 +226,19 @@ bool bio_integrity_prep(struct bio *bio)
+               if (!bi->profile->generate_fn ||
+                   !(bi->flags & BLK_INTEGRITY_GENERATE))
+                       return true;
++
++              /*
++               * Zero the memory allocated to not leak uninitialized kernel
++               * memory to disk.  For PI this only affects the app tag, but
++               * for non-integrity metadata it affects the entire metadata
++               * buffer.
++               */
++              gfp |= __GFP_ZERO;
+       }
+       /* Allocate kernel buffer for protection data */
+       len = bio_integrity_bytes(bi, bio_sectors(bio));
+-      buf = kmalloc(len, GFP_NOIO);
++      buf = kmalloc(len, gfp);
+       if (unlikely(buf == NULL)) {
+               printk(KERN_ERR "could not allocate integrity buffer\n");
+               goto err_end_io;
+-- 
+2.43.0
+
diff --git a/queue-5.15/block-refactor-to-use-helper.patch b/queue-5.15/block-refactor-to-use-helper.patch
new file mode 100644 (file)
index 0000000..7480202
--- /dev/null
@@ -0,0 +1,48 @@
+From 1290f463ddddd8ed468468d471340c49abe3e52b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Jul 2023 17:46:08 +0530
+Subject: block: refactor to use helper
+
+From: Nitesh Shetty <nj.shetty@samsung.com>
+
+[ Upstream commit 8f63fef5867fb5e8c29d9c14b6d739bfc1869d32 ]
+
+Reduce some code by making use of bio_integrity_bytes().
+
+Signed-off-by: Nitesh Shetty <nj.shetty@samsung.com>
+Reviewed-by: "Martin K. Petersen" <martin.petersen@oracle.com>
+Link: https://lore.kernel.org/r/20230719121608.32105-1-nj.shetty@samsung.com
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Stable-dep-of: 899ee2c3829c ("block: initialize integrity buffer to zero before writing it to media")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ block/bio-integrity.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/block/bio-integrity.c b/block/bio-integrity.c
+index 4f34ac27c47dd..a11c4cac269f1 100644
+--- a/block/bio-integrity.c
++++ b/block/bio-integrity.c
+@@ -203,7 +203,6 @@ bool bio_integrity_prep(struct bio *bio)
+       unsigned long start, end;
+       unsigned int len, nr_pages;
+       unsigned int bytes, offset, i;
+-      unsigned int intervals;
+       blk_status_t status;
+       if (!bi)
+@@ -228,10 +227,9 @@ bool bio_integrity_prep(struct bio *bio)
+                   !(bi->flags & BLK_INTEGRITY_GENERATE))
+                       return true;
+       }
+-      intervals = bio_integrity_intervals(bi, bio_sectors(bio));
+       /* Allocate kernel buffer for protection data */
+-      len = intervals * bi->tuple_size;
++      len = bio_integrity_bytes(bi, bio_sectors(bio));
+       buf = kmalloc(len, GFP_NOIO);
+       status = BLK_STS_RESOURCE;
+       if (unlikely(buf == NULL)) {
+-- 
+2.43.0
+
diff --git a/queue-5.15/bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch b/queue-5.15/bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch
new file mode 100644 (file)
index 0000000..df8ee74
--- /dev/null
@@ -0,0 +1,77 @@
+From 44010303e45622329fcd0f38ec52c3d03290e583 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jul 2024 10:50:08 +0000
+Subject: bna: adjust 'name' buf size of bna_tcb and bna_ccb structures
+
+From: Alexey Kodanev <aleksei.kodanev@bell-sw.com>
+
+[ Upstream commit c9741a03dc8e491e57b95fba0058ab46b7e506da ]
+
+To have enough space to write all possible sprintf() args. Currently
+'name' size is 16, but the first '%s' specifier may already need at
+least 16 characters, since 'bnad->netdev->name' is used there.
+
+For '%d' specifiers, assume that they require:
+ * 1 char for 'tx_id + tx_info->tcb[i]->id' sum, BNAD_MAX_TXQ_PER_TX is 8
+ * 2 chars for 'rx_id + rx_info->rx_ctrl[i].ccb->id', BNAD_MAX_RXP_PER_RX
+   is 16
+
+And replace sprintf with snprintf.
+
+Detected using the static analysis tool - Svace.
+
+Fixes: 8b230ed8ec96 ("bna: Brocade 10Gb Ethernet device driver")
+Signed-off-by: Alexey Kodanev <aleksei.kodanev@bell-sw.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/brocade/bna/bna_types.h |  2 +-
+ drivers/net/ethernet/brocade/bna/bnad.c      | 11 ++++++-----
+ 2 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/brocade/bna/bna_types.h b/drivers/net/ethernet/brocade/bna/bna_types.h
+index 666b6922e24db..ebf54d74c2bbe 100644
+--- a/drivers/net/ethernet/brocade/bna/bna_types.h
++++ b/drivers/net/ethernet/brocade/bna/bna_types.h
+@@ -410,7 +410,7 @@ struct bna_ib {
+ /* Tx object */
+ /* Tx datapath control structure */
+-#define BNA_Q_NAME_SIZE               16
++#define BNA_Q_NAME_SIZE               (IFNAMSIZ + 6)
+ struct bna_tcb {
+       /* Fast path */
+       void                    **sw_qpt;
+diff --git a/drivers/net/ethernet/brocade/bna/bnad.c b/drivers/net/ethernet/brocade/bna/bnad.c
+index 0347c9d3aff32..a3b6b9af0b057 100644
+--- a/drivers/net/ethernet/brocade/bna/bnad.c
++++ b/drivers/net/ethernet/brocade/bna/bnad.c
+@@ -1535,8 +1535,9 @@ bnad_tx_msix_register(struct bnad *bnad, struct bnad_tx_info *tx_info,
+       for (i = 0; i < num_txqs; i++) {
+               vector_num = tx_info->tcb[i]->intr_vector;
+-              sprintf(tx_info->tcb[i]->name, "%s TXQ %d", bnad->netdev->name,
+-                              tx_id + tx_info->tcb[i]->id);
++              snprintf(tx_info->tcb[i]->name, BNA_Q_NAME_SIZE, "%s TXQ %d",
++                       bnad->netdev->name,
++                       tx_id + tx_info->tcb[i]->id);
+               err = request_irq(bnad->msix_table[vector_num].vector,
+                                 (irq_handler_t)bnad_msix_tx, 0,
+                                 tx_info->tcb[i]->name,
+@@ -1586,9 +1587,9 @@ bnad_rx_msix_register(struct bnad *bnad, struct bnad_rx_info *rx_info,
+       for (i = 0; i < num_rxps; i++) {
+               vector_num = rx_info->rx_ctrl[i].ccb->intr_vector;
+-              sprintf(rx_info->rx_ctrl[i].ccb->name, "%s CQ %d",
+-                      bnad->netdev->name,
+-                      rx_id + rx_info->rx_ctrl[i].ccb->id);
++              snprintf(rx_info->rx_ctrl[i].ccb->name, BNA_Q_NAME_SIZE,
++                       "%s CQ %d", bnad->netdev->name,
++                       rx_id + rx_info->rx_ctrl[i].ccb->id);
+               err = request_irq(bnad->msix_table[vector_num].vector,
+                                 (irq_handler_t)bnad_msix_rx, 0,
+                                 rx_info->rx_ctrl[i].ccb->name,
+-- 
+2.43.0
+
diff --git a/queue-5.15/bnxt_re-fix-imm_data-endianness.patch b/queue-5.15/bnxt_re-fix-imm_data-endianness.patch
new file mode 100644 (file)
index 0000000..fc80afa
--- /dev/null
@@ -0,0 +1,105 @@
+From bc26b40c3278748cd78b6119c01ec916169be69d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jul 2024 14:21:02 +0200
+Subject: bnxt_re: Fix imm_data endianness
+
+From: Jack Wang <jinpu.wang@ionos.com>
+
+[ Upstream commit 95b087f87b780daafad1dbb2c84e81b729d5d33f ]
+
+When map a device between servers with MLX and BCM RoCE nics, RTRS
+server complain about unknown imm type, and can't map the device,
+
+After more debug, it seems bnxt_re wrongly handle the
+imm_data, this patch fixed the compat issue with MLX for us.
+
+In off list discussion, Selvin confirmed HW is working in little endian format
+and all data needs to be converted to LE while providing.
+
+This patch fix the endianness for imm_data
+
+Fixes: 1ac5a4047975 ("RDMA/bnxt_re: Add bnxt_re RoCE driver")
+Signed-off-by: Jack Wang <jinpu.wang@ionos.com>
+Link: https://lore.kernel.org/r/20240710122102.37569-1-jinpu.wang@ionos.com
+Acked-by: Selvin Xavier <selvin.xavier@broadcom.com>
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/bnxt_re/ib_verbs.c | 8 ++++----
+ drivers/infiniband/hw/bnxt_re/qplib_fp.h | 6 +++---
+ 2 files changed, 7 insertions(+), 7 deletions(-)
+
+diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+index 91b71fa3c1216..e29894197f5ca 100644
+--- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
++++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
+@@ -2354,7 +2354,7 @@ static int bnxt_re_build_send_wqe(struct bnxt_re_qp *qp,
+               break;
+       case IB_WR_SEND_WITH_IMM:
+               wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_IMM;
+-              wqe->send.imm_data = wr->ex.imm_data;
++              wqe->send.imm_data = be32_to_cpu(wr->ex.imm_data);
+               break;
+       case IB_WR_SEND_WITH_INV:
+               wqe->type = BNXT_QPLIB_SWQE_TYPE_SEND_WITH_INV;
+@@ -2384,7 +2384,7 @@ static int bnxt_re_build_rdma_wqe(const struct ib_send_wr *wr,
+               break;
+       case IB_WR_RDMA_WRITE_WITH_IMM:
+               wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_WRITE_WITH_IMM;
+-              wqe->rdma.imm_data = wr->ex.imm_data;
++              wqe->rdma.imm_data = be32_to_cpu(wr->ex.imm_data);
+               break;
+       case IB_WR_RDMA_READ:
+               wqe->type = BNXT_QPLIB_SWQE_TYPE_RDMA_READ;
+@@ -3334,7 +3334,7 @@ static void bnxt_re_process_res_shadow_qp_wc(struct bnxt_re_qp *gsi_sqp,
+       wc->byte_len = orig_cqe->length;
+       wc->qp = &gsi_qp->ib_qp;
+-      wc->ex.imm_data = orig_cqe->immdata;
++      wc->ex.imm_data = cpu_to_be32(le32_to_cpu(orig_cqe->immdata));
+       wc->src_qp = orig_cqe->src_qp;
+       memcpy(wc->smac, orig_cqe->smac, ETH_ALEN);
+       if (bnxt_re_is_vlan_pkt(orig_cqe, &vlan_id, &sl)) {
+@@ -3470,7 +3470,7 @@ int bnxt_re_poll_cq(struct ib_cq *ib_cq, int num_entries, struct ib_wc *wc)
+                                (unsigned long)(cqe->qp_handle),
+                                struct bnxt_re_qp, qplib_qp);
+                       wc->qp = &qp->ib_qp;
+-                      wc->ex.imm_data = cqe->immdata;
++                      wc->ex.imm_data = cpu_to_be32(le32_to_cpu(cqe->immdata));
+                       wc->src_qp = cqe->src_qp;
+                       memcpy(wc->smac, cqe->smac, ETH_ALEN);
+                       wc->port_num = 1;
+diff --git a/drivers/infiniband/hw/bnxt_re/qplib_fp.h b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
+index 49d89c0808275..4f1a845f9be6c 100644
+--- a/drivers/infiniband/hw/bnxt_re/qplib_fp.h
++++ b/drivers/infiniband/hw/bnxt_re/qplib_fp.h
+@@ -164,7 +164,7 @@ struct bnxt_qplib_swqe {
+               /* Send, with imm, inval key */
+               struct {
+                       union {
+-                              __be32  imm_data;
++                              u32     imm_data;
+                               u32     inv_key;
+                       };
+                       u32             q_key;
+@@ -182,7 +182,7 @@ struct bnxt_qplib_swqe {
+               /* RDMA write, with imm, read */
+               struct {
+                       union {
+-                              __be32  imm_data;
++                              u32     imm_data;
+                               u32     inv_key;
+                       };
+                       u64             remote_va;
+@@ -374,7 +374,7 @@ struct bnxt_qplib_cqe {
+       u16                             cfa_meta;
+       u64                             wr_id;
+       union {
+-              __be32                  immdata;
++              __le32                  immdata;
+               u32                     invrkey;
+       };
+       u64                             qp_handle;
+-- 
+2.43.0
+
diff --git a/queue-5.15/bpf-annotate-btf-show-functions-with-__printf.patch b/queue-5.15/bpf-annotate-btf-show-functions-with-__printf.patch
new file mode 100644 (file)
index 0000000..2f6df50
--- /dev/null
@@ -0,0 +1,56 @@
+From a8d6a4d214c2dfcc8e8b2d2715ca414a014b6343 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 Jul 2024 19:23:21 +0100
+Subject: bpf: annotate BTF show functions with __printf
+
+From: Alan Maguire <alan.maguire@oracle.com>
+
+[ Upstream commit b3470da314fd8018ee237e382000c4154a942420 ]
+
+-Werror=suggest-attribute=format warns about two functions
+in kernel/bpf/btf.c [1]; add __printf() annotations to silence
+these warnings since for CONFIG_WERROR=y they will trigger
+build failures.
+
+[1] https://lore.kernel.org/bpf/a8b20c72-6631-4404-9e1f-0410642d7d20@gmail.com/
+
+Fixes: 31d0bc81637d ("bpf: Move to generic BTF show support, apply it to seq files/strings")
+Reported-by: Mirsad Todorovac <mtodorovac69@gmail.com>
+Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
+Tested-by: Mirsad Todorovac <mtodorovac69@yahoo.com>
+Link: https://lore.kernel.org/r/20240711182321.963667-1-alan.maguire@oracle.com
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/bpf/btf.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
+index a0c7e13e0ab4d..0c9d93e2c18f0 100644
+--- a/kernel/bpf/btf.c
++++ b/kernel/bpf/btf.c
+@@ -5808,8 +5808,8 @@ static void btf_type_show(const struct btf *btf, u32 type_id, void *obj,
+       btf_type_ops(t)->show(btf, t, type_id, obj, 0, show);
+ }
+-static void btf_seq_show(struct btf_show *show, const char *fmt,
+-                       va_list args)
++__printf(2, 0) static void btf_seq_show(struct btf_show *show, const char *fmt,
++                                      va_list args)
+ {
+       seq_vprintf((struct seq_file *)show->target, fmt, args);
+ }
+@@ -5842,8 +5842,8 @@ struct btf_show_snprintf {
+       int len;                /* length we would have written */
+ };
+-static void btf_snprintf_show(struct btf_show *show, const char *fmt,
+-                            va_list args)
++__printf(2, 0) static void btf_snprintf_show(struct btf_show *show, const char *fmt,
++                                           va_list args)
+ {
+       struct btf_show_snprintf *ssnprintf = (struct btf_show_snprintf *)show;
+       int len;
+-- 
+2.43.0
+
diff --git a/queue-5.15/bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch b/queue-5.15/bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch
new file mode 100644 (file)
index 0000000..6bfe2aa
--- /dev/null
@@ -0,0 +1,60 @@
+From 3b30207081c8beaca8e2e01fbe6dee66de2cc0b5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jul 2024 10:28:59 +0100
+Subject: bpf: Eliminate remaining "make W=1" warnings in kernel/bpf/btf.o
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Alan Maguire <alan.maguire@oracle.com>
+
+[ Upstream commit 2454075f8e2915cebbe52a1195631bc7efe2b7e1 ]
+
+As reported by Mirsad [1] we still see format warnings in kernel/bpf/btf.o
+at W=1 warning level:
+
+  CC      kernel/bpf/btf.o
+./kernel/bpf/btf.c: In function ‘btf_type_seq_show_flags’:
+./kernel/bpf/btf.c:7553:21: warning: assignment left-hand side might be a candidate for a format attribute [-Wsuggest-attribute=format]
+ 7553 |         sseq.showfn = btf_seq_show;
+      |                     ^
+./kernel/bpf/btf.c: In function ‘btf_type_snprintf_show’:
+./kernel/bpf/btf.c:7604:31: warning: assignment left-hand side might be a candidate for a format attribute [-Wsuggest-attribute=format]
+ 7604 |         ssnprintf.show.showfn = btf_snprintf_show;
+      |                               ^
+
+Combined with CONFIG_WERROR=y these can halt the build.
+
+The fix (annotating the structure field with __printf())
+suggested by Mirsad resolves these. Apologies I missed this last time.
+No other W=1 warnings were observed in kernel/bpf after this fix.
+
+[1] https://lore.kernel.org/bpf/92c9d047-f058-400c-9c7d-81d4dc1ef71b@gmail.com/
+
+Fixes: b3470da314fd ("bpf: annotate BTF show functions with __printf")
+Reported-by: Mirsad Todorovac <mtodorovac69@gmail.com>
+Suggested-by: Mirsad Todorovac <mtodorovac69@gmail.com>
+Signed-off-by: Alan Maguire <alan.maguire@oracle.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Link: https://lore.kernel.org/bpf/20240712092859.1390960-1-alan.maguire@oracle.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/bpf/btf.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kernel/bpf/btf.c b/kernel/bpf/btf.c
+index 0c9d93e2c18f0..d3eb75bfd9718 100644
+--- a/kernel/bpf/btf.c
++++ b/kernel/bpf/btf.c
+@@ -349,7 +349,7 @@ const char *btf_type_str(const struct btf_type *t)
+ struct btf_show {
+       u64 flags;
+       void *target;   /* target of show operation (seq file, buffer) */
+-      void (*showfn)(struct btf_show *show, const char *fmt, va_list args);
++      __printf(2, 0) void (*showfn)(struct btf_show *show, const char *fmt, va_list args);
+       const struct btf *btf;
+       /* below are used during iteration */
+       struct {
+-- 
+2.43.0
+
diff --git a/queue-5.15/bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch b/queue-5.15/bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch
new file mode 100644 (file)
index 0000000..fa97af0
--- /dev/null
@@ -0,0 +1,46 @@
+From 0d0f0b1ff512cf2e5a7cb8ab41a736c8214b50a3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 21:11:50 +0800
+Subject: bpftool: Mount bpffs when pinmaps path not under the bpffs
+
+From: Tao Chen <chen.dylane@gmail.com>
+
+[ Upstream commit da5f8fd1f0d393d5eaaba9ad8c22d1c26bb2bf9b ]
+
+As Quentin said [0], BPF map pinning will fail if the pinmaps path is not
+under the bpffs, like:
+
+  libbpf: specified path /home/ubuntu/test/sock_ops_map is not on BPF FS
+  Error: failed to pin all maps
+
+  [0] https://github.com/libbpf/bpftool/issues/146
+
+Fixes: 3767a94b3253 ("bpftool: add pinmaps argument to the load/loadall")
+Signed-off-by: Tao Chen <chen.dylane@gmail.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Tested-by: Quentin Monnet <qmo@kernel.org>
+Reviewed-by: Quentin Monnet <qmo@kernel.org>
+Link: https://lore.kernel.org/bpf/20240702131150.15622-1-chen.dylane@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/bpf/bpftool/prog.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/tools/bpf/bpftool/prog.c b/tools/bpf/bpftool/prog.c
+index afb28fcc66786..da1864d28892d 100644
+--- a/tools/bpf/bpftool/prog.c
++++ b/tools/bpf/bpftool/prog.c
+@@ -1627,6 +1627,10 @@ static int load_with_options(int argc, char **argv, bool first_prog_only)
+       }
+       if (pinmaps) {
++              err = create_and_mount_bpffs_dir(pinmaps);
++              if (err)
++                      goto err_unpin;
++
+               err = bpf_object__pin_maps(obj, pinmaps);
+               if (err) {
+                       p_err("failed to pin all maps");
+-- 
+2.43.0
+
diff --git a/queue-5.15/clk-qcom-branch-add-helper-functions-for-setting-ret.patch b/queue-5.15/clk-qcom-branch-add-helper-functions-for-setting-ret.patch
new file mode 100644 (file)
index 0000000..70c8988
--- /dev/null
@@ -0,0 +1,63 @@
+From 9f4198044f52dd30926c75e96a6f4cf834f28c97 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 Feb 2023 10:13:31 +0100
+Subject: clk: qcom: branch: Add helper functions for setting retain bits
+
+From: Konrad Dybcio <konrad.dybcio@linaro.org>
+
+[ Upstream commit b594e6f6605311785171b8d4600fe96e35625530 ]
+
+Most Qualcomm branch clocks come with a pretty usual set of bits that
+can enable memory retention by means of not turning off parts of the
+memory logic. Add them to the common header file and introduce helper
+functions for setting them instead of using magic writes.
+
+Signed-off-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Link: https://lore.kernel.org/r/20230208091340.124641-2-konrad.dybcio@linaro.org
+Stable-dep-of: f38467b5a920 ("clk: qcom: gcc-sc7280: Update force mem core bit for UFS ICE clock")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/qcom/clk-branch.h | 26 ++++++++++++++++++++++++++
+ 1 file changed, 26 insertions(+)
+
+diff --git a/drivers/clk/qcom/clk-branch.h b/drivers/clk/qcom/clk-branch.h
+index 17a58119165e8..55b3a2c3afed9 100644
+--- a/drivers/clk/qcom/clk-branch.h
++++ b/drivers/clk/qcom/clk-branch.h
+@@ -37,6 +37,32 @@ struct clk_branch {
+       struct clk_regmap clkr;
+ };
++/* Branch clock common bits for HLOS-owned clocks */
++#define CBCR_FORCE_MEM_CORE_ON                BIT(14)
++#define CBCR_FORCE_MEM_PERIPH_ON      BIT(13)
++#define CBCR_FORCE_MEM_PERIPH_OFF     BIT(12)
++
++static inline void qcom_branch_set_force_mem_core(struct regmap *regmap,
++                                                struct clk_branch clk, bool on)
++{
++      regmap_update_bits(regmap, clk.halt_reg, CBCR_FORCE_MEM_CORE_ON,
++                         on ? CBCR_FORCE_MEM_CORE_ON : 0);
++}
++
++static inline void qcom_branch_set_force_periph_on(struct regmap *regmap,
++                                                 struct clk_branch clk, bool on)
++{
++      regmap_update_bits(regmap, clk.halt_reg, CBCR_FORCE_MEM_PERIPH_ON,
++                         on ? CBCR_FORCE_MEM_PERIPH_ON : 0);
++}
++
++static inline void qcom_branch_set_force_periph_off(struct regmap *regmap,
++                                                  struct clk_branch clk, bool on)
++{
++      regmap_update_bits(regmap, clk.halt_reg, CBCR_FORCE_MEM_PERIPH_OFF,
++                         on ? CBCR_FORCE_MEM_PERIPH_OFF : 0);
++}
++
+ extern const struct clk_ops clk_branch_ops;
+ extern const struct clk_ops clk_branch2_ops;
+ extern const struct clk_ops clk_branch_simple_ops;
+-- 
+2.43.0
+
diff --git a/queue-5.15/clk-qcom-gcc-sc7280-update-force-mem-core-bit-for-uf.patch b/queue-5.15/clk-qcom-gcc-sc7280-update-force-mem-core-bit-for-uf.patch
new file mode 100644 (file)
index 0000000..6288d5a
--- /dev/null
@@ -0,0 +1,41 @@
+From 2cbd957d7dc8b947eb9a0b2e0bef9ebe9dff8ccc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 31 May 2024 15:21:41 +0530
+Subject: clk: qcom: gcc-sc7280: Update force mem core bit for UFS ICE clock
+
+From: Taniya Das <quic_tdas@quicinc.com>
+
+[ Upstream commit f38467b5a920be1473710428a93c4e54b6f8a0c1 ]
+
+Update the force mem core bit for UFS ICE clock to force the core on signal
+to remain active during halt state of the clk. When retention bit of the
+clock is set the memories of the subsystem will retain the logic across
+power states.
+
+Fixes: a3cc092196ef ("clk: qcom: Add Global Clock controller (GCC) driver for SC7280")
+Signed-off-by: Taniya Das <quic_tdas@quicinc.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20240531095142.9688-3-quic_tdas@quicinc.com
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/clk/qcom/gcc-sc7280.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/clk/qcom/gcc-sc7280.c b/drivers/clk/qcom/gcc-sc7280.c
+index d10efbf260b7a..76d5a9f49d8e6 100644
+--- a/drivers/clk/qcom/gcc-sc7280.c
++++ b/drivers/clk/qcom/gcc-sc7280.c
+@@ -3573,6 +3573,9 @@ static int gcc_sc7280_probe(struct platform_device *pdev)
+       regmap_update_bits(regmap, 0x71004, BIT(0), BIT(0));
+       regmap_update_bits(regmap, 0x7100C, BIT(13), BIT(13));
++      /* FORCE_MEM_CORE_ON for ufs phy ice core clocks */
++      qcom_branch_set_force_mem_core(regmap, gcc_ufs_phy_ice_core_clk, true);
++
+       ret = qcom_cc_register_rcg_dfs(regmap, gcc_dfs_clocks,
+                       ARRAY_SIZE(gcc_dfs_clocks));
+       if (ret)
+-- 
+2.43.0
+
diff --git a/queue-5.15/coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch b/queue-5.15/coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch
new file mode 100644 (file)
index 0000000..d0204f7
--- /dev/null
@@ -0,0 +1,45 @@
+From 10ccb743abed61acf6681241095d60a2f2d85a0a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 May 2024 14:36:26 +0100
+Subject: coresight: Fix ref leak when of_coresight_parse_endpoint() fails
+
+From: James Clark <james.clark@arm.com>
+
+[ Upstream commit 7fcb9cb2fe47294e16067c3cfd25332c8662a115 ]
+
+of_graph_get_next_endpoint() releases the reference to the previous
+endpoint on each iteration, but when parsing fails the loop exits
+early meaning the last reference is never dropped.
+
+Fix it by dropping the refcount in the exit condition.
+
+Fixes: d375b356e687 ("coresight: Fix support for sparsely populated ports")
+Signed-off-by: James Clark <james.clark@arm.com>
+Reported-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Suzuki K Poulose <suzuki.poulose@arm.com>
+Link: https://lore.kernel.org/r/20240529133626.90080-1-james.clark@arm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwtracing/coresight/coresight-platform.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hwtracing/coresight/coresight-platform.c b/drivers/hwtracing/coresight/coresight-platform.c
+index c594f45319fc5..dfb8022c4da1a 100644
+--- a/drivers/hwtracing/coresight/coresight-platform.c
++++ b/drivers/hwtracing/coresight/coresight-platform.c
+@@ -323,8 +323,10 @@ static int of_get_coresight_platform_data(struct device *dev,
+                       continue;
+               ret = of_coresight_parse_endpoint(dev, ep, pdata);
+-              if (ret)
++              if (ret) {
++                      of_node_put(ep);
+                       return ret;
++              }
+       }
+       return 0;
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-amd-pm-fix-aldebaran-pcie-speed-reporting.patch b/queue-5.15/drm-amd-pm-fix-aldebaran-pcie-speed-reporting.patch
new file mode 100644 (file)
index 0000000..43c386c
--- /dev/null
@@ -0,0 +1,39 @@
+From 8c60611b595606804456cf6c3df800fa8c17f96b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 May 2024 14:14:10 +0530
+Subject: drm/amd/pm: Fix aldebaran pcie speed reporting
+
+From: Lijo Lazar <lijo.lazar@amd.com>
+
+[ Upstream commit b6420021e17e262c57bb289d0556ee181b014f9c ]
+
+Fix the field definitions for LC_CURRENT_DATA_RATE.
+
+Fixes: c05d1c401572 ("drm/amd/swsmu: add aldebaran smu13 ip support (v3)")
+Signed-off-by: Lijo Lazar <lijo.lazar@amd.com>
+Reviewed-by: Asad Kamal <asad.kamal@amd.com>
+Reviewed-by: Yang Wang <kevinyang.wang@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
+index a3723ba359231..7671a8b3c195a 100644
+--- a/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
++++ b/drivers/gpu/drm/amd/pm/swsmu/smu13/smu_v13_0.c
+@@ -69,8 +69,8 @@ MODULE_FIRMWARE("amdgpu/aldebaran_smc.bin");
+ #define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD_MASK 0x00000070L
+ #define PCIE_LC_LINK_WIDTH_CNTL__LC_LINK_WIDTH_RD__SHIFT 0x4
+ #define smnPCIE_LC_SPEED_CNTL                 0x11140290
+-#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK 0xC000
+-#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT 0xE
++#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE_MASK 0xE0
++#define PCIE_LC_SPEED_CNTL__LC_CURRENT_DATA_RATE__SHIFT 0x5
+ static const int link_width[] = {0, 1, 2, 4, 8, 12, 16};
+ static const int link_speed[] = {25, 50, 80, 160};
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-amdgpu-check-if-nbio-funcs-are-null-in-amdgpu_de.patch b/queue-5.15/drm-amdgpu-check-if-nbio-funcs-are-null-in-amdgpu_de.patch
new file mode 100644 (file)
index 0000000..f8821df
--- /dev/null
@@ -0,0 +1,43 @@
+From 8f9b580b0f3d4a568c90548c87fa7dfef42833c1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 May 2024 09:06:38 +0200
+Subject: drm/amdgpu: Check if NBIO funcs are NULL in amdgpu_device_baco_exit
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Friedrich Vock <friedrich.vock@gmx.de>
+
+[ Upstream commit 0cdb3f9740844b9d95ca413e3fcff11f81223ecf ]
+
+The special case for VM passthrough doesn't check adev->nbio.funcs
+before dereferencing it. If GPUs that don't have an NBIO block are
+passed through, this leads to a NULL pointer dereference on startup.
+
+Signed-off-by: Friedrich Vock <friedrich.vock@gmx.de>
+Fixes: 1bece222eabe ("drm/amdgpu: Clear doorbell interrupt status for Sienna Cichlid")
+Cc: Alex Deucher <alexander.deucher@amd.com>
+Cc: Christian König <christian.koenig@amd.com>
+Acked-by: Christian König <christian.koenig@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+index 5f6c32ec674d3..300d3b236bb35 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
+@@ -5531,7 +5531,7 @@ int amdgpu_device_baco_exit(struct drm_device *dev)
+           adev->nbio.funcs->enable_doorbell_interrupt)
+               adev->nbio.funcs->enable_doorbell_interrupt(adev, true);
+-      if (amdgpu_passthrough(adev) &&
++      if (amdgpu_passthrough(adev) && adev->nbio.funcs &&
+           adev->nbio.funcs->clear_doorbell_interrupt)
+               adev->nbio.funcs->clear_doorbell_interrupt(adev);
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch b/queue-5.15/drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch
new file mode 100644 (file)
index 0000000..fa91faa
--- /dev/null
@@ -0,0 +1,42 @@
+From 984eb4e8bf9d9617af45feaed74e22b09847cb50 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jun 2024 19:11:06 +0200
+Subject: drm/etnaviv: fix DMA direction handling for cached RW buffers
+
+From: Lucas Stach <l.stach@pengutronix.de>
+
+[ Upstream commit 58979ad6330a70450ed78837be3095107d022ea9 ]
+
+The dma sync operation needs to be done with DMA_BIDIRECTIONAL when
+the BO is prepared for both read and write operations.
+
+Fixes: a8c21a5451d8 ("drm/etnaviv: add initial etnaviv DRM driver")
+Signed-off-by: Lucas Stach <l.stach@pengutronix.de>
+Reviewed-by: Philipp Zabel <p.zabel@pengutronix.de>
+Reviewed-by: Christian Gmeiner <cgmeiner@igalia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/etnaviv/etnaviv_gem.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gem.c b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+index f0b2540e60e46..87da2278398ae 100644
+--- a/drivers/gpu/drm/etnaviv/etnaviv_gem.c
++++ b/drivers/gpu/drm/etnaviv/etnaviv_gem.c
+@@ -353,9 +353,11 @@ static void *etnaviv_gem_vmap_impl(struct etnaviv_gem_object *obj)
+ static inline enum dma_data_direction etnaviv_op_to_dma_dir(u32 op)
+ {
+-      if (op & ETNA_PREP_READ)
++      op &= ETNA_PREP_READ | ETNA_PREP_WRITE;
++
++      if (op == ETNA_PREP_READ)
+               return DMA_FROM_DEVICE;
+-      else if (op & ETNA_PREP_WRITE)
++      else if (op == ETNA_PREP_WRITE)
+               return DMA_TO_DEVICE;
+       else
+               return DMA_BIDIRECTIONAL;
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-mediatek-add-drm_mode_rotate_0-to-rotation-prope.patch b/queue-5.15/drm-mediatek-add-drm_mode_rotate_0-to-rotation-prope.patch
new file mode 100644 (file)
index 0000000..cfbac93
--- /dev/null
@@ -0,0 +1,95 @@
+From 0f30780d8794a215ff8d3cd050c52fd149a3c38f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jun 2024 00:38:48 +0800
+Subject: drm/mediatek: Add DRM_MODE_ROTATE_0 to rotation property
+
+From: Hsiao Chien Sung <shawn.sung@mediatek.com>
+
+[ Upstream commit 74608d8feefd1675388f23362aac8df4ac3af931 ]
+
+Always add DRM_MODE_ROTATE_0 to rotation property to meet
+IGT's (Intel GPU Tools) requirement.
+
+Reviewed-by: CK Hu <ck.hu@mediatek.com>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Fixes: 119f5173628a ("drm/mediatek: Add DRM Driver for Mediatek SoC MT8173.")
+Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
+Link: https://patchwork.kernel.org/project/dri-devel/patch/20240620-igt-v3-8-a9d62d2e2c7e@mediatek.com/
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/mediatek/mtk_disp_ovl.c     | 17 +++++------------
+ drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h |  6 +++++-
+ drivers/gpu/drm/mediatek/mtk_drm_plane.c    |  2 +-
+ 3 files changed, 11 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+index 411cf0f216611..c54d56fb7b4c5 100644
+--- a/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
++++ b/drivers/gpu/drm/mediatek/mtk_disp_ovl.c
+@@ -204,27 +204,20 @@ int mtk_ovl_layer_check(struct device *dev, unsigned int idx,
+                       struct mtk_plane_state *mtk_state)
+ {
+       struct drm_plane_state *state = &mtk_state->base;
+-      unsigned int rotation = 0;
+-      rotation = drm_rotation_simplify(state->rotation,
+-                                       DRM_MODE_ROTATE_0 |
+-                                       DRM_MODE_REFLECT_X |
+-                                       DRM_MODE_REFLECT_Y);
+-      rotation &= ~DRM_MODE_ROTATE_0;
+-
+-      /* We can only do reflection, not rotation */
+-      if ((rotation & DRM_MODE_ROTATE_MASK) != 0)
++      /* check if any unsupported rotation is set */
++      if (state->rotation & ~mtk_ovl_supported_rotations(dev))
+               return -EINVAL;
+       /*
+        * TODO: Rotating/reflecting YUV buffers is not supported at this time.
+        *       Only RGB[AX] variants are supported.
++       *       Since DRM_MODE_ROTATE_0 means "no rotation", we should not
++       *       reject layers with this property.
+        */
+-      if (state->fb->format->is_yuv && rotation != 0)
++      if (state->fb->format->is_yuv && (state->rotation & ~DRM_MODE_ROTATE_0))
+               return -EINVAL;
+-      state->rotation = rotation;
+-
+       return 0;
+ }
+diff --git a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
+index 25cb50f2391fa..fa9616505ed6a 100644
+--- a/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
++++ b/drivers/gpu/drm/mediatek/mtk_drm_ddp_comp.h
+@@ -145,7 +145,11 @@ unsigned int mtk_ddp_comp_supported_rotations(struct mtk_ddp_comp *comp)
+       if (comp->funcs && comp->funcs->supported_rotations)
+               return comp->funcs->supported_rotations(comp->dev);
+-      return 0;
++      /*
++       * In order to pass IGT tests, DRM_MODE_ROTATE_0 is required when
++       * rotation is not supported.
++       */
++      return DRM_MODE_ROTATE_0;
+ }
+ static inline unsigned int mtk_ddp_comp_layer_nr(struct mtk_ddp_comp *comp)
+diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
+index a9fa510d9a684..b0c3bc2cf2f0f 100644
+--- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
++++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
+@@ -258,7 +258,7 @@ int mtk_plane_init(struct drm_device *dev, struct drm_plane *plane,
+               return err;
+       }
+-      if (supported_rotations & ~DRM_MODE_ROTATE_0) {
++      if (supported_rotations) {
+               err = drm_plane_create_rotation_property(plane,
+                                                        DRM_MODE_ROTATE_0,
+                                                        supported_rotations);
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-mediatek-add-missing-plane-settings-when-async-u.patch b/queue-5.15/drm-mediatek-add-missing-plane-settings-when-async-u.patch
new file mode 100644 (file)
index 0000000..8cb1d12
--- /dev/null
@@ -0,0 +1,41 @@
+From 15323d6d399c8d1ffb9257f8c24afce87e0a871e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jun 2024 00:38:41 +0800
+Subject: drm/mediatek: Add missing plane settings when async update
+
+From: Hsiao Chien Sung <shawn.sung@mediatek.com>
+
+[ Upstream commit 86b89dc669c400576dc23aa923bcf302f99e8e3a ]
+
+Fix an issue that plane coordinate was not saved when
+calling async update.
+
+Fixes: 920fffcc8912 ("drm/mediatek: update cursors by using async atomic update")
+
+Reviewed-by: CK Hu <ck.hu@mediatek.com>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Fixes: 119f5173628a ("drm/mediatek: Add DRM Driver for Mediatek SoC MT8173.")
+Signed-off-by: Hsiao Chien Sung <shawn.sung@mediatek.com>
+Link: https://patchwork.kernel.org/project/dri-devel/patch/20240620-igt-v3-1-a9d62d2e2c7e@mediatek.com/
+Signed-off-by: Chun-Kuang Hu <chunkuang.hu@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/mediatek/mtk_drm_plane.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/gpu/drm/mediatek/mtk_drm_plane.c b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
+index eda072a3bf9ae..a9fa510d9a684 100644
+--- a/drivers/gpu/drm/mediatek/mtk_drm_plane.c
++++ b/drivers/gpu/drm/mediatek/mtk_drm_plane.c
+@@ -154,6 +154,8 @@ static void mtk_plane_atomic_async_update(struct drm_plane *plane,
+       plane->state->src_y = new_state->src_y;
+       plane->state->src_h = new_state->src_h;
+       plane->state->src_w = new_state->src_w;
++      plane->state->dst.x1 = new_state->dst.x1;
++      plane->state->dst.y1 = new_state->dst.y1;
+       mtk_plane_update_new_state(new_state, new_plane_state);
+       swap(plane->state->fb, new_state->fb);
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-meson-fix-canvas-release-in-bind-function.patch b/queue-5.15/drm-meson-fix-canvas-release-in-bind-function.patch
new file mode 100644 (file)
index 0000000..55e820b
--- /dev/null
@@ -0,0 +1,106 @@
+From e77a05c356bd46f1723db2fc9523a27aeb72d55f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jul 2024 15:58:27 +0000
+Subject: drm/meson: fix canvas release in bind function
+
+From: Yao Zi <ziyao@disroot.org>
+
+[ Upstream commit a695949b2e9bb6b6700a764c704731a306c4bebf ]
+
+Allocated canvases may not be released on the error exit path of
+meson_drv_bind_master(), leading to resource leaking. Rewrite exit path
+to release canvases on error.
+
+Fixes: 2bf6b5b0e374 ("drm/meson: exclusively use the canvas provider module")
+Signed-off-by: Yao Zi <ziyao@disroot.org>
+Reviewed-by: Neil Armstrong <neil.armstrong@linaro.org>
+Link: https://lore.kernel.org/r/20240703155826.10385-2-ziyao@disroot.org
+Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240703155826.10385-2-ziyao@disroot.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/meson/meson_drv.c | 37 +++++++++++++++----------------
+ 1 file changed, 18 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/gpu/drm/meson/meson_drv.c b/drivers/gpu/drm/meson/meson_drv.c
+index 207b309a21c07..829aadc1258a1 100644
+--- a/drivers/gpu/drm/meson/meson_drv.c
++++ b/drivers/gpu/drm/meson/meson_drv.c
+@@ -248,29 +248,20 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
+       if (ret)
+               goto free_drm;
+       ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_0);
+-      if (ret) {
+-              meson_canvas_free(priv->canvas, priv->canvas_id_osd1);
+-              goto free_drm;
+-      }
++      if (ret)
++              goto free_canvas_osd1;
+       ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_1);
+-      if (ret) {
+-              meson_canvas_free(priv->canvas, priv->canvas_id_osd1);
+-              meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0);
+-              goto free_drm;
+-      }
++      if (ret)
++              goto free_canvas_vd1_0;
+       ret = meson_canvas_alloc(priv->canvas, &priv->canvas_id_vd1_2);
+-      if (ret) {
+-              meson_canvas_free(priv->canvas, priv->canvas_id_osd1);
+-              meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0);
+-              meson_canvas_free(priv->canvas, priv->canvas_id_vd1_1);
+-              goto free_drm;
+-      }
++      if (ret)
++              goto free_canvas_vd1_1;
+       priv->vsync_irq = platform_get_irq(pdev, 0);
+       ret = drm_vblank_init(drm, 1);
+       if (ret)
+-              goto free_drm;
++              goto free_canvas_vd1_2;
+       /* Assign limits per soc revision/package */
+       for (i = 0 ; i < ARRAY_SIZE(meson_drm_soc_attrs) ; ++i) {
+@@ -286,11 +277,11 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
+        */
+       ret = drm_aperture_remove_framebuffers(false, &meson_driver);
+       if (ret)
+-              goto free_drm;
++              goto free_canvas_vd1_2;
+       ret = drmm_mode_config_init(drm);
+       if (ret)
+-              goto free_drm;
++              goto free_canvas_vd1_2;
+       drm->mode_config.max_width = 3840;
+       drm->mode_config.max_height = 2160;
+       drm->mode_config.funcs = &meson_mode_config_funcs;
+@@ -305,7 +296,7 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
+       if (priv->afbcd.ops) {
+               ret = priv->afbcd.ops->init(priv);
+               if (ret)
+-                      goto free_drm;
++                      goto free_canvas_vd1_2;
+       }
+       /* Encoder Initialization */
+@@ -364,6 +355,14 @@ static int meson_drv_bind_master(struct device *dev, bool has_components)
+ exit_afbcd:
+       if (priv->afbcd.ops)
+               priv->afbcd.ops->exit(priv);
++free_canvas_vd1_2:
++      meson_canvas_free(priv->canvas, priv->canvas_id_vd1_2);
++free_canvas_vd1_1:
++      meson_canvas_free(priv->canvas, priv->canvas_id_vd1_1);
++free_canvas_vd1_0:
++      meson_canvas_free(priv->canvas, priv->canvas_id_vd1_0);
++free_canvas_osd1:
++      meson_canvas_free(priv->canvas, priv->canvas_id_osd1);
+ free_drm:
+       drm_dev_put(drm);
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch b/queue-5.15/drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch
new file mode 100644 (file)
index 0000000..f02c958
--- /dev/null
@@ -0,0 +1,49 @@
+From 8846780f6f54f3278cb99bb0dfc74a6815a29f60 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 May 2024 14:36:38 -0700
+Subject: drm/panel: boe-tv101wum-nl6: Check for errors on the NOP in prepare()
+
+From: Douglas Anderson <dianders@chromium.org>
+
+[ Upstream commit 6320b9199dd99622668649c234d4e8a99e44a9c8 ]
+
+The mipi_dsi_dcs_nop() function returns an error but we weren't
+checking it in boe_panel_prepare(). Add a check. This is highly
+unlikely to matter in practice. If the NOP failed then likely later
+MIPI commands would fail too.
+
+Found by code inspection.
+
+Fixes: 812562b8d881 ("drm/panel: boe-tv101wum-nl6: Fine tune the panel power sequence")
+Signed-off-by: Douglas Anderson <dianders@chromium.org>
+Reviewed-by: AngeloGioacchino Del Regno <angelogioacchino.delregno@collabora.com>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Link: https://lore.kernel.org/r/20240517143643.3.Ibffbaa5b4999ac0e55f43bf353144433b099d727@changeid
+Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240517143643.3.Ibffbaa5b4999ac0e55f43bf353144433b099d727@changeid
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
+index c448be3d01d16..0a2d5f461aee8 100644
+--- a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
++++ b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
+@@ -553,7 +553,11 @@ static int boe_panel_prepare(struct drm_panel *panel)
+       usleep_range(5000, 10000);
+       if (boe->desc->lp11_before_reset) {
+-              mipi_dsi_dcs_nop(boe->dsi);
++              ret = mipi_dsi_dcs_nop(boe->dsi);
++              if (ret < 0) {
++                      dev_err(&boe->dsi->dev, "Failed to send NOP: %d\n", ret);
++                      goto poweroff;
++              }
+               usleep_range(1000, 2000);
+       }
+       gpiod_set_value(boe->enable_gpio, 1);
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch b/queue-5.15/drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch
new file mode 100644 (file)
index 0000000..d09d130
--- /dev/null
@@ -0,0 +1,48 @@
+From 76ff83dee67d99d0bb45228e46e5a26675a4059f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 May 2024 14:36:37 -0700
+Subject: drm/panel: boe-tv101wum-nl6: If prepare fails, disable GPIO before
+ regulators
+
+From: Douglas Anderson <dianders@chromium.org>
+
+[ Upstream commit 587c48f622374e5d47b1d515c6006a4df4dee882 ]
+
+The enable GPIO should clearly be set low before turning off
+regulators. That matches both the inverse order that things were
+enabled and also the order in unprepare().
+
+Fixes: a869b9db7adf ("drm/panel: support for boe tv101wum-nl6 wuxga dsi video mode panel")
+Signed-off-by: Douglas Anderson <dianders@chromium.org>
+Reviewed-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
+Link: https://lore.kernel.org/r/20240517143643.2.Ieac346cd0f1606948ba39ceea06b55359fe972b6@changeid
+Signed-off-by: Neil Armstrong <neil.armstrong@linaro.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240517143643.2.Ieac346cd0f1606948ba39ceea06b55359fe972b6@changeid
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
+index 9e518213a54ff..c448be3d01d16 100644
+--- a/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
++++ b/drivers/gpu/drm/panel/panel-boe-tv101wum-nl6.c
+@@ -574,13 +574,13 @@ static int boe_panel_prepare(struct drm_panel *panel)
+       return 0;
+ poweroff:
++      gpiod_set_value(boe->enable_gpio, 0);
+       regulator_disable(boe->avee);
+ poweroffavdd:
+       regulator_disable(boe->avdd);
+ poweroff1v8:
+       usleep_range(5000, 7000);
+       regulator_disable(boe->pp1800);
+-      gpiod_set_value(boe->enable_gpio, 0);
+       return ret;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/drm-qxl-add-check-for-drm_cvt_mode.patch b/queue-5.15/drm-qxl-add-check-for-drm_cvt_mode.patch
new file mode 100644 (file)
index 0000000..04e93cd
--- /dev/null
@@ -0,0 +1,39 @@
+From f5385f942e1832e7a2ce015d10fb0c2923eb730b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jun 2024 15:10:31 +0800
+Subject: drm/qxl: Add check for drm_cvt_mode
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 7bd09a2db0f617377027a2bb0b9179e6959edff3 ]
+
+Add check for the return value of drm_cvt_mode() and return the error if
+it fails in order to avoid NULL pointer dereference.
+
+Fixes: 1b043677d4be ("drm/qxl: add qxl_add_mode helper function")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Heng Qi <hengqi@linux.alibaba.com>
+Signed-off-by: Maxime Ripard <mripard@kernel.org>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240621071031.1987974-1-nichen@iscas.ac.cn
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/qxl/qxl_display.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/gpu/drm/qxl/qxl_display.c b/drivers/gpu/drm/qxl/qxl_display.c
+index dc04412784a0d..c17b24eee0cf4 100644
+--- a/drivers/gpu/drm/qxl/qxl_display.c
++++ b/drivers/gpu/drm/qxl/qxl_display.c
+@@ -233,6 +233,9 @@ static int qxl_add_mode(struct drm_connector *connector,
+               return 0;
+       mode = drm_cvt_mode(dev, width, height, 60, false, false, false);
++      if (!mode)
++              return 0;
++
+       if (preferred)
+               mode->type |= DRM_MODE_TYPE_PREFERRED;
+       mode->hdisplay = width;
+-- 
+2.43.0
+
diff --git a/queue-5.15/edac-i10nm-make-skx_common.o-a-separate-module.patch b/queue-5.15/edac-i10nm-make-skx_common.o-a-separate-module.patch
new file mode 100644 (file)
index 0000000..a7cb881
--- /dev/null
@@ -0,0 +1,190 @@
+From 0f76bca49946d218434033095b9f6b73804d8b43 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 May 2024 11:51:11 +0200
+Subject: EDAC, i10nm: make skx_common.o a separate module
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 123b158635505c89ed0d3ef45c5845ff9030a466 ]
+
+Commit 598afa050403 ("kbuild: warn objects shared among multiple modules")
+was added to track down cases where the same object is linked into
+multiple modules. This can cause serious problems if some modules are
+builtin while others are not.
+
+That test triggers this warning:
+
+scripts/Makefile.build:236: drivers/edac/Makefile: skx_common.o is added to multiple modules: i10nm_edac skx_edac
+
+Make this a separate module instead.
+
+[Tony: Added more background details to commit message]
+
+Fixes: d4dc89d069aa ("EDAC, i10nm: Add a driver for Intel 10nm server processors")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Tony Luck <tony.luck@intel.com>
+Link: https://lore.kernel.org/all/20240529095132.1929397-1-arnd@kernel.org/
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/edac/Makefile     | 10 ++++++----
+ drivers/edac/skx_common.c | 21 +++++++++++++++++++--
+ drivers/edac/skx_common.h |  4 ++--
+ 3 files changed, 27 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/edac/Makefile b/drivers/edac/Makefile
+index 2d1641a27a28f..a98e1981df157 100644
+--- a/drivers/edac/Makefile
++++ b/drivers/edac/Makefile
+@@ -54,11 +54,13 @@ obj-$(CONFIG_EDAC_MPC85XX)         += mpc85xx_edac_mod.o
+ layerscape_edac_mod-y                 := fsl_ddr_edac.o layerscape_edac.o
+ obj-$(CONFIG_EDAC_LAYERSCAPE)         += layerscape_edac_mod.o
+-skx_edac-y                            := skx_common.o skx_base.o
+-obj-$(CONFIG_EDAC_SKX)                        += skx_edac.o
++skx_edac_common-y                     := skx_common.o
+-i10nm_edac-y                          := skx_common.o i10nm_base.o
+-obj-$(CONFIG_EDAC_I10NM)              += i10nm_edac.o
++skx_edac-y                            := skx_base.o
++obj-$(CONFIG_EDAC_SKX)                        += skx_edac.o skx_edac_common.o
++
++i10nm_edac-y                          := i10nm_base.o
++obj-$(CONFIG_EDAC_I10NM)              += i10nm_edac.o skx_edac_common.o
+ obj-$(CONFIG_EDAC_CELL)                       += cell_edac.o
+ obj-$(CONFIG_EDAC_PPC4XX)             += ppc4xx_edac.o
+diff --git a/drivers/edac/skx_common.c b/drivers/edac/skx_common.c
+index 19c17c5198c5f..88c44d5359076 100644
+--- a/drivers/edac/skx_common.c
++++ b/drivers/edac/skx_common.c
+@@ -46,7 +46,7 @@ static u64 skx_tolm, skx_tohm;
+ static LIST_HEAD(dev_edac_list);
+ static bool skx_mem_cfg_2lm;
+-int __init skx_adxl_get(void)
++int skx_adxl_get(void)
+ {
+       const char * const *names;
+       int i, j;
+@@ -108,12 +108,14 @@ int __init skx_adxl_get(void)
+       return -ENODEV;
+ }
++EXPORT_SYMBOL_GPL(skx_adxl_get);
+-void __exit skx_adxl_put(void)
++void skx_adxl_put(void)
+ {
+       kfree(adxl_values);
+       kfree(adxl_msg);
+ }
++EXPORT_SYMBOL_GPL(skx_adxl_put);
+ static bool skx_adxl_decode(struct decoded_addr *res, bool error_in_1st_level_mem)
+ {
+@@ -180,12 +182,14 @@ void skx_set_mem_cfg(bool mem_cfg_2lm)
+ {
+       skx_mem_cfg_2lm = mem_cfg_2lm;
+ }
++EXPORT_SYMBOL_GPL(skx_set_mem_cfg);
+ void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log)
+ {
+       skx_decode = decode;
+       skx_show_retry_rd_err_log = show_retry_log;
+ }
++EXPORT_SYMBOL_GPL(skx_set_decode);
+ int skx_get_src_id(struct skx_dev *d, int off, u8 *id)
+ {
+@@ -199,6 +203,7 @@ int skx_get_src_id(struct skx_dev *d, int off, u8 *id)
+       *id = GET_BITFIELD(reg, 12, 14);
+       return 0;
+ }
++EXPORT_SYMBOL_GPL(skx_get_src_id);
+ int skx_get_node_id(struct skx_dev *d, u8 *id)
+ {
+@@ -212,6 +217,7 @@ int skx_get_node_id(struct skx_dev *d, u8 *id)
+       *id = GET_BITFIELD(reg, 0, 2);
+       return 0;
+ }
++EXPORT_SYMBOL_GPL(skx_get_node_id);
+ static int get_width(u32 mtr)
+ {
+@@ -277,6 +283,7 @@ int skx_get_all_bus_mappings(struct res_config *cfg, struct list_head **list)
+               *list = &dev_edac_list;
+       return ndev;
+ }
++EXPORT_SYMBOL_GPL(skx_get_all_bus_mappings);
+ int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm)
+ {
+@@ -316,6 +323,7 @@ int skx_get_hi_lo(unsigned int did, int off[], u64 *tolm, u64 *tohm)
+       pci_dev_put(pdev);
+       return -ENODEV;
+ }
++EXPORT_SYMBOL_GPL(skx_get_hi_lo);
+ static int skx_get_dimm_attr(u32 reg, int lobit, int hibit, int add,
+                            int minval, int maxval, const char *name)
+@@ -387,6 +395,7 @@ int skx_get_dimm_info(u32 mtr, u32 mcmtr, u32 amap, struct dimm_info *dimm,
+       return 1;
+ }
++EXPORT_SYMBOL_GPL(skx_get_dimm_info);
+ int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc,
+                       int chan, int dimmno, const char *mod_str)
+@@ -435,6 +444,7 @@ int skx_get_nvdimm_info(struct dimm_info *dimm, struct skx_imc *imc,
+       return (size == 0 || size == ~0ull) ? 0 : 1;
+ }
++EXPORT_SYMBOL_GPL(skx_get_nvdimm_info);
+ int skx_register_mci(struct skx_imc *imc, struct pci_dev *pdev,
+                    const char *ctl_name, const char *mod_str,
+@@ -505,6 +515,7 @@ int skx_register_mci(struct skx_imc *imc, struct pci_dev *pdev,
+       imc->mci = NULL;
+       return rc;
+ }
++EXPORT_SYMBOL_GPL(skx_register_mci);
+ static void skx_unregister_mci(struct skx_imc *imc)
+ {
+@@ -686,6 +697,7 @@ int skx_mce_check_error(struct notifier_block *nb, unsigned long val,
+       mce->kflags |= MCE_HANDLED_EDAC;
+       return NOTIFY_DONE;
+ }
++EXPORT_SYMBOL_GPL(skx_mce_check_error);
+ void skx_remove(void)
+ {
+@@ -723,3 +735,8 @@ void skx_remove(void)
+               kfree(d);
+       }
+ }
++EXPORT_SYMBOL_GPL(skx_remove);
++
++MODULE_LICENSE("GPL v2");
++MODULE_AUTHOR("Tony Luck");
++MODULE_DESCRIPTION("MC Driver for Intel server processors");
+diff --git a/drivers/edac/skx_common.h b/drivers/edac/skx_common.h
+index 03ac067a80b9f..13f761930b4f8 100644
+--- a/drivers/edac/skx_common.h
++++ b/drivers/edac/skx_common.h
+@@ -162,8 +162,8 @@ typedef int (*get_dimm_config_f)(struct mem_ctl_info *mci,
+ typedef bool (*skx_decode_f)(struct decoded_addr *res);
+ typedef void (*skx_show_retry_log_f)(struct decoded_addr *res, char *msg, int len, bool scrub_err);
+-int __init skx_adxl_get(void);
+-void __exit skx_adxl_put(void);
++int skx_adxl_get(void);
++void skx_adxl_put(void);
+ void skx_set_decode(skx_decode_f decode, skx_show_retry_log_f show_retry_log);
+ void skx_set_mem_cfg(bool mem_cfg_2lm);
+-- 
+2.43.0
+
diff --git a/queue-5.15/ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch b/queue-5.15/ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch
new file mode 100644 (file)
index 0000000..707cc98
--- /dev/null
@@ -0,0 +1,46 @@
+From 7dc5f2e657e79e4a8bb9178bd2effb1a43a5a466 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Jun 2024 17:02:34 +0200
+Subject: ext4: avoid writing unitialized memory to disk in EA inodes
+
+From: Jan Kara <jack@suse.cz>
+
+[ Upstream commit 65121eff3e4c8c90f8126debf3c369228691c591 ]
+
+If the extended attribute size is not a multiple of block size, the last
+block in the EA inode will have uninitialized tail which will get
+written to disk. We will never expose the data to userspace but still
+this is not a good practice so just zero out the tail of the block as it
+isn't going to cause a noticeable performance overhead.
+
+Fixes: e50e5129f384 ("ext4: xattr-in-inode support")
+Reported-by: syzbot+9c1fe13fcb51574b249b@syzkaller.appspotmail.com
+Reported-by: Hugh Dickins <hughd@google.com>
+Signed-off-by: Jan Kara <jack@suse.cz>
+Link: https://patch.msgid.link/20240613150234.25176-1-jack@suse.cz
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ext4/xattr.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/fs/ext4/xattr.c b/fs/ext4/xattr.c
+index 37f3c2ebe6f82..e788f291ae86d 100644
+--- a/fs/ext4/xattr.c
++++ b/fs/ext4/xattr.c
+@@ -1384,6 +1384,12 @@ static int ext4_xattr_inode_write(handle_t *handle, struct inode *ea_inode,
+                       goto out;
+               memcpy(bh->b_data, buf, csize);
++              /*
++               * Zero out block tail to avoid writing uninitialized memory
++               * to disk.
++               */
++              if (csize < blocksize)
++                      memset(bh->b_data + csize, 0, blocksize - csize);
+               set_buffer_uptodate(bh);
+               ext4_handle_dirty_metadata(handle, ea_inode, bh);
+-- 
+2.43.0
+
diff --git a/queue-5.15/ext4-don-t-track-ranges-in-fast_commit-if-inode-has-.patch b/queue-5.15/ext4-don-t-track-ranges-in-fast_commit-if-inode-has-.patch
new file mode 100644 (file)
index 0000000..8f213b0
--- /dev/null
@@ -0,0 +1,49 @@
+From 08b28c201ac821989b833f152108b7b4d5ed4e0b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 18 Jun 2024 15:43:12 +0100
+Subject: ext4: don't track ranges in fast_commit if inode has inlined data
+
+From: Luis Henriques (SUSE) <luis.henriques@linux.dev>
+
+[ Upstream commit 7882b0187bbeb647967a7b5998ce4ad26ef68a9a ]
+
+When fast-commit needs to track ranges, it has to handle inodes that have
+inlined data in a different way because ext4_fc_write_inode_data(), in the
+actual commit path, will attempt to map the required blocks for the range.
+However, inodes that have inlined data will have it's data stored in
+inode->i_block and, eventually, in the extended attribute space.
+
+Unfortunately, because fast commit doesn't currently support extended
+attributes, the solution is to mark this commit as ineligible.
+
+Link: https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=1039883
+Signed-off-by: Luis Henriques (SUSE) <luis.henriques@linux.dev>
+Tested-by: Ben Hutchings <benh@debian.org>
+Fixes: 9725958bb75c ("ext4: fast commit may miss tracking unwritten range during ftruncate")
+Link: https://patch.msgid.link/20240618144312.17786-1-luis.henriques@linux.dev
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ext4/fast_commit.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
+index c6814edf0ce0a..e81b886d9c673 100644
+--- a/fs/ext4/fast_commit.c
++++ b/fs/ext4/fast_commit.c
+@@ -617,6 +617,12 @@ void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t star
+       if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
+               return;
++      if (ext4_has_inline_data(inode)) {
++              ext4_fc_mark_ineligible(inode->i_sb, EXT4_FC_REASON_XATTR,
++                                      handle);
++              return;
++      }
++
+       args.start = start;
+       args.end = end;
+-- 
+2.43.0
+
diff --git a/queue-5.15/ext4-fix-infinite-loop-when-replaying-fast_commit.patch b/queue-5.15/ext4-fix-infinite-loop-when-replaying-fast_commit.patch
new file mode 100644 (file)
index 0000000..db399e0
--- /dev/null
@@ -0,0 +1,48 @@
+From e66dbab45d43d3308c3542f2f571095938ac804c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 May 2024 09:28:57 +0100
+Subject: ext4: fix infinite loop when replaying fast_commit
+
+From: Luis Henriques (SUSE) <luis.henriques@linux.dev>
+
+[ Upstream commit 907c3fe532253a6ef4eb9c4d67efb71fab58c706 ]
+
+When doing fast_commit replay an infinite loop may occur due to an
+uninitialized extent_status struct.  ext4_ext_determine_insert_hole() does
+not detect the replay and calls ext4_es_find_extent_range(), which will
+return immediately without initializing the 'es' variable.
+
+Because 'es' contains garbage, an integer overflow may happen causing an
+infinite loop in this function, easily reproducible using fstest generic/039.
+
+This commit fixes this issue by unconditionally initializing the structure
+in function ext4_es_find_extent_range().
+
+Thanks to Zhang Yi, for figuring out the real problem!
+
+Fixes: 8016e29f4362 ("ext4: fast commit recovery path")
+Signed-off-by: Luis Henriques (SUSE) <luis.henriques@linux.dev>
+Reviewed-by: Zhang Yi <yi.zhang@huawei.com>
+Link: https://patch.msgid.link/20240515082857.32730-1-luis.henriques@linux.dev
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ext4/extents_status.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/fs/ext4/extents_status.c b/fs/ext4/extents_status.c
+index cccbdfd49a86b..ee52dd6afe543 100644
+--- a/fs/ext4/extents_status.c
++++ b/fs/ext4/extents_status.c
+@@ -312,6 +312,8 @@ void ext4_es_find_extent_range(struct inode *inode,
+                              ext4_lblk_t lblk, ext4_lblk_t end,
+                              struct extent_status *es)
+ {
++      es->es_lblk = es->es_len = es->es_pblk = 0;
++
+       if (EXT4_SB(inode->i_sb)->s_mount_state & EXT4_FC_REPLAY)
+               return;
+-- 
+2.43.0
+
diff --git a/queue-5.15/ext4-return-early-for-non-eligible-fast_commit-track.patch b/queue-5.15/ext4-return-early-for-non-eligible-fast_commit-track.patch
new file mode 100644 (file)
index 0000000..1fe9376
--- /dev/null
@@ -0,0 +1,176 @@
+From 5f6899a730abe0b506248342981c9036eaaf58bc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 12 Mar 2022 11:09:50 +0530
+Subject: ext4: return early for non-eligible fast_commit track events
+
+From: Ritesh Harjani <riteshh@linux.ibm.com>
+
+[ Upstream commit 78be0471da4e9fff874307d73d68f0173fa6a154 ]
+
+Currently ext4_fc_track_template() checks, whether the trace event
+path belongs to replay or does sb has ineligible set, if yes it simply
+returns. This patch pulls those checks before calling
+ext4_fc_track_template() in the callers of ext4_fc_track_template().
+
+[ Add checks to ext4_rename() which calls the __ext4_fc_track_*()
+  functions directly. -- TYT ]
+
+Signed-off-by: Ritesh Harjani <riteshh@linux.ibm.com>
+Link: https://lore.kernel.org/r/3cd025d9c490218a92e6d8fb30b6123e693373e3.1647057583.git.riteshh@linux.ibm.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Stable-dep-of: 7882b0187bbe ("ext4: don't track ranges in fast_commit if inode has inlined data")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ext4/fast_commit.c | 59 +++++++++++++++++++++++++++++++++++--------
+ fs/ext4/namei.c       | 15 ++++++++---
+ 2 files changed, 60 insertions(+), 14 deletions(-)
+
+diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
+index 2660c34c770e3..c6814edf0ce0a 100644
+--- a/fs/ext4/fast_commit.c
++++ b/fs/ext4/fast_commit.c
+@@ -353,13 +353,6 @@ static int ext4_fc_track_template(
+       tid_t tid = 0;
+       int ret;
+-      if (!test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT) ||
+-          (sbi->s_mount_state & EXT4_FC_REPLAY))
+-              return -EOPNOTSUPP;
+-
+-      if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
+-              return -EINVAL;
+-
+       tid = handle->h_transaction->t_tid;
+       mutex_lock(&ei->i_fc_lock);
+       if (tid == ei->i_sync_tid) {
+@@ -468,7 +461,17 @@ void __ext4_fc_track_unlink(handle_t *handle,
+ void ext4_fc_track_unlink(handle_t *handle, struct dentry *dentry)
+ {
+-      __ext4_fc_track_unlink(handle, d_inode(dentry), dentry);
++      struct inode *inode = d_inode(dentry);
++      struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
++
++      if (!test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT) ||
++          (sbi->s_mount_state & EXT4_FC_REPLAY))
++              return;
++
++      if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
++              return;
++
++      __ext4_fc_track_unlink(handle, inode, dentry);
+ }
+ void __ext4_fc_track_link(handle_t *handle,
+@@ -487,7 +490,17 @@ void __ext4_fc_track_link(handle_t *handle,
+ void ext4_fc_track_link(handle_t *handle, struct dentry *dentry)
+ {
+-      __ext4_fc_track_link(handle, d_inode(dentry), dentry);
++      struct inode *inode = d_inode(dentry);
++      struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
++
++      if (!test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT) ||
++          (sbi->s_mount_state & EXT4_FC_REPLAY))
++              return;
++
++      if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
++              return;
++
++      __ext4_fc_track_link(handle, inode, dentry);
+ }
+ void __ext4_fc_track_create(handle_t *handle, struct inode *inode,
+@@ -506,7 +519,17 @@ void __ext4_fc_track_create(handle_t *handle, struct inode *inode,
+ void ext4_fc_track_create(handle_t *handle, struct dentry *dentry)
+ {
+-      __ext4_fc_track_create(handle, d_inode(dentry), dentry);
++      struct inode *inode = d_inode(dentry);
++      struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
++
++      if (!test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT) ||
++          (sbi->s_mount_state & EXT4_FC_REPLAY))
++              return;
++
++      if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
++              return;
++
++      __ext4_fc_track_create(handle, inode, dentry);
+ }
+ /* __track_fn for inode tracking */
+@@ -522,6 +545,7 @@ static int __track_inode(struct inode *inode, void *arg, bool update)
+ void ext4_fc_track_inode(handle_t *handle, struct inode *inode)
+ {
++      struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+       int ret;
+       if (S_ISDIR(inode->i_mode))
+@@ -533,6 +557,13 @@ void ext4_fc_track_inode(handle_t *handle, struct inode *inode)
+               return;
+       }
++      if (!test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT) ||
++          (sbi->s_mount_state & EXT4_FC_REPLAY))
++              return;
++
++      if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
++              return;
++
+       ret = ext4_fc_track_template(handle, inode, __track_inode, NULL, 1);
+       trace_ext4_fc_track_inode(inode, ret);
+ }
+@@ -572,12 +603,20 @@ static int __track_range(struct inode *inode, void *arg, bool update)
+ void ext4_fc_track_range(handle_t *handle, struct inode *inode, ext4_lblk_t start,
+                        ext4_lblk_t end)
+ {
++      struct ext4_sb_info *sbi = EXT4_SB(inode->i_sb);
+       struct __track_range_args args;
+       int ret;
+       if (S_ISDIR(inode->i_mode))
+               return;
++      if (!test_opt2(inode->i_sb, JOURNAL_FAST_COMMIT) ||
++          (sbi->s_mount_state & EXT4_FC_REPLAY))
++              return;
++
++      if (ext4_test_mount_flag(inode->i_sb, EXT4_MF_FC_INELIGIBLE))
++              return;
++
+       args.start = start;
+       args.end = end;
+diff --git a/fs/ext4/namei.c b/fs/ext4/namei.c
+index e9501fb28477b..eb32cd1e74773 100644
+--- a/fs/ext4/namei.c
++++ b/fs/ext4/namei.c
+@@ -4011,12 +4011,19 @@ static int ext4_rename(struct user_namespace *mnt_userns, struct inode *old_dir,
+               ext4_fc_mark_ineligible(old.inode->i_sb,
+                       EXT4_FC_REASON_RENAME_DIR, handle);
+       } else {
++              struct super_block *sb = old.inode->i_sb;
++
+               if (new.inode)
+                       ext4_fc_track_unlink(handle, new.dentry);
+-              __ext4_fc_track_link(handle, old.inode, new.dentry);
+-              __ext4_fc_track_unlink(handle, old.inode, old.dentry);
+-              if (whiteout)
+-                      __ext4_fc_track_create(handle, whiteout, old.dentry);
++              if (test_opt2(sb, JOURNAL_FAST_COMMIT) &&
++                  !(EXT4_SB(sb)->s_mount_state & EXT4_FC_REPLAY) &&
++                  !(ext4_test_mount_flag(sb, EXT4_MF_FC_INELIGIBLE))) {
++                      __ext4_fc_track_link(handle, old.inode, new.dentry);
++                      __ext4_fc_track_unlink(handle, old.inode, old.dentry);
++                      if (whiteout)
++                              __ext4_fc_track_create(handle, whiteout,
++                                                     old.dentry);
++              }
+       }
+       if (new.inode) {
+-- 
+2.43.0
+
diff --git a/queue-5.15/firmware-turris-mox-rwtm-do-not-complete-if-there-ar.patch b/queue-5.15/firmware-turris-mox-rwtm-do-not-complete-if-there-ar.patch
new file mode 100644 (file)
index 0000000..e775d71
--- /dev/null
@@ -0,0 +1,50 @@
+From 250f94d52a9427303504c18234da0dcfa37c106c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Jul 2024 13:59:10 +0200
+Subject: firmware: turris-mox-rwtm: Do not complete if there are no waiters
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <kabel@kernel.org>
+
+[ Upstream commit 0bafb172b111ab27251af0eb684e7bde9570ce4c ]
+
+Do not complete the "command done" completion if there are no waiters.
+This can happen if a wait_for_completion() timed out or was interrupted.
+
+Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver")
+Signed-off-by: Marek Behún <kabel@kernel.org>
+Reviewed-by: Andy Shevchenko <andy@kernel.org>
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/turris-mox-rwtm.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
+index c2d34dc8ba462..fa4b904d74df1 100644
+--- a/drivers/firmware/turris-mox-rwtm.c
++++ b/drivers/firmware/turris-mox-rwtm.c
+@@ -2,7 +2,7 @@
+ /*
+  * Turris Mox rWTM firmware driver
+  *
+- * Copyright (C) 2019 Marek Behún <kabel@kernel.org>
++ * Copyright (C) 2019, 2024 Marek Behún <kabel@kernel.org>
+  */
+ #include <linux/armada-37xx-rwtm-mailbox.h>
+@@ -174,6 +174,9 @@ static void mox_rwtm_rx_callback(struct mbox_client *cl, void *data)
+       struct mox_rwtm *rwtm = dev_get_drvdata(cl->dev);
+       struct armada_37xx_rwtm_rx_msg *msg = data;
++      if (completion_done(&rwtm->cmd_done))
++              return;
++
+       rwtm->reply = *msg;
+       complete(&rwtm->cmd_done);
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/firmware-turris-mox-rwtm-fix-checking-return-value-o.patch b/queue-5.15/firmware-turris-mox-rwtm-fix-checking-return-value-o.patch
new file mode 100644 (file)
index 0000000..e3a7abd
--- /dev/null
@@ -0,0 +1,70 @@
+From f40a2e400c363c0dcffd96c40ea3c3061ff291bc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Jul 2024 13:59:11 +0200
+Subject: firmware: turris-mox-rwtm: Fix checking return value of
+ wait_for_completion_timeout()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <kabel@kernel.org>
+
+[ Upstream commit 8467cfe821ac3526f7598682ad5f90689fa8cc49 ]
+
+The wait_for_completion_timeout() function returns 0 if timed out, and a
+positive value if completed. Fix the usage of this function.
+
+Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver")
+Fixes: 2eab59cf0d20 ("firmware: turris-mox-rwtm: fail probing when firmware does not support hwrng")
+Signed-off-by: Marek Behún <kabel@kernel.org>
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Reviewed-by: Andy Shevchenko <andy@kernel.org>
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/turris-mox-rwtm.c | 15 ++++++---------
+ 1 file changed, 6 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
+index fa4b904d74df1..98bdfadfa1d9e 100644
+--- a/drivers/firmware/turris-mox-rwtm.c
++++ b/drivers/firmware/turris-mox-rwtm.c
+@@ -202,9 +202,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
+       if (ret < 0)
+               return ret;
+-      ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
+-      if (ret < 0)
+-              return ret;
++      if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
++              return -ETIMEDOUT;
+       ret = mox_get_status(MBOX_CMD_BOARD_INFO, reply->retval);
+       if (ret == -ENODATA) {
+@@ -238,9 +237,8 @@ static int mox_get_board_info(struct mox_rwtm *rwtm)
+       if (ret < 0)
+               return ret;
+-      ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
+-      if (ret < 0)
+-              return ret;
++      if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
++              return -ETIMEDOUT;
+       ret = mox_get_status(MBOX_CMD_ECDSA_PUB_KEY, reply->retval);
+       if (ret == -ENODATA) {
+@@ -277,9 +275,8 @@ static int check_get_random_support(struct mox_rwtm *rwtm)
+       if (ret < 0)
+               return ret;
+-      ret = wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2);
+-      if (ret < 0)
+-              return ret;
++      if (!wait_for_completion_timeout(&rwtm->cmd_done, HZ / 2))
++              return -ETIMEDOUT;
+       return mox_get_status(MBOX_CMD_GET_RANDOM, rwtm->reply.retval);
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/firmware-turris-mox-rwtm-initialize-completion-befor.patch b/queue-5.15/firmware-turris-mox-rwtm-initialize-completion-befor.patch
new file mode 100644 (file)
index 0000000..26412f2
--- /dev/null
@@ -0,0 +1,47 @@
+From cbba5e0d3b47da7bcfbd24933971c6181c66591e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Jul 2024 13:59:12 +0200
+Subject: firmware: turris-mox-rwtm: Initialize completion before mailbox
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Behún <kabel@kernel.org>
+
+[ Upstream commit 49e24c80d3c81c43e2a56101449e1eea32fcf292 ]
+
+Initialize the completion before the mailbox channel is requested.
+
+Fixes: 389711b37493 ("firmware: Add Turris Mox rWTM firmware driver")
+Signed-off-by: Marek Behún <kabel@kernel.org>
+Reviewed-by: Andy Shevchenko <andy@kernel.org>
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/turris-mox-rwtm.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/firmware/turris-mox-rwtm.c b/drivers/firmware/turris-mox-rwtm.c
+index 98bdfadfa1d9e..c3d49fcc53305 100644
+--- a/drivers/firmware/turris-mox-rwtm.c
++++ b/drivers/firmware/turris-mox-rwtm.c
+@@ -499,6 +499,7 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
+       platform_set_drvdata(pdev, rwtm);
+       mutex_init(&rwtm->busy);
++      init_completion(&rwtm->cmd_done);
+       rwtm->mbox_client.dev = dev;
+       rwtm->mbox_client.rx_callback = mox_rwtm_rx_callback;
+@@ -512,8 +513,6 @@ static int turris_mox_rwtm_probe(struct platform_device *pdev)
+               goto remove_files;
+       }
+-      init_completion(&rwtm->cmd_done);
+-
+       ret = mox_get_board_info(rwtm);
+       if (ret < 0)
+               dev_warn(dev, "Cannot read board information: %i\n", ret);
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-fix-field-spanning-write-in-index_hdr.patch b/queue-5.15/fs-ntfs3-fix-field-spanning-write-in-index_hdr.patch
new file mode 100644 (file)
index 0000000..cf044c0
--- /dev/null
@@ -0,0 +1,84 @@
+From f82980997895e374dc6b1058a41e4373a3e142d0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 15:13:09 +0300
+Subject: fs/ntfs3: Fix field-spanning write in INDEX_HDR
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 2f3e176fee66ac86ae387787bf06457b101d9f7a ]
+
+Fields flags and res[3] replaced with one 4 byte flags.
+
+Fixes: 4534a70b7056 ("fs/ntfs3: Add headers and misc files")
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/index.c | 4 ++--
+ fs/ntfs3/ntfs.h  | 9 +++++----
+ 2 files changed, 7 insertions(+), 6 deletions(-)
+
+diff --git a/fs/ntfs3/index.c b/fs/ntfs3/index.c
+index a069ae7a748ef..13f492d0d971f 100644
+--- a/fs/ntfs3/index.c
++++ b/fs/ntfs3/index.c
+@@ -979,7 +979,7 @@ static struct indx_node *indx_new(struct ntfs_index *indx,
+               hdr->used =
+                       cpu_to_le32(eo + sizeof(struct NTFS_DE) + sizeof(u64));
+               de_set_vbn_le(e, *sub_vbn);
+-              hdr->flags = 1;
++              hdr->flags = NTFS_INDEX_HDR_HAS_SUBNODES;
+       } else {
+               e->size = cpu_to_le16(sizeof(struct NTFS_DE));
+               hdr->used = cpu_to_le32(eo + sizeof(struct NTFS_DE));
+@@ -1684,7 +1684,7 @@ static int indx_insert_into_root(struct ntfs_index *indx, struct ntfs_inode *ni,
+       e->size = cpu_to_le16(sizeof(struct NTFS_DE) + sizeof(u64));
+       e->flags = NTFS_IE_HAS_SUBNODES | NTFS_IE_LAST;
+-      hdr->flags = 1;
++      hdr->flags = NTFS_INDEX_HDR_HAS_SUBNODES;
+       hdr->used = hdr->total =
+               cpu_to_le32(new_root_size - offsetof(struct INDEX_ROOT, ihdr));
+diff --git a/fs/ntfs3/ntfs.h b/fs/ntfs3/ntfs.h
+index b992ec42a1d92..625f2b52bd586 100644
+--- a/fs/ntfs3/ntfs.h
++++ b/fs/ntfs3/ntfs.h
+@@ -686,14 +686,15 @@ static inline bool de_has_vcn_ex(const struct NTFS_DE *e)
+             offsetof(struct ATTR_FILE_NAME, name) + \
+             NTFS_NAME_LEN * sizeof(short), 8)
++#define NTFS_INDEX_HDR_HAS_SUBNODES cpu_to_le32(1)
++
+ struct INDEX_HDR {
+       __le32 de_off;  // 0x00: The offset from the start of this structure
+                       // to the first NTFS_DE.
+       __le32 used;    // 0x04: The size of this structure plus all
+                       // entries (quad-word aligned).
+       __le32 total;   // 0x08: The allocated size of for this structure plus all entries.
+-      u8 flags;       // 0x0C: 0x00 = Small directory, 0x01 = Large directory.
+-      u8 res[3];
++      __le32 flags;   // 0x0C: 0x00 = Small directory, 0x01 = Large directory.
+       //
+       // de_off + used <= total
+@@ -740,7 +741,7 @@ static inline struct NTFS_DE *hdr_next_de(const struct INDEX_HDR *hdr,
+ static inline bool hdr_has_subnode(const struct INDEX_HDR *hdr)
+ {
+-      return hdr->flags & 1;
++      return hdr->flags & NTFS_INDEX_HDR_HAS_SUBNODES;
+ }
+ struct INDEX_BUFFER {
+@@ -760,7 +761,7 @@ static inline bool ib_is_empty(const struct INDEX_BUFFER *ib)
+ static inline bool ib_is_leaf(const struct INDEX_BUFFER *ib)
+ {
+-      return !(ib->ihdr.flags & 1);
++      return !(ib->ihdr.flags & NTFS_INDEX_HDR_HAS_SUBNODES);
+ }
+ /* Index root structure ( 0x90 ). */
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-fix-getting-file-type.patch b/queue-5.15/fs-ntfs3-fix-getting-file-type.patch
new file mode 100644 (file)
index 0000000..8df43d7
--- /dev/null
@@ -0,0 +1,36 @@
+From 472f3a30bb08355db6e4d137db619367386262a8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Jun 2024 10:41:39 +0300
+Subject: fs/ntfs3: Fix getting file type
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 24c5100aceedcd47af89aaa404d4c96cd2837523 ]
+
+An additional condition causes the mft record to be read from disk
+and get the file type dt_type.
+
+Fixes: 22457c047ed97 ("fs/ntfs3: Modified fix directory element type detection")
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/dir.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/fs/ntfs3/dir.c b/fs/ntfs3/dir.c
+index 98f57d0c702eb..dcd689ed4baae 100644
+--- a/fs/ntfs3/dir.c
++++ b/fs/ntfs3/dir.c
+@@ -326,7 +326,8 @@ static inline int ntfs_filldir(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
+        * It does additional locks/reads just to get the type of name.
+        * Should we use additional mount option to enable branch below?
+        */
+-      if ((fname->dup.fa & FILE_ATTRIBUTE_REPARSE_POINT) &&
++      if (((fname->dup.fa & FILE_ATTRIBUTE_REPARSE_POINT) ||
++           fname->dup.ea_size) &&
+           ino != ni->mi.rno) {
+               struct inode *inode = ntfs_iget5(sbi->sb, &e->ref, NULL);
+               if (!IS_ERR_OR_NULL(inode)) {
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-fix-transform-resident-to-nonresident-for-c.patch b/queue-5.15/fs-ntfs3-fix-transform-resident-to-nonresident-for-c.patch
new file mode 100644 (file)
index 0000000..3a01217
--- /dev/null
@@ -0,0 +1,56 @@
+From 436d3b077c6427507237362bfaad3373db829aea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 May 2024 01:10:01 +0300
+Subject: fs/ntfs3: Fix transform resident to nonresident for compressed files
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 25610ff98d4a34e6a85cbe4fd8671be6b0829f8f ]
+
+Сorrected calculation of required space len (in clusters)
+for attribute data storage in case of compression.
+
+Fixes: be71b5cba2e64 ("fs/ntfs3: Add attrib operations")
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/attrib.c | 13 ++++++++-----
+ 1 file changed, 8 insertions(+), 5 deletions(-)
+
+diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c
+index 558a7e9bf1ef2..e8fc86dab6114 100644
+--- a/fs/ntfs3/attrib.c
++++ b/fs/ntfs3/attrib.c
+@@ -242,7 +242,7 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr,
+       struct ntfs_sb_info *sbi;
+       struct ATTRIB *attr_s;
+       struct MFT_REC *rec;
+-      u32 used, asize, rsize, aoff, align;
++      u32 used, asize, rsize, aoff;
+       bool is_data;
+       CLST len, alen;
+       char *next;
+@@ -263,10 +263,13 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr,
+       rsize = le32_to_cpu(attr->res.data_size);
+       is_data = attr->type == ATTR_DATA && !attr->name_len;
+-      align = sbi->cluster_size;
+-      if (is_attr_compressed(attr))
+-              align <<= NTFS_LZNT_CUNIT;
+-      len = (rsize + align - 1) >> sbi->cluster_bits;
++      /* len - how many clusters required to store 'rsize' bytes */
++      if (is_attr_compressed(attr)) {
++              u8 shift = sbi->cluster_bits + NTFS_LZNT_CUNIT;
++              len = ((rsize + (1u << shift) - 1) >> shift) << NTFS_LZNT_CUNIT;
++      } else {
++              len = bytes_to_cluster(sbi, rsize);
++      }
+       run_init(run);
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-merge-synonym-compression_unit-and-ntfs_lzn.patch b/queue-5.15/fs-ntfs3-merge-synonym-compression_unit-and-ntfs_lzn.patch
new file mode 100644 (file)
index 0000000..d900297
--- /dev/null
@@ -0,0 +1,94 @@
+From 8f158c4dcf2e7256800328d8164fbae297c339ee Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 May 2024 00:41:02 +0300
+Subject: fs/ntfs3: Merge synonym COMPRESSION_UNIT and NTFS_LZNT_CUNIT
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 487f8d482a7e51a640b8f955a398f906a4f83951 ]
+
+COMPRESSION_UNIT and NTFS_LZNT_CUNIT mean the same thing
+(1u<<NTFS_LZNT_CUNIT) determines the size for compression (in clusters).
+
+COMPRESS_MAX_CLUSTER is not used in the code.
+
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Stable-dep-of: 25610ff98d4a ("fs/ntfs3: Fix transform resident to nonresident for compressed files")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/attrib.c  | 2 +-
+ fs/ntfs3/frecord.c | 2 +-
+ fs/ntfs3/fslog.c   | 2 +-
+ fs/ntfs3/inode.c   | 2 +-
+ fs/ntfs3/ntfs.h    | 3 ---
+ 5 files changed, 4 insertions(+), 7 deletions(-)
+
+diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c
+index 64a6d255c4686..558a7e9bf1ef2 100644
+--- a/fs/ntfs3/attrib.c
++++ b/fs/ntfs3/attrib.c
+@@ -265,7 +265,7 @@ int attr_make_nonresident(struct ntfs_inode *ni, struct ATTRIB *attr,
+       align = sbi->cluster_size;
+       if (is_attr_compressed(attr))
+-              align <<= COMPRESSION_UNIT;
++              align <<= NTFS_LZNT_CUNIT;
+       len = (rsize + align - 1) >> sbi->cluster_bits;
+       run_init(run);
+diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
+index b02778cbb1d34..da21a044d3f86 100644
+--- a/fs/ntfs3/frecord.c
++++ b/fs/ntfs3/frecord.c
+@@ -1453,7 +1453,7 @@ int ni_insert_nonresident(struct ntfs_inode *ni, enum ATTR_TYPE type,
+       if (is_ext) {
+               if (flags & ATTR_FLAG_COMPRESSED)
+-                      attr->nres.c_unit = COMPRESSION_UNIT;
++                      attr->nres.c_unit = NTFS_LZNT_CUNIT;
+               attr->nres.total_size = attr->nres.alloc_size;
+       }
+diff --git a/fs/ntfs3/fslog.c b/fs/ntfs3/fslog.c
+index 8ac677e3b250c..8b8125b0e7fb8 100644
+--- a/fs/ntfs3/fslog.c
++++ b/fs/ntfs3/fslog.c
+@@ -2999,7 +2999,7 @@ static struct ATTRIB *attr_create_nonres_log(struct ntfs_sb_info *sbi,
+       if (is_ext) {
+               attr->name_off = SIZEOF_NONRESIDENT_EX_LE;
+               if (is_attr_compressed(attr))
+-                      attr->nres.c_unit = COMPRESSION_UNIT;
++                      attr->nres.c_unit = NTFS_LZNT_CUNIT;
+               attr->nres.run_off =
+                       cpu_to_le16(SIZEOF_NONRESIDENT_EX + name_size);
+diff --git a/fs/ntfs3/inode.c b/fs/ntfs3/inode.c
+index ff45ad967fb82..7adfa19a2f067 100644
+--- a/fs/ntfs3/inode.c
++++ b/fs/ntfs3/inode.c
+@@ -1465,7 +1465,7 @@ struct inode *ntfs_create_inode(struct user_namespace *mnt_userns,
+                       attr->size = cpu_to_le32(SIZEOF_NONRESIDENT_EX + 8);
+                       attr->name_off = SIZEOF_NONRESIDENT_EX_LE;
+                       attr->flags = ATTR_FLAG_COMPRESSED;
+-                      attr->nres.c_unit = COMPRESSION_UNIT;
++                      attr->nres.c_unit = NTFS_LZNT_CUNIT;
+                       asize = SIZEOF_NONRESIDENT_EX + 8;
+               } else {
+                       attr->size = cpu_to_le32(SIZEOF_NONRESIDENT + 8);
+diff --git a/fs/ntfs3/ntfs.h b/fs/ntfs3/ntfs.h
+index 1197d1a232962..b992ec42a1d92 100644
+--- a/fs/ntfs3/ntfs.h
++++ b/fs/ntfs3/ntfs.h
+@@ -82,9 +82,6 @@ typedef u32 CLST;
+ #define RESIDENT_LCN   ((CLST)-2)
+ #define COMPRESSED_LCN ((CLST)-3)
+-#define COMPRESSION_UNIT     4
+-#define COMPRESS_MAX_CLUSTER 0x1000
+-
+ enum RECORD_NUM {
+       MFT_REC_MFT             = 0,
+       MFT_REC_MIRR            = 1,
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-missed-error-return.patch b/queue-5.15/fs-ntfs3-missed-error-return.patch
new file mode 100644 (file)
index 0000000..70ed79f
--- /dev/null
@@ -0,0 +1,32 @@
+From a4686abb681a088b6188aa6edf7b65f750688604 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 13:43:09 +0300
+Subject: fs/ntfs3: Missed error return
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 2cbbd96820255fff4f0ad1533197370c9ccc570b ]
+
+Fixes: 3f3b442b5ad2 ("fs/ntfs3: Add bitmap")
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/bitmap.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/fs/ntfs3/bitmap.c b/fs/ntfs3/bitmap.c
+index 21536b72aa5e5..95589a496f0ff 100644
+--- a/fs/ntfs3/bitmap.c
++++ b/fs/ntfs3/bitmap.c
+@@ -1363,7 +1363,7 @@ int wnd_extend(struct wnd_bitmap *wnd, size_t new_bits)
+               err = ntfs_vbo_to_lbo(sbi, &wnd->run, vbo, &lbo, &bytes);
+               if (err)
+-                      break;
++                      return err;
+               bh = ntfs_bread(sb, lbo >> sb->s_blocksize_bits);
+               if (!bh)
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-missed-ni_flag_update_parent-setting.patch b/queue-5.15/fs-ntfs3-missed-ni_flag_update_parent-setting.patch
new file mode 100644 (file)
index 0000000..e1e3c5a
--- /dev/null
@@ -0,0 +1,31 @@
+From dc51b65b84d282e0ea559a18ab52dc17ab18064e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Jun 2024 20:36:03 +0300
+Subject: fs/ntfs3: Missed NI_FLAG_UPDATE_PARENT setting
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 1c308ace1fd6de93bd0b7e1a5e8963ab27e2c016 ]
+
+Fixes: be71b5cba2e64 ("fs/ntfs3: Add attrib operations")
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/attrib.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/fs/ntfs3/attrib.c b/fs/ntfs3/attrib.c
+index e8fc86dab6114..83c15c70f5945 100644
+--- a/fs/ntfs3/attrib.c
++++ b/fs/ntfs3/attrib.c
+@@ -1565,6 +1565,7 @@ int attr_allocate_frame(struct ntfs_inode *ni, CLST frame, size_t compr_size,
+       attr_b->nres.total_size = cpu_to_le64(total_size);
+       inode_set_bytes(&ni->vfs_inode, total_size);
++      ni->ni_flags |= NI_FLAG_UPDATE_PARENT;
+       mi_b->dirty = true;
+       mark_inode_dirty(&ni->vfs_inode);
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-replace-inode_trylock-with-inode_lock.patch b/queue-5.15/fs-ntfs3-replace-inode_trylock-with-inode_lock.patch
new file mode 100644 (file)
index 0000000..6cbca3b
--- /dev/null
@@ -0,0 +1,37 @@
+From 902bcdbfae4b57b880531a43b6ffd31b0842b51c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 May 2024 10:54:07 +0300
+Subject: fs/ntfs3: Replace inode_trylock with inode_lock
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 69505fe98f198ee813898cbcaf6770949636430b ]
+
+The issue was detected due to xfstest 465 failing.
+
+Fixes: 4342306f0f0d ("fs/ntfs3: Add file operations and implementation")
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/file.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/fs/ntfs3/file.c b/fs/ntfs3/file.c
+index 6d4f3431bc75a..af7e138064624 100644
+--- a/fs/ntfs3/file.c
++++ b/fs/ntfs3/file.c
+@@ -398,10 +398,7 @@ static int ntfs_file_mmap(struct file *file, struct vm_area_struct *vma)
+               }
+               if (ni->i_valid < to) {
+-                      if (!inode_trylock(inode)) {
+-                              err = -EAGAIN;
+-                              goto out;
+-                      }
++                      inode_lock(inode);
+                       err = ntfs_extend_initialized_size(file, ni,
+                                                          ni->i_valid, to);
+                       inode_unlock(inode);
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-ntfs3-use-align-kernel-macro.patch b/queue-5.15/fs-ntfs3-use-align-kernel-macro.patch
new file mode 100644 (file)
index 0000000..2ff2622
--- /dev/null
@@ -0,0 +1,61 @@
+From ba509ccb15151907d2851835d032a060d819a8fd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Oct 2022 20:12:02 +0300
+Subject: fs/ntfs3: Use ALIGN kernel macro
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 97a6815e50619377704e6566fb2b77c1aa4e2647 ]
+
+This way code will be more readable.
+
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Stable-dep-of: 25610ff98d4a ("fs/ntfs3: Fix transform resident to nonresident for compressed files")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/fsntfs.c  | 2 +-
+ fs/ntfs3/ntfs.h    | 1 -
+ fs/ntfs3/ntfs_fs.h | 2 ++
+ 3 files changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/fs/ntfs3/fsntfs.c b/fs/ntfs3/fsntfs.c
+index 1b082b7a67ee2..4bd3e6718ee65 100644
+--- a/fs/ntfs3/fsntfs.c
++++ b/fs/ntfs3/fsntfs.c
+@@ -475,7 +475,7 @@ static int ntfs_extend_mft(struct ntfs_sb_info *sbi)
+       struct ATTRIB *attr;
+       struct wnd_bitmap *wnd = &sbi->mft.bitmap;
+-      new_mft_total = (wnd->nbits + MFT_INCREASE_CHUNK + 127) & (CLST)~127;
++      new_mft_total = ALIGN(wnd->nbits + NTFS_MFT_INCREASE_STEP, 128);
+       new_mft_bytes = (u64)new_mft_total << sbi->record_bits;
+       /* Step 1: Resize $MFT::DATA. */
+diff --git a/fs/ntfs3/ntfs.h b/fs/ntfs3/ntfs.h
+index 324c0b036fdc1..1197d1a232962 100644
+--- a/fs/ntfs3/ntfs.h
++++ b/fs/ntfs3/ntfs.h
+@@ -84,7 +84,6 @@ typedef u32 CLST;
+ #define COMPRESSION_UNIT     4
+ #define COMPRESS_MAX_CLUSTER 0x1000
+-#define MFT_INCREASE_CHUNK   1024
+ enum RECORD_NUM {
+       MFT_REC_MFT             = 0,
+diff --git a/fs/ntfs3/ntfs_fs.h b/fs/ntfs3/ntfs_fs.h
+index 12a3b41d351c9..e67bef4018079 100644
+--- a/fs/ntfs3/ntfs_fs.h
++++ b/fs/ntfs3/ntfs_fs.h
+@@ -198,6 +198,8 @@ struct ntfs_index {
+ /* Minimum MFT zone. */
+ #define NTFS_MIN_MFT_ZONE 100
++/* Step to increase the MFT. */
++#define NTFS_MFT_INCREASE_STEP 1024
+ /* Ntfs file system in-core superblock data. */
+ struct ntfs_sb_info {
+-- 
+2.43.0
+
diff --git a/queue-5.15/fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch b/queue-5.15/fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch
new file mode 100644 (file)
index 0000000..bb260bf
--- /dev/null
@@ -0,0 +1,65 @@
+From 0ff0293f0005df8bcef686d6029e184b7fe8b0c7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jun 2024 14:23:52 +0200
+Subject: fs/proc/task_mmu: indicate PM_FILE for PMD-mapped file THP
+
+From: David Hildenbrand <david@redhat.com>
+
+[ Upstream commit 3f9f022e975d930709848a86a1c79775b0585202 ]
+
+Patch series "fs/proc: move page_mapcount() to fs/proc/internal.h".
+
+With all other page_mapcount() users in the tree gone, move
+page_mapcount() to fs/proc/internal.h, rename it and extend the
+documentation to prevent future (ab)use.
+
+... of course, I find some issues while working on that code that I sort
+first ;)
+
+We'll now only end up calling page_mapcount() [now
+folio_precise_page_mapcount()] on pages mapped via present page table
+entries.  Except for /proc/kpagecount, that still does questionable
+things, but we'll leave that legacy interface as is for now.
+
+Did a quick sanity check.  Likely we would want some better selfestest for
+/proc/$/pagemap + smaps.  I'll see if I can find some time to write some
+more.
+
+This patch (of 6):
+
+Looks like we never taught pagemap_pmd_range() about the existence of
+PMD-mapped file THPs.  Seems to date back to the times when we first added
+support for non-anon THPs in the form of shmem THP.
+
+Link: https://lkml.kernel.org/r/20240607122357.115423-1-david@redhat.com
+Link: https://lkml.kernel.org/r/20240607122357.115423-2-david@redhat.com
+Signed-off-by: David Hildenbrand <david@redhat.com>
+Fixes: 800d8c63b2e9 ("shmem: add huge pages support")
+Acked-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
+Reviewed-by: Lance Yang <ioworker0@gmail.com>
+Reviewed-by: Oscar Salvador <osalvador@suse.de>
+Cc: David Hildenbrand <david@redhat.com>
+Cc: Jonathan Corbet <corbet@lwn.net>
+Cc: Alexey Dobriyan <adobriyan@gmail.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/proc/task_mmu.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/fs/proc/task_mmu.c b/fs/proc/task_mmu.c
+index 705a41f4d6b36..b255e3dfded14 100644
+--- a/fs/proc/task_mmu.c
++++ b/fs/proc/task_mmu.c
+@@ -1471,6 +1471,8 @@ static int pagemap_pmd_range(pmd_t *pmdp, unsigned long addr, unsigned long end,
+               }
+ #endif
++              if (page && !PageAnon(page))
++                      flags |= PM_FILE;
+               if (page && !migration && page_mapcount(page) == 1)
+                       flags |= PM_MMAP_EXCLUSIVE;
+-- 
+2.43.0
+
diff --git a/queue-5.15/gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch b/queue-5.15/gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch
new file mode 100644 (file)
index 0000000..6461be1
--- /dev/null
@@ -0,0 +1,38 @@
+From fa3b401e7ce55f908a8c119d67f3c484397b4d62 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 Jul 2024 14:50:08 +0800
+Subject: gss_krb5: Fix the error handling path for crypto_sync_skcipher_setkey
+
+From: Gaosheng Cui <cuigaosheng1@huawei.com>
+
+[ Upstream commit a3123341dc358952ce2bf8067fbdfb7eaadf71bb ]
+
+If we fail to call crypto_sync_skcipher_setkey, we should free the
+memory allocation for cipher, replace err_return with err_free_cipher
+to free the memory of cipher.
+
+Fixes: 4891f2d008e4 ("gss_krb5: import functionality to derive keys into the kernel")
+Signed-off-by: Gaosheng Cui <cuigaosheng1@huawei.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sunrpc/auth_gss/gss_krb5_keys.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/net/sunrpc/auth_gss/gss_krb5_keys.c b/net/sunrpc/auth_gss/gss_krb5_keys.c
+index 726c076950c04..fc4639687c0fd 100644
+--- a/net/sunrpc/auth_gss/gss_krb5_keys.c
++++ b/net/sunrpc/auth_gss/gss_krb5_keys.c
+@@ -161,7 +161,7 @@ u32 krb5_derive_key(const struct gss_krb5_enctype *gk5e,
+       if (IS_ERR(cipher))
+               goto err_return;
+       if (crypto_sync_skcipher_setkey(cipher, inkey->data, inkey->len))
+-              goto err_return;
++              goto err_free_cipher;
+       /* allocate and set up buffers */
+-- 
+2.43.0
+
diff --git a/queue-5.15/hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch b/queue-5.15/hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch
new file mode 100644 (file)
index 0000000..85db651
--- /dev/null
@@ -0,0 +1,211 @@
+From 386375951daf4820f88b705f68d97237120df0a2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jun 2024 22:23:04 +0800
+Subject: hfsplus: fix to avoid false alarm of circular locking
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Chao Yu <chao@kernel.org>
+
+[ Upstream commit be4edd1642ee205ed7bbf66edc0453b1be1fb8d7 ]
+
+Syzbot report potential ABBA deadlock as below:
+
+loop0: detected capacity change from 0 to 1024
+======================================================
+WARNING: possible circular locking dependency detected
+6.9.0-syzkaller-10323-g8f6a15f095a6 #0 Not tainted
+------------------------------------------------------
+syz-executor171/5344 is trying to acquire lock:
+ffff88807cb980b0 (&tree->tree_lock){+.+.}-{3:3}, at: hfsplus_file_truncate+0x811/0xb50 fs/hfsplus/extents.c:595
+
+but task is already holding lock:
+ffff88807a930108 (&HFSPLUS_I(inode)->extents_lock){+.+.}-{3:3}, at: hfsplus_file_truncate+0x2da/0xb50 fs/hfsplus/extents.c:576
+
+which lock already depends on the new lock.
+
+the existing dependency chain (in reverse order) is:
+
+-> #1 (&HFSPLUS_I(inode)->extents_lock){+.+.}-{3:3}:
+       lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5754
+       __mutex_lock_common kernel/locking/mutex.c:608 [inline]
+       __mutex_lock+0x136/0xd70 kernel/locking/mutex.c:752
+       hfsplus_file_extend+0x21b/0x1b70 fs/hfsplus/extents.c:457
+       hfsplus_bmap_reserve+0x105/0x4e0 fs/hfsplus/btree.c:358
+       hfsplus_rename_cat+0x1d0/0x1050 fs/hfsplus/catalog.c:456
+       hfsplus_rename+0x12e/0x1c0 fs/hfsplus/dir.c:552
+       vfs_rename+0xbdb/0xf00 fs/namei.c:4887
+       do_renameat2+0xd94/0x13f0 fs/namei.c:5044
+       __do_sys_rename fs/namei.c:5091 [inline]
+       __se_sys_rename fs/namei.c:5089 [inline]
+       __x64_sys_rename+0x86/0xa0 fs/namei.c:5089
+       do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+       do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83
+       entry_SYSCALL_64_after_hwframe+0x77/0x7f
+
+-> #0 (&tree->tree_lock){+.+.}-{3:3}:
+       check_prev_add kernel/locking/lockdep.c:3134 [inline]
+       check_prevs_add kernel/locking/lockdep.c:3253 [inline]
+       validate_chain+0x18cb/0x58e0 kernel/locking/lockdep.c:3869
+       __lock_acquire+0x1346/0x1fd0 kernel/locking/lockdep.c:5137
+       lock_acquire+0x1ed/0x550 kernel/locking/lockdep.c:5754
+       __mutex_lock_common kernel/locking/mutex.c:608 [inline]
+       __mutex_lock+0x136/0xd70 kernel/locking/mutex.c:752
+       hfsplus_file_truncate+0x811/0xb50 fs/hfsplus/extents.c:595
+       hfsplus_setattr+0x1ce/0x280 fs/hfsplus/inode.c:265
+       notify_change+0xb9d/0xe70 fs/attr.c:497
+       do_truncate+0x220/0x310 fs/open.c:65
+       handle_truncate fs/namei.c:3308 [inline]
+       do_open fs/namei.c:3654 [inline]
+       path_openat+0x2a3d/0x3280 fs/namei.c:3807
+       do_filp_open+0x235/0x490 fs/namei.c:3834
+       do_sys_openat2+0x13e/0x1d0 fs/open.c:1406
+       do_sys_open fs/open.c:1421 [inline]
+       __do_sys_creat fs/open.c:1497 [inline]
+       __se_sys_creat fs/open.c:1491 [inline]
+       __x64_sys_creat+0x123/0x170 fs/open.c:1491
+       do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+       do_syscall_64+0xf5/0x240 arch/x86/entry/common.c:83
+       entry_SYSCALL_64_after_hwframe+0x77/0x7f
+
+other info that might help us debug this:
+
+ Possible unsafe locking scenario:
+
+       CPU0                    CPU1
+       ----                    ----
+  lock(&HFSPLUS_I(inode)->extents_lock);
+                               lock(&tree->tree_lock);
+                               lock(&HFSPLUS_I(inode)->extents_lock);
+  lock(&tree->tree_lock);
+
+This is a false alarm as tree_lock mutex are different, one is
+from sbi->cat_tree, and another is from sbi->ext_tree:
+
+Thread A                       Thread B
+- hfsplus_rename
+ - hfsplus_rename_cat
+  - hfs_find_init
+   - mutext_lock(cat_tree->tree_lock)
+                               - hfsplus_setattr
+                                - hfsplus_file_truncate
+                                 - mutex_lock(hip->extents_lock)
+                                 - hfs_find_init
+                                  - mutext_lock(ext_tree->tree_lock)
+  - hfs_bmap_reserve
+   - hfsplus_file_extend
+    - mutex_lock(hip->extents_lock)
+
+So, let's call mutex_lock_nested for tree_lock mutex lock, and pass
+correct lock class for it.
+
+Fixes: 31651c607151 ("hfsplus: avoid deadlock on file truncation")
+Reported-by: syzbot+6030b3b1b9bf70e538c4@syzkaller.appspotmail.com
+Closes: https://lore.kernel.org/linux-fsdevel/000000000000e37a4005ef129563@google.com
+Cc: Ernesto A. Fernández <ernesto.mnd.fernandez@gmail.com>
+Signed-off-by: Chao Yu <chao@kernel.org>
+Link: https://lore.kernel.org/r/20240607142304.455441-1-chao@kernel.org
+Signed-off-by: Christian Brauner <brauner@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/hfsplus/bfind.c      | 15 ++-------------
+ fs/hfsplus/extents.c    |  9 ++++++---
+ fs/hfsplus/hfsplus_fs.h | 21 +++++++++++++++++++++
+ 3 files changed, 29 insertions(+), 16 deletions(-)
+
+diff --git a/fs/hfsplus/bfind.c b/fs/hfsplus/bfind.c
+index ca2ba8c9f82ef..901e83d65d202 100644
+--- a/fs/hfsplus/bfind.c
++++ b/fs/hfsplus/bfind.c
+@@ -25,19 +25,8 @@ int hfs_find_init(struct hfs_btree *tree, struct hfs_find_data *fd)
+       fd->key = ptr + tree->max_key_len + 2;
+       hfs_dbg(BNODE_REFS, "find_init: %d (%p)\n",
+               tree->cnid, __builtin_return_address(0));
+-      switch (tree->cnid) {
+-      case HFSPLUS_CAT_CNID:
+-              mutex_lock_nested(&tree->tree_lock, CATALOG_BTREE_MUTEX);
+-              break;
+-      case HFSPLUS_EXT_CNID:
+-              mutex_lock_nested(&tree->tree_lock, EXTENTS_BTREE_MUTEX);
+-              break;
+-      case HFSPLUS_ATTR_CNID:
+-              mutex_lock_nested(&tree->tree_lock, ATTR_BTREE_MUTEX);
+-              break;
+-      default:
+-              BUG();
+-      }
++      mutex_lock_nested(&tree->tree_lock,
++                      hfsplus_btree_lock_class(tree));
+       return 0;
+ }
+diff --git a/fs/hfsplus/extents.c b/fs/hfsplus/extents.c
+index 7054a542689f9..c95a2f0ed4a74 100644
+--- a/fs/hfsplus/extents.c
++++ b/fs/hfsplus/extents.c
+@@ -430,7 +430,8 @@ int hfsplus_free_fork(struct super_block *sb, u32 cnid,
+               hfsplus_free_extents(sb, ext_entry, total_blocks - start,
+                                    total_blocks);
+               total_blocks = start;
+-              mutex_lock(&fd.tree->tree_lock);
++              mutex_lock_nested(&fd.tree->tree_lock,
++                      hfsplus_btree_lock_class(fd.tree));
+       } while (total_blocks > blocks);
+       hfs_find_exit(&fd);
+@@ -592,7 +593,8 @@ void hfsplus_file_truncate(struct inode *inode)
+                                            alloc_cnt, alloc_cnt - blk_cnt);
+                       hfsplus_dump_extent(hip->first_extents);
+                       hip->first_blocks = blk_cnt;
+-                      mutex_lock(&fd.tree->tree_lock);
++                      mutex_lock_nested(&fd.tree->tree_lock,
++                              hfsplus_btree_lock_class(fd.tree));
+                       break;
+               }
+               res = __hfsplus_ext_cache_extent(&fd, inode, alloc_cnt);
+@@ -606,7 +608,8 @@ void hfsplus_file_truncate(struct inode *inode)
+               hfsplus_free_extents(sb, hip->cached_extents,
+                                    alloc_cnt - start, alloc_cnt - blk_cnt);
+               hfsplus_dump_extent(hip->cached_extents);
+-              mutex_lock(&fd.tree->tree_lock);
++              mutex_lock_nested(&fd.tree->tree_lock,
++                              hfsplus_btree_lock_class(fd.tree));
+               if (blk_cnt > start) {
+                       hip->extent_state |= HFSPLUS_EXT_DIRTY;
+                       break;
+diff --git a/fs/hfsplus/hfsplus_fs.h b/fs/hfsplus/hfsplus_fs.h
+index ebc0d5c678d0c..decb671db91b4 100644
+--- a/fs/hfsplus/hfsplus_fs.h
++++ b/fs/hfsplus/hfsplus_fs.h
+@@ -550,6 +550,27 @@ static inline __be32 __hfsp_ut2mt(time64_t ut)
+       return cpu_to_be32(lower_32_bits(ut) + HFSPLUS_UTC_OFFSET);
+ }
++static inline enum hfsplus_btree_mutex_classes
++hfsplus_btree_lock_class(struct hfs_btree *tree)
++{
++      enum hfsplus_btree_mutex_classes class;
++
++      switch (tree->cnid) {
++      case HFSPLUS_CAT_CNID:
++              class = CATALOG_BTREE_MUTEX;
++              break;
++      case HFSPLUS_EXT_CNID:
++              class = EXTENTS_BTREE_MUTEX;
++              break;
++      case HFSPLUS_ATTR_CNID:
++              class = ATTR_BTREE_MUTEX;
++              break;
++      default:
++              BUG();
++      }
++      return class;
++}
++
+ /* compatibility */
+ #define hfsp_mt2ut(t)         (struct timespec64){ .tv_sec = __hfsp_mt2ut(t) }
+ #define hfsp_ut2mt(t)         __hfsp_ut2mt((t).tv_sec)
+-- 
+2.43.0
+
diff --git a/queue-5.15/hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch b/queue-5.15/hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch
new file mode 100644 (file)
index 0000000..d656c6f
--- /dev/null
@@ -0,0 +1,38 @@
+From f31a56fddb8887bdcf0acdd7f7b4c7a0bc1bdd5c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 1 Jul 2024 15:32:52 +0800
+Subject: hwmon: (adt7475) Fix default duty on fan is disabled
+
+From: Wayne Tung <chineweff@gmail.com>
+
+[ Upstream commit 39b24cced70fdc336dbc0070f8b3bde61d8513a8 ]
+
+According to the comments on fan is disabled, we change to manual mode
+and set the duty cycle to 0.
+For setting the duty cycle part, the register is wrong. Fix it.
+
+Fixes: 1c301fc5394f ("hwmon: Add a driver for the ADT7475 hardware monitoring chip")
+Signed-off-by: Wayne Tung <chineweff@gmail.com>
+Link: https://lore.kernel.org/r/20240701073252.317397-1-chineweff@gmail.com
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/adt7475.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/hwmon/adt7475.c b/drivers/hwmon/adt7475.c
+index 22e314725def0..b4c0f01f52c4f 100644
+--- a/drivers/hwmon/adt7475.c
++++ b/drivers/hwmon/adt7475.c
+@@ -1770,7 +1770,7 @@ static void adt7475_read_pwm(struct i2c_client *client, int index)
+               data->pwm[CONTROL][index] &= ~0xE0;
+               data->pwm[CONTROL][index] |= (7 << 5);
+-              i2c_smbus_write_byte_data(client, PWM_CONFIG_REG(index),
++              i2c_smbus_write_byte_data(client, PWM_REG(index),
+                                         data->pwm[INPUT][index]);
+               i2c_smbus_write_byte_data(client, PWM_CONFIG_REG(index),
+-- 
+2.43.0
+
diff --git a/queue-5.15/hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch b/queue-5.15/hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch
new file mode 100644 (file)
index 0000000..5c55f81
--- /dev/null
@@ -0,0 +1,48 @@
+From 81b66c74758ee9d894ea88cdb37deef6d06a7e26 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 13 Jul 2024 12:03:53 -0700
+Subject: hwmon: (max6697) Fix swapped temp{1,8} critical alarms
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit 1ea3fd1eb9869fcdcbc9c68f9728bfc47b9503f1 ]
+
+The critical alarm bit for the local temperature sensor (temp1) is in
+bit 7 of register 0x45 (not bit 6), and the critical alarm bit for remote
+temperature sensor 7 (temp8) is in bit 6 (not bit 7).
+
+This only affects MAX6581 since all other chips supported by this driver
+do not support those critical alarms.
+
+Fixes: 5372d2d71c46 ("hwmon: Driver for Maxim MAX6697 and compatibles")
+Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/max6697.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hwmon/max6697.c b/drivers/hwmon/max6697.c
+index 563e73f071d07..266baae94e3ee 100644
+--- a/drivers/hwmon/max6697.c
++++ b/drivers/hwmon/max6697.c
+@@ -430,14 +430,14 @@ static SENSOR_DEVICE_ATTR_RO(temp6_max_alarm, alarm, 20);
+ static SENSOR_DEVICE_ATTR_RO(temp7_max_alarm, alarm, 21);
+ static SENSOR_DEVICE_ATTR_RO(temp8_max_alarm, alarm, 23);
+-static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm, alarm, 14);
++static SENSOR_DEVICE_ATTR_RO(temp1_crit_alarm, alarm, 15);
+ static SENSOR_DEVICE_ATTR_RO(temp2_crit_alarm, alarm, 8);
+ static SENSOR_DEVICE_ATTR_RO(temp3_crit_alarm, alarm, 9);
+ static SENSOR_DEVICE_ATTR_RO(temp4_crit_alarm, alarm, 10);
+ static SENSOR_DEVICE_ATTR_RO(temp5_crit_alarm, alarm, 11);
+ static SENSOR_DEVICE_ATTR_RO(temp6_crit_alarm, alarm, 12);
+ static SENSOR_DEVICE_ATTR_RO(temp7_crit_alarm, alarm, 13);
+-static SENSOR_DEVICE_ATTR_RO(temp8_crit_alarm, alarm, 15);
++static SENSOR_DEVICE_ATTR_RO(temp8_crit_alarm, alarm, 14);
+ static SENSOR_DEVICE_ATTR_RO(temp2_fault, alarm, 1);
+ static SENSOR_DEVICE_ATTR_RO(temp3_fault, alarm, 2);
+-- 
+2.43.0
+
diff --git a/queue-5.15/hwmon-max6697-fix-underflow-when-writing-limit-attri.patch b/queue-5.15/hwmon-max6697-fix-underflow-when-writing-limit-attri.patch
new file mode 100644 (file)
index 0000000..f272aa4
--- /dev/null
@@ -0,0 +1,40 @@
+From 05b8c2c2086f286178ebcb4256528d5ef8bbef3e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 13 Jul 2024 14:26:19 -0700
+Subject: hwmon: (max6697) Fix underflow when writing limit attributes
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit cbf7467828cd4ec7ceac7a8b5b5ddb2f69f07b0e ]
+
+Using DIV_ROUND_CLOSEST() on an unbound value can result in underflows.
+Indeed, module test scripts report:
+
+temp1_max: Suspected underflow: [min=0, read 255000, written -9223372036854775808]
+temp1_crit: Suspected underflow: [min=0, read 255000, written -9223372036854775808]
+
+Fix by introducing an extra set of clamping.
+
+Fixes: 5372d2d71c46 ("hwmon: Driver for Maxim MAX6697 and compatibles")
+Reviewed-by: Tzung-Bi Shih <tzungbi@kernel.org>
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/max6697.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/hwmon/max6697.c b/drivers/hwmon/max6697.c
+index 2895cea541934..563e73f071d07 100644
+--- a/drivers/hwmon/max6697.c
++++ b/drivers/hwmon/max6697.c
+@@ -312,6 +312,7 @@ static ssize_t temp_store(struct device *dev,
+               return ret;
+       mutex_lock(&data->update_lock);
++      temp = clamp_val(temp, -1000000, 1000000);      /* prevent underflow */
+       temp = DIV_ROUND_CLOSEST(temp, 1000) + data->temp_offset;
+       temp = clamp_val(temp, 0, data->type == max6581 ? 255 : 127);
+       data->temp[nr][index] = temp;
+-- 
+2.43.0
+
diff --git a/queue-5.15/input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch b/queue-5.15/input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch
new file mode 100644 (file)
index 0000000..9405c40
--- /dev/null
@@ -0,0 +1,36 @@
+From 37fa7ec601a3e85258c4a0ba1a783d3785eae1e8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 23:02:48 -0700
+Subject: Input: elan_i2c - do not leave interrupt disabled on suspend failure
+
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+[ Upstream commit 5f82c1e04721e7cd98e604eb4e58f0724d8e5a65 ]
+
+Make sure interrupts are not left disabled when we fail to suspend the
+touch controller.
+
+Fixes: 6696777c6506 ("Input: add driver for Elan I2C/SMbus touchpad")
+Link: https://lore.kernel.org/r/ZmKiiL-1wzKrhqBj@google.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/mouse/elan_i2c_core.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/input/mouse/elan_i2c_core.c b/drivers/input/mouse/elan_i2c_core.c
+index e1758d5ffe421..a5f067b93ab9a 100644
+--- a/drivers/input/mouse/elan_i2c_core.c
++++ b/drivers/input/mouse/elan_i2c_core.c
+@@ -1378,6 +1378,8 @@ static int __maybe_unused elan_suspend(struct device *dev)
+       }
+ err:
++      if (ret)
++              enable_irq(client->irq);
+       mutex_unlock(&data->sysfs_mutex);
+       return ret;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/input-qt1050-handle-chip_id-reading-error.patch b/queue-5.15/input-qt1050-handle-chip_id-reading-error.patch
new file mode 100644 (file)
index 0000000..9e4dfb5
--- /dev/null
@@ -0,0 +1,49 @@
+From 4e27c12a4e1d8f8256701afbb9cefa4bfd5891bc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 20:30:18 +0200
+Subject: Input: qt1050 - handle CHIP_ID reading error
+
+From: Andrei Lalaev <andrei.lalaev@anton-paar.com>
+
+[ Upstream commit 866a5c7e2781cf1b019072288f1f5c64186dcb63 ]
+
+If the device is missing, we get the following error:
+
+  qt1050 3-0041: ID -1340767592 not supported
+
+Let's handle this situation and print more informative error
+when reading of CHIP_ID fails:
+
+  qt1050 3-0041: Failed to read chip ID: -6
+
+Fixes: cbebf5addec1 ("Input: qt1050 - add Microchip AT42QT1050 support")
+Signed-off-by: Andrei Lalaev <andrei.lalaev@anton-paar.com>
+Reviewed-by: Marco Felsch <m.felsch@pengutronix.de>
+Link: https://lore.kernel.org/r/20240617183018.916234-1-andrey.lalaev@gmail.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/keyboard/qt1050.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/input/keyboard/qt1050.c b/drivers/input/keyboard/qt1050.c
+index 403060d05c3b3..7193a4198e214 100644
+--- a/drivers/input/keyboard/qt1050.c
++++ b/drivers/input/keyboard/qt1050.c
+@@ -226,7 +226,12 @@ static bool qt1050_identify(struct qt1050_priv *ts)
+       int err;
+       /* Read Chip ID */
+-      regmap_read(ts->regmap, QT1050_CHIP_ID, &val);
++      err = regmap_read(ts->regmap, QT1050_CHIP_ID, &val);
++      if (err) {
++              dev_err(&ts->client->dev, "Failed to read chip ID: %d\n", err);
++              return false;
++      }
++
+       if (val != QT1050_CHIP_ID_VER) {
+               dev_err(&ts->client->dev, "ID %d not supported\n", val);
+               return false;
+-- 
+2.43.0
+
diff --git a/queue-5.15/ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch b/queue-5.15/ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch
new file mode 100644 (file)
index 0000000..eaf1a76
--- /dev/null
@@ -0,0 +1,47 @@
+From 0ac449f2601fd4c1d940d692e9b18c9292763e71 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 May 2024 18:54:44 +0200
+Subject: ipvs: Avoid unnecessary calls to skb_is_gso_sctp
+
+From: Ismael Luceno <iluceno@suse.de>
+
+[ Upstream commit 53796b03295cf7ab1fc8600016fa6dfbf4a494a0 ]
+
+In the context of the SCTP SNAT/DNAT handler, these calls can only
+return true.
+
+Fixes: e10d3ba4d434 ("ipvs: Fix checksumming on GSO of SCTP packets")
+Signed-off-by: Ismael Luceno <iluceno@suse.de>
+Acked-by: Julian Anastasov <ja@ssi.bg>
+Acked-by: Simon Horman <horms@kernel.org>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/ipvs/ip_vs_proto_sctp.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/netfilter/ipvs/ip_vs_proto_sctp.c b/net/netfilter/ipvs/ip_vs_proto_sctp.c
+index 1e689c7141271..83e452916403d 100644
+--- a/net/netfilter/ipvs/ip_vs_proto_sctp.c
++++ b/net/netfilter/ipvs/ip_vs_proto_sctp.c
+@@ -126,7 +126,7 @@ sctp_snat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
+       if (sctph->source != cp->vport || payload_csum ||
+           skb->ip_summed == CHECKSUM_PARTIAL) {
+               sctph->source = cp->vport;
+-              if (!skb_is_gso(skb) || !skb_is_gso_sctp(skb))
++              if (!skb_is_gso(skb))
+                       sctp_nat_csum(skb, sctph, sctphoff);
+       } else {
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+@@ -175,7 +175,7 @@ sctp_dnat_handler(struct sk_buff *skb, struct ip_vs_protocol *pp,
+           (skb->ip_summed == CHECKSUM_PARTIAL &&
+            !(skb_dst(skb)->dev->features & NETIF_F_SCTP_CRC))) {
+               sctph->dest = cp->dport;
+-              if (!skb_is_gso(skb) || !skb_is_gso_sctp(skb))
++              if (!skb_is_gso(skb))
+                       sctp_nat_csum(skb, sctph, sctphoff);
+       } else if (skb->ip_summed != CHECKSUM_PARTIAL) {
+               skb->ip_summed = CHECKSUM_UNNECESSARY;
+-- 
+2.43.0
+
diff --git a/queue-5.15/kvm-s390-fix-race-in-gmap_make_secure.patch b/queue-5.15/kvm-s390-fix-race-in-gmap_make_secure.patch
new file mode 100644 (file)
index 0000000..e718ad8
--- /dev/null
@@ -0,0 +1,95 @@
+From b739fcc754aeb7b3d4948ab3ccd9395e69591576 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Apr 2023 11:27:53 +0200
+Subject: KVM: s390: fix race in gmap_make_secure()
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+[ Upstream commit c148dc8e2fa403be501612ee409db866eeed35c0 ]
+
+Fix a potential race in gmap_make_secure() and remove the last user of
+follow_page() without FOLL_GET.
+
+The old code is locking something it doesn't have a reference to, and
+as explained by Jason and David in this discussion:
+https://lore.kernel.org/linux-mm/Y9J4P%2FRNvY1Ztn0Q@nvidia.com/
+it can lead to all kind of bad things, including the page getting
+unmapped (MADV_DONTNEED), freed, reallocated as a larger folio and the
+unlock_page() would target the wrong bit.
+There is also another race with the FOLL_WRITE, which could race
+between the follow_page() and the get_locked_pte().
+
+The main point is to remove the last use of follow_page() without
+FOLL_GET or FOLL_PIN, removing the races can be considered a nice
+bonus.
+
+Link: https://lore.kernel.org/linux-mm/Y9J4P%2FRNvY1Ztn0Q@nvidia.com/
+Suggested-by: Jason Gunthorpe <jgg@nvidia.com>
+Fixes: 214d9bbcd3a6 ("s390/mm: provide memory management functions for protected KVM guests")
+Reviewed-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Message-Id: <20230428092753.27913-2-imbrenda@linux.ibm.com>
+Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/uv.c | 32 +++++++++++---------------------
+ 1 file changed, 11 insertions(+), 21 deletions(-)
+
+diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
+index 56bb0a4829770..bdf4d2bed87c5 100644
+--- a/arch/s390/kernel/uv.c
++++ b/arch/s390/kernel/uv.c
+@@ -192,21 +192,10 @@ static int expected_page_refs(struct page *page)
+       return res;
+ }
+-static int make_secure_pte(pte_t *ptep, unsigned long addr,
+-                         struct page *exp_page, struct uv_cb_header *uvcb)
++static int make_page_secure(struct page *page, struct uv_cb_header *uvcb)
+ {
+-      pte_t entry = READ_ONCE(*ptep);
+-      struct page *page;
+       int expected, cc = 0;
+-      if (!pte_present(entry))
+-              return -ENXIO;
+-      if (pte_val(entry) & _PAGE_INVALID)
+-              return -ENXIO;
+-
+-      page = pte_page(entry);
+-      if (page != exp_page)
+-              return -ENXIO;
+       if (PageWriteback(page))
+               return -EAGAIN;
+       expected = expected_page_refs(page);
+@@ -297,17 +286,18 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+               goto out;
+       rc = -ENXIO;
+-      page = follow_page(vma, uaddr, FOLL_WRITE);
+-      if (IS_ERR_OR_NULL(page))
+-              goto out;
+-
+-      lock_page(page);
+       ptep = get_locked_pte(gmap->mm, uaddr, &ptelock);
+-      if (should_export_before_import(uvcb, gmap->mm))
+-              uv_convert_from_secure(page_to_phys(page));
+-      rc = make_secure_pte(ptep, uaddr, page, uvcb);
++      if (pte_present(*ptep) && !(pte_val(*ptep) & _PAGE_INVALID) && pte_write(*ptep)) {
++              page = pte_page(*ptep);
++              rc = -EAGAIN;
++              if (trylock_page(page)) {
++                      if (should_export_before_import(uvcb, gmap->mm))
++                              uv_convert_from_secure(page_to_phys(page));
++                      rc = make_page_secure(page, uvcb);
++                      unlock_page(page);
++              }
++      }
+       pte_unmap_unlock(ptep, ptelock);
+-      unlock_page(page);
+ out:
+       mmap_read_unlock(gmap->mm);
+-- 
+2.43.0
+
diff --git a/queue-5.15/kvm-s390-pv-add-export-before-import.patch b/queue-5.15/kvm-s390-pv-add-export-before-import.patch
new file mode 100644 (file)
index 0000000..fa4ba3b
--- /dev/null
@@ -0,0 +1,81 @@
+From 342e0e171ab722c50937ffc2a897fa50f9eb9bb2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 Jun 2022 15:56:07 +0200
+Subject: KVM: s390: pv: add export before import
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+[ Upstream commit 72b1daff2671cef2c8cccc6c4e52f8d5ce4ebe58 ]
+
+Due to upcoming changes, it will be possible to temporarily have
+multiple protected VMs in the same address space, although only one
+will be actually active.
+
+In that scenario, it is necessary to perform an export of every page
+that is to be imported, since the hardware does not allow a page
+belonging to a protected guest to be imported into a different
+protected guest.
+
+This also applies to pages that are shared, and thus accessible by the
+host.
+
+Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
+Link: https://lore.kernel.org/r/20220628135619.32410-7-imbrenda@linux.ibm.com
+Message-Id: <20220628135619.32410-7-imbrenda@linux.ibm.com>
+Signed-off-by: Janosch Frank <frankja@linux.ibm.com>
+Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/uv.c | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
+index 8b0e62507d62e..56bb0a4829770 100644
+--- a/arch/s390/kernel/uv.c
++++ b/arch/s390/kernel/uv.c
+@@ -234,6 +234,32 @@ static int make_secure_pte(pte_t *ptep, unsigned long addr,
+       return uvcb->rc == 0x10a ? -ENXIO : -EINVAL;
+ }
++/**
++ * should_export_before_import - Determine whether an export is needed
++ * before an import-like operation
++ * @uvcb: the Ultravisor control block of the UVC to be performed
++ * @mm: the mm of the process
++ *
++ * Returns whether an export is needed before every import-like operation.
++ * This is needed for shared pages, which don't trigger a secure storage
++ * exception when accessed from a different guest.
++ *
++ * Although considered as one, the Unpin Page UVC is not an actual import,
++ * so it is not affected.
++ *
++ * No export is needed also when there is only one protected VM, because the
++ * page cannot belong to the wrong VM in that case (there is no "other VM"
++ * it can belong to).
++ *
++ * Return: true if an export is needed before every import, otherwise false.
++ */
++static bool should_export_before_import(struct uv_cb_header *uvcb, struct mm_struct *mm)
++{
++      if (uvcb->cmd == UVC_CMD_UNPIN_PAGE_SHARED)
++              return false;
++      return atomic_read(&mm->context.protected_count) > 1;
++}
++
+ /*
+  * Requests the Ultravisor to make a page accessible to a guest.
+  * If it's brought in the first time, it will be cleared. If
+@@ -277,6 +303,8 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+       lock_page(page);
+       ptep = get_locked_pte(gmap->mm, uaddr, &ptelock);
++      if (should_export_before_import(uvcb, gmap->mm))
++              uv_convert_from_secure(page_to_phys(page));
+       rc = make_secure_pte(ptep, uaddr, page, uvcb);
+       pte_unmap_unlock(ptep, ptelock);
+       unlock_page(page);
+-- 
+2.43.0
+
diff --git a/queue-5.15/kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch b/queue-5.15/kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch
new file mode 100644 (file)
index 0000000..e016b2b
--- /dev/null
@@ -0,0 +1,110 @@
+From 5ba85302f2e686742c608561e93f6750cd48ca32 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Sep 2021 15:24:52 +0200
+Subject: KVM: s390: pv: avoid stalls when making pages secure
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+[ Upstream commit f0a1a0615a6ff6d38af2c65a522698fb4bb85df6 ]
+
+Improve make_secure_pte to avoid stalls when the system is heavily
+overcommitted. This was especially problematic in kvm_s390_pv_unpack,
+because of the loop over all pages that needed unpacking.
+
+Due to the locks being held, it was not possible to simply replace
+uv_call with uv_call_sched. A more complex approach was
+needed, in which uv_call is replaced with __uv_call, which does not
+loop. When the UVC needs to be executed again, -EAGAIN is returned, and
+the caller (or its caller) will try again.
+
+When -EAGAIN is returned, the path is the same as when the page is in
+writeback (and the writeback check is also performed, which is
+harmless).
+
+Fixes: 214d9bbcd3a672 ("s390/mm: provide memory management functions for protected KVM guests")
+Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
+Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Link: https://lore.kernel.org/r/20210920132502.36111-5-imbrenda@linux.ibm.com
+Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/uv.c     | 29 +++++++++++++++++++++++------
+ arch/s390/kvm/intercept.c |  5 +++++
+ 2 files changed, 28 insertions(+), 6 deletions(-)
+
+diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
+index f95ccbd396925..09b80d371409b 100644
+--- a/arch/s390/kernel/uv.c
++++ b/arch/s390/kernel/uv.c
+@@ -165,7 +165,7 @@ static int make_secure_pte(pte_t *ptep, unsigned long addr,
+ {
+       pte_t entry = READ_ONCE(*ptep);
+       struct page *page;
+-      int expected, rc = 0;
++      int expected, cc = 0;
+       if (!pte_present(entry))
+               return -ENXIO;
+@@ -181,12 +181,25 @@ static int make_secure_pte(pte_t *ptep, unsigned long addr,
+       if (!page_ref_freeze(page, expected))
+               return -EBUSY;
+       set_bit(PG_arch_1, &page->flags);
+-      rc = uv_call(0, (u64)uvcb);
++      /*
++       * If the UVC does not succeed or fail immediately, we don't want to
++       * loop for long, or we might get stall notifications.
++       * On the other hand, this is a complex scenario and we are holding a lot of
++       * locks, so we can't easily sleep and reschedule. We try only once,
++       * and if the UVC returned busy or partial completion, we return
++       * -EAGAIN and we let the callers deal with it.
++       */
++      cc = __uv_call(0, (u64)uvcb);
+       page_ref_unfreeze(page, expected);
+-      /* Return -ENXIO if the page was not mapped, -EINVAL otherwise */
+-      if (rc)
+-              rc = uvcb->rc == 0x10a ? -ENXIO : -EINVAL;
+-      return rc;
++      /*
++       * Return -ENXIO if the page was not mapped, -EINVAL for other errors.
++       * If busy or partially completed, return -EAGAIN.
++       */
++      if (cc == UVC_CC_OK)
++              return 0;
++      else if (cc == UVC_CC_BUSY || cc == UVC_CC_PARTIAL)
++              return -EAGAIN;
++      return uvcb->rc == 0x10a ? -ENXIO : -EINVAL;
+ }
+ /*
+@@ -239,6 +252,10 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+       mmap_read_unlock(gmap->mm);
+       if (rc == -EAGAIN) {
++              /*
++               * If we are here because the UVC returned busy or partial
++               * completion, this is just a useless check, but it is safe.
++               */
+               wait_on_page_writeback(page);
+       } else if (rc == -EBUSY) {
+               /*
+diff --git a/arch/s390/kvm/intercept.c b/arch/s390/kvm/intercept.c
+index 458b42b50b8cb..79e6f016c22fc 100644
+--- a/arch/s390/kvm/intercept.c
++++ b/arch/s390/kvm/intercept.c
+@@ -537,6 +537,11 @@ static int handle_pv_uvc(struct kvm_vcpu *vcpu)
+        */
+       if (rc == -EINVAL)
+               return 0;
++      /*
++       * If we got -EAGAIN here, we simply return it. It will eventually
++       * get propagated all the way to userspace, which should then try
++       * again.
++       */
+       return rc;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/kvm-s390-pv-properly-handle-page-flags-for-protected.patch b/queue-5.15/kvm-s390-pv-properly-handle-page-flags-for-protected.patch
new file mode 100644 (file)
index 0000000..be39c73
--- /dev/null
@@ -0,0 +1,184 @@
+From 0a51b33f2a72d978eb128188c1515162fc0b48b5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 20 Sep 2021 15:24:54 +0200
+Subject: KVM: s390: pv: properly handle page flags for protected guests
+
+From: Claudio Imbrenda <imbrenda@linux.ibm.com>
+
+[ Upstream commit 380d97bd02fca7b9b41aec2d1c767874d602bc78 ]
+
+Introduce variants of the convert and destroy page functions that also
+clear the PG_arch_1 bit used to mark them as secure pages.
+
+The PG_arch_1 flag is always allowed to overindicate; using the new
+functions introduced here allows to reduce the extent of overindication
+and thus improve performance.
+
+These new functions can only be called on pages for which a reference
+is already being held.
+
+Signed-off-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Reviewed-by: Janosch Frank <frankja@linux.ibm.com>
+Reviewed-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Link: https://lore.kernel.org/r/20210920132502.36111-7-imbrenda@linux.ibm.com
+Signed-off-by: Christian Borntraeger <borntraeger@de.ibm.com>
+Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/include/asm/pgtable.h |  9 ++++++---
+ arch/s390/include/asm/uv.h      | 10 ++++++++--
+ arch/s390/kernel/uv.c           | 34 ++++++++++++++++++++++++++++++++-
+ arch/s390/mm/gmap.c             |  4 +++-
+ 4 files changed, 50 insertions(+), 7 deletions(-)
+
+diff --git a/arch/s390/include/asm/pgtable.h b/arch/s390/include/asm/pgtable.h
+index b61426c9ef178..e434169502456 100644
+--- a/arch/s390/include/asm/pgtable.h
++++ b/arch/s390/include/asm/pgtable.h
+@@ -1074,8 +1074,9 @@ static inline pte_t ptep_get_and_clear(struct mm_struct *mm,
+       pte_t res;
+       res = ptep_xchg_lazy(mm, addr, ptep, __pte(_PAGE_INVALID));
++      /* At this point the reference through the mapping is still present */
+       if (mm_is_protected(mm) && pte_present(res))
+-              uv_convert_from_secure(pte_val(res) & PAGE_MASK);
++              uv_convert_owned_from_secure(pte_val(res) & PAGE_MASK);
+       return res;
+ }
+@@ -1091,8 +1092,9 @@ static inline pte_t ptep_clear_flush(struct vm_area_struct *vma,
+       pte_t res;
+       res = ptep_xchg_direct(vma->vm_mm, addr, ptep, __pte(_PAGE_INVALID));
++      /* At this point the reference through the mapping is still present */
+       if (mm_is_protected(vma->vm_mm) && pte_present(res))
+-              uv_convert_from_secure(pte_val(res) & PAGE_MASK);
++              uv_convert_owned_from_secure(pte_val(res) & PAGE_MASK);
+       return res;
+ }
+@@ -1116,8 +1118,9 @@ static inline pte_t ptep_get_and_clear_full(struct mm_struct *mm,
+       } else {
+               res = ptep_xchg_lazy(mm, addr, ptep, __pte(_PAGE_INVALID));
+       }
++      /* At this point the reference through the mapping is still present */
+       if (mm_is_protected(mm) && pte_present(res))
+-              uv_convert_from_secure(pte_val(res) & PAGE_MASK);
++              uv_convert_owned_from_secure(pte_val(res) & PAGE_MASK);
+       return res;
+ }
+diff --git a/arch/s390/include/asm/uv.h b/arch/s390/include/asm/uv.h
+index fe92a4caf5ec8..bb94d2bec67bd 100644
+--- a/arch/s390/include/asm/uv.h
++++ b/arch/s390/include/asm/uv.h
+@@ -351,8 +351,9 @@ static inline int is_prot_virt_host(void)
+ }
+ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb);
+-int uv_destroy_page(unsigned long paddr);
++int uv_destroy_owned_page(unsigned long paddr);
+ int uv_convert_from_secure(unsigned long paddr);
++int uv_convert_owned_from_secure(unsigned long paddr);
+ int gmap_convert_to_secure(struct gmap *gmap, unsigned long gaddr);
+ void setup_uv(void);
+@@ -360,7 +361,7 @@ void setup_uv(void);
+ #define is_prot_virt_host() 0
+ static inline void setup_uv(void) {}
+-static inline int uv_destroy_page(unsigned long paddr)
++static inline int uv_destroy_owned_page(unsigned long paddr)
+ {
+       return 0;
+ }
+@@ -369,6 +370,11 @@ static inline int uv_convert_from_secure(unsigned long paddr)
+ {
+       return 0;
+ }
++
++static inline int uv_convert_owned_from_secure(unsigned long paddr)
++{
++      return 0;
++}
+ #endif
+ #endif /* _ASM_S390_UV_H */
+diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
+index 09b80d371409b..8b0e62507d62e 100644
+--- a/arch/s390/kernel/uv.c
++++ b/arch/s390/kernel/uv.c
+@@ -100,7 +100,7 @@ static int uv_pin_shared(unsigned long paddr)
+  *
+  * @paddr: Absolute host address of page to be destroyed
+  */
+-int uv_destroy_page(unsigned long paddr)
++static int uv_destroy_page(unsigned long paddr)
+ {
+       struct uv_cb_cfs uvcb = {
+               .header.cmd = UVC_CMD_DESTR_SEC_STOR,
+@@ -120,6 +120,22 @@ int uv_destroy_page(unsigned long paddr)
+       return 0;
+ }
++/*
++ * The caller must already hold a reference to the page
++ */
++int uv_destroy_owned_page(unsigned long paddr)
++{
++      struct page *page = phys_to_page(paddr);
++      int rc;
++
++      get_page(page);
++      rc = uv_destroy_page(paddr);
++      if (!rc)
++              clear_bit(PG_arch_1, &page->flags);
++      put_page(page);
++      return rc;
++}
++
+ /*
+  * Requests the Ultravisor to encrypt a guest page and make it
+  * accessible to the host for paging (export).
+@@ -139,6 +155,22 @@ int uv_convert_from_secure(unsigned long paddr)
+       return 0;
+ }
++/*
++ * The caller must already hold a reference to the page
++ */
++int uv_convert_owned_from_secure(unsigned long paddr)
++{
++      struct page *page = phys_to_page(paddr);
++      int rc;
++
++      get_page(page);
++      rc = uv_convert_from_secure(paddr);
++      if (!rc)
++              clear_bit(PG_arch_1, &page->flags);
++      put_page(page);
++      return rc;
++}
++
+ /*
+  * Calculate the expected ref_count for a page that would otherwise have no
+  * further pins. This was cribbed from similar functions in other places in
+diff --git a/arch/s390/mm/gmap.c b/arch/s390/mm/gmap.c
+index 32d9db5e6f53c..7a4320a9f6557 100644
+--- a/arch/s390/mm/gmap.c
++++ b/arch/s390/mm/gmap.c
+@@ -2698,8 +2698,10 @@ static int __s390_reset_acc(pte_t *ptep, unsigned long addr,
+ {
+       pte_t pte = READ_ONCE(*ptep);
++      /* There is a reference through the mapping */
+       if (pte_present(pte))
+-              WARN_ON_ONCE(uv_destroy_page(pte_val(pte) & PAGE_MASK));
++              WARN_ON_ONCE(uv_destroy_owned_page(pte_val(pte) & PAGE_MASK));
++
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/leds-trigger-unregister-sysfs-attributes-before-call.patch b/queue-5.15/leds-trigger-unregister-sysfs-attributes-before-call.patch
new file mode 100644 (file)
index 0000000..03f7534
--- /dev/null
@@ -0,0 +1,57 @@
+From b8e128d6af5c68b69e63bdff0cf300533e7e0116 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 4 May 2024 18:25:33 +0200
+Subject: leds: trigger: Unregister sysfs attributes before calling
+ deactivate()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Hans de Goede <hdegoede@redhat.com>
+
+[ Upstream commit c0dc9adf9474ecb7106e60e5472577375aedaed3 ]
+
+Triggers which have trigger specific sysfs attributes typically store
+related data in trigger-data allocated by the activate() callback and
+freed by the deactivate() callback.
+
+Calling device_remove_groups() after calling deactivate() leaves a window
+where the sysfs attributes show/store functions could be called after
+deactivation and then operate on the just freed trigger-data.
+
+Move the device_remove_groups() call to before deactivate() to close
+this race window.
+
+This also makes the deactivation path properly do things in reverse order
+of the activation path which calls the activate() callback before calling
+device_add_groups().
+
+Fixes: a7e7a3156300 ("leds: triggers: add device attribute support")
+Cc: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+Signed-off-by: Hans de Goede <hdegoede@redhat.com>
+Acked-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+Link: https://lore.kernel.org/r/20240504162533.76780-1-hdegoede@redhat.com
+Signed-off-by: Lee Jones <lee@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/leds/led-triggers.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/leds/led-triggers.c b/drivers/leds/led-triggers.c
+index 4e7b78a84149b..cbe70f38cb572 100644
+--- a/drivers/leds/led-triggers.c
++++ b/drivers/leds/led-triggers.c
+@@ -177,9 +177,9 @@ int led_trigger_set(struct led_classdev *led_cdev, struct led_trigger *trig)
+                       flags);
+               cancel_work_sync(&led_cdev->set_brightness_work);
+               led_stop_software_blink(led_cdev);
++              device_remove_groups(led_cdev->dev, led_cdev->trigger->groups);
+               if (led_cdev->trigger->deactivate)
+                       led_cdev->trigger->deactivate(led_cdev);
+-              device_remove_groups(led_cdev->dev, led_cdev->trigger->groups);
+               led_cdev->trigger = NULL;
+               led_cdev->trigger_data = NULL;
+               led_cdev->activated = false;
+-- 
+2.43.0
+
diff --git a/queue-5.15/lib-objagg-fix-general-protection-fault.patch b/queue-5.15/lib-objagg-fix-general-protection-fault.patch
new file mode 100644 (file)
index 0000000..54fb3b5
--- /dev/null
@@ -0,0 +1,75 @@
+From d3a7468a6a0d24c1e8ee87d2a5c8e6d3b29965c0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 16:49:41 +0200
+Subject: lib: objagg: Fix general protection fault
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+[ Upstream commit b4a3a89fffcdf09702b1f161b914e52abca1894d ]
+
+The library supports aggregation of objects into other objects only if
+the parent object does not have a parent itself. That is, nesting is not
+supported.
+
+Aggregation happens in two cases: Without and with hints, where hints
+are a pre-computed recommendation on how to aggregate the provided
+objects.
+
+Nesting is not possible in the first case due to a check that prevents
+it, but in the second case there is no check because the assumption is
+that nesting cannot happen when creating objects based on hints. The
+violation of this assumption leads to various warnings and eventually to
+a general protection fault [1].
+
+Before fixing the root cause, error out when nesting happens and warn.
+
+[1]
+general protection fault, probably for non-canonical address 0xdead000000000d90: 0000 [#1] PREEMPT SMP PTI
+CPU: 1 PID: 1083 Comm: kworker/1:9 Tainted: G        W          6.9.0-rc6-custom-gd9b4f1cca7fb #7
+Hardware name: Mellanox Technologies Ltd. MSN3700/VMOD0005, BIOS 5.11 01/06/2019
+Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work
+RIP: 0010:mlxsw_sp_acl_erp_bf_insert+0x25/0x80
+[...]
+Call Trace:
+ <TASK>
+ mlxsw_sp_acl_atcam_entry_add+0x256/0x3c0
+ mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0
+ mlxsw_sp_acl_tcam_vchunk_migrate_one+0x16b/0x270
+ mlxsw_sp_acl_tcam_vregion_rehash_work+0xbe/0x510
+ process_one_work+0x151/0x370
+ worker_thread+0x2cb/0x3e0
+ kthread+0xd0/0x100
+ ret_from_fork+0x34/0x50
+ ret_from_fork_asm+0x1a/0x30
+ </TASK>
+
+Fixes: 9069a3817d82 ("lib: objagg: implement optimization hints assembly and use hints for object creation")
+Reported-by: Alexander Zubkov <green@qrator.net>
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Reviewed-by: Amit Cohen <amcohen@nvidia.com>
+Tested-by: Alexander Zubkov <green@qrator.net>
+Signed-off-by: Petr Machata <petrm@nvidia.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/objagg.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/lib/objagg.c b/lib/objagg.c
+index 5e1676ccdaddd..73d7116025736 100644
+--- a/lib/objagg.c
++++ b/lib/objagg.c
+@@ -167,6 +167,9 @@ static int objagg_obj_parent_assign(struct objagg *objagg,
+ {
+       void *delta_priv;
++      if (WARN_ON(!objagg_obj_is_root(parent)))
++              return -EINVAL;
++
+       delta_priv = objagg->ops->delta_create(objagg->priv, parent->obj,
+                                              objagg_obj->obj);
+       if (IS_ERR(delta_priv))
+-- 
+2.43.0
+
diff --git a/queue-5.15/libbpf-checking-the-btf_type-kind-when-fixing-variab.patch b/queue-5.15/libbpf-checking-the-btf_type-kind-when-fixing-variab.patch
new file mode 100644 (file)
index 0000000..63c2ff8
--- /dev/null
@@ -0,0 +1,78 @@
+From 0f5a6240b10ca6bb7e2375aa9b9939f9d8204522 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Jun 2024 05:23:55 -0700
+Subject: libbpf: Checking the btf_type kind when fixing variable offsets
+
+From: Donglin Peng <dolinux.peng@gmail.com>
+
+[ Upstream commit cc5083d1f3881624ad2de1f3cbb3a07e152cb254 ]
+
+I encountered an issue when building the test_progs from the repository [1]:
+
+  $ pwd
+  /work/Qemu/x86_64/linux-6.10-rc2/tools/testing/selftests/bpf/
+
+  $ make test_progs V=1
+  [...]
+  ./tools/sbin/bpftool gen object ./ip_check_defrag.bpf.linked2.o ./ip_check_defrag.bpf.linked1.o
+  libbpf: failed to find symbol for variable 'bpf_dynptr_slice' in section '.ksyms'
+  Error: failed to link './ip_check_defrag.bpf.linked1.o': No such file or directory (2)
+  [...]
+
+Upon investigation, I discovered that the btf_types referenced in the '.ksyms'
+section had a kind of BTF_KIND_FUNC instead of BTF_KIND_VAR:
+
+  $ bpftool btf dump file ./ip_check_defrag.bpf.linked1.o
+  [...]
+  [2] DATASEC '.ksyms' size=0 vlen=2
+        type_id=16 offset=0 size=0 (FUNC 'bpf_dynptr_from_skb')
+        type_id=17 offset=0 size=0 (FUNC 'bpf_dynptr_slice')
+  [...]
+  [16] FUNC 'bpf_dynptr_from_skb' type_id=82 linkage=extern
+  [17] FUNC 'bpf_dynptr_slice' type_id=85 linkage=extern
+  [...]
+
+For a detailed analysis, please refer to [2]. We can add a kind checking to
+fix the issue.
+
+  [1] https://github.com/eddyz87/bpf/tree/binsort-btf-dedup
+  [2] https://lore.kernel.org/all/0c0ef20c-c05e-4db9-bad7-2cbc0d6dfae7@oracle.com/
+
+Fixes: 8fd27bf69b86 ("libbpf: Add BPF static linker BTF and BTF.ext support")
+Signed-off-by: Donglin Peng <dolinux.peng@gmail.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Reviewed-by: Alan Maguire <alan.maguire@oracle.com>
+Acked-by: Eduard Zingerman <eddyz87@gmail.com>
+Link: https://lore.kernel.org/bpf/20240619122355.426405-1-dolinux.peng@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/lib/bpf/linker.c | 11 +++++++++--
+ 1 file changed, 9 insertions(+), 2 deletions(-)
+
+diff --git a/tools/lib/bpf/linker.c b/tools/lib/bpf/linker.c
+index 6b2f59ddb6918..bfe0c30841b9b 100644
+--- a/tools/lib/bpf/linker.c
++++ b/tools/lib/bpf/linker.c
+@@ -2193,10 +2193,17 @@ static int linker_fixup_btf(struct src_obj *obj)
+               vi = btf_var_secinfos(t);
+               for (j = 0, m = btf_vlen(t); j < m; j++, vi++) {
+                       const struct btf_type *vt = btf__type_by_id(obj->btf, vi->type);
+-                      const char *var_name = btf__str_by_offset(obj->btf, vt->name_off);
+-                      int var_linkage = btf_var(vt)->linkage;
++                      const char *var_name;
++                      int var_linkage;
+                       Elf64_Sym *sym;
++                      /* could be a variable or function */
++                      if (!btf_is_var(vt))
++                              continue;
++
++                      var_name = btf__str_by_offset(obj->btf, vt->name_off);
++                      var_linkage = btf_var(vt)->linkage;
++
+                       /* no need to patch up static or extern vars */
+                       if (var_linkage != BTF_VAR_GLOBAL_ALLOCATED)
+                               continue;
+-- 
+2.43.0
+
diff --git a/queue-5.15/locking-rwsem-add-__always_inline-annotation-to-__do.patch b/queue-5.15/locking-rwsem-add-__always_inline-annotation-to-__do.patch
new file mode 100644 (file)
index 0000000..cfd4f61
--- /dev/null
@@ -0,0 +1,71 @@
+From 3cf11f7aab3174622614ae4ea87bc93bf42a298c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jul 2024 23:08:27 -0700
+Subject: locking/rwsem: Add __always_inline annotation to
+ __down_write_common() and inlined callers
+
+From: John Stultz <jstultz@google.com>
+
+[ Upstream commit e81859fe64ad42dccefe134d1696e0635f78d763 ]
+
+Apparently despite it being marked inline, the compiler
+may not inline __down_write_common() which makes it difficult
+to identify the cause of lock contention, as the wchan of the
+blocked function will always be listed as __down_write_common().
+
+So add __always_inline annotation to the common function (as
+well as the inlined helper callers) to force it to be inlined
+so a more useful blocking function will be listed (via wchan).
+
+This mirrors commit 92cc5d00a431 ("locking/rwsem: Add
+__always_inline annotation to __down_read_common() and inlined
+callers") which did the same for __down_read_common.
+
+I sort of worry that I'm playing wack-a-mole here, and talking
+with compiler people, they tell me inline means nothing, which
+makes me want to cry a little. So I'm wondering if we need to
+replace all the inlines with __always_inline, or remove them
+because either we mean something by it, or not.
+
+Fixes: c995e638ccbb ("locking/rwsem: Fold __down_{read,write}*()")
+Reported-by: Tim Murray <timmurray@google.com>
+Signed-off-by: John Stultz <jstultz@google.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Acked-by: Waiman Long <longman@redhat.com>
+Link: https://lkml.kernel.org/r/20240709060831.495366-1-jstultz@google.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/locking/rwsem.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/kernel/locking/rwsem.c b/kernel/locking/rwsem.c
+index 4a38d32b89fa3..eca42c14ec09a 100644
+--- a/kernel/locking/rwsem.c
++++ b/kernel/locking/rwsem.c
+@@ -1286,7 +1286,7 @@ static inline int __down_read_trylock(struct rw_semaphore *sem)
+ /*
+  * lock for writing
+  */
+-static inline int __down_write_common(struct rw_semaphore *sem, int state)
++static __always_inline int __down_write_common(struct rw_semaphore *sem, int state)
+ {
+       if (unlikely(!rwsem_write_trylock(sem))) {
+               if (IS_ERR(rwsem_down_write_slowpath(sem, state)))
+@@ -1296,12 +1296,12 @@ static inline int __down_write_common(struct rw_semaphore *sem, int state)
+       return 0;
+ }
+-static inline void __down_write(struct rw_semaphore *sem)
++static __always_inline void __down_write(struct rw_semaphore *sem)
+ {
+       __down_write_common(sem, TASK_UNINTERRUPTIBLE);
+ }
+-static inline int __down_write_killable(struct rw_semaphore *sem)
++static __always_inline int __down_write_killable(struct rw_semaphore *sem)
+ {
+       return __down_write_common(sem, TASK_KILLABLE);
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch b/queue-5.15/m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch
new file mode 100644 (file)
index 0000000..92f6de4
--- /dev/null
@@ -0,0 +1,58 @@
+From ddd59b0c5aa1e2fbdf6c49b38904f50641981cae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 17:49:01 +0300
+Subject: m68k: atari: Fix TT bootup freeze / unexpected (SCU) interrupt
+ messages
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Eero Tamminen <oak@helsinkinet.fi>
+
+[ Upstream commit f70065a9fd988983b2c693631b801f25a615fc04 ]
+
+Avoid freeze on Atari TT / MegaSTe boot with continuous messages of:
+
+       unexpected interrupt from 112
+
+Which was due to VBL interrupt being enabled in SCU sys mask, but there
+being no handler for that any more.
+
+(Bug and fix were first verified on real Atari TT HW by Christian,
+ this patch later on in Hatari emulator.)
+
+Fixes: 1fa0b29f3a43f9dd ("fbdev: Kill Atari vblank cursor blinking")
+Reported-by: Nicolas Pomarède <npomarede@corp.free.fr>
+Closes: https://listengine.tuxfamily.org/lists.tuxfamily.org/hatari-devel/2024/06/msg00016.html
+Closes: https://lore.kernel.org/all/9aa793d7-82ed-4fbd-bce5-60810d8a9119@helsinkinet.fi
+Tested-by: Christian Zietz <czietz@gmx.net>
+Signed-off-by: Eero Tamminen <oak@helsinkinet.fi>
+Reviewed-by: Michael Schmitz <schmitzmic@gmail.com>
+Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Link: https://lore.kernel.org/20240624144901.5236-1-oak@helsinkinet.fi
+Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/m68k/atari/ataints.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/arch/m68k/atari/ataints.c b/arch/m68k/atari/ataints.c
+index 56f02ea2c248d..715d1e0d973e6 100644
+--- a/arch/m68k/atari/ataints.c
++++ b/arch/m68k/atari/ataints.c
+@@ -302,11 +302,7 @@ void __init atari_init_IRQ(void)
+       if (ATARIHW_PRESENT(SCU)) {
+               /* init the SCU if present */
+-              tt_scu.sys_mask = 0x10;         /* enable VBL (for the cursor) and
+-                                                                       * disable HSYNC interrupts (who
+-                                                                       * needs them?)  MFP and SCC are
+-                                                                       * enabled in VME mask
+-                                                                       */
++              tt_scu.sys_mask = 0x0;          /* disable all interrupts */
+               tt_scu.vme_mask = 0x60;         /* enable MFP and SCC ints */
+       } else {
+               /* If no SCU and no Hades, the HSYNC interrupt needs to be
+-- 
+2.43.0
+
diff --git a/queue-5.15/m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch b/queue-5.15/m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch
new file mode 100644 (file)
index 0000000..465631b
--- /dev/null
@@ -0,0 +1,38 @@
+From 74dc25b68be78c1193c887af9f6c0406c902071b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 05:41:17 +0200
+Subject: m68k: cmpxchg: Fix return value for default case in __arch_xchg()
+
+From: Thorsten Blum <thorsten.blum@toblux.com>
+
+[ Upstream commit 21b9e722ad28c19c2bc83f18f540b3dbd89bf762 ]
+
+The return value of __invalid_xchg_size() is assigned to tmp instead of
+the return variable x. Assign it to x instead.
+
+Fixes: 2501cf768e4009a0 ("m68k: Fix xchg/cmpxchg to fail to link if given an inappropriate pointer")
+Signed-off-by: Thorsten Blum <thorsten.blum@toblux.com>
+Reviewed-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Link: https://lore.kernel.org/20240702034116.140234-2-thorsten.blum@toblux.com
+Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/m68k/include/asm/cmpxchg.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/m68k/include/asm/cmpxchg.h b/arch/m68k/include/asm/cmpxchg.h
+index e8ca4b0ccefaa..9765910d0ad27 100644
+--- a/arch/m68k/include/asm/cmpxchg.h
++++ b/arch/m68k/include/asm/cmpxchg.h
+@@ -33,7 +33,7 @@ static inline unsigned long __xchg(unsigned long x, volatile void * ptr, int siz
+               x = tmp;
+               break;
+       default:
+-              tmp = __invalid_xchg_size(x, ptr, size);
++              x = __invalid_xchg_size(x, ptr, size);
+               break;
+       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/macintosh-therm_windtunnel-fix-module-unload.patch b/queue-5.15/macintosh-therm_windtunnel-fix-module-unload.patch
new file mode 100644 (file)
index 0000000..f8cef60
--- /dev/null
@@ -0,0 +1,48 @@
+From 1e551b67497d01fc065dd34d61cc946cde56931d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jul 2024 23:54:17 -0400
+Subject: macintosh/therm_windtunnel: fix module unload.
+
+From: Nick Bowler <nbowler@draconx.ca>
+
+[ Upstream commit fd748e177194ebcbbaf98df75152a30e08230cc6 ]
+
+The of_device_unregister call in therm_windtunnel's module_exit procedure
+does not fully reverse the effects of of_platform_device_create in the
+module_init prodedure.  Once you unload this module, it is impossible
+to load it ever again since only the first of_platform_device_create
+call on the fan node succeeds.
+
+This driver predates first git commit, and it turns out back then
+of_platform_device_create worked differently than it does today.
+So this is actually an old regression.
+
+The appropriate function to undo of_platform_device_create now appears
+to be of_platform_device_destroy, and switching to use this makes it
+possible to unload and load the module as expected.
+
+Signed-off-by: Nick Bowler <nbowler@draconx.ca>
+Fixes: c6e126de43e7 ("of: Keep track of populated platform devices")
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://msgid.link/20240711035428.16696-1-nbowler@draconx.ca
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/macintosh/therm_windtunnel.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/macintosh/therm_windtunnel.c b/drivers/macintosh/therm_windtunnel.c
+index f55f6adf5e5ff..49805eb4d145a 100644
+--- a/drivers/macintosh/therm_windtunnel.c
++++ b/drivers/macintosh/therm_windtunnel.c
+@@ -549,7 +549,7 @@ g4fan_exit( void )
+       platform_driver_unregister( &therm_of_driver );
+       if( x.of_dev )
+-              of_device_unregister( x.of_dev );
++              of_platform_device_destroy(&x.of_dev->dev, NULL);
+ }
+ module_init(g4fan_init);
+-- 
+2.43.0
+
diff --git a/queue-5.15/media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch b/queue-5.15/media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch
new file mode 100644 (file)
index 0000000..7650080
--- /dev/null
@@ -0,0 +1,144 @@
+From c33c309235bcbc3e402b1b5449215b1796e9a14b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 May 2024 20:44:14 +0800
+Subject: media: dvb-usb: Fix unexpected infinite loop in
+ dvb_usb_read_remote_control()
+
+From: Zheng Yejian <zhengyejian1@huawei.com>
+
+[ Upstream commit 2052138b7da52ad5ccaf74f736d00f39a1c9198c ]
+
+Infinite log printing occurs during fuzz test:
+
+  rc rc1: DViCO FusionHDTV DVB-T USB (LGZ201) as ...
+  ...
+  dvb-usb: schedule remote query interval to 100 msecs.
+  dvb-usb: DViCO FusionHDTV DVB-T USB (LGZ201) successfully initialized ...
+  dvb-usb: bulk message failed: -22 (1/0)
+  dvb-usb: bulk message failed: -22 (1/0)
+  dvb-usb: bulk message failed: -22 (1/0)
+  ...
+  dvb-usb: bulk message failed: -22 (1/0)
+
+Looking into the codes, there is a loop in dvb_usb_read_remote_control(),
+that is in rc_core_dvb_usb_remote_init() create a work that will call
+dvb_usb_read_remote_control(), and this work will reschedule itself at
+'rc_interval' intervals to recursively call dvb_usb_read_remote_control(),
+see following code snippet:
+
+  rc_core_dvb_usb_remote_init() {
+    ...
+    INIT_DELAYED_WORK(&d->rc_query_work, dvb_usb_read_remote_control);
+    schedule_delayed_work(&d->rc_query_work,
+                          msecs_to_jiffies(rc_interval));
+    ...
+  }
+
+  dvb_usb_read_remote_control() {
+    ...
+    err = d->props.rc.core.rc_query(d);
+    if (err)
+      err(...)  // Did not return even if query failed
+    schedule_delayed_work(&d->rc_query_work,
+                          msecs_to_jiffies(rc_interval));
+  }
+
+When the infinite log printing occurs, the query callback
+'d->props.rc.core.rc_query' is cxusb_rc_query(). And the log is due to
+the failure of finding a valid 'generic_bulk_ctrl_endpoint'
+in usb_bulk_msg(), see following code snippet:
+
+  cxusb_rc_query() {
+    cxusb_ctrl_msg() {
+      dvb_usb_generic_rw() {
+        ret = usb_bulk_msg(d->udev, usb_sndbulkpipe(d->udev,
+                           d->props.generic_bulk_ctrl_endpoint),...);
+        if (ret)
+          err("bulk message failed: %d (%d/%d)",ret,wlen,actlen);
+          ...
+      }
+  ...
+  }
+
+By analyzing the corresponding USB descriptor, it shows that the
+bNumEndpoints is 0 in its interface descriptor, but
+the 'generic_bulk_ctrl_endpoint' is 1, that means user don't configure
+a valid endpoint for 'generic_bulk_ctrl_endpoint', therefore this
+'invalid' USB device should be rejected before it calls into
+dvb_usb_read_remote_control().
+
+To fix it, we need to add endpoint check for 'generic_bulk_ctrl_endpoint'.
+And as Sean suggested, the same check and clear halts should be done for
+'generic_bulk_ctrl_endpoint_response'. So introduce
+dvb_usb_check_bulk_endpoint() to do it for both of them.
+
+Fixes: 4d43e13f723e ("V4L/DVB (4643): Multi-input patch for DVB-USB device")
+Signed-off-by: Zheng Yejian <zhengyejian1@huawei.com>
+Signed-off-by: Sean Young <sean@mess.org>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/usb/dvb-usb/dvb-usb-init.c | 35 +++++++++++++++++++++---
+ 1 file changed, 31 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/usb/dvb-usb/dvb-usb-init.c b/drivers/media/usb/dvb-usb/dvb-usb-init.c
+index 58eea8ab54779..6cf6d08cc4ec9 100644
+--- a/drivers/media/usb/dvb-usb/dvb-usb-init.c
++++ b/drivers/media/usb/dvb-usb/dvb-usb-init.c
+@@ -23,11 +23,40 @@ static int dvb_usb_force_pid_filter_usage;
+ module_param_named(force_pid_filter_usage, dvb_usb_force_pid_filter_usage, int, 0444);
+ MODULE_PARM_DESC(force_pid_filter_usage, "force all dvb-usb-devices to use a PID filter, if any (default: 0).");
++static int dvb_usb_check_bulk_endpoint(struct dvb_usb_device *d, u8 endpoint)
++{
++      if (endpoint) {
++              int ret;
++
++              ret = usb_pipe_type_check(d->udev, usb_sndbulkpipe(d->udev, endpoint));
++              if (ret)
++                      return ret;
++              ret = usb_pipe_type_check(d->udev, usb_rcvbulkpipe(d->udev, endpoint));
++              if (ret)
++                      return ret;
++      }
++      return 0;
++}
++
++static void dvb_usb_clear_halt(struct dvb_usb_device *d, u8 endpoint)
++{
++      if (endpoint) {
++              usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, endpoint));
++              usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, endpoint));
++      }
++}
++
+ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
+ {
+       struct dvb_usb_adapter *adap;
+       int ret, n, o;
++      ret = dvb_usb_check_bulk_endpoint(d, d->props.generic_bulk_ctrl_endpoint);
++      if (ret)
++              return ret;
++      ret = dvb_usb_check_bulk_endpoint(d, d->props.generic_bulk_ctrl_endpoint_response);
++      if (ret)
++              return ret;
+       for (n = 0; n < d->props.num_adapters; n++) {
+               adap = &d->adapter[n];
+               adap->dev = d;
+@@ -103,10 +132,8 @@ static int dvb_usb_adapter_init(struct dvb_usb_device *d, short *adapter_nrs)
+        * when reloading the driver w/o replugging the device
+        * sometimes a timeout occurs, this helps
+        */
+-      if (d->props.generic_bulk_ctrl_endpoint != 0) {
+-              usb_clear_halt(d->udev, usb_sndbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
+-              usb_clear_halt(d->udev, usb_rcvbulkpipe(d->udev, d->props.generic_bulk_ctrl_endpoint));
+-      }
++      dvb_usb_clear_halt(d, d->props.generic_bulk_ctrl_endpoint);
++      dvb_usb_clear_halt(d, d->props.generic_bulk_ctrl_endpoint_response);
+       return 0;
+-- 
+2.43.0
+
diff --git a/queue-5.15/media-i2c-fix-imx412-exposure-control.patch b/queue-5.15/media-i2c-fix-imx412-exposure-control.patch
new file mode 100644 (file)
index 0000000..1f7ef68
--- /dev/null
@@ -0,0 +1,97 @@
+From b7b01698dd694c2c3e6e17577c3a769ce78c7281 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 May 2024 13:53:07 +0100
+Subject: media: i2c: Fix imx412 exposure control
+
+From: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+
+[ Upstream commit a1956bf53a2774014ee1768b484af2c38c633a25 ]
+
+Currently we have the following algorithm to calculate what value should be
+written to the exposure control of imx412.
+
+lpfr = imx412->vblank + imx412->cur_mode->height;
+shutter = lpfr - exposure;
+
+The 'shutter' value is given to IMX412_REG_EXPOSURE_CIT however, the above
+algorithm will result in the value given to IMX412_REG_EXPOSURE_CIT
+decreasing as the requested exposure value from user-space goes up.
+
+e.g.
+[ 2255.713989] imx412 20-001a: Received exp 1608, analog gain 0
+[ 2255.714002] imx412 20-001a: Set exp 1608, analog gain 0, shutter 1938, lpfr 3546
+[ 2256.302770] imx412 20-001a: Received exp 2586, analog gain 100
+[ 2256.302800] imx412 20-001a: Set exp 2586, analog gain 100, shutter 960, lpfr 3546
+[ 2256.753755] imx412 20-001a: Received exp 3524, analog gain 110
+[ 2256.753772] imx412 20-001a: Set exp 3524, analog gain 110, shutter 22, lpfr 3546
+
+This behaviour results in the image having less exposure as the requested
+exposure value from user-space increases.
+
+Other sensor drivers such as ov5675, imx218, hid556 and others take the
+requested exposure value and use the value directly.
+
+Take the example of the above cited sensor drivers and directly apply the
+requested exposure value from user-space. The 'lpfr' variable still
+functions as before but the 'shutter' variable can be dispensed with as a
+result.
+
+Once done a similar run of the test application requesting higher exposure
+looks like this, with 'exp' written directly to the sensor.
+
+[  133.207884] imx412 20-001a: Received exp 1608, analog gain 0
+[  133.207899] imx412 20-001a: Set exp 1608, analog gain 0, lpfr 3546
+[  133.905309] imx412 20-001a: Received exp 2844, analog gain 100
+[  133.905344] imx412 20-001a: Set exp 2844, analog gain 100, lpfr 3546
+[  134.241705] imx412 20-001a: Received exp 3524, analog gain 110
+[  134.241775] imx412 20-001a: Set exp 3524, analog gain 110, lpfr 3546
+
+The result is then setting the sensor exposure to lower values results in
+darker, less exposure images and vice versa with higher exposure values.
+
+Fixes: 9214e86c0cc1 ("media: i2c: Add imx412 camera sensor driver")
+Tested-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> # qrb5165-rb5/imx577
+Reviewed-by: Jacopo Mondi <jacopo.mondi@ideasonboard.com>
+Reviewed-by: Gjorgji Rosikopulos <quic_grosikop@quicinc.com>
+Signed-off-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+Signed-off-by: Sakari Ailus <sakari.ailus@linux.intel.com>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/i2c/imx412.c | 9 ++++-----
+ 1 file changed, 4 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/media/i2c/imx412.c b/drivers/media/i2c/imx412.c
+index 84279a6808730..3d4d813923918 100644
+--- a/drivers/media/i2c/imx412.c
++++ b/drivers/media/i2c/imx412.c
+@@ -535,14 +535,13 @@ static int imx412_update_controls(struct imx412 *imx412,
+  */
+ static int imx412_update_exp_gain(struct imx412 *imx412, u32 exposure, u32 gain)
+ {
+-      u32 lpfr, shutter;
++      u32 lpfr;
+       int ret;
+       lpfr = imx412->vblank + imx412->cur_mode->height;
+-      shutter = lpfr - exposure;
+-      dev_dbg(imx412->dev, "Set exp %u, analog gain %u, shutter %u, lpfr %u",
+-              exposure, gain, shutter, lpfr);
++      dev_dbg(imx412->dev, "Set exp %u, analog gain %u, lpfr %u",
++              exposure, gain, lpfr);
+       ret = imx412_write_reg(imx412, IMX412_REG_HOLD, 1, 1);
+       if (ret)
+@@ -552,7 +551,7 @@ static int imx412_update_exp_gain(struct imx412 *imx412, u32 exposure, u32 gain)
+       if (ret)
+               goto error_release_group_hold;
+-      ret = imx412_write_reg(imx412, IMX412_REG_EXPOSURE_CIT, 2, shutter);
++      ret = imx412_write_reg(imx412, IMX412_REG_EXPOSURE_CIT, 2, exposure);
+       if (ret)
+               goto error_release_group_hold;
+-- 
+2.43.0
+
diff --git a/queue-5.15/media-imon-fix-race-getting-ictx-lock.patch b/queue-5.15/media-imon-fix-race-getting-ictx-lock.patch
new file mode 100644 (file)
index 0000000..7527a4a
--- /dev/null
@@ -0,0 +1,51 @@
+From d90157f62763aef32ae1bcf4e82517f89e7c5dce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 6 May 2024 21:10:27 +0000
+Subject: media: imon: Fix race getting ictx->lock
+
+From: Ricardo Ribalda <ribalda@chromium.org>
+
+[ Upstream commit 24147897507cd3a7d63745d1518a638bf4132238 ]
+
+Lets fix a race between mutex_is_lock() and mutex_lock().
+
+<-mutex is not locked
+if (!mutex_is_locked(&ictx->lock)) {
+       unlock = true; <- mutex is locked externaly
+       mutex_lock(&ictx->lock);
+}
+
+Let's use mutex_trylock() that does mutex_is_lock() and mutex_lock()
+atomically.
+
+Fix the following cocci warning:
+drivers/media/rc/imon.c:1167:1-7: preceding lock on line 1153
+
+Fixes: 23ef710e1a6c ("[media] imon: add conditional locking in change_protocol")
+Signed-off-by: Ricardo Ribalda <ribalda@chromium.org>
+Signed-off-by: Sean Young <sean@mess.org>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/rc/imon.c | 5 +----
+ 1 file changed, 1 insertion(+), 4 deletions(-)
+
+diff --git a/drivers/media/rc/imon.c b/drivers/media/rc/imon.c
+index 4e7c3d889d5ce..9faf8365afa71 100644
+--- a/drivers/media/rc/imon.c
++++ b/drivers/media/rc/imon.c
+@@ -1150,10 +1150,7 @@ static int imon_ir_change_protocol(struct rc_dev *rc, u64 *rc_proto)
+       memcpy(ictx->usb_tx_buf, &ir_proto_packet, sizeof(ir_proto_packet));
+-      if (!mutex_is_locked(&ictx->lock)) {
+-              unlock = true;
+-              mutex_lock(&ictx->lock);
+-      }
++      unlock = mutex_trylock(&ictx->lock);
+       retval = send_packet(ictx);
+       if (retval)
+-- 
+2.43.0
+
diff --git a/queue-5.15/media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch b/queue-5.15/media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch
new file mode 100644 (file)
index 0000000..9225346
--- /dev/null
@@ -0,0 +1,117 @@
+From 15dd1bbeb295b6e89ff7852df097a2ae8f9457df Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 5 May 2024 20:22:27 +0300
+Subject: media: renesas: vsp1: Fix _irqsave and _irq mix
+
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+
+[ Upstream commit 57edbbcf5258c378a9b9d0c80d33b03a010b22c8 ]
+
+The histogram support mixes _irqsave and _irq, causing the following
+smatch warning:
+
+     drivers/media/platform/renesas/vsp1/vsp1_histo.c:153 histo_stop_streaming()
+     warn: mixing irqsave and irq
+
+The histo_stop_streaming() calls spin_lock_irqsave() followed by
+wait_event_lock_irq(). The former hints that interrupts may be disabled
+by the caller, while the latter reenables interrupts unconditionally.
+This doesn't cause any real bug, as the function is always called with
+interrupts enabled, but the pattern is still incorrect.
+
+Fix the problem by using spin_lock_irq() instead of spin_lock_irqsave()
+in histo_stop_streaming(). While at it, switch to spin_lock_irq() and
+spin_lock() as appropriate elsewhere.
+
+Fixes: 99362e32332b ("[media] v4l: vsp1: Add histogram support")
+Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
+Closes: https://lore.kernel.org/linux-renesas-soc/164d74ff-312c-468f-be64-afa7182cd2f4@moroto.mountain/
+Reviewed-by: Kieran Bingham <kieran.bingham+renesas@ideasonboard.com>
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/platform/vsp1/vsp1_histo.c | 20 ++++++++------------
+ 1 file changed, 8 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/media/platform/vsp1/vsp1_histo.c b/drivers/media/platform/vsp1/vsp1_histo.c
+index 5e5013d2cd2ad..897dfe99323af 100644
+--- a/drivers/media/platform/vsp1/vsp1_histo.c
++++ b/drivers/media/platform/vsp1/vsp1_histo.c
+@@ -36,9 +36,8 @@ struct vsp1_histogram_buffer *
+ vsp1_histogram_buffer_get(struct vsp1_histogram *histo)
+ {
+       struct vsp1_histogram_buffer *buf = NULL;
+-      unsigned long flags;
+-      spin_lock_irqsave(&histo->irqlock, flags);
++      spin_lock(&histo->irqlock);
+       if (list_empty(&histo->irqqueue))
+               goto done;
+@@ -49,7 +48,7 @@ vsp1_histogram_buffer_get(struct vsp1_histogram *histo)
+       histo->readout = true;
+ done:
+-      spin_unlock_irqrestore(&histo->irqlock, flags);
++      spin_unlock(&histo->irqlock);
+       return buf;
+ }
+@@ -58,7 +57,6 @@ void vsp1_histogram_buffer_complete(struct vsp1_histogram *histo,
+                                   size_t size)
+ {
+       struct vsp1_pipeline *pipe = histo->entity.pipe;
+-      unsigned long flags;
+       /*
+        * The pipeline pointer is guaranteed to be valid as this function is
+@@ -70,10 +68,10 @@ void vsp1_histogram_buffer_complete(struct vsp1_histogram *histo,
+       vb2_set_plane_payload(&buf->buf.vb2_buf, 0, size);
+       vb2_buffer_done(&buf->buf.vb2_buf, VB2_BUF_STATE_DONE);
+-      spin_lock_irqsave(&histo->irqlock, flags);
++      spin_lock(&histo->irqlock);
+       histo->readout = false;
+       wake_up(&histo->wait_queue);
+-      spin_unlock_irqrestore(&histo->irqlock, flags);
++      spin_unlock(&histo->irqlock);
+ }
+ /* -----------------------------------------------------------------------------
+@@ -124,11 +122,10 @@ static void histo_buffer_queue(struct vb2_buffer *vb)
+       struct vb2_v4l2_buffer *vbuf = to_vb2_v4l2_buffer(vb);
+       struct vsp1_histogram *histo = vb2_get_drv_priv(vb->vb2_queue);
+       struct vsp1_histogram_buffer *buf = to_vsp1_histogram_buffer(vbuf);
+-      unsigned long flags;
+-      spin_lock_irqsave(&histo->irqlock, flags);
++      spin_lock_irq(&histo->irqlock);
+       list_add_tail(&buf->queue, &histo->irqqueue);
+-      spin_unlock_irqrestore(&histo->irqlock, flags);
++      spin_unlock_irq(&histo->irqlock);
+ }
+ static int histo_start_streaming(struct vb2_queue *vq, unsigned int count)
+@@ -140,9 +137,8 @@ static void histo_stop_streaming(struct vb2_queue *vq)
+ {
+       struct vsp1_histogram *histo = vb2_get_drv_priv(vq);
+       struct vsp1_histogram_buffer *buffer;
+-      unsigned long flags;
+-      spin_lock_irqsave(&histo->irqlock, flags);
++      spin_lock_irq(&histo->irqlock);
+       /* Remove all buffers from the IRQ queue. */
+       list_for_each_entry(buffer, &histo->irqqueue, queue)
+@@ -152,7 +148,7 @@ static void histo_stop_streaming(struct vb2_queue *vq)
+       /* Wait for the buffer being read out (if any) to complete. */
+       wait_event_lock_irq(histo->wait_queue, !histo->readout, histo->irqlock);
+-      spin_unlock_irqrestore(&histo->irqlock, flags);
++      spin_unlock_irq(&histo->irqlock);
+ }
+ static const struct vb2_ops histo_video_queue_qops = {
+-- 
+2.43.0
+
diff --git a/queue-5.15/media-renesas-vsp1-store-rpf-partition-configuration.patch b/queue-5.15/media-renesas-vsp1-store-rpf-partition-configuration.patch
new file mode 100644 (file)
index 0000000..175d690
--- /dev/null
@@ -0,0 +1,66 @@
+From ebc7b3b5d004fde239cdc2448fcc206700353c44 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 19 Nov 2023 03:11:51 +0200
+Subject: media: renesas: vsp1: Store RPF partition configuration per RPF
+ instance
+
+From: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+
+[ Upstream commit a213bc09b1025c771ee722ee341af1d84375db8a ]
+
+The vsp1_partition structure stores the RPF partition configuration in a
+single field for all RPF instances, while each RPF can have its own
+configuration. Fix it by storing the configuration separately for each
+RPF instance.
+
+Signed-off-by: Laurent Pinchart <laurent.pinchart+renesas@ideasonboard.com>
+Fixes: ab45e8585182 ("media: v4l: vsp1: Allow entities to participate in the partition algorithm")
+Reviewed-by: Jacopo Mondi <jacopo.mondi+renesas@ideasonboard.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/platform/vsp1/vsp1_pipe.h | 2 +-
+ drivers/media/platform/vsp1/vsp1_rpf.c  | 8 +++++---
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/platform/vsp1/vsp1_pipe.h b/drivers/media/platform/vsp1/vsp1_pipe.h
+index ae646c9ef3373..15daf35bda216 100644
+--- a/drivers/media/platform/vsp1/vsp1_pipe.h
++++ b/drivers/media/platform/vsp1/vsp1_pipe.h
+@@ -73,7 +73,7 @@ struct vsp1_partition_window {
+  * @wpf: The WPF partition window configuration
+  */
+ struct vsp1_partition {
+-      struct vsp1_partition_window rpf;
++      struct vsp1_partition_window rpf[VSP1_MAX_RPF];
+       struct vsp1_partition_window uds_sink;
+       struct vsp1_partition_window uds_source;
+       struct vsp1_partition_window sru;
+diff --git a/drivers/media/platform/vsp1/vsp1_rpf.c b/drivers/media/platform/vsp1/vsp1_rpf.c
+index 75083cb234fe3..996a3058d5b76 100644
+--- a/drivers/media/platform/vsp1/vsp1_rpf.c
++++ b/drivers/media/platform/vsp1/vsp1_rpf.c
+@@ -271,8 +271,8 @@ static void rpf_configure_partition(struct vsp1_entity *entity,
+        * 'width' need to be adjusted.
+        */
+       if (pipe->partitions > 1) {
+-              crop.width = pipe->partition->rpf.width;
+-              crop.left += pipe->partition->rpf.left;
++              crop.width = pipe->partition->rpf[rpf->entity.index].width;
++              crop.left += pipe->partition->rpf[rpf->entity.index].left;
+       }
+       if (pipe->interlaced) {
+@@ -327,7 +327,9 @@ static void rpf_partition(struct vsp1_entity *entity,
+                         unsigned int partition_idx,
+                         struct vsp1_partition_window *window)
+ {
+-      partition->rpf = *window;
++      struct vsp1_rwpf *rpf = to_rwpf(&entity->subdev);
++
++      partition->rpf[rpf->entity.index] = *window;
+ }
+ static const struct vsp1_entity_operations rpf_entity_ops = {
+-- 
+2.43.0
+
diff --git a/queue-5.15/media-uvcvideo-override-default-flags.patch b/queue-5.15/media-uvcvideo-override-default-flags.patch
new file mode 100644 (file)
index 0000000..0dfe97b
--- /dev/null
@@ -0,0 +1,68 @@
+From 5fc3e7c5d1dbe7b5069eec281b51d9074cfa2aad Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 2 Jun 2024 14:50:53 +0800
+Subject: media: uvcvideo: Override default flags
+
+From: Daniel Schaefer <dhs@frame.work>
+
+[ Upstream commit 86419686e66da5b90a07fb8a40ab138fe97189b5 ]
+
+When the UVC device has a control that is readonly it doesn't set the
+SET_CUR flag. For example the privacy control has SET_CUR flag set in
+the defaults in the `uvc_ctrls` variable. Even if the device does not
+have it set, it's not cleared by uvc_ctrl_get_flags().
+
+Originally written with assignment in commit 859086ae3636 ("media:
+uvcvideo: Apply flags from device to actual properties"). But changed to
+|= in commit 0dc68cabdb62 ("media: uvcvideo: Prevent setting unavailable
+flags"). It would not clear the default flags.
+
+With this patch applied the correct flags are reported to user space.
+Tested with:
+
+```
+> v4l2-ctl --list-ctrls | grep privacy
+privacy 0x009a0910 (bool)   : default=0 value=0 flags=read-only
+```
+
+Signed-off-by: Daniel Schaefer <dhs@frame.work>
+Fixes: 0dc68cabdb62 ("media: uvcvideo: Prevent setting unavailable flags")
+Reviewed-by: Ricardo Ribalda <ribalda@chromium.org>
+Reviewed-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Link: https://lore.kernel.org/r/20240602065053.36850-1-dhs@frame.work
+Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/usb/uvc/uvc_ctrl.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/media/usb/uvc/uvc_ctrl.c b/drivers/media/usb/uvc/uvc_ctrl.c
+index 05335866e6d62..050d334265828 100644
+--- a/drivers/media/usb/uvc/uvc_ctrl.c
++++ b/drivers/media/usb/uvc/uvc_ctrl.c
+@@ -1868,7 +1868,13 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev,
+       else
+               ret = uvc_query_ctrl(dev, UVC_GET_INFO, ctrl->entity->id,
+                                    dev->intfnum, info->selector, data, 1);
+-      if (!ret)
++
++      if (!ret) {
++              info->flags &= ~(UVC_CTRL_FLAG_GET_CUR |
++                               UVC_CTRL_FLAG_SET_CUR |
++                               UVC_CTRL_FLAG_AUTO_UPDATE |
++                               UVC_CTRL_FLAG_ASYNCHRONOUS);
++
+               info->flags |= (data[0] & UVC_CONTROL_CAP_GET ?
+                               UVC_CTRL_FLAG_GET_CUR : 0)
+                           |  (data[0] & UVC_CONTROL_CAP_SET ?
+@@ -1877,6 +1883,7 @@ static int uvc_ctrl_get_flags(struct uvc_device *dev,
+                               UVC_CTRL_FLAG_AUTO_UPDATE : 0)
+                           |  (data[0] & UVC_CONTROL_CAP_ASYNCHRONOUS ?
+                               UVC_CTRL_FLAG_ASYNCHRONOUS : 0);
++      }
+       kfree(data);
+       return ret;
+-- 
+2.43.0
+
diff --git a/queue-5.15/media-venus-flush-all-buffers-in-output-plane-stream.patch b/queue-5.15/media-venus-flush-all-buffers-in-output-plane-stream.patch
new file mode 100644 (file)
index 0000000..faf4734
--- /dev/null
@@ -0,0 +1,43 @@
+From 1a2444a997314e76385465e6a22ca586cbd14ff1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jan 2024 11:42:14 +0530
+Subject: media: venus: flush all buffers in output plane streamoff
+
+From: Dikshita Agarwal <quic_dikshita@quicinc.com>
+
+[ Upstream commit e750a4b1224142bd8dd057b0d5adf8a5608b7e77 ]
+
+For scenarios, when source change is followed by VIDIOC_STREAMOFF
+on output plane, driver should discard any queued OUTPUT
+buffers, which are not decoded or dequeued.
+Flush with HFI_FLUSH_INPUT does not have any actual impact.
+So, fix it, by invoking HFI_FLUSH_ALL, which will flush all
+queued buffers.
+
+Fixes: 85872f861d4c ("media: venus: Mark last capture buffer")
+Signed-off-by: Dikshita Agarwal <quic_dikshita@quicinc.com>
+Tested-by: Nathan Hebert <nhebert@chromium.org>
+Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org>
+Signed-off-by: Stanimir Varbanov <stanimir.k.varbanov@gmail.com>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/platform/qcom/venus/vdec.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/media/platform/qcom/venus/vdec.c b/drivers/media/platform/qcom/venus/vdec.c
+index 6e0466772339a..94fb20d283ea4 100644
+--- a/drivers/media/platform/qcom/venus/vdec.c
++++ b/drivers/media/platform/qcom/venus/vdec.c
+@@ -1165,7 +1165,7 @@ static int vdec_stop_output(struct venus_inst *inst)
+               break;
+       case VENUS_DEC_STATE_INIT:
+       case VENUS_DEC_STATE_CAPTURE_SETUP:
+-              ret = hfi_session_flush(inst, HFI_FLUSH_INPUT, true);
++              ret = hfi_session_flush(inst, HFI_FLUSH_ALL, true);
+               break;
+       default:
+               break;
+-- 
+2.43.0
+
diff --git a/queue-5.15/memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch b/queue-5.15/memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch
new file mode 100644 (file)
index 0000000..7c5a3b9
--- /dev/null
@@ -0,0 +1,54 @@
+From 9d06c0fcd500271d1ab39239719aa162a27dd790 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 May 2024 16:46:36 +0200
+Subject: memory: fsl_ifc: Make FSL_IFC config visible and selectable
+
+From: Esben Haabendal <esben@geanix.com>
+
+[ Upstream commit 9ba0cae3cac07c21c583f9ff194f74043f90d29c ]
+
+While use of fsl_ifc driver with NAND flash is fine, as the fsl_ifc_nand
+driver selects FSL_IFC automatically, we need the CONFIG_FSL_IFC option to
+be selectable for platforms using fsl_ifc with NOR flash.
+
+Fixes: ea0c0ad6b6eb ("memory: Enable compile testing for most of the drivers")
+Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Signed-off-by: Esben Haabendal <esben@geanix.com>
+Link: https://lore.kernel.org/r/20240530-fsl-ifc-config-v3-1-1fd2c3d233dd@geanix.com
+Signed-off-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/memory/Kconfig       | 2 +-
+ drivers/mtd/nand/raw/Kconfig | 3 +--
+ 2 files changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/memory/Kconfig b/drivers/memory/Kconfig
+index 72c0df129d5c5..5a410a40f914a 100644
+--- a/drivers/memory/Kconfig
++++ b/drivers/memory/Kconfig
+@@ -168,7 +168,7 @@ config FSL_CORENET_CF
+         represents a coherency violation.
+ config FSL_IFC
+-      bool "Freescale IFC driver" if COMPILE_TEST
++      bool "Freescale IFC driver"
+       depends on FSL_SOC || ARCH_LAYERSCAPE || SOC_LS1021A || COMPILE_TEST
+       depends on HAS_IOMEM
+diff --git a/drivers/mtd/nand/raw/Kconfig b/drivers/mtd/nand/raw/Kconfig
+index 67b7cb67c0307..aa584aaf8ae3f 100644
+--- a/drivers/mtd/nand/raw/Kconfig
++++ b/drivers/mtd/nand/raw/Kconfig
+@@ -254,8 +254,7 @@ config MTD_NAND_FSL_IFC
+       tristate "Freescale IFC NAND controller"
+       depends on FSL_SOC || ARCH_LAYERSCAPE || SOC_LS1021A || COMPILE_TEST
+       depends on HAS_IOMEM
+-      select FSL_IFC
+-      select MEMORY
++      depends on FSL_IFC
+       help
+         Various Freescale chips e.g P1010, include a NAND Flash machine
+         with built-in hardware ECC capabilities.
+-- 
+2.43.0
+
diff --git a/queue-5.15/mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch b/queue-5.15/mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch
new file mode 100644 (file)
index 0000000..bb2f76a
--- /dev/null
@@ -0,0 +1,69 @@
+From 8e8670be4859435e77d6609627c71e9b6496ff0b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jun 2024 21:37:03 +0200
+Subject: mfd: omap-usb-tll: Use struct_size to allocate tll
+
+From: Javier Carrasco <javier.carrasco.cruz@gmail.com>
+
+[ Upstream commit 40176714c818b0b6a2ca8213cdb7654fbd49b742 ]
+
+Commit 16c2004d9e4d ("mfd: omap-usb-tll: Allocate driver data at once")
+changed the memory allocation of 'tll' to consolidate it into a single
+allocation, introducing an incorrect size calculation.
+
+In particular, the allocation for the array of pointers was converted
+into a single-pointer allocation.
+
+The memory allocation used to occur in two steps:
+
+tll = devm_kzalloc(dev, sizeof(struct usbtll_omap), GFP_KERNEL);
+tll->ch_clk = devm_kzalloc(dev, sizeof(struct clk *) * tll->nch,
+                           GFP_KERNEL);
+
+And it turned that into the following allocation:
+
+tll = devm_kzalloc(dev, sizeof(*tll) + sizeof(tll->ch_clk[nch]),
+                   GFP_KERNEL);
+
+sizeof(tll->ch_clk[nch]) returns the size of a single pointer instead of
+the expected nch pointers.
+
+This bug went unnoticed because the allocation size was small enough to
+fit within the minimum size of a memory allocation for this particular
+case [1].
+
+The complete allocation can still be done at once with the struct_size
+macro, which comes in handy for structures with a trailing flexible
+array.
+
+Fix the memory allocation to obtain the original size again.
+
+Link: https://lore.kernel.org/all/202406261121.2FFD65647@keescook/ [1]
+Fixes: 16c2004d9e4d ("mfd: omap-usb-tll: Allocate driver data at once")
+Reviewed-by: Kees Cook <kees@kernel.org>
+Signed-off-by: Javier Carrasco <javier.carrasco.cruz@gmail.com>
+Fixes: commit 16c2004d9e4d ("mfd: omap-usb-tll: Allocate driver data at once")
+Link: https://lore.kernel.org/r/20240626-omap-usb-tll-counted_by-v2-1-4bedf20d1b51@gmail.com
+Signed-off-by: Lee Jones <lee@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mfd/omap-usb-tll.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/mfd/omap-usb-tll.c b/drivers/mfd/omap-usb-tll.c
+index 080d7970a3774..5971b5cb290a1 100644
+--- a/drivers/mfd/omap-usb-tll.c
++++ b/drivers/mfd/omap-usb-tll.c
+@@ -237,8 +237,7 @@ static int usbtll_omap_probe(struct platform_device *pdev)
+               break;
+       }
+-      tll = devm_kzalloc(dev, sizeof(*tll) + sizeof(tll->ch_clk[nch]),
+-                         GFP_KERNEL);
++      tll = devm_kzalloc(dev, struct_size(tll, ch_clk, nch), GFP_KERNEL);
+       if (!tll) {
+               pm_runtime_put_sync(dev);
+               pm_runtime_disable(dev);
+-- 
+2.43.0
+
diff --git a/queue-5.15/mfd-rsmu-split-core-code-into-separate-module.patch b/queue-5.15/mfd-rsmu-split-core-code-into-separate-module.patch
new file mode 100644 (file)
index 0000000..df1216a
--- /dev/null
@@ -0,0 +1,61 @@
+From 4b99225ae8266a454483bea94dbb97fa087e243e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 May 2024 11:48:47 +0200
+Subject: mfd: rsmu: Split core code into separate module
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit c879a8c39dd55e7fabdd8d13341f7bc5200db377 ]
+
+Linking a file into two modules can have unintended side-effects
+and produces a W=1 warning:
+
+scripts/Makefile.build:236: drivers/mfd/Makefile: rsmu_core.o is added to multiple modules: rsmu-i2c rsmu-spi
+
+Make this one a separate module instead.
+
+Fixes: a1867f85e06e ("mfd: Add Renesas Synchronization Management Unit (SMU) support")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Link: https://lore.kernel.org/r/20240529094856.1869543-1-arnd@kernel.org
+Signed-off-by: Lee Jones <lee@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mfd/Makefile    | 6 ++----
+ drivers/mfd/rsmu_core.c | 2 ++
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/mfd/Makefile b/drivers/mfd/Makefile
+index 2ba6646e874cd..aa0d439142691 100644
+--- a/drivers/mfd/Makefile
++++ b/drivers/mfd/Makefile
+@@ -274,7 +274,5 @@ obj-$(CONFIG_MFD_INTEL_M10_BMC)   += intel-m10-bmc.o
+ obj-$(CONFIG_MFD_ATC260X)     += atc260x-core.o
+ obj-$(CONFIG_MFD_ATC260X_I2C) += atc260x-i2c.o
+-rsmu-i2c-objs                 := rsmu_core.o rsmu_i2c.o
+-rsmu-spi-objs                 := rsmu_core.o rsmu_spi.o
+-obj-$(CONFIG_MFD_RSMU_I2C)    += rsmu-i2c.o
+-obj-$(CONFIG_MFD_RSMU_SPI)    += rsmu-spi.o
++obj-$(CONFIG_MFD_RSMU_I2C)    += rsmu_i2c.o rsmu_core.o
++obj-$(CONFIG_MFD_RSMU_SPI)    += rsmu_spi.o rsmu_core.o
+diff --git a/drivers/mfd/rsmu_core.c b/drivers/mfd/rsmu_core.c
+index 29437fd0bd5bf..fd04a6e5dfa31 100644
+--- a/drivers/mfd/rsmu_core.c
++++ b/drivers/mfd/rsmu_core.c
+@@ -78,11 +78,13 @@ int rsmu_core_init(struct rsmu_ddata *rsmu)
+       return ret;
+ }
++EXPORT_SYMBOL_GPL(rsmu_core_init);
+ void rsmu_core_exit(struct rsmu_ddata *rsmu)
+ {
+       mutex_destroy(&rsmu->lock);
+ }
++EXPORT_SYMBOL_GPL(rsmu_core_exit);
+ MODULE_DESCRIPTION("Renesas SMU core driver");
+ MODULE_LICENSE("GPL");
+-- 
+2.43.0
+
diff --git a/queue-5.15/mips-octeron-remove-source-file-executable-bit.patch b/queue-5.15/mips-octeron-remove-source-file-executable-bit.patch
new file mode 100644 (file)
index 0000000..1b04c6e
--- /dev/null
@@ -0,0 +1,27 @@
+From 1283cc0a0b48495e8bbd19f8c5b76258b89a74ef Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jul 2024 16:48:30 +0900
+Subject: MIPS: Octeron: remove source file executable bit
+
+From: Dominique Martinet <dominique.martinet@atmark-techno.com>
+
+[ Upstream commit 89c7f5078935872cf47a713a645affb5037be694 ]
+
+This does not matter the least, but there is no other .[ch] file in the
+repo that is executable, so clean this up.
+
+Fixes: 29b83a64df3b ("MIPS: Octeon: Add PCIe link status check")
+Signed-off-by: Dominique Martinet <dominique.martinet@atmark-techno.com>
+Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/mips/pci/pcie-octeon.c | 0
+ 1 file changed, 0 insertions(+), 0 deletions(-)
+ mode change 100755 => 100644 arch/mips/pci/pcie-octeon.c
+
+diff --git a/arch/mips/pci/pcie-octeon.c b/arch/mips/pci/pcie-octeon.c
+old mode 100755
+new mode 100644
+-- 
+2.43.0
+
diff --git a/queue-5.15/mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch b/queue-5.15/mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch
new file mode 100644 (file)
index 0000000..fbf5bc6
--- /dev/null
@@ -0,0 +1,252 @@
+From 54a2aec1314aa4b63629d1a43215ad0e463205d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 16:49:43 +0200
+Subject: mlxsw: spectrum_acl: Fix ACL scale regression and firmware errors
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+[ Upstream commit 75d8d7a63065b18df9555dbaab0b42d4c6f20943 ]
+
+ACLs that reside in the algorithmic TCAM (A-TCAM) in Spectrum-2 and
+newer ASICs can share the same mask if their masks only differ in up to
+8 consecutive bits. For example, consider the following filters:
+
+ # tc filter add dev swp1 ingress pref 1 proto ip flower dst_ip 192.0.2.0/24 action drop
+ # tc filter add dev swp1 ingress pref 1 proto ip flower dst_ip 198.51.100.128/25 action drop
+
+The second filter can use the same mask as the first (dst_ip/24) with a
+delta of 1 bit.
+
+However, the above only works because the two filters have different
+values in the common unmasked part (dst_ip/24). When entries have the
+same value in the common unmasked part they create undesired collisions
+in the device since many entries now have the same key. This leads to
+firmware errors such as [1] and to a reduced scale.
+
+Fix by adjusting the hash table key to only include the value in the
+common unmasked part. That is, without including the delta bits. That
+way the driver will detect the collision during filter insertion and
+spill the filter into the circuit TCAM (C-TCAM).
+
+Add a test case that fails without the fix and adjust existing cases
+that check C-TCAM spillage according to the above limitation.
+
+[1]
+mlxsw_spectrum2 0000:06:00.0: EMAD reg access failed (tid=3379b18a00003394,reg_id=3027(ptce3),type=write,status=8(resource not available))
+
+Fixes: c22291f7cf45 ("mlxsw: spectrum: acl: Implement delta for ERP")
+Reported-by: Alexander Zubkov <green@qrator.net>
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Reviewed-by: Amit Cohen <amcohen@nvidia.com>
+Tested-by: Alexander Zubkov <green@qrator.net>
+Signed-off-by: Petr Machata <petrm@nvidia.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../mellanox/mlxsw/spectrum_acl_atcam.c       | 18 +++---
+ .../mlxsw/spectrum_acl_bloom_filter.c         |  2 +-
+ .../mellanox/mlxsw/spectrum_acl_tcam.h        |  9 +--
+ .../drivers/net/mlxsw/spectrum-2/tc_flower.sh | 55 +++++++++++++++++--
+ 4 files changed, 63 insertions(+), 21 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c
+index 4b713832fdd55..f5c0a4214c4e5 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c
+@@ -391,7 +391,8 @@ mlxsw_sp_acl_atcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp,
+       if (err)
+               return err;
+-      lkey_id = aregion->ops->lkey_id_get(aregion, aentry->enc_key, erp_id);
++      lkey_id = aregion->ops->lkey_id_get(aregion, aentry->ht_key.enc_key,
++                                          erp_id);
+       if (IS_ERR(lkey_id))
+               return PTR_ERR(lkey_id);
+       aentry->lkey_id = lkey_id;
+@@ -399,7 +400,7 @@ mlxsw_sp_acl_atcam_region_entry_insert(struct mlxsw_sp *mlxsw_sp,
+       kvdl_index = mlxsw_afa_block_first_kvdl_index(rulei->act_block);
+       mlxsw_reg_ptce3_pack(ptce3_pl, true, MLXSW_REG_PTCE3_OP_WRITE_WRITE,
+                            priority, region->tcam_region_info,
+-                           aentry->enc_key, erp_id,
++                           aentry->ht_key.enc_key, erp_id,
+                            aentry->delta_info.start,
+                            aentry->delta_info.mask,
+                            aentry->delta_info.value,
+@@ -428,7 +429,7 @@ mlxsw_sp_acl_atcam_region_entry_remove(struct mlxsw_sp *mlxsw_sp,
+       mlxsw_reg_ptce3_pack(ptce3_pl, false, MLXSW_REG_PTCE3_OP_WRITE_WRITE, 0,
+                            region->tcam_region_info,
+-                           aentry->enc_key, erp_id,
++                           aentry->ht_key.enc_key, erp_id,
+                            aentry->delta_info.start,
+                            aentry->delta_info.mask,
+                            aentry->delta_info.value,
+@@ -457,7 +458,7 @@ mlxsw_sp_acl_atcam_region_entry_action_replace(struct mlxsw_sp *mlxsw_sp,
+       kvdl_index = mlxsw_afa_block_first_kvdl_index(rulei->act_block);
+       mlxsw_reg_ptce3_pack(ptce3_pl, true, MLXSW_REG_PTCE3_OP_WRITE_UPDATE,
+                            priority, region->tcam_region_info,
+-                           aentry->enc_key, erp_id,
++                           aentry->ht_key.enc_key, erp_id,
+                            aentry->delta_info.start,
+                            aentry->delta_info.mask,
+                            aentry->delta_info.value,
+@@ -480,15 +481,13 @@ __mlxsw_sp_acl_atcam_entry_add(struct mlxsw_sp *mlxsw_sp,
+       int err;
+       mlxsw_afk_encode(afk, region->key_info, &rulei->values,
+-                       aentry->ht_key.full_enc_key, mask);
++                       aentry->ht_key.enc_key, mask);
+       erp_mask = mlxsw_sp_acl_erp_mask_get(aregion, mask, false);
+       if (IS_ERR(erp_mask))
+               return PTR_ERR(erp_mask);
+       aentry->erp_mask = erp_mask;
+       aentry->ht_key.erp_id = mlxsw_sp_acl_erp_mask_erp_id(erp_mask);
+-      memcpy(aentry->enc_key, aentry->ht_key.full_enc_key,
+-             sizeof(aentry->enc_key));
+       /* Compute all needed delta information and clear the delta bits
+        * from the encrypted key.
+@@ -497,9 +496,8 @@ __mlxsw_sp_acl_atcam_entry_add(struct mlxsw_sp *mlxsw_sp,
+       aentry->delta_info.start = mlxsw_sp_acl_erp_delta_start(delta);
+       aentry->delta_info.mask = mlxsw_sp_acl_erp_delta_mask(delta);
+       aentry->delta_info.value =
+-              mlxsw_sp_acl_erp_delta_value(delta,
+-                                           aentry->ht_key.full_enc_key);
+-      mlxsw_sp_acl_erp_delta_clear(delta, aentry->enc_key);
++              mlxsw_sp_acl_erp_delta_value(delta, aentry->ht_key.enc_key);
++      mlxsw_sp_acl_erp_delta_clear(delta, aentry->ht_key.enc_key);
+       /* Add rule to the list of A-TCAM rules, assuming this
+        * rule is intended to A-TCAM. In case this rule does
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c
+index 2d2e29c202770..3ab87db83b7fc 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c
+@@ -136,7 +136,7 @@ __mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion,
+               memcpy(chunk + pad_bytes, &erp_region_id,
+                      sizeof(erp_region_id));
+               memcpy(chunk + key_offset,
+-                     &aentry->enc_key[chunk_key_offsets[chunk_index]],
++                     &aentry->ht_key.enc_key[chunk_key_offsets[chunk_index]],
+                      chunk_key_len);
+               chunk += chunk_len;
+       }
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h
+index a41df10ade9bf..f28c47ae54880 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.h
+@@ -171,9 +171,9 @@ struct mlxsw_sp_acl_atcam_region {
+ };
+ struct mlxsw_sp_acl_atcam_entry_ht_key {
+-      char full_enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* Encoded
+-                                                               * key.
+-                                                               */
++      char enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* Encoded key, minus
++                                                          * delta bits.
++                                                          */
+       u8 erp_id;
+ };
+@@ -185,9 +185,6 @@ struct mlxsw_sp_acl_atcam_entry {
+       struct rhash_head ht_node;
+       struct list_head list; /* Member in entries_list */
+       struct mlxsw_sp_acl_atcam_entry_ht_key ht_key;
+-      char enc_key[MLXSW_REG_PTCEX_FLEX_KEY_BLOCKS_LEN]; /* Encoded key,
+-                                                          * minus delta bits.
+-                                                          */
+       struct {
+               u16 start;
+               u8 mask;
+diff --git a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh
+index 616d3581419ca..21d0f419cc6d7 100755
+--- a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh
++++ b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh
+@@ -11,7 +11,7 @@ ALL_TESTS="single_mask_test identical_filters_test two_masks_test \
+       multiple_masks_test ctcam_edge_cases_test delta_simple_test \
+       delta_two_masks_one_key_test delta_simple_rehash_test \
+       bloom_simple_test bloom_complex_test bloom_delta_test \
+-      max_erp_entries_test max_group_size_test"
++      max_erp_entries_test max_group_size_test collision_test"
+ NUM_NETIFS=2
+ source $lib_dir/lib.sh
+ source $lib_dir/tc_common.sh
+@@ -457,7 +457,7 @@ delta_two_masks_one_key_test()
+ {
+       # If 2 keys are the same and only differ in mask in a way that
+       # they belong under the same ERP (second is delta of the first),
+-      # there should be no C-TCAM spill.
++      # there should be C-TCAM spill.
+       RET=0
+@@ -474,8 +474,8 @@ delta_two_masks_one_key_test()
+       tp_record "mlxsw:*" "tc filter add dev $h2 ingress protocol ip \
+                  pref 2 handle 102 flower $tcflags dst_ip 192.0.2.2 \
+                  action drop"
+-      tp_check_hits "mlxsw:mlxsw_sp_acl_atcam_entry_add_ctcam_spill" 0
+-      check_err $? "incorrect C-TCAM spill while inserting the second rule"
++      tp_check_hits "mlxsw:mlxsw_sp_acl_atcam_entry_add_ctcam_spill" 1
++      check_err $? "C-TCAM spill did not happen while inserting the second rule"
+       $MZ $h1 -c 1 -p 64 -a $h1mac -b $h2mac -A 192.0.2.1 -B 192.0.2.2 \
+               -t ip -q
+@@ -1087,6 +1087,53 @@ max_group_size_test()
+       log_test "max ACL group size test ($tcflags). max size $max_size"
+ }
++collision_test()
++{
++      # Filters cannot share an eRP if in the common unmasked part (i.e.,
++      # without the delta bits) they have the same values. If the driver does
++      # not prevent such configuration (by spilling into the C-TCAM), then
++      # multiple entries will be present in the device with the same key,
++      # leading to collisions and a reduced scale.
++      #
++      # Create such a scenario and make sure all the filters are successfully
++      # added.
++
++      RET=0
++
++      local ret
++
++      if [[ "$tcflags" != "skip_sw" ]]; then
++              return 0;
++      fi
++
++      # Add a single dst_ip/24 filter and multiple dst_ip/32 filters that all
++      # have the same values in the common unmasked part (dst_ip/24).
++
++      tc filter add dev $h2 ingress pref 1 proto ipv4 handle 101 \
++              flower $tcflags dst_ip 198.51.100.0/24 \
++              action drop
++
++      for i in {0..255}; do
++              tc filter add dev $h2 ingress pref 2 proto ipv4 \
++                      handle $((102 + i)) \
++                      flower $tcflags dst_ip 198.51.100.${i}/32 \
++                      action drop
++              ret=$?
++              [[ $ret -ne 0 ]] && break
++      done
++
++      check_err $ret "failed to add all the filters"
++
++      for i in {255..0}; do
++              tc filter del dev $h2 ingress pref 2 proto ipv4 \
++                      handle $((102 + i)) flower
++      done
++
++      tc filter del dev $h2 ingress pref 1 proto ipv4 handle 101 flower
++
++      log_test "collision test ($tcflags)"
++}
++
+ setup_prepare()
+ {
+       h1=${NETIFS[p1]}
+-- 
+2.43.0
+
diff --git a/queue-5.15/mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch b/queue-5.15/mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch
new file mode 100644 (file)
index 0000000..a8b7982
--- /dev/null
@@ -0,0 +1,90 @@
+From 2a0f3199b233cfe7e7548f13e9f0ad8ff9a27d96 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jan 2022 18:06:48 +0200
+Subject: mlxsw: spectrum_acl_bloom_filter: Make mlxsw_sp_acl_bf_key_encode()
+ more flexible
+
+From: Amit Cohen <amcohen@nvidia.com>
+
+[ Upstream commit 5d5c3ba9e4121b7738d10be3825f4d9a5a1d80ef ]
+
+Spectrum-4 will calculate hash function for bloom filter differently from
+the existing ASICs.
+
+One of the changes is related to the way that the chunks will be build -
+without padding.
+
+As preparation for support of Spectrum-4 bloom filter, make
+mlxsw_sp_acl_bf_key_encode() more flexible, so it will be able to use it
+for Spectrum-4 as well.
+
+Signed-off-by: Amit Cohen <amcohen@nvidia.com>
+Reviewed-by: Petr Machata <petrm@nvidia.com>
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: 75d8d7a63065 ("mlxsw: spectrum_acl: Fix ACL scale regression and firmware errors")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../mlxsw/spectrum_acl_bloom_filter.c         | 36 +++++++++++++------
+ 1 file changed, 25 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c
+index 2e8b17e3b9358..2d2e29c202770 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_bloom_filter.c
+@@ -116,9 +116,10 @@ static u16 mlxsw_sp_acl_bf_crc(const u8 *buffer, size_t len)
+ }
+ static void
+-mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion,
+-                         struct mlxsw_sp_acl_atcam_entry *aentry,
+-                         char *output, u8 *len)
++__mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion,
++                           struct mlxsw_sp_acl_atcam_entry *aentry,
++                           char *output, u8 *len, u8 max_chunks, u8 pad_bytes,
++                           u8 key_offset, u8 chunk_key_len, u8 chunk_len)
+ {
+       struct mlxsw_afk_key_info *key_info = aregion->region->key_info;
+       u8 chunk_index, chunk_count, block_count;
+@@ -129,17 +130,30 @@ mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion,
+       chunk_count = 1 + ((block_count - 1) >> 2);
+       erp_region_id = cpu_to_be16(aentry->ht_key.erp_id |
+                                  (aregion->region->id << 4));
+-      for (chunk_index = MLXSW_BLOOM_KEY_CHUNKS - chunk_count;
+-           chunk_index < MLXSW_BLOOM_KEY_CHUNKS; chunk_index++) {
+-              memset(chunk, 0, MLXSW_BLOOM_CHUNK_PAD_BYTES);
+-              memcpy(chunk + MLXSW_BLOOM_CHUNK_PAD_BYTES, &erp_region_id,
++      for (chunk_index = max_chunks - chunk_count; chunk_index < max_chunks;
++           chunk_index++) {
++              memset(chunk, 0, pad_bytes);
++              memcpy(chunk + pad_bytes, &erp_region_id,
+                      sizeof(erp_region_id));
+-              memcpy(chunk + MLXSW_BLOOM_CHUNK_KEY_OFFSET,
++              memcpy(chunk + key_offset,
+                      &aentry->enc_key[chunk_key_offsets[chunk_index]],
+-                     MLXSW_BLOOM_CHUNK_KEY_BYTES);
+-              chunk += MLXSW_BLOOM_KEY_CHUNK_BYTES;
++                     chunk_key_len);
++              chunk += chunk_len;
+       }
+-      *len = chunk_count * MLXSW_BLOOM_KEY_CHUNK_BYTES;
++      *len = chunk_count * chunk_len;
++}
++
++static void
++mlxsw_sp_acl_bf_key_encode(struct mlxsw_sp_acl_atcam_region *aregion,
++                         struct mlxsw_sp_acl_atcam_entry *aentry,
++                         char *output, u8 *len)
++{
++      __mlxsw_sp_acl_bf_key_encode(aregion, aentry, output, len,
++                                   MLXSW_BLOOM_KEY_CHUNKS,
++                                   MLXSW_BLOOM_CHUNK_PAD_BYTES,
++                                   MLXSW_BLOOM_CHUNK_KEY_OFFSET,
++                                   MLXSW_BLOOM_CHUNK_KEY_BYTES,
++                                   MLXSW_BLOOM_KEY_CHUNK_BYTES);
+ }
+ static unsigned int
+-- 
+2.43.0
+
diff --git a/queue-5.15/mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch b/queue-5.15/mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch
new file mode 100644 (file)
index 0000000..ce6df33
--- /dev/null
@@ -0,0 +1,184 @@
+From d3eb4591a9fc2fea9f9110bd541f2fcd167f38bc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 16:49:42 +0200
+Subject: mlxsw: spectrum_acl_erp: Fix object nesting warning
+
+From: Ido Schimmel <idosch@nvidia.com>
+
+[ Upstream commit 97d833ceb27dc19f8777d63f90be4a27b5daeedf ]
+
+ACLs in Spectrum-2 and newer ASICs can reside in the algorithmic TCAM
+(A-TCAM) or in the ordinary circuit TCAM (C-TCAM). The former can
+contain more ACLs (i.e., tc filters), but the number of masks in each
+region (i.e., tc chain) is limited.
+
+In order to mitigate the effects of the above limitation, the device
+allows filters to share a single mask if their masks only differ in up
+to 8 consecutive bits. For example, dst_ip/25 can be represented using
+dst_ip/24 with a delta of 1 bit. The C-TCAM does not have a limit on the
+number of masks being used (and therefore does not support mask
+aggregation), but can contain a limited number of filters.
+
+The driver uses the "objagg" library to perform the mask aggregation by
+passing it objects that consist of the filter's mask and whether the
+filter is to be inserted into the A-TCAM or the C-TCAM since filters in
+different TCAMs cannot share a mask.
+
+The set of created objects is dependent on the insertion order of the
+filters and is not necessarily optimal. Therefore, the driver will
+periodically ask the library to compute a more optimal set ("hints") by
+looking at all the existing objects.
+
+When the library asks the driver whether two objects can be aggregated
+the driver only compares the provided masks and ignores the A-TCAM /
+C-TCAM indication. This is the right thing to do since the goal is to
+move as many filters as possible to the A-TCAM. The driver also forbids
+two identical masks from being aggregated since this can only happen if
+one was intentionally put in the C-TCAM to avoid a conflict in the
+A-TCAM.
+
+The above can result in the following set of hints:
+
+H1: {mask X, A-TCAM} -> H2: {mask Y, A-TCAM} // X is Y + delta
+H3: {mask Y, C-TCAM} -> H4: {mask Z, A-TCAM} // Y is Z + delta
+
+After getting the hints from the library the driver will start migrating
+filters from one region to another while consulting the computed hints
+and instructing the device to perform a lookup in both regions during
+the transition.
+
+Assuming a filter with mask X is being migrated into the A-TCAM in the
+new region, the hints lookup will return H1. Since H2 is the parent of
+H1, the library will try to find the object associated with it and
+create it if necessary in which case another hints lookup (recursive)
+will be performed. This hints lookup for {mask Y, A-TCAM} will either
+return H2 or H3 since the driver passes the library an object comparison
+function that ignores the A-TCAM / C-TCAM indication.
+
+This can eventually lead to nested objects which are not supported by
+the library [1].
+
+Fix by removing the object comparison function from both the driver and
+the library as the driver was the only user. That way the lookup will
+only return exact matches.
+
+I do not have a reliable reproducer that can reproduce the issue in a
+timely manner, but before the fix the issue would reproduce in several
+minutes and with the fix it does not reproduce in over an hour.
+
+Note that the current usefulness of the hints is limited because they
+include the C-TCAM indication and represent aggregation that cannot
+actually happen. This will be addressed in net-next.
+
+[1]
+WARNING: CPU: 0 PID: 153 at lib/objagg.c:170 objagg_obj_parent_assign+0xb5/0xd0
+Modules linked in:
+CPU: 0 PID: 153 Comm: kworker/0:18 Not tainted 6.9.0-rc6-custom-g70fbc2c1c38b #42
+Hardware name: Mellanox Technologies Ltd. MSN3700C/VMOD0008, BIOS 5.11 10/10/2018
+Workqueue: mlxsw_core mlxsw_sp_acl_tcam_vregion_rehash_work
+RIP: 0010:objagg_obj_parent_assign+0xb5/0xd0
+[...]
+Call Trace:
+ <TASK>
+ __objagg_obj_get+0x2bb/0x580
+ objagg_obj_get+0xe/0x80
+ mlxsw_sp_acl_erp_mask_get+0xb5/0xf0
+ mlxsw_sp_acl_atcam_entry_add+0xe8/0x3c0
+ mlxsw_sp_acl_tcam_entry_create+0x5e/0xa0
+ mlxsw_sp_acl_tcam_vchunk_migrate_one+0x16b/0x270
+ mlxsw_sp_acl_tcam_vregion_rehash_work+0xbe/0x510
+ process_one_work+0x151/0x370
+
+Fixes: 9069a3817d82 ("lib: objagg: implement optimization hints assembly and use hints for object creation")
+Signed-off-by: Ido Schimmel <idosch@nvidia.com>
+Reviewed-by: Amit Cohen <amcohen@nvidia.com>
+Tested-by: Alexander Zubkov <green@qrator.net>
+Signed-off-by: Petr Machata <petrm@nvidia.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../ethernet/mellanox/mlxsw/spectrum_acl_erp.c    | 13 -------------
+ include/linux/objagg.h                            |  1 -
+ lib/objagg.c                                      | 15 ---------------
+ 3 files changed, 29 deletions(-)
+
+diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c
+index d231f4d2888be..9eee229303cce 100644
+--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c
++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c
+@@ -1217,18 +1217,6 @@ static bool mlxsw_sp_acl_erp_delta_check(void *priv, const void *parent_obj,
+       return err ? false : true;
+ }
+-static int mlxsw_sp_acl_erp_hints_obj_cmp(const void *obj1, const void *obj2)
+-{
+-      const struct mlxsw_sp_acl_erp_key *key1 = obj1;
+-      const struct mlxsw_sp_acl_erp_key *key2 = obj2;
+-
+-      /* For hints purposes, two objects are considered equal
+-       * in case the masks are the same. Does not matter what
+-       * the "ctcam" value is.
+-       */
+-      return memcmp(key1->mask, key2->mask, sizeof(key1->mask));
+-}
+-
+ static void *mlxsw_sp_acl_erp_delta_create(void *priv, void *parent_obj,
+                                          void *obj)
+ {
+@@ -1308,7 +1296,6 @@ static void mlxsw_sp_acl_erp_root_destroy(void *priv, void *root_priv)
+ static const struct objagg_ops mlxsw_sp_acl_erp_objagg_ops = {
+       .obj_size = sizeof(struct mlxsw_sp_acl_erp_key),
+       .delta_check = mlxsw_sp_acl_erp_delta_check,
+-      .hints_obj_cmp = mlxsw_sp_acl_erp_hints_obj_cmp,
+       .delta_create = mlxsw_sp_acl_erp_delta_create,
+       .delta_destroy = mlxsw_sp_acl_erp_delta_destroy,
+       .root_create = mlxsw_sp_acl_erp_root_create,
+diff --git a/include/linux/objagg.h b/include/linux/objagg.h
+index 78021777df462..6df5b887dc547 100644
+--- a/include/linux/objagg.h
++++ b/include/linux/objagg.h
+@@ -8,7 +8,6 @@ struct objagg_ops {
+       size_t obj_size;
+       bool (*delta_check)(void *priv, const void *parent_obj,
+                           const void *obj);
+-      int (*hints_obj_cmp)(const void *obj1, const void *obj2);
+       void * (*delta_create)(void *priv, void *parent_obj, void *obj);
+       void (*delta_destroy)(void *priv, void *delta_priv);
+       void * (*root_create)(void *priv, void *obj, unsigned int root_id);
+diff --git a/lib/objagg.c b/lib/objagg.c
+index 73d7116025736..57bde522f2493 100644
+--- a/lib/objagg.c
++++ b/lib/objagg.c
+@@ -909,20 +909,6 @@ static const struct objagg_opt_algo *objagg_opt_algos[] = {
+       [OBJAGG_OPT_ALGO_SIMPLE_GREEDY] = &objagg_opt_simple_greedy,
+ };
+-static int objagg_hints_obj_cmp(struct rhashtable_compare_arg *arg,
+-                              const void *obj)
+-{
+-      struct rhashtable *ht = arg->ht;
+-      struct objagg_hints *objagg_hints =
+-                      container_of(ht, struct objagg_hints, node_ht);
+-      const struct objagg_ops *ops = objagg_hints->ops;
+-      const char *ptr = obj;
+-
+-      ptr += ht->p.key_offset;
+-      return ops->hints_obj_cmp ? ops->hints_obj_cmp(ptr, arg->key) :
+-                                  memcmp(ptr, arg->key, ht->p.key_len);
+-}
+-
+ /**
+  * objagg_hints_get - obtains hints instance
+  * @objagg:           objagg instance
+@@ -961,7 +947,6 @@ struct objagg_hints *objagg_hints_get(struct objagg *objagg,
+                               offsetof(struct objagg_hints_node, obj);
+       objagg_hints->ht_params.head_offset =
+                               offsetof(struct objagg_hints_node, ht_node);
+-      objagg_hints->ht_params.obj_cmpfn = objagg_hints_obj_cmp;
+       err = rhashtable_init(&objagg_hints->node_ht, &objagg_hints->ht_params);
+       if (err)
+-- 
+2.43.0
+
diff --git a/queue-5.15/mtd-make-mtd_test.c-a-separate-module.patch b/queue-5.15/mtd-make-mtd_test.c-a-separate-module.patch
new file mode 100644 (file)
index 0000000..cc43bbe
--- /dev/null
@@ -0,0 +1,114 @@
+From 3298a79b211f445bb9a27c0dba203f3d91c3c047 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 May 2024 11:50:39 +0200
+Subject: mtd: make mtd_test.c a separate module
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit a5cf054d325e6f362e82fe6d124a1871a4af8174 ]
+
+This file gets linked into nine different modules, which causes a warning:
+
+scripts/Makefile.build:236: drivers/mtd/tests/Makefile: mtd_test.o is added to multiple modules: mtd_nandbiterrs mtd_oobtest mtd_pagetest mtd_readtest mtd_speedtest mtd_stresstest mtd_subpagetest mtd_torturetest
+
+Make it a separate module instead.
+
+Fixes: a995c792280d ("mtd: tests: rename sources in order to link a helper object")
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Link: https://lore.kernel.org/linux-mtd/20240529095049.1915393-1-arnd@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/mtd/tests/Makefile   | 34 +++++++++++++++++-----------------
+ drivers/mtd/tests/mtd_test.c |  9 +++++++++
+ 2 files changed, 26 insertions(+), 17 deletions(-)
+
+diff --git a/drivers/mtd/tests/Makefile b/drivers/mtd/tests/Makefile
+index 5de0378f90dbd..7dae831ee8b6b 100644
+--- a/drivers/mtd/tests/Makefile
++++ b/drivers/mtd/tests/Makefile
+@@ -1,19 +1,19 @@
+ # SPDX-License-Identifier: GPL-2.0
+-obj-$(CONFIG_MTD_TESTS) += mtd_oobtest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_pagetest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_readtest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_speedtest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_stresstest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_subpagetest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_torturetest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_nandecctest.o
+-obj-$(CONFIG_MTD_TESTS) += mtd_nandbiterrs.o
++obj-$(CONFIG_MTD_TESTS) += mtd_oobtest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_pagetest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_readtest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_speedtest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_stresstest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_subpagetest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_torturetest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_nandecctest.o mtd_test.o
++obj-$(CONFIG_MTD_TESTS) += mtd_nandbiterrs.o mtd_test.o
+-mtd_oobtest-objs := oobtest.o mtd_test.o
+-mtd_pagetest-objs := pagetest.o mtd_test.o
+-mtd_readtest-objs := readtest.o mtd_test.o
+-mtd_speedtest-objs := speedtest.o mtd_test.o
+-mtd_stresstest-objs := stresstest.o mtd_test.o
+-mtd_subpagetest-objs := subpagetest.o mtd_test.o
+-mtd_torturetest-objs := torturetest.o mtd_test.o
+-mtd_nandbiterrs-objs := nandbiterrs.o mtd_test.o
++mtd_oobtest-objs := oobtest.o
++mtd_pagetest-objs := pagetest.o
++mtd_readtest-objs := readtest.o
++mtd_speedtest-objs := speedtest.o
++mtd_stresstest-objs := stresstest.o
++mtd_subpagetest-objs := subpagetest.o
++mtd_torturetest-objs := torturetest.o
++mtd_nandbiterrs-objs := nandbiterrs.o
+diff --git a/drivers/mtd/tests/mtd_test.c b/drivers/mtd/tests/mtd_test.c
+index c84250beffdc9..f391e0300cdc9 100644
+--- a/drivers/mtd/tests/mtd_test.c
++++ b/drivers/mtd/tests/mtd_test.c
+@@ -25,6 +25,7 @@ int mtdtest_erase_eraseblock(struct mtd_info *mtd, unsigned int ebnum)
+       return 0;
+ }
++EXPORT_SYMBOL_GPL(mtdtest_erase_eraseblock);
+ static int is_block_bad(struct mtd_info *mtd, unsigned int ebnum)
+ {
+@@ -57,6 +58,7 @@ int mtdtest_scan_for_bad_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
+       return 0;
+ }
++EXPORT_SYMBOL_GPL(mtdtest_scan_for_bad_eraseblocks);
+ int mtdtest_erase_good_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
+                               unsigned int eb, int ebcnt)
+@@ -75,6 +77,7 @@ int mtdtest_erase_good_eraseblocks(struct mtd_info *mtd, unsigned char *bbt,
+       return 0;
+ }
++EXPORT_SYMBOL_GPL(mtdtest_erase_good_eraseblocks);
+ int mtdtest_read(struct mtd_info *mtd, loff_t addr, size_t size, void *buf)
+ {
+@@ -92,6 +95,7 @@ int mtdtest_read(struct mtd_info *mtd, loff_t addr, size_t size, void *buf)
+       return err;
+ }
++EXPORT_SYMBOL_GPL(mtdtest_read);
+ int mtdtest_write(struct mtd_info *mtd, loff_t addr, size_t size,
+               const void *buf)
+@@ -107,3 +111,8 @@ int mtdtest_write(struct mtd_info *mtd, loff_t addr, size_t size,
+       return err;
+ }
++EXPORT_SYMBOL_GPL(mtdtest_write);
++
++MODULE_LICENSE("GPL");
++MODULE_DESCRIPTION("MTD function test helpers");
++MODULE_AUTHOR("Akinobu Mita");
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch b/queue-5.15/net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch
new file mode 100644 (file)
index 0000000..bc26bdc
--- /dev/null
@@ -0,0 +1,49 @@
+From b34545a9afd807e5998d42f7d3a0e9c62b7fc694 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 17 Jul 2024 11:08:20 +0200
+Subject: net: dsa: b53: Limit chip-wide jumbo frame config to CPU ports
+
+From: Martin Willi <martin@strongswan.org>
+
+[ Upstream commit c5118072e228e7e4385fc5ac46b2e31cf6c4f2d3 ]
+
+Broadcom switches supported by the b53 driver use a chip-wide jumbo frame
+configuration. In the commit referenced with the Fixes tag, the setting
+is applied just for the last port changing its MTU.
+
+While configuring CPU ports accounts for tagger overhead, user ports do
+not. When setting the MTU for a user port, the chip-wide setting is
+reduced to not include the tagger overhead, resulting in an potentially
+insufficient chip-wide maximum frame size for the CPU port.
+
+As, by design, the CPU port MTU is adjusted for any user port change,
+apply the chip-wide setting only for CPU ports. This aligns the driver
+to the behavior of other switch drivers.
+
+Fixes: 6ae5834b983a ("net: dsa: b53: add MTU configuration support")
+Suggested-by: Vladimir Oltean <olteanv@gmail.com>
+Signed-off-by: Martin Willi <martin@strongswan.org>
+Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/b53/b53_common.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/dsa/b53/b53_common.c b/drivers/net/dsa/b53/b53_common.c
+index 604f541126654..e23f184ffdda7 100644
+--- a/drivers/net/dsa/b53/b53_common.c
++++ b/drivers/net/dsa/b53/b53_common.c
+@@ -2223,6 +2223,9 @@ static int b53_change_mtu(struct dsa_switch *ds, int port, int mtu)
+       if (is5325(dev) || is5365(dev))
+               return -EOPNOTSUPP;
++      if (!dsa_is_cpu_port(ds, port))
++              return 0;
++
+       enable_jumbo = (mtu >= JMS_MIN_SIZE);
+       allow_10_100 = (dev->chip_id == BCM583XX_DEVICE_ID);
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch b/queue-5.15/net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch
new file mode 100644 (file)
index 0000000..dde17e4
--- /dev/null
@@ -0,0 +1,50 @@
+From 7cd5d34213a32ae5d53a18aa2ee3a1a694400d5f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 17 Jul 2024 11:08:19 +0200
+Subject: net: dsa: mv88e6xxx: Limit chip-wide frame size config to CPU ports
+
+From: Martin Willi <martin@strongswan.org>
+
+[ Upstream commit 66b6095c264e1b4e0a441c6329861806504e06c6 ]
+
+Marvell chips not supporting per-port jumbo frame size configurations use
+a chip-wide frame size configuration. In the commit referenced with the
+Fixes tag, the setting is applied just for the last port changing its MTU.
+
+While configuring CPU ports accounts for tagger overhead, user ports do
+not. When setting the MTU for a user port, the chip-wide setting is
+reduced to not include the tagger overhead, resulting in an potentially
+insufficient maximum frame size for the CPU port. Specifically, sending
+full-size frames from the CPU port on a MV88E6097 having a user port MTU
+of 1500 bytes results in dropped frames.
+
+As, by design, the CPU port MTU is adjusted for any user port change,
+apply the chip-wide setting only for CPU ports.
+
+Fixes: 1baf0fac10fb ("net: dsa: mv88e6xxx: Use chip-wide max frame size for MTU")
+Suggested-by: Vladimir Oltean <olteanv@gmail.com>
+Signed-off-by: Martin Willi <martin@strongswan.org>
+Reviewed-by: Vladimir Oltean <olteanv@gmail.com>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/mv88e6xxx/chip.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/dsa/mv88e6xxx/chip.c b/drivers/net/dsa/mv88e6xxx/chip.c
+index 7985a48e08306..2a55ecceab8c6 100644
+--- a/drivers/net/dsa/mv88e6xxx/chip.c
++++ b/drivers/net/dsa/mv88e6xxx/chip.c
+@@ -3104,7 +3104,8 @@ static int mv88e6xxx_change_mtu(struct dsa_switch *ds, int port, int new_mtu)
+       mv88e6xxx_reg_lock(chip);
+       if (chip->info->ops->port_set_jumbo_size)
+               ret = chip->info->ops->port_set_jumbo_size(chip, port, new_mtu);
+-      else if (chip->info->ops->set_max_frame_size)
++      else if (chip->info->ops->set_max_frame_size &&
++               dsa_is_cpu_port(ds, port))
+               ret = chip->info->ops->set_max_frame_size(chip, new_mtu);
+       mv88e6xxx_reg_unlock(chip);
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch b/queue-5.15/net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch
new file mode 100644 (file)
index 0000000..dafbd96
--- /dev/null
@@ -0,0 +1,63 @@
+From c6464cc16fb83ccd54a3bb1a0e2b274b1c376a16 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 18 May 2024 13:04:39 +0000
+Subject: net: esp: cleanup esp_output_tail_tcp() in case of unsupported
+ ESPINTCP
+
+From: Hagar Hemdan <hagarhem@amazon.com>
+
+[ Upstream commit 96f887a612e4cda89efc3f54bc10c1997e3ab0e9 ]
+
+xmit() functions should consume skb or return error codes in error
+paths.
+When the configuration "CONFIG_INET_ESPINTCP" is not set, the
+implementation of the function "esp_output_tail_tcp" violates this rule.
+The function frees the skb and returns the error code.
+This change removes the kfree_skb from both functions, for both
+esp4 and esp6.
+WARN_ON is added because esp_output_tail_tcp() should never be called if
+CONFIG_INET_ESPINTCP is not set.
+
+This bug was discovered and resolved using Coverity Static Analysis
+Security Testing (SAST) by Synopsys, Inc.
+
+Fixes: e27cca96cd68 ("xfrm: add espintcp (RFC 8229)")
+Signed-off-by: Hagar Hemdan <hagarhem@amazon.com>
+Signed-off-by: Steffen Klassert <steffen.klassert@secunet.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/esp4.c | 3 +--
+ net/ipv6/esp6.c | 3 +--
+ 2 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/net/ipv4/esp4.c b/net/ipv4/esp4.c
+index ca0cd94eb22d1..e578d065d9046 100644
+--- a/net/ipv4/esp4.c
++++ b/net/ipv4/esp4.c
+@@ -237,8 +237,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
+ #else
+ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
+ {
+-      kfree_skb(skb);
+-
++      WARN_ON(1);
+       return -EOPNOTSUPP;
+ }
+ #endif
+diff --git a/net/ipv6/esp6.c b/net/ipv6/esp6.c
+index 26d476494676e..a4b8c70ae5275 100644
+--- a/net/ipv6/esp6.c
++++ b/net/ipv6/esp6.c
+@@ -255,8 +255,7 @@ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
+ #else
+ static int esp_output_tail_tcp(struct xfrm_state *x, struct sk_buff *skb)
+ {
+-      kfree_skb(skb);
+-
++      WARN_ON(1);
+       return -EOPNOTSUPP;
+ }
+ #endif
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch b/queue-5.15/net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch
new file mode 100644 (file)
index 0000000..bd67b67
--- /dev/null
@@ -0,0 +1,50 @@
+From 90089d7c183f20c2fb5fc1eba182d37220080836 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Jun 2024 14:31:11 +0200
+Subject: net: fec: Fix FEC_ECR_EN1588 being cleared on link-down
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Csókás, Bence <csokas.bence@prolan.hu>
+
+[ Upstream commit c32fe1986f27cac329767d3497986e306cad1d5e ]
+
+FEC_ECR_EN1588 bit gets cleared after MAC reset in `fec_stop()`, which
+makes all 1588 functionality shut down, and all the extended registers
+disappear, on link-down, making the adapter fall back to compatibility
+"dumb mode". However, some functionality needs to be retained (e.g. PPS)
+even without link.
+
+Fixes: 6605b730c061 ("FEC: Add time stamping code and a PTP hardware clock")
+Cc: Richard Cochran <richardcochran@gmail.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://lore.kernel.org/netdev/5fa9fadc-a89d-467a-aae9-c65469ff5fe1@lunn.ch/
+Signed-off-by: Csókás, Bence <csokas.bence@prolan.hu>
+Reviewed-by: Wei Fang <wei.fang@nxp.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index 722810ce4068f..0a3cf22dc260b 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -1242,6 +1242,12 @@ fec_stop(struct net_device *ndev)
+               writel(FEC_ECR_ETHEREN, fep->hwp + FEC_ECNTRL);
+               writel(rmii_mode, fep->hwp + FEC_R_CNTRL);
+       }
++
++      if (fep->bufdesc_ex) {
++              val = readl(fep->hwp + FEC_ECNTRL);
++              val |= FEC_ECR_EN1588;
++              writel(val, fep->hwp + FEC_ECNTRL);
++      }
+ }
+ static void
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-fec-refactor-define-magic-constants.patch b/queue-5.15/net-fec-refactor-define-magic-constants.patch
new file mode 100644 (file)
index 0000000..43d3cef
--- /dev/null
@@ -0,0 +1,149 @@
+From ef48bacbdd4c08e8f3259291fbcdf358f0e26a35 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 12 Feb 2024 16:37:17 +0100
+Subject: net: fec: Refactor: #define magic constants
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Csókás Bence <csokas.bence@prolan.hu>
+
+[ Upstream commit ff049886671ccd4e624a30ec464cb20e4c39a313 ]
+
+Add defines for bits of ECR, RCR control registers, TX watermark etc.
+
+Signed-off-by: Csókás Bence <csokas.bence@prolan.hu>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://lore.kernel.org/r/20240212153717.10023-1-csokas.bence@prolan.hu
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: c32fe1986f27 ("net: fec: Fix FEC_ECR_EN1588 being cleared on link-down")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/freescale/fec_main.c | 46 +++++++++++++++--------
+ 1 file changed, 30 insertions(+), 16 deletions(-)
+
+diff --git a/drivers/net/ethernet/freescale/fec_main.c b/drivers/net/ethernet/freescale/fec_main.c
+index f02376555ed45..722810ce4068f 100644
+--- a/drivers/net/ethernet/freescale/fec_main.c
++++ b/drivers/net/ethernet/freescale/fec_main.c
+@@ -252,8 +252,8 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
+ #define PKT_MINBUF_SIZE               64
+ /* FEC receive acceleration */
+-#define FEC_RACC_IPDIS                (1 << 1)
+-#define FEC_RACC_PRODIS               (1 << 2)
++#define FEC_RACC_IPDIS                BIT(1)
++#define FEC_RACC_PRODIS               BIT(2)
+ #define FEC_RACC_SHIFT16      BIT(7)
+ #define FEC_RACC_OPTIONS      (FEC_RACC_IPDIS | FEC_RACC_PRODIS)
+@@ -285,8 +285,23 @@ MODULE_PARM_DESC(macaddr, "FEC Ethernet MAC address");
+ #define FEC_MMFR_TA           (2 << 16)
+ #define FEC_MMFR_DATA(v)      (v & 0xffff)
+ /* FEC ECR bits definition */
+-#define FEC_ECR_MAGICEN               (1 << 2)
+-#define FEC_ECR_SLEEP         (1 << 3)
++#define FEC_ECR_RESET           BIT(0)
++#define FEC_ECR_ETHEREN         BIT(1)
++#define FEC_ECR_MAGICEN         BIT(2)
++#define FEC_ECR_SLEEP           BIT(3)
++#define FEC_ECR_EN1588          BIT(4)
++#define FEC_ECR_BYTESWP         BIT(8)
++/* FEC RCR bits definition */
++#define FEC_RCR_LOOP            BIT(0)
++#define FEC_RCR_HALFDPX         BIT(1)
++#define FEC_RCR_MII             BIT(2)
++#define FEC_RCR_PROMISC         BIT(3)
++#define FEC_RCR_BC_REJ          BIT(4)
++#define FEC_RCR_FLOWCTL         BIT(5)
++#define FEC_RCR_RMII            BIT(8)
++#define FEC_RCR_10BASET         BIT(9)
++/* TX WMARK bits */
++#define FEC_TXWMRK_STRFWD       BIT(8)
+ #define FEC_MII_TIMEOUT               30000 /* us */
+@@ -981,7 +996,7 @@ fec_restart(struct net_device *ndev)
+       struct fec_enet_private *fep = netdev_priv(ndev);
+       u32 temp_mac[2];
+       u32 rcntl = OPT_FRAME_SIZE | 0x04;
+-      u32 ecntl = 0x2; /* ETHEREN */
++      u32 ecntl = FEC_ECR_ETHEREN;
+       /* Whack a reset.  We should wait for this.
+        * For i.MX6SX SOC, enet use AXI bus, we use disable MAC
+@@ -1059,18 +1074,18 @@ fec_restart(struct net_device *ndev)
+                   fep->phy_interface == PHY_INTERFACE_MODE_RGMII_TXID)
+                       rcntl |= (1 << 6);
+               else if (fep->phy_interface == PHY_INTERFACE_MODE_RMII)
+-                      rcntl |= (1 << 8);
++                      rcntl |= FEC_RCR_RMII;
+               else
+-                      rcntl &= ~(1 << 8);
++                      rcntl &= ~FEC_RCR_RMII;
+               /* 1G, 100M or 10M */
+               if (ndev->phydev) {
+                       if (ndev->phydev->speed == SPEED_1000)
+                               ecntl |= (1 << 5);
+                       else if (ndev->phydev->speed == SPEED_100)
+-                              rcntl &= ~(1 << 9);
++                              rcntl &= ~FEC_RCR_10BASET;
+                       else
+-                              rcntl |= (1 << 9);
++                              rcntl |= FEC_RCR_10BASET;
+               }
+       } else {
+ #ifdef FEC_MIIGSK_ENR
+@@ -1129,13 +1144,13 @@ fec_restart(struct net_device *ndev)
+       if (fep->quirks & FEC_QUIRK_ENET_MAC) {
+               /* enable ENET endian swap */
+-              ecntl |= (1 << 8);
++              ecntl |= FEC_ECR_BYTESWP;
+               /* enable ENET store and forward mode */
+-              writel(1 << 8, fep->hwp + FEC_X_WMRK);
++              writel(FEC_TXWMRK_STRFWD, fep->hwp + FEC_X_WMRK);
+       }
+       if (fep->bufdesc_ex)
+-              ecntl |= (1 << 4);
++              ecntl |= FEC_ECR_EN1588;
+       if (fep->quirks & FEC_QUIRK_DELAYED_CLKS_SUPPORT &&
+           fep->rgmii_txc_dly)
+@@ -1189,7 +1204,7 @@ static void
+ fec_stop(struct net_device *ndev)
+ {
+       struct fec_enet_private *fep = netdev_priv(ndev);
+-      u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & (1 << 8);
++      u32 rmii_mode = readl(fep->hwp + FEC_R_CNTRL) & FEC_RCR_RMII;
+       u32 val;
+       /* We cannot expect a graceful transmit stop without link !!! */
+@@ -1208,7 +1223,7 @@ fec_stop(struct net_device *ndev)
+               if (fep->quirks & FEC_QUIRK_HAS_MULTI_QUEUES) {
+                       writel(0, fep->hwp + FEC_ECNTRL);
+               } else {
+-                      writel(1, fep->hwp + FEC_ECNTRL);
++                      writel(FEC_ECR_RESET, fep->hwp + FEC_ECNTRL);
+                       udelay(10);
+               }
+               writel(FEC_DEFAULT_IMASK, fep->hwp + FEC_IMASK);
+@@ -1224,12 +1239,11 @@ fec_stop(struct net_device *ndev)
+       /* We have to keep ENET enabled to have MII interrupt stay working */
+       if (fep->quirks & FEC_QUIRK_ENET_MAC &&
+               !(fep->wol_flag & FEC_WOL_FLAG_SLEEP_ON)) {
+-              writel(2, fep->hwp + FEC_ECNTRL);
++              writel(FEC_ECR_ETHEREN, fep->hwp + FEC_ECNTRL);
+               writel(rmii_mode, fep->hwp + FEC_R_CNTRL);
+       }
+ }
+-
+ static void
+ fec_timeout(struct net_device *ndev, unsigned int txqueue)
+ {
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-missing-check-virtio.patch b/queue-5.15/net-missing-check-virtio.patch
new file mode 100644 (file)
index 0000000..be600f6
--- /dev/null
@@ -0,0 +1,119 @@
+From ca187130c8cb0d3fa395185ed89dda3e8b0c8033 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Jun 2024 12:54:48 +0300
+Subject: net: missing check virtio
+
+From: Denis Arefev <arefev@swemel.ru>
+
+[ Upstream commit e269d79c7d35aa3808b1f3c1737d63dab504ddc8 ]
+
+Two missing check in virtio_net_hdr_to_skb() allowed syzbot
+to crash kernels again
+
+1. After the skb_segment function the buffer may become non-linear
+(nr_frags != 0), but since the SKBTX_SHARED_FRAG flag is not set anywhere
+the __skb_linearize function will not be executed, then the buffer will
+remain non-linear. Then the condition (offset >= skb_headlen(skb))
+becomes true, which causes WARN_ON_ONCE in skb_checksum_help.
+
+2. The struct sk_buff and struct virtio_net_hdr members must be
+mathematically related.
+(gso_size) must be greater than (needed) otherwise WARN_ON_ONCE.
+(remainder) must be greater than (needed) otherwise WARN_ON_ONCE.
+(remainder) may be 0 if division is without remainder.
+
+offset+2 (4191) > skb_headlen() (1116)
+WARNING: CPU: 1 PID: 5084 at net/core/dev.c:3303 skb_checksum_help+0x5e2/0x740 net/core/dev.c:3303
+Modules linked in:
+CPU: 1 PID: 5084 Comm: syz-executor336 Not tainted 6.7.0-rc3-syzkaller-00014-gdf60cee26a2e #0
+Hardware name: Google Compute Engine/Google Compute Engine, BIOS Google 11/10/2023
+RIP: 0010:skb_checksum_help+0x5e2/0x740 net/core/dev.c:3303
+Code: 89 e8 83 e0 07 83 c0 03 38 d0 7c 08 84 d2 0f 85 52 01 00 00 44 89 e2 2b 53 74 4c 89 ee 48 c7 c7 40 57 e9 8b e8 af 8f dd f8 90 <0f> 0b 90 90 e9 87 fe ff ff e8 40 0f 6e f9 e9 4b fa ff ff 48 89 ef
+RSP: 0018:ffffc90003a9f338 EFLAGS: 00010286
+RAX: 0000000000000000 RBX: ffff888025125780 RCX: ffffffff814db209
+RDX: ffff888015393b80 RSI: ffffffff814db216 RDI: 0000000000000001
+RBP: ffff8880251257f4 R08: 0000000000000001 R09: 0000000000000000
+R10: 0000000000000000 R11: 0000000000000001 R12: 000000000000045c
+R13: 000000000000105f R14: ffff8880251257f0 R15: 000000000000105d
+FS:  0000555555c24380(0000) GS:ffff8880b9900000(0000) knlGS:0000000000000000
+CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+CR2: 000000002000f000 CR3: 0000000023151000 CR4: 00000000003506f0
+DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
+DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
+Call Trace:
+ <TASK>
+ ip_do_fragment+0xa1b/0x18b0 net/ipv4/ip_output.c:777
+ ip_fragment.constprop.0+0x161/0x230 net/ipv4/ip_output.c:584
+ ip_finish_output_gso net/ipv4/ip_output.c:286 [inline]
+ __ip_finish_output net/ipv4/ip_output.c:308 [inline]
+ __ip_finish_output+0x49c/0x650 net/ipv4/ip_output.c:295
+ ip_finish_output+0x31/0x310 net/ipv4/ip_output.c:323
+ NF_HOOK_COND include/linux/netfilter.h:303 [inline]
+ ip_output+0x13b/0x2a0 net/ipv4/ip_output.c:433
+ dst_output include/net/dst.h:451 [inline]
+ ip_local_out+0xaf/0x1a0 net/ipv4/ip_output.c:129
+ iptunnel_xmit+0x5b4/0x9b0 net/ipv4/ip_tunnel_core.c:82
+ ipip6_tunnel_xmit net/ipv6/sit.c:1034 [inline]
+ sit_tunnel_xmit+0xed2/0x28f0 net/ipv6/sit.c:1076
+ __netdev_start_xmit include/linux/netdevice.h:4940 [inline]
+ netdev_start_xmit include/linux/netdevice.h:4954 [inline]
+ xmit_one net/core/dev.c:3545 [inline]
+ dev_hard_start_xmit+0x13d/0x6d0 net/core/dev.c:3561
+ __dev_queue_xmit+0x7c1/0x3d60 net/core/dev.c:4346
+ dev_queue_xmit include/linux/netdevice.h:3134 [inline]
+ packet_xmit+0x257/0x380 net/packet/af_packet.c:276
+ packet_snd net/packet/af_packet.c:3087 [inline]
+ packet_sendmsg+0x24ca/0x5240 net/packet/af_packet.c:3119
+ sock_sendmsg_nosec net/socket.c:730 [inline]
+ __sock_sendmsg+0xd5/0x180 net/socket.c:745
+ __sys_sendto+0x255/0x340 net/socket.c:2190
+ __do_sys_sendto net/socket.c:2202 [inline]
+ __se_sys_sendto net/socket.c:2198 [inline]
+ __x64_sys_sendto+0xe0/0x1b0 net/socket.c:2198
+ do_syscall_x64 arch/x86/entry/common.c:51 [inline]
+ do_syscall_64+0x40/0x110 arch/x86/entry/common.c:82
+ entry_SYSCALL_64_after_hwframe+0x63/0x6b
+
+Found by Linux Verification Center (linuxtesting.org) with Syzkaller
+
+Fixes: 0f6925b3e8da ("virtio_net: Do not pull payload in skb->head")
+Signed-off-by: Denis Arefev <arefev@swemel.ru>
+Message-Id: <20240613095448.27118-1-arefev@swemel.ru>
+Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/virtio_net.h | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/include/linux/virtio_net.h b/include/linux/virtio_net.h
+index 6047058d67037..29b19d0a324c7 100644
+--- a/include/linux/virtio_net.h
++++ b/include/linux/virtio_net.h
+@@ -51,6 +51,7 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,
+       unsigned int thlen = 0;
+       unsigned int p_off = 0;
+       unsigned int ip_proto;
++      u64 ret, remainder, gso_size;
+       if (hdr->gso_type != VIRTIO_NET_HDR_GSO_NONE) {
+               switch (hdr->gso_type & ~VIRTIO_NET_HDR_GSO_ECN) {
+@@ -87,6 +88,16 @@ static inline int virtio_net_hdr_to_skb(struct sk_buff *skb,
+               u32 off = __virtio16_to_cpu(little_endian, hdr->csum_offset);
+               u32 needed = start + max_t(u32, thlen, off + sizeof(__sum16));
++              if (hdr->gso_size) {
++                      gso_size = __virtio16_to_cpu(little_endian, hdr->gso_size);
++                      ret = div64_u64_rem(skb->len, gso_size, &remainder);
++                      if (!(ret && (hdr->gso_size > needed) &&
++                                              ((remainder > needed) || (remainder == 0)))) {
++                              return -EINVAL;
++                      }
++                      skb_shinfo(skb)->tx_flags |= SKBFL_SHARED_FRAG;
++              }
++
+               if (!pskb_may_pull(skb, needed))
+                       return -EINVAL;
+-- 
+2.43.0
+
diff --git a/queue-5.15/net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch b/queue-5.15/net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch
new file mode 100644 (file)
index 0000000..dfd1494
--- /dev/null
@@ -0,0 +1,57 @@
+From cbef5404e66698a0805aa98691d529fa7350a2b7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Jun 2024 11:00:18 +0800
+Subject: net/smc: set rmb's SG_MAX_SINGLE_ALLOC limitation only when
+ CONFIG_ARCH_NO_SG_CHAIN is defined
+
+From: Guangguan Wang <guangguan.wang@linux.alibaba.com>
+
+[ Upstream commit 3ac14b9dfbd345e891d48d89f6c2fa519848f0f4 ]
+
+SG_MAX_SINGLE_ALLOC is used to limit maximum number of entries that
+will be allocated in one piece of scatterlist. When the entries of
+scatterlist exceeds SG_MAX_SINGLE_ALLOC, sg chain will be used. From
+commit 7c703e54cc71 ("arch: switch the default on ARCH_HAS_SG_CHAIN"),
+we can know that the macro CONFIG_ARCH_NO_SG_CHAIN is used to identify
+whether sg chain is supported. So, SMC-R's rmb buffer should be limited
+by SG_MAX_SINGLE_ALLOC only when the macro CONFIG_ARCH_NO_SG_CHAIN is
+defined.
+
+Fixes: a3fe3d01bd0d ("net/smc: introduce sg-logic for RMBs")
+Signed-off-by: Guangguan Wang <guangguan.wang@linux.alibaba.com>
+Co-developed-by: Wen Gu <guwen@linux.alibaba.com>
+Signed-off-by: Wen Gu <guwen@linux.alibaba.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/smc/smc_core.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/net/smc/smc_core.c b/net/smc/smc_core.c
+index b84896acd4732..0b32612b86aa2 100644
+--- a/net/smc/smc_core.c
++++ b/net/smc/smc_core.c
+@@ -1772,7 +1772,6 @@ int smc_conn_create(struct smc_sock *smc, struct smc_init_info *ini)
+  */
+ static u8 smc_compress_bufsize(int size, bool is_smcd, bool is_rmb)
+ {
+-      const unsigned int max_scat = SG_MAX_SINGLE_ALLOC * PAGE_SIZE;
+       u8 compressed;
+       if (size <= SMC_BUF_MIN_SIZE)
+@@ -1782,9 +1781,11 @@ static u8 smc_compress_bufsize(int size, bool is_smcd, bool is_rmb)
+       compressed = min_t(u8, ilog2(size) + 1,
+                          is_smcd ? SMCD_DMBE_SIZES : SMCR_RMBE_SIZES);
++#ifdef CONFIG_ARCH_NO_SG_CHAIN
+       if (!is_smcd && is_rmb)
+               /* RMBs are backed by & limited to max size of scatterlists */
+-              compressed = min_t(u8, compressed, ilog2(max_scat >> 14));
++              compressed = min_t(u8, compressed, ilog2((SG_MAX_SINGLE_ALLOC * PAGE_SIZE) >> 14));
++#endif
+       return compressed;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/netfilter-ctnetlink-use-helper-function-to-calculate.patch b/queue-5.15/netfilter-ctnetlink-use-helper-function-to-calculate.patch
new file mode 100644 (file)
index 0000000..3317fa9
--- /dev/null
@@ -0,0 +1,38 @@
+From e78403238b9e487ec245733fe1fdbe930c9e5762 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 13 Jul 2024 16:47:38 +0200
+Subject: netfilter: ctnetlink: use helper function to calculate expect ID
+
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+
+[ Upstream commit 782161895eb4ac45cf7cfa8db375bd4766cb8299 ]
+
+Delete expectation path is missing a call to the nf_expect_get_id()
+helper function to calculate the expectation ID, otherwise LSB of the
+expectation object address is leaked to userspace.
+
+Fixes: 3c79107631db ("netfilter: ctnetlink: don't use conntrack/expect object addresses as id")
+Reported-by: zdi-disclosures@trendmicro.com
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_conntrack_netlink.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/netfilter/nf_conntrack_netlink.c b/net/netfilter/nf_conntrack_netlink.c
+index 1466015bc56dc..b429ffde25b1a 100644
+--- a/net/netfilter/nf_conntrack_netlink.c
++++ b/net/netfilter/nf_conntrack_netlink.c
+@@ -3426,7 +3426,8 @@ static int ctnetlink_del_expect(struct sk_buff *skb,
+               if (cda[CTA_EXPECT_ID]) {
+                       __be32 id = nla_get_be32(cda[CTA_EXPECT_ID]);
+-                      if (ntohl(id) != (u32)(unsigned long)exp) {
++
++                      if (id != nf_expect_get_id(exp)) {
+                               nf_ct_expect_put(exp);
+                               return -ENOENT;
+                       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/netfilter-nf_set_pipapo-fix-initial-map-fill.patch b/queue-5.15/netfilter-nf_set_pipapo-fix-initial-map-fill.patch
new file mode 100644 (file)
index 0000000..c2da570
--- /dev/null
@@ -0,0 +1,142 @@
+From e7a3c58cff4923ea6af16d1980998026952e776b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Jul 2024 13:54:03 +0200
+Subject: netfilter: nf_set_pipapo: fix initial map fill
+
+From: Florian Westphal <fw@strlen.de>
+
+[ Upstream commit 791a615b7ad2258c560f91852be54b0480837c93 ]
+
+The initial buffer has to be inited to all-ones, but it must restrict
+it to the size of the first field, not the total field size.
+
+After each round in the map search step, the result and the fill map
+are swapped, so if we have a set where f->bsize of the first element
+is smaller than m->bsize_max, those one-bits are leaked into future
+rounds result map.
+
+This makes pipapo find an incorrect matching results for sets where
+first field size is not the largest.
+
+Followup patch adds a test case to nft_concat_range.sh selftest script.
+
+Thanks to Stefano Brivio for pointing out that we need to zero out
+the remainder explicitly, only correcting memset() argument isn't enough.
+
+Fixes: 3c4287f62044 ("nf_tables: Add set type for arbitrary concatenation of ranges")
+Reported-by: Yi Chen <yiche@redhat.com>
+Cc: Stefano Brivio <sbrivio@redhat.com>
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nft_set_pipapo.c      |  4 ++--
+ net/netfilter/nft_set_pipapo.h      | 21 +++++++++++++++++++++
+ net/netfilter/nft_set_pipapo_avx2.c | 10 ++++++----
+ 3 files changed, 29 insertions(+), 6 deletions(-)
+
+diff --git a/net/netfilter/nft_set_pipapo.c b/net/netfilter/nft_set_pipapo.c
+index cde08578722ef..8b1a88a16e5c1 100644
+--- a/net/netfilter/nft_set_pipapo.c
++++ b/net/netfilter/nft_set_pipapo.c
+@@ -432,7 +432,7 @@ bool nft_pipapo_lookup(const struct net *net, const struct nft_set *set,
+       res_map  = scratch->map + (map_index ? m->bsize_max : 0);
+       fill_map = scratch->map + (map_index ? 0 : m->bsize_max);
+-      memset(res_map, 0xff, m->bsize_max * sizeof(*res_map));
++      pipapo_resmap_init(m, res_map);
+       nft_pipapo_for_each_field(f, i, m) {
+               bool last = i == m->field_count - 1;
+@@ -536,7 +536,7 @@ static struct nft_pipapo_elem *pipapo_get(const struct net *net,
+               goto out;
+       }
+-      memset(res_map, 0xff, m->bsize_max * sizeof(*res_map));
++      pipapo_resmap_init(m, res_map);
+       nft_pipapo_for_each_field(f, i, m) {
+               bool last = i == m->field_count - 1;
+diff --git a/net/netfilter/nft_set_pipapo.h b/net/netfilter/nft_set_pipapo.h
+index 73a4518308be4..519a2e6dc206f 100644
+--- a/net/netfilter/nft_set_pipapo.h
++++ b/net/netfilter/nft_set_pipapo.h
+@@ -285,4 +285,25 @@ static u64 pipapo_estimate_size(const struct nft_set_desc *desc)
+       return size;
+ }
++/**
++ * pipapo_resmap_init() - Initialise result map before first use
++ * @m:                Matching data, including mapping table
++ * @res_map:  Result map
++ *
++ * Initialize all bits covered by the first field to one, so that after
++ * the first step, only the matching bits of the first bit group remain.
++ *
++ * If other fields have a large bitmap, set remainder of res_map to 0.
++ */
++static inline void pipapo_resmap_init(const struct nft_pipapo_match *m, unsigned long *res_map)
++{
++      const struct nft_pipapo_field *f = m->f;
++      int i;
++
++      for (i = 0; i < f->bsize; i++)
++              res_map[i] = ULONG_MAX;
++
++      for (i = f->bsize; i < m->bsize_max; i++)
++              res_map[i] = 0ul;
++}
+ #endif /* _NFT_SET_PIPAPO_H */
+diff --git a/net/netfilter/nft_set_pipapo_avx2.c b/net/netfilter/nft_set_pipapo_avx2.c
+index ef24c41482a32..295406cf63672 100644
+--- a/net/netfilter/nft_set_pipapo_avx2.c
++++ b/net/netfilter/nft_set_pipapo_avx2.c
+@@ -1036,6 +1036,7 @@ static int nft_pipapo_avx2_lookup_8b_16(unsigned long *map, unsigned long *fill,
+ /**
+  * nft_pipapo_avx2_lookup_slow() - Fallback function for uncommon field sizes
++ * @mdata:    Matching data, including mapping table
+  * @map:      Previous match result, used as initial bitmap
+  * @fill:     Destination bitmap to be filled with current match result
+  * @f:                Field, containing lookup and mapping tables
+@@ -1051,7 +1052,8 @@ static int nft_pipapo_avx2_lookup_8b_16(unsigned long *map, unsigned long *fill,
+  * Return: -1 on no match, rule index of match if @last, otherwise first long
+  * word index to be checked next (i.e. first filled word).
+  */
+-static int nft_pipapo_avx2_lookup_slow(unsigned long *map, unsigned long *fill,
++static int nft_pipapo_avx2_lookup_slow(const struct nft_pipapo_match *mdata,
++                                      unsigned long *map, unsigned long *fill,
+                                       const struct nft_pipapo_field *f,
+                                       int offset, const u8 *pkt,
+                                       bool first, bool last)
+@@ -1062,7 +1064,7 @@ static int nft_pipapo_avx2_lookup_slow(unsigned long *map, unsigned long *fill,
+       lt += offset * NFT_PIPAPO_LONGS_PER_M256;
+       if (first)
+-              memset(map, 0xff, bsize * sizeof(*map));
++              pipapo_resmap_init(mdata, map);
+       for (i = offset; i < bsize; i++) {
+               if (f->bb == 8)
+@@ -1188,7 +1190,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
+                       } else if (f->groups == 16) {
+                               NFT_SET_PIPAPO_AVX2_LOOKUP(8, 16);
+                       } else {
+-                              ret = nft_pipapo_avx2_lookup_slow(res, fill, f,
++                              ret = nft_pipapo_avx2_lookup_slow(m, res, fill, f,
+                                                                 ret, rp,
+                                                                 first, last);
+                       }
+@@ -1204,7 +1206,7 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
+                       } else if (f->groups == 32) {
+                               NFT_SET_PIPAPO_AVX2_LOOKUP(4, 32);
+                       } else {
+-                              ret = nft_pipapo_avx2_lookup_slow(res, fill, f,
++                              ret = nft_pipapo_avx2_lookup_slow(m, res, fill, f,
+                                                                 ret, rp,
+                                                                 first, last);
+                       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch b/queue-5.15/netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch
new file mode 100644 (file)
index 0000000..7df598f
--- /dev/null
@@ -0,0 +1,34 @@
+From 415e6fc167a364fe37f332340154ead93e26278b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Jun 2024 20:16:59 +0200
+Subject: netfilter: nf_tables: rise cap on SELinux secmark context
+
+From: Pablo Neira Ayuso <pablo@netfilter.org>
+
+[ Upstream commit e29630247be24c3987e2b048f8e152771b32d38b ]
+
+secmark context is artificially limited 256 bytes, rise it to 4Kbytes.
+
+Fixes: fb961945457f ("netfilter: nf_tables: add SECMARK support")
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/uapi/linux/netfilter/nf_tables.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/uapi/linux/netfilter/nf_tables.h b/include/uapi/linux/netfilter/nf_tables.h
+index 62cc780a168a8..c0edc1a2c8e65 100644
+--- a/include/uapi/linux/netfilter/nf_tables.h
++++ b/include/uapi/linux/netfilter/nf_tables.h
+@@ -1320,7 +1320,7 @@ enum nft_secmark_attributes {
+ #define NFTA_SECMARK_MAX      (__NFTA_SECMARK_MAX - 1)
+ /* Max security context length */
+-#define NFT_SECMARK_CTX_MAXLEN                256
++#define NFT_SECMARK_CTX_MAXLEN                4096
+ /**
+  * enum nft_reject_types - nf_tables reject expression reject types
+-- 
+2.43.0
+
diff --git a/queue-5.15/netfilter-nft_set_pipapo-constify-lookup-fn-args-whe.patch b/queue-5.15/netfilter-nft_set_pipapo-constify-lookup-fn-args-whe.patch
new file mode 100644 (file)
index 0000000..0545868
--- /dev/null
@@ -0,0 +1,265 @@
+From 8c8b57fac9d07c8c16c181232c2113a531bff7a5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 13 Feb 2024 16:23:37 +0100
+Subject: netfilter: nft_set_pipapo: constify lookup fn args where possible
+
+From: Florian Westphal <fw@strlen.de>
+
+[ Upstream commit f04df573faf90bb828a2241b650598c02c074323 ]
+
+Those get called from packet path, content must not be modified.
+No functional changes intended.
+
+Reviewed-by: Stefano Brivio <sbrivio@redhat.com>
+Signed-off-by: Florian Westphal <fw@strlen.de>
+Stable-dep-of: 791a615b7ad2 ("netfilter: nf_set_pipapo: fix initial map fill")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nft_set_pipapo.c      | 18 +++++----
+ net/netfilter/nft_set_pipapo.h      |  6 +--
+ net/netfilter/nft_set_pipapo_avx2.c | 59 +++++++++++++++++------------
+ 3 files changed, 48 insertions(+), 35 deletions(-)
+
+diff --git a/net/netfilter/nft_set_pipapo.c b/net/netfilter/nft_set_pipapo.c
+index 2299ced939c47..cde08578722ef 100644
+--- a/net/netfilter/nft_set_pipapo.c
++++ b/net/netfilter/nft_set_pipapo.c
+@@ -360,7 +360,7 @@
+  * Return: -1 on no match, bit position on 'match_only', 0 otherwise.
+  */
+ int pipapo_refill(unsigned long *map, int len, int rules, unsigned long *dst,
+-                union nft_pipapo_map_bucket *mt, bool match_only)
++                const union nft_pipapo_map_bucket *mt, bool match_only)
+ {
+       unsigned long bitset;
+       int k, ret = -1;
+@@ -412,9 +412,9 @@ bool nft_pipapo_lookup(const struct net *net, const struct nft_set *set,
+       struct nft_pipapo_scratch *scratch;
+       unsigned long *res_map, *fill_map;
+       u8 genmask = nft_genmask_cur(net);
++      const struct nft_pipapo_match *m;
++      const struct nft_pipapo_field *f;
+       const u8 *rp = (const u8 *)key;
+-      struct nft_pipapo_match *m;
+-      struct nft_pipapo_field *f;
+       bool map_index;
+       int i;
+@@ -517,11 +517,13 @@ static struct nft_pipapo_elem *pipapo_get(const struct net *net,
+ {
+       struct nft_pipapo_elem *ret = ERR_PTR(-ENOENT);
+       struct nft_pipapo *priv = nft_set_priv(set);
+-      struct nft_pipapo_match *m = priv->clone;
+       unsigned long *res_map, *fill_map = NULL;
+-      struct nft_pipapo_field *f;
++      const struct nft_pipapo_match *m;
++      const struct nft_pipapo_field *f;
+       int i;
++      m = priv->clone;
++
+       res_map = kmalloc_array(m->bsize_max, sizeof(*res_map), GFP_ATOMIC);
+       if (!res_map) {
+               ret = ERR_PTR(-ENOMEM);
+@@ -1591,7 +1593,7 @@ static void pipapo_gc(const struct nft_set *_set, struct nft_pipapo_match *m)
+       while ((rules_f0 = pipapo_rules_same_key(m->f, first_rule))) {
+               union nft_pipapo_map_bucket rulemap[NFT_PIPAPO_MAX_FIELDS];
+-              struct nft_pipapo_field *f;
++              const struct nft_pipapo_field *f;
+               int i, start, rules_fx;
+               start = first_rule;
+@@ -2037,8 +2039,8 @@ static void nft_pipapo_walk(const struct nft_ctx *ctx, struct nft_set *set,
+ {
+       struct nft_pipapo *priv = nft_set_priv(set);
+       struct net *net = read_pnet(&set->net);
+-      struct nft_pipapo_match *m;
+-      struct nft_pipapo_field *f;
++      const struct nft_pipapo_match *m;
++      const struct nft_pipapo_field *f;
+       int i, r;
+       rcu_read_lock();
+diff --git a/net/netfilter/nft_set_pipapo.h b/net/netfilter/nft_set_pipapo.h
+index 30a3d092cd841..73a4518308be4 100644
+--- a/net/netfilter/nft_set_pipapo.h
++++ b/net/netfilter/nft_set_pipapo.h
+@@ -185,7 +185,7 @@ struct nft_pipapo_elem {
+ };
+ int pipapo_refill(unsigned long *map, int len, int rules, unsigned long *dst,
+-                union nft_pipapo_map_bucket *mt, bool match_only);
++                const union nft_pipapo_map_bucket *mt, bool match_only);
+ /**
+  * pipapo_and_field_buckets_4bit() - Intersect 4-bit buckets
+@@ -193,7 +193,7 @@ int pipapo_refill(unsigned long *map, int len, int rules, unsigned long *dst,
+  * @dst:      Area to store result
+  * @data:     Input data selecting table buckets
+  */
+-static inline void pipapo_and_field_buckets_4bit(struct nft_pipapo_field *f,
++static inline void pipapo_and_field_buckets_4bit(const struct nft_pipapo_field *f,
+                                                unsigned long *dst,
+                                                const u8 *data)
+ {
+@@ -221,7 +221,7 @@ static inline void pipapo_and_field_buckets_4bit(struct nft_pipapo_field *f,
+  * @dst:      Area to store result
+  * @data:     Input data selecting table buckets
+  */
+-static inline void pipapo_and_field_buckets_8bit(struct nft_pipapo_field *f,
++static inline void pipapo_and_field_buckets_8bit(const struct nft_pipapo_field *f,
+                                                unsigned long *dst,
+                                                const u8 *data)
+ {
+diff --git a/net/netfilter/nft_set_pipapo_avx2.c b/net/netfilter/nft_set_pipapo_avx2.c
+index 0d9f8e79eb00e..ef24c41482a32 100644
+--- a/net/netfilter/nft_set_pipapo_avx2.c
++++ b/net/netfilter/nft_set_pipapo_avx2.c
+@@ -212,8 +212,9 @@ static int nft_pipapo_avx2_refill(int offset, unsigned long *map,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_4b_2(unsigned long *map, unsigned long *fill,
+-                                     struct nft_pipapo_field *f, int offset,
+-                                     const u8 *pkt, bool first, bool last)
++                                     const struct nft_pipapo_field *f,
++                                     int offset, const u8 *pkt,
++                                     bool first, bool last)
+ {
+       int i, ret = -1, m256_size = f->bsize / NFT_PIPAPO_LONGS_PER_M256, b;
+       u8 pg[2] = { pkt[0] >> 4, pkt[0] & 0xf };
+@@ -274,8 +275,9 @@ static int nft_pipapo_avx2_lookup_4b_2(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_4b_4(unsigned long *map, unsigned long *fill,
+-                                     struct nft_pipapo_field *f, int offset,
+-                                     const u8 *pkt, bool first, bool last)
++                                     const struct nft_pipapo_field *f,
++                                     int offset, const u8 *pkt,
++                                     bool first, bool last)
+ {
+       int i, ret = -1, m256_size = f->bsize / NFT_PIPAPO_LONGS_PER_M256, b;
+       u8 pg[4] = { pkt[0] >> 4, pkt[0] & 0xf, pkt[1] >> 4, pkt[1] & 0xf };
+@@ -350,8 +352,9 @@ static int nft_pipapo_avx2_lookup_4b_4(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_4b_8(unsigned long *map, unsigned long *fill,
+-                                     struct nft_pipapo_field *f, int offset,
+-                                     const u8 *pkt, bool first, bool last)
++                                     const struct nft_pipapo_field *f,
++                                     int offset, const u8 *pkt,
++                                     bool first, bool last)
+ {
+       u8 pg[8] = {  pkt[0] >> 4,  pkt[0] & 0xf,  pkt[1] >> 4,  pkt[1] & 0xf,
+                     pkt[2] >> 4,  pkt[2] & 0xf,  pkt[3] >> 4,  pkt[3] & 0xf,
+@@ -445,8 +448,9 @@ static int nft_pipapo_avx2_lookup_4b_8(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_4b_12(unsigned long *map, unsigned long *fill,
+-                                      struct nft_pipapo_field *f, int offset,
+-                                      const u8 *pkt, bool first, bool last)
++                                      const struct nft_pipapo_field *f,
++                                      int offset, const u8 *pkt,
++                                      bool first, bool last)
+ {
+       u8 pg[12] = {  pkt[0] >> 4,  pkt[0] & 0xf,  pkt[1] >> 4,  pkt[1] & 0xf,
+                      pkt[2] >> 4,  pkt[2] & 0xf,  pkt[3] >> 4,  pkt[3] & 0xf,
+@@ -534,8 +538,9 @@ static int nft_pipapo_avx2_lookup_4b_12(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_4b_32(unsigned long *map, unsigned long *fill,
+-                                      struct nft_pipapo_field *f, int offset,
+-                                      const u8 *pkt, bool first, bool last)
++                                      const struct nft_pipapo_field *f,
++                                      int offset, const u8 *pkt,
++                                      bool first, bool last)
+ {
+       u8 pg[32] = {  pkt[0] >> 4,  pkt[0] & 0xf,  pkt[1] >> 4,  pkt[1] & 0xf,
+                      pkt[2] >> 4,  pkt[2] & 0xf,  pkt[3] >> 4,  pkt[3] & 0xf,
+@@ -669,8 +674,9 @@ static int nft_pipapo_avx2_lookup_4b_32(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_8b_1(unsigned long *map, unsigned long *fill,
+-                                     struct nft_pipapo_field *f, int offset,
+-                                     const u8 *pkt, bool first, bool last)
++                                     const struct nft_pipapo_field *f,
++                                     int offset, const u8 *pkt,
++                                     bool first, bool last)
+ {
+       int i, ret = -1, m256_size = f->bsize / NFT_PIPAPO_LONGS_PER_M256, b;
+       unsigned long *lt = f->lt, bsize = f->bsize;
+@@ -726,8 +732,9 @@ static int nft_pipapo_avx2_lookup_8b_1(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_8b_2(unsigned long *map, unsigned long *fill,
+-                                     struct nft_pipapo_field *f, int offset,
+-                                     const u8 *pkt, bool first, bool last)
++                                     const struct nft_pipapo_field *f,
++                                     int offset, const u8 *pkt,
++                                     bool first, bool last)
+ {
+       int i, ret = -1, m256_size = f->bsize / NFT_PIPAPO_LONGS_PER_M256, b;
+       unsigned long *lt = f->lt, bsize = f->bsize;
+@@ -790,8 +797,9 @@ static int nft_pipapo_avx2_lookup_8b_2(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_8b_4(unsigned long *map, unsigned long *fill,
+-                                     struct nft_pipapo_field *f, int offset,
+-                                     const u8 *pkt, bool first, bool last)
++                                     const struct nft_pipapo_field *f,
++                                     int offset, const u8 *pkt,
++                                     bool first, bool last)
+ {
+       int i, ret = -1, m256_size = f->bsize / NFT_PIPAPO_LONGS_PER_M256, b;
+       unsigned long *lt = f->lt, bsize = f->bsize;
+@@ -865,8 +873,9 @@ static int nft_pipapo_avx2_lookup_8b_4(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_8b_6(unsigned long *map, unsigned long *fill,
+-                                     struct nft_pipapo_field *f, int offset,
+-                                     const u8 *pkt, bool first, bool last)
++                                     const struct nft_pipapo_field *f,
++                                     int offset, const u8 *pkt,
++                                     bool first, bool last)
+ {
+       int i, ret = -1, m256_size = f->bsize / NFT_PIPAPO_LONGS_PER_M256, b;
+       unsigned long *lt = f->lt, bsize = f->bsize;
+@@ -950,8 +959,9 @@ static int nft_pipapo_avx2_lookup_8b_6(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_8b_16(unsigned long *map, unsigned long *fill,
+-                                      struct nft_pipapo_field *f, int offset,
+-                                      const u8 *pkt, bool first, bool last)
++                                      const struct nft_pipapo_field *f,
++                                      int offset, const u8 *pkt,
++                                      bool first, bool last)
+ {
+       int i, ret = -1, m256_size = f->bsize / NFT_PIPAPO_LONGS_PER_M256, b;
+       unsigned long *lt = f->lt, bsize = f->bsize;
+@@ -1042,8 +1052,9 @@ static int nft_pipapo_avx2_lookup_8b_16(unsigned long *map, unsigned long *fill,
+  * word index to be checked next (i.e. first filled word).
+  */
+ static int nft_pipapo_avx2_lookup_slow(unsigned long *map, unsigned long *fill,
+-                                      struct nft_pipapo_field *f, int offset,
+-                                      const u8 *pkt, bool first, bool last)
++                                      const struct nft_pipapo_field *f,
++                                      int offset, const u8 *pkt,
++                                      bool first, bool last)
+ {
+       unsigned long *lt = f->lt, bsize = f->bsize;
+       int i, ret = -1, b;
+@@ -1121,9 +1132,9 @@ bool nft_pipapo_avx2_lookup(const struct net *net, const struct nft_set *set,
+       struct nft_pipapo *priv = nft_set_priv(set);
+       struct nft_pipapo_scratch *scratch;
+       u8 genmask = nft_genmask_cur(net);
++      const struct nft_pipapo_match *m;
++      const struct nft_pipapo_field *f;
+       const u8 *rp = (const u8 *)key;
+-      struct nft_pipapo_match *m;
+-      struct nft_pipapo_field *f;
+       unsigned long *res, *fill;
+       bool map_index;
+       int i, ret = 0;
+-- 
+2.43.0
+
diff --git a/queue-5.15/nfsv4.1-another-fix-for-exchgid4_flag_use_pnfs_ds-fo.patch b/queue-5.15/nfsv4.1-another-fix-for-exchgid4_flag_use_pnfs_ds-fo.patch
new file mode 100644 (file)
index 0000000..55ff0d1
--- /dev/null
@@ -0,0 +1,66 @@
+From eddad8fdbdc155730cb836bea763f4d5782c9df9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 09:28:27 -0400
+Subject: NFSv4.1 another fix for EXCHGID4_FLAG_USE_PNFS_DS for DS server
+
+From: Olga Kornievskaia <kolga@netapp.com>
+
+[ Upstream commit 4840c00003a2275668a13b82c9f5b1aed80183aa ]
+
+Previously in order to mark the communication with the DS server,
+we tried to use NFS_CS_DS in cl_flags. However, this flag would
+only be saved for the DS server and in case where DS equals MDS,
+the client would not find a matching nfs_client in nfs_match_client
+that represents the MDS (but is also a DS).
+
+Instead, don't rely on the NFS_CS_DS but instead use NFS_CS_PNFS.
+
+Fixes: 379e4adfddd6 ("NFSv4.1: fixup use EXCHGID4_FLAG_USE_PNFS_DS for DS server")
+Signed-off-by: Olga Kornievskaia <kolga@netapp.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/nfs4client.c | 6 ++----
+ fs/nfs/nfs4proc.c   | 2 +-
+ 2 files changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/fs/nfs/nfs4client.c b/fs/nfs/nfs4client.c
+index cba8b4c1fb4a3..8557b2218aa19 100644
+--- a/fs/nfs/nfs4client.c
++++ b/fs/nfs/nfs4client.c
+@@ -230,9 +230,8 @@ struct nfs_client *nfs4_alloc_client(const struct nfs_client_initdata *cl_init)
+               __set_bit(NFS_CS_INFINITE_SLOTS, &clp->cl_flags);
+       __set_bit(NFS_CS_DISCRTRY, &clp->cl_flags);
+       __set_bit(NFS_CS_NO_RETRANS_TIMEOUT, &clp->cl_flags);
+-
+-      if (test_bit(NFS_CS_DS, &cl_init->init_flags))
+-              __set_bit(NFS_CS_DS, &clp->cl_flags);
++      if (test_bit(NFS_CS_PNFS, &cl_init->init_flags))
++              __set_bit(NFS_CS_PNFS, &clp->cl_flags);
+       /*
+        * Set up the connection to the server before we add add to the
+        * global list.
+@@ -997,7 +996,6 @@ struct nfs_client *nfs4_set_ds_client(struct nfs_server *mds_srv,
+       if (mds_srv->flags & NFS_MOUNT_NORESVPORT)
+               __set_bit(NFS_CS_NORESVPORT, &cl_init.init_flags);
+-      __set_bit(NFS_CS_DS, &cl_init.init_flags);
+       __set_bit(NFS_CS_PNFS, &cl_init.init_flags);
+       cl_init.max_connect = NFS_MAX_TRANSPORTS;
+       /*
+diff --git a/fs/nfs/nfs4proc.c b/fs/nfs/nfs4proc.c
+index 167f2cc3c3798..770fa1cb112d8 100644
+--- a/fs/nfs/nfs4proc.c
++++ b/fs/nfs/nfs4proc.c
+@@ -8718,7 +8718,7 @@ nfs4_run_exchange_id(struct nfs_client *clp, const struct cred *cred,
+ #ifdef CONFIG_NFS_V4_1_MIGRATION
+       calldata->args.flags |= EXCHGID4_FLAG_SUPP_MOVED_MIGR;
+ #endif
+-      if (test_bit(NFS_CS_DS, &clp->cl_flags))
++      if (test_bit(NFS_CS_PNFS, &clp->cl_flags))
+               calldata->args.flags |= EXCHGID4_FLAG_USE_PNFS_DS;
+       msg.rpc_argp = &calldata->args;
+       msg.rpc_resp = &calldata->res;
+-- 
+2.43.0
+
diff --git a/queue-5.15/nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch b/queue-5.15/nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch
new file mode 100644 (file)
index 0000000..9ae289c
--- /dev/null
@@ -0,0 +1,47 @@
+From a2bd13c8be52b9375a85e47dbf9955d26bece3c6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jul 2024 03:35:12 +0900
+Subject: nilfs2: avoid undefined behavior in nilfs_cnt32_ge macro
+
+From: Ryusuke Konishi <konishi.ryusuke@gmail.com>
+
+[ Upstream commit 0f3819e8c483771a59cf9d3190cd68a7a990083c ]
+
+According to the C standard 3.4.3p3, the result of signed integer overflow
+is undefined.  The macro nilfs_cnt32_ge(), which compares two sequence
+numbers, uses signed integer subtraction that can overflow, and therefore
+the result of the calculation may differ from what is expected due to
+undefined behavior in different environments.
+
+Similar to an earlier change to the jiffies-related comparison macros in
+commit 5a581b367b5d ("jiffies: Avoid undefined behavior from signed
+overflow"), avoid this potential issue by changing the definition of the
+macro to perform the subtraction as unsigned integers, then cast the
+result to a signed integer for comparison.
+
+Link: https://lkml.kernel.org/r/20130727225828.GA11864@linux.vnet.ibm.com
+Link: https://lkml.kernel.org/r/20240702183512.6390-1-konishi.ryusuke@gmail.com
+Fixes: 9ff05123e3bf ("nilfs2: segment constructor")
+Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nilfs2/segment.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/fs/nilfs2/segment.c b/fs/nilfs2/segment.c
+index 440e628f9d4fc..c90435e8e7489 100644
+--- a/fs/nilfs2/segment.c
++++ b/fs/nilfs2/segment.c
+@@ -136,7 +136,7 @@ static void nilfs_dispose_list(struct the_nilfs *, struct list_head *, int);
+ #define nilfs_cnt32_ge(a, b)   \
+       (typecheck(__u32, a) && typecheck(__u32, b) && \
+-       ((__s32)(a) - (__s32)(b) >= 0))
++       ((__s32)((a) - (b)) >= 0))
+ static int nilfs_prepare_segment_lock(struct super_block *sb,
+                                     struct nilfs_transaction_info *ti)
+-- 
+2.43.0
+
diff --git a/queue-5.15/pci-endpoint-clean-up-error-handling-in-vpci_scan_bu.patch b/queue-5.15/pci-endpoint-clean-up-error-handling-in-vpci_scan_bu.patch
new file mode 100644 (file)
index 0000000..43e61bc
--- /dev/null
@@ -0,0 +1,68 @@
+From 882ce9222051b2e38e87ce8cbff25cd9b97fe36c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Jun 2024 12:33:39 +0300
+Subject: PCI: endpoint: Clean up error handling in vpci_scan_bus()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Dan Carpenter <dan.carpenter@linaro.org>
+
+[ Upstream commit 8e0f5a96c534f781e8c57ca30459448b3bfe5429 ]
+
+Smatch complains about inconsistent NULL checking in vpci_scan_bus():
+
+    drivers/pci/endpoint/functions/pci-epf-vntb.c:1024 vpci_scan_bus() error: we previously assumed 'vpci_bus' could be null (see line 1021)
+
+Instead of printing an error message and then crashing we should return
+an error code and clean up.
+
+Also the NULL check is reversed so it prints an error for success
+instead of failure.
+
+Fixes: e35f56bb0330 ("PCI: endpoint: Support NTB transfer between RC and EP")
+Link: https://lore.kernel.org/linux-pci/68e0f6a4-fd57-45d0-945b-0876f2c8cb86@moroto.mountain
+Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
+Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/endpoint/functions/pci-epf-vntb.c | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pci/endpoint/functions/pci-epf-vntb.c b/drivers/pci/endpoint/functions/pci-epf-vntb.c
+index d4cd4bd4a0881..fb926b300c951 100644
+--- a/drivers/pci/endpoint/functions/pci-epf-vntb.c
++++ b/drivers/pci/endpoint/functions/pci-epf-vntb.c
+@@ -993,8 +993,10 @@ static int vpci_scan_bus(void *sysdata)
+       struct epf_ntb *ndev = sysdata;
+       vpci_bus = pci_scan_bus(ndev->vbus_number, &vpci_ops, sysdata);
+-      if (vpci_bus)
+-              pr_err("create pci bus\n");
++      if (!vpci_bus) {
++              pr_err("create pci bus failed\n");
++              return -EINVAL;
++      }
+       pci_bus_add_devices(vpci_bus);
+@@ -1313,10 +1315,14 @@ static int epf_ntb_bind(struct pci_epf *epf)
+               goto err_bar_alloc;
+       }
+-      vpci_scan_bus(ntb);
++      ret = vpci_scan_bus(ntb);
++      if (ret)
++              goto err_unregister;
+       return 0;
++err_unregister:
++      pci_unregister_driver(&vntb_pci_driver);
+ err_bar_alloc:
+       epf_ntb_config_spad_bar_free(ntb);
+-- 
+2.43.0
+
diff --git a/queue-5.15/pci-fix-resource-double-counting-on-remove-rescan.patch b/queue-5.15/pci-fix-resource-double-counting-on-remove-rescan.patch
new file mode 100644 (file)
index 0000000..0f3c16b
--- /dev/null
@@ -0,0 +1,73 @@
+From 65cb9bfcb75323a840e208cfbc3677554e250c43 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 May 2024 13:25:16 +0300
+Subject: PCI: Fix resource double counting on remove & rescan
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit 903534fa7d30214d8ba840ab1cd9e917e0c88e41 ]
+
+pbus_size_mem() keeps the size of the optional resources in
+children_add_size. When calculating the PCI bridge window size,
+calculate_memsize() lower bounds size by old_size before adding
+children_add_size and performing the window size alignment. This
+results in double counting for the resources in children_add_size
+because old_size may be based on the previous size of the bridge
+window after it has already included children_add_size (that is,
+size1 in pbus_size_mem() from an earlier invocation of that
+function).
+
+As a result, on repeated remove of the bus & rescan cycles the resource
+size keeps increasing when children_add_size is non-zero as can be seen
+from this extract:
+
+  iomem0:  23fffd00000-23fffdfffff : PCI Bus 0000:03    # 1MiB
+  iomem1:  20000000000-200001fffff : PCI Bus 0000:03    # 2MiB
+  iomem2:  20000000000-200002fffff : PCI Bus 0000:03    # 3MiB
+  iomem3:  20000000000-200003fffff : PCI Bus 0000:03    # 4MiB
+  iomem4:  20000000000-200004fffff : PCI Bus 0000:03    # 5MiB
+
+Solve the double counting by moving old_size check later in
+calculate_memsize() so that children_add_size is already accounted for.
+
+After the patch, the bridge window retains its size as expected:
+
+  iomem0:  23fffd00000-23fffdfffff : PCI Bus 0000:03    # 1MiB
+  iomem1:  20000000000-200000fffff : PCI Bus 0000:03    # 1MiB
+  iomem2:  20000000000-200000fffff : PCI Bus 0000:03    # 1MiB
+
+Fixes: a4ac9fea016f ("PCI : Calculate right add_size")
+Link: https://lore.kernel.org/r/20240507102523.57320-2-ilpo.jarvinen@linux.intel.com
+Tested-by: Lidong Wang <lidong.wang@intel.com>
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Reviewed-by: Mika Westerberg <mika.westerberg@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/setup-bus.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/pci/setup-bus.c b/drivers/pci/setup-bus.c
+index 16d291e10627b..a159bfdfa2512 100644
+--- a/drivers/pci/setup-bus.c
++++ b/drivers/pci/setup-bus.c
+@@ -824,11 +824,9 @@ static resource_size_t calculate_memsize(resource_size_t size,
+               size = min_size;
+       if (old_size == 1)
+               old_size = 0;
+-      if (size < old_size)
+-              size = old_size;
+-      size = ALIGN(max(size, add_size) + children_add_size, align);
+-      return size;
++      size = max(size, add_size) + children_add_size;
++      return ALIGN(max(size, old_size), align);
+ }
+ resource_size_t __weak pcibios_window_alignment(struct pci_bus *bus,
+-- 
+2.43.0
+
diff --git a/queue-5.15/perf-fix-default-aux_watermark-calculation.patch b/queue-5.15/perf-fix-default-aux_watermark-calculation.patch
new file mode 100644 (file)
index 0000000..ac40993
--- /dev/null
@@ -0,0 +1,47 @@
+From 7ff322bcbc9c69cd542f1b2dcfa222d941781bc9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 23:11:00 +0300
+Subject: perf: Fix default aux_watermark calculation
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ Upstream commit 43deb76b19663a96ec2189d8f4eb9a9dc2d7623f ]
+
+The default aux_watermark is half the AUX area buffer size. In general,
+on a 64-bit architecture, the AUX area buffer size could be a bigger than
+fits in a 32-bit type, but the calculation does not allow for that
+possibility.
+
+However the aux_watermark value is recorded in a u32, so should not be
+more than U32_MAX either.
+
+Fix by doing the calculation in a correctly sized type, and limiting the
+result to U32_MAX.
+
+Fixes: d68e6799a5c8 ("perf: Cap allocation order at aux_watermark")
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lore.kernel.org/r/20240624201101.60186-7-adrian.hunter@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/events/ring_buffer.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/kernel/events/ring_buffer.c b/kernel/events/ring_buffer.c
+index 45965f13757e4..f3a3c294ff2b3 100644
+--- a/kernel/events/ring_buffer.c
++++ b/kernel/events/ring_buffer.c
+@@ -683,7 +683,9 @@ int rb_alloc_aux(struct perf_buffer *rb, struct perf_event *event,
+                * max_order, to aid PMU drivers in double buffering.
+                */
+               if (!watermark)
+-                      watermark = nr_pages << (PAGE_SHIFT - 1);
++                      watermark = min_t(unsigned long,
++                                        U32_MAX,
++                                        (unsigned long)nr_pages << (PAGE_SHIFT - 1));
+               /*
+                * Use aux_watermark as the basis for chunking to
+-- 
+2.43.0
+
diff --git a/queue-5.15/perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch b/queue-5.15/perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch
new file mode 100644 (file)
index 0000000..4273979
--- /dev/null
@@ -0,0 +1,37 @@
+From dd1ada35a0233e9ce4461b4b63dce28951ec2588 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 23:10:58 +0300
+Subject: perf: Fix perf_aux_size() for greater-than 32-bit size
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ Upstream commit 3df94a5b1078dfe2b0c03f027d018800faf44c82 ]
+
+perf_buffer->aux_nr_pages uses a 32-bit type, so a cast is needed to
+calculate a 64-bit size.
+
+Fixes: 45bfb2e50471 ("perf: Add AUX area to ring buffer for raw data streams")
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lore.kernel.org/r/20240624201101.60186-5-adrian.hunter@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/events/internal.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kernel/events/internal.h b/kernel/events/internal.h
+index 5150d5f84c033..386d21c7edfa0 100644
+--- a/kernel/events/internal.h
++++ b/kernel/events/internal.h
+@@ -128,7 +128,7 @@ static inline unsigned long perf_data_size(struct perf_buffer *rb)
+ static inline unsigned long perf_aux_size(struct perf_buffer *rb)
+ {
+-      return rb->aux_nr_pages << PAGE_SHIFT;
++      return (unsigned long)rb->aux_nr_pages << PAGE_SHIFT;
+ }
+ #define __DEFINE_OUTPUT_COPY_BODY(advance_buf, memcpy_func, ...)      \
+-- 
+2.43.0
+
diff --git a/queue-5.15/perf-intel-pt-fix-aux_watermark-calculation-for-64-b.patch b/queue-5.15/perf-intel-pt-fix-aux_watermark-calculation-for-64-b.patch
new file mode 100644 (file)
index 0000000..29b89ff
--- /dev/null
@@ -0,0 +1,38 @@
+From d49333e1286d0dda65af88c3ab1d0fc643b57783 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jun 2024 13:45:31 +0300
+Subject: perf intel-pt: Fix aux_watermark calculation for 64-bit size
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ Upstream commit 36b4cd990a8fd3f5b748883050e9d8c69fe6398d ]
+
+aux_watermark is a u32. For a 64-bit size, cap the aux_watermark
+calculation at UINT_MAX instead of truncating it to 32-bits.
+
+Fixes: 874fc35cdd55 ("perf intel-pt: Use aux_watermark")
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Link: https://lore.kernel.org/r/20240625104532.11990-2-adrian.hunter@intel.com
+Signed-off-by: Namhyung Kim <namhyung@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/perf/arch/x86/util/intel-pt.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
+index 6df0dc00d73ab..99ae6d4d3ae3c 100644
+--- a/tools/perf/arch/x86/util/intel-pt.c
++++ b/tools/perf/arch/x86/util/intel-pt.c
+@@ -777,7 +777,8 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
+       }
+       if (!opts->auxtrace_snapshot_mode && !opts->auxtrace_sample_mode) {
+-              u32 aux_watermark = opts->auxtrace_mmap_pages * page_size / 4;
++              size_t aw = opts->auxtrace_mmap_pages * (size_t)page_size / 4;
++              u32 aux_watermark = aw > UINT_MAX ? UINT_MAX : aw;
+               intel_pt_evsel->core.attr.aux_watermark = aux_watermark;
+       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/perf-intel-pt-fix-exclude_guest-setting.patch b/queue-5.15/perf-intel-pt-fix-exclude_guest-setting.patch
new file mode 100644 (file)
index 0000000..c637a39
--- /dev/null
@@ -0,0 +1,69 @@
+From 2e857bac77cde79c3a2aff71582a490932a7f34f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jun 2024 13:45:32 +0300
+Subject: perf intel-pt: Fix exclude_guest setting
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ Upstream commit b40934ae32232140e85dc7dc1c3ea0e296986723 ]
+
+In the past, the exclude_guest setting has had no effect on Intel PT
+tracing, but that may not be the case in the future.
+
+Set the flag correctly based upon whether KVM is using Intel PT
+"Host/Guest" mode, which is determined by the kvm_intel module
+parameter pt_mode:
+
+ pt_mode=0     System-wide mode : host and guest output to host buffer
+ pt_mode=1     Host/Guest mode : host/guest output to host/guest
+                buffers respectively
+
+Fixes: 6e86bfdc4a60 ("perf intel-pt: Support decoding of guest kernel")
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Link: https://lore.kernel.org/r/20240625104532.11990-3-adrian.hunter@intel.com
+Signed-off-by: Namhyung Kim <namhyung@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/perf/arch/x86/util/intel-pt.c | 12 ++++++++++++
+ 1 file changed, 12 insertions(+)
+
+diff --git a/tools/perf/arch/x86/util/intel-pt.c b/tools/perf/arch/x86/util/intel-pt.c
+index 99ae6d4d3ae3c..7cb21803455a9 100644
+--- a/tools/perf/arch/x86/util/intel-pt.c
++++ b/tools/perf/arch/x86/util/intel-pt.c
+@@ -31,6 +31,7 @@
+ #include "../../../util/tsc.h"
+ #include <internal/lib.h> // page_size
+ #include "../../../util/intel-pt.h"
++#include <api/fs/fs.h>
+ #define KiB(x) ((x) * 1024)
+ #define MiB(x) ((x) * 1024 * 1024)
+@@ -438,6 +439,16 @@ static int intel_pt_track_switches(struct evlist *evlist)
+       return 0;
+ }
++static bool intel_pt_exclude_guest(void)
++{
++      int pt_mode;
++
++      if (sysfs__read_int("module/kvm_intel/parameters/pt_mode", &pt_mode))
++              pt_mode = 0;
++
++      return pt_mode == 1;
++}
++
+ static void intel_pt_valid_str(char *str, size_t len, u64 valid)
+ {
+       unsigned int val, last = 0, state = 1;
+@@ -641,6 +652,7 @@ static int intel_pt_recording_options(struct auxtrace_record *itr,
+                       }
+                       evsel->core.attr.freq = 0;
+                       evsel->core.attr.sample_period = 1;
++                      evsel->core.attr.exclude_guest = intel_pt_exclude_guest();
+                       evsel->no_aux_samples = true;
+                       intel_pt_evsel = evsel;
+                       opts->full_auxtrace = true;
+-- 
+2.43.0
+
diff --git a/queue-5.15/perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch b/queue-5.15/perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch
new file mode 100644 (file)
index 0000000..90f6591
--- /dev/null
@@ -0,0 +1,51 @@
+From afd926d5f55df3e7030326173bff58faa8ceb507 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 23:10:59 +0300
+Subject: perf: Prevent passing zero nr_pages to rb_alloc_aux()
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ Upstream commit dbc48c8f41c208082cfa95e973560134489e3309 ]
+
+nr_pages is unsigned long but gets passed to rb_alloc_aux() as an int,
+and is stored as an int.
+
+Only power-of-2 values are accepted, so if nr_pages is a 64_bit value, it
+will be passed to rb_alloc_aux() as zero.
+
+That is not ideal because:
+ 1. the value is incorrect
+ 2. rb_alloc_aux() is at risk of misbehaving, although it manages to
+ return -ENOMEM in that case, it is a result of passing zero to get_order()
+ even though the get_order() result is documented to be undefined in that
+ case.
+
+Fix by simply validating the maximum supported value in the first place.
+Use -ENOMEM error code for consistency with the current error code that
+is returned in that case.
+
+Fixes: 45bfb2e50471 ("perf: Add AUX area to ring buffer for raw data streams")
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lore.kernel.org/r/20240624201101.60186-6-adrian.hunter@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/events/core.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/kernel/events/core.c b/kernel/events/core.c
+index 80d9c8fcc30a6..b689b35473a38 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -6401,6 +6401,8 @@ static int perf_mmap(struct file *file, struct vm_area_struct *vma)
+                       return -EINVAL;
+               nr_pages = vma_size / PAGE_SIZE;
++              if (nr_pages > INT_MAX)
++                      return -ENOMEM;
+               mutex_lock(&event->mmap_mutex);
+               ret = -EINVAL;
+-- 
+2.43.0
+
diff --git a/queue-5.15/perf-report-fix-condition-in-sort__sym_cmp.patch b/queue-5.15/perf-report-fix-condition-in-sort__sym_cmp.patch
new file mode 100644 (file)
index 0000000..26b4565
--- /dev/null
@@ -0,0 +1,42 @@
+From 4cbc83a92b79ef13f8213b08e7aef019121a5bc9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jun 2024 10:05:25 -0700
+Subject: perf report: Fix condition in sort__sym_cmp()
+
+From: Namhyung Kim <namhyung@kernel.org>
+
+[ Upstream commit cb39d05e67dc24985ff9f5150e71040fa4d60ab8 ]
+
+It's expected that both hist entries are in the same hists when
+comparing two.  But the current code in the function checks one without
+dso sort key and other with the key.  This would make the condition true
+in any case.
+
+I guess the intention of the original commit was to add '!' for the
+right side too.  But as it should be the same, let's just remove it.
+
+Fixes: 69849fc5d2119 ("perf hists: Move sort__has_dso into struct perf_hpp_list")
+Reviewed-by: Kan Liang <kan.liang@linux.intel.com>
+Signed-off-by: Namhyung Kim <namhyung@kernel.org>
+Link: https://lore.kernel.org/r/20240621170528.608772-2-namhyung@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/perf/util/sort.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/perf/util/sort.c b/tools/perf/util/sort.c
+index a4f2ffe2bdb6d..d5133786d3e17 100644
+--- a/tools/perf/util/sort.c
++++ b/tools/perf/util/sort.c
+@@ -275,7 +275,7 @@ sort__sym_cmp(struct hist_entry *left, struct hist_entry *right)
+        * comparing symbol address alone is not enough since it's a
+        * relative address within a dso.
+        */
+-      if (!hists__has(left->hists, dso) || hists__has(right->hists, dso)) {
++      if (!hists__has(left->hists, dso)) {
+               ret = sort__dso_cmp(left, right);
+               if (ret != 0)
+                       return ret;
+-- 
+2.43.0
+
diff --git a/queue-5.15/perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch b/queue-5.15/perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch
new file mode 100644 (file)
index 0000000..5aaf958
--- /dev/null
@@ -0,0 +1,42 @@
+From 5b8e704d92b2fb69e4ef9a412af7f9dd13e65eb3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 23:10:57 +0300
+Subject: perf/x86/intel/pt: Fix pt_topa_entry_for_page() address calculation
+
+From: Adrian Hunter <adrian.hunter@intel.com>
+
+[ Upstream commit 3520b251dcae2b4a27b95cd6f745c54fd658bda5 ]
+
+Currently, perf allocates an array of page pointers which is limited in
+size by MAX_PAGE_ORDER. That in turn limits the maximum Intel PT buffer
+size to 2GiB. Should that limitation be lifted, the Intel PT driver can
+support larger sizes, except for one calculation in
+pt_topa_entry_for_page(), which is limited to 32-bits.
+
+Fix pt_topa_entry_for_page() address calculation by adding a cast.
+
+Fixes: 39152ee51b77 ("perf/x86/intel/pt: Get rid of reverse lookup table for ToPA")
+Signed-off-by: Adrian Hunter <adrian.hunter@intel.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lore.kernel.org/r/20240624201101.60186-4-adrian.hunter@intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/events/intel/pt.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/x86/events/intel/pt.c b/arch/x86/events/intel/pt.c
+index a85d3138839c5..cf0bb42b1569e 100644
+--- a/arch/x86/events/intel/pt.c
++++ b/arch/x86/events/intel/pt.c
+@@ -973,7 +973,7 @@ pt_topa_entry_for_page(struct pt_buffer *buf, unsigned int pg)
+        * order allocations, there shouldn't be many of these.
+        */
+       list_for_each_entry(topa, &buf->tables, list) {
+-              if (topa->offset + topa->size > pg << PAGE_SHIFT)
++              if (topa->offset + topa->size > (unsigned long)pg << PAGE_SHIFT)
+                       goto found;
+       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch b/queue-5.15/pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch
new file mode 100644 (file)
index 0000000..bccf586
--- /dev/null
@@ -0,0 +1,59 @@
+From df50956b4d6ae20f89f1966a05244ce21001ea06 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 10:37:02 +0800
+Subject: pinctrl: core: fix possible memory leak when pinctrl_enable() fails
+
+From: Yang Yingliang <yangyingliang@huawei.com>
+
+[ Upstream commit ae1cf4759972c5fe665ee4c5e0c29de66fe3cf4a ]
+
+In devm_pinctrl_register(), if pinctrl_enable() fails in pinctrl_register(),
+the "pctldev" has not been added to dev resources, so devm_pinctrl_dev_release()
+can not be called, it leads memory leak.
+
+Introduce pinctrl_uninit_controller(), call it in the error path to free memory.
+
+Fixes: 5038a66dad01 ("pinctrl: core: delete incorrect free in pinctrl_enable()")
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
+Link: https://lore.kernel.org/r/20240606023704.3931561-2-yangyingliang@huawei.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/core.c | 12 +++++++++++-
+ 1 file changed, 11 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/pinctrl/core.c b/drivers/pinctrl/core.c
+index f567805cbde8e..8f4cc52b2a066 100644
+--- a/drivers/pinctrl/core.c
++++ b/drivers/pinctrl/core.c
+@@ -2062,6 +2062,14 @@ pinctrl_init_controller(struct pinctrl_desc *pctldesc, struct device *dev,
+       return ERR_PTR(ret);
+ }
++static void pinctrl_uninit_controller(struct pinctrl_dev *pctldev, struct pinctrl_desc *pctldesc)
++{
++      pinctrl_free_pindescs(pctldev, pctldesc->pins,
++                            pctldesc->npins);
++      mutex_destroy(&pctldev->mutex);
++      kfree(pctldev);
++}
++
+ static int pinctrl_claim_hogs(struct pinctrl_dev *pctldev)
+ {
+       pctldev->p = create_pinctrl(pctldev->dev, pctldev);
+@@ -2142,8 +2150,10 @@ struct pinctrl_dev *pinctrl_register(struct pinctrl_desc *pctldesc,
+               return pctldev;
+       error = pinctrl_enable(pctldev);
+-      if (error)
++      if (error) {
++              pinctrl_uninit_controller(pctldev, pctldesc);
+               return ERR_PTR(error);
++      }
+       return pctldev;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/pinctrl-freescale-mxs-fix-refcount-of-child.patch b/queue-5.15/pinctrl-freescale-mxs-fix-refcount-of-child.patch
new file mode 100644 (file)
index 0000000..99d3e78
--- /dev/null
@@ -0,0 +1,43 @@
+From 71511854d0b65b2cead70fcea01cbb09c4664ac8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 4 May 2024 21:20:16 +0800
+Subject: pinctrl: freescale: mxs: Fix refcount of child
+
+From: Peng Fan <peng.fan@nxp.com>
+
+[ Upstream commit 7f500f2011c0bbb6e1cacab74b4c99222e60248e ]
+
+of_get_next_child() will increase refcount of the returned node, need
+use of_node_put() on it when done.
+
+Per current implementation, 'child' will be override by
+for_each_child_of_node(np, child), so use of_get_child_count to avoid
+refcount leakage.
+
+Fixes: 17723111e64f ("pinctrl: add pinctrl-mxs support")
+Signed-off-by: Peng Fan <peng.fan@nxp.com>
+Link: https://lore.kernel.org/20240504-pinctrl-cleanup-v2-18-26c5f2dc1181@nxp.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/freescale/pinctrl-mxs.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pinctrl/freescale/pinctrl-mxs.c b/drivers/pinctrl/freescale/pinctrl-mxs.c
+index 735cedd0958a2..5b0fcf15f2804 100644
+--- a/drivers/pinctrl/freescale/pinctrl-mxs.c
++++ b/drivers/pinctrl/freescale/pinctrl-mxs.c
+@@ -405,8 +405,8 @@ static int mxs_pinctrl_probe_dt(struct platform_device *pdev,
+       int ret;
+       u32 val;
+-      child = of_get_next_child(np, NULL);
+-      if (!child) {
++      val = of_get_child_count(np);
++      if (val == 0) {
+               dev_err(&pdev->dev, "no group is defined\n");
+               return -ENOENT;
+       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/pinctrl-rockchip-update-rk3308-iomux-routes.patch b/queue-5.15/pinctrl-rockchip-update-rk3308-iomux-routes.patch
new file mode 100644 (file)
index 0000000..12715ee
--- /dev/null
@@ -0,0 +1,60 @@
+From a6a4ff479da8f5c277f97cb2eb2fcdd327d5b5f9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 May 2024 17:16:32 +0500
+Subject: pinctrl: rockchip: update rk3308 iomux routes
+
+From: Dmitry Yashin <dmt.yashin@gmail.com>
+
+[ Upstream commit a8f2548548584549ea29d43431781d67c4afa42b ]
+
+Some of the rk3308 iomux routes in rk3308_mux_route_data belong to
+the rk3308b SoC. Remove them and correct i2c3 routes.
+
+Fixes: 7825aeb7b208 ("pinctrl: rockchip: add rk3308 SoC support")
+Signed-off-by: Dmitry Yashin <dmt.yashin@gmail.com>
+Reviewed-by: Heiko Stuebner <heiko@sntech.de>
+Link: https://lore.kernel.org/r/20240515121634.23945-2-dmt.yashin@gmail.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/pinctrl-rockchip.c | 17 ++---------------
+ 1 file changed, 2 insertions(+), 15 deletions(-)
+
+diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
+index 4ff70527755a3..790467dcde4f5 100644
+--- a/drivers/pinctrl/pinctrl-rockchip.c
++++ b/drivers/pinctrl/pinctrl-rockchip.c
+@@ -748,9 +748,8 @@ static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
+       RK_MUXROUTE_SAME(0, RK_PC3, 1, 0x314, BIT(16 + 0) | BIT(0)), /* rtc_clk */
+       RK_MUXROUTE_SAME(1, RK_PC6, 2, 0x314, BIT(16 + 2) | BIT(16 + 3)), /* uart2_rxm0 */
+       RK_MUXROUTE_SAME(4, RK_PD2, 2, 0x314, BIT(16 + 2) | BIT(16 + 3) | BIT(2)), /* uart2_rxm1 */
+-      RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x608, BIT(16 + 8) | BIT(16 + 9)), /* i2c3_sdam0 */
+-      RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(8)), /* i2c3_sdam1 */
+-      RK_MUXROUTE_SAME(2, RK_PA0, 3, 0x608, BIT(16 + 8) | BIT(16 + 9) | BIT(9)), /* i2c3_sdam2 */
++      RK_MUXROUTE_SAME(0, RK_PB7, 2, 0x314, BIT(16 + 4)), /* i2c3_sdam0 */
++      RK_MUXROUTE_SAME(3, RK_PB4, 2, 0x314, BIT(16 + 4) | BIT(4)), /* i2c3_sdam1 */
+       RK_MUXROUTE_SAME(1, RK_PA3, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclktxm0 */
+       RK_MUXROUTE_SAME(1, RK_PA4, 2, 0x308, BIT(16 + 3)), /* i2s-8ch-1-sclkrxm0 */
+       RK_MUXROUTE_SAME(1, RK_PB5, 2, 0x308, BIT(16 + 3) | BIT(3)), /* i2s-8ch-1-sclktxm1 */
+@@ -759,18 +758,6 @@ static struct rockchip_mux_route_data rk3308_mux_route_data[] = {
+       RK_MUXROUTE_SAME(1, RK_PB6, 4, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* pdm-clkm1 */
+       RK_MUXROUTE_SAME(2, RK_PA6, 2, 0x308, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* pdm-clkm2 */
+       RK_MUXROUTE_SAME(2, RK_PA4, 3, 0x600, BIT(16 + 2) | BIT(2)), /* pdm-clkm-m2 */
+-      RK_MUXROUTE_SAME(3, RK_PB2, 3, 0x314, BIT(16 + 9)), /* spi1_miso */
+-      RK_MUXROUTE_SAME(2, RK_PA4, 2, 0x314, BIT(16 + 9) | BIT(9)), /* spi1_miso_m1 */
+-      RK_MUXROUTE_SAME(0, RK_PB3, 3, 0x314, BIT(16 + 10) | BIT(16 + 11)), /* owire_m0 */
+-      RK_MUXROUTE_SAME(1, RK_PC6, 7, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(10)), /* owire_m1 */
+-      RK_MUXROUTE_SAME(2, RK_PA2, 5, 0x314, BIT(16 + 10) | BIT(16 + 11) | BIT(11)), /* owire_m2 */
+-      RK_MUXROUTE_SAME(0, RK_PB3, 2, 0x314, BIT(16 + 12) | BIT(16 + 13)), /* can_rxd_m0 */
+-      RK_MUXROUTE_SAME(1, RK_PC6, 5, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(12)), /* can_rxd_m1 */
+-      RK_MUXROUTE_SAME(2, RK_PA2, 4, 0x314, BIT(16 + 12) | BIT(16 + 13) | BIT(13)), /* can_rxd_m2 */
+-      RK_MUXROUTE_SAME(1, RK_PC4, 3, 0x314, BIT(16 + 14)), /* mac_rxd0_m0 */
+-      RK_MUXROUTE_SAME(4, RK_PA2, 2, 0x314, BIT(16 + 14) | BIT(14)), /* mac_rxd0_m1 */
+-      RK_MUXROUTE_SAME(3, RK_PB4, 4, 0x314, BIT(16 + 15)), /* uart3_rx */
+-      RK_MUXROUTE_SAME(0, RK_PC1, 3, 0x314, BIT(16 + 15) | BIT(15)), /* uart3_rx_m1 */
+ };
+ static struct rockchip_mux_route_data rk3328_mux_route_data[] = {
+-- 
+2.43.0
+
diff --git a/queue-5.15/pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch b/queue-5.15/pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch
new file mode 100644 (file)
index 0000000..f32ec6a
--- /dev/null
@@ -0,0 +1,60 @@
+From 3bbec6d0ff7902098138d919db4aaf15ef74b2cb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 10:37:03 +0800
+Subject: pinctrl: single: fix possible memory leak when pinctrl_enable() fails
+
+From: Yang Yingliang <yangyingliang@huawei.com>
+
+[ Upstream commit 8f773bfbdd428819328a2d185976cfc6ae811cd3 ]
+
+This driver calls pinctrl_register_and_init() which is not
+devm_ managed, it will leads memory leak if pinctrl_enable()
+fails. Replace it with devm_pinctrl_register_and_init().
+And call pcs_free_resources() if pinctrl_enable() fails.
+
+Fixes: 5038a66dad01 ("pinctrl: core: delete incorrect free in pinctrl_enable()")
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
+Link: https://lore.kernel.org/r/20240606023704.3931561-3-yangyingliang@huawei.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/pinctrl-single.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pinctrl/pinctrl-single.c b/drivers/pinctrl/pinctrl-single.c
+index 9ad8f70206142..cd23479f352a2 100644
+--- a/drivers/pinctrl/pinctrl-single.c
++++ b/drivers/pinctrl/pinctrl-single.c
+@@ -1328,7 +1328,6 @@ static void pcs_irq_free(struct pcs_device *pcs)
+ static void pcs_free_resources(struct pcs_device *pcs)
+ {
+       pcs_irq_free(pcs);
+-      pinctrl_unregister(pcs->pctl);
+ #if IS_BUILTIN(CONFIG_PINCTRL_SINGLE)
+       if (pcs->missing_nr_pinctrl_cells)
+@@ -1885,7 +1884,7 @@ static int pcs_probe(struct platform_device *pdev)
+       if (ret < 0)
+               goto free;
+-      ret = pinctrl_register_and_init(&pcs->desc, pcs->dev, pcs, &pcs->pctl);
++      ret = devm_pinctrl_register_and_init(pcs->dev, &pcs->desc, pcs, &pcs->pctl);
+       if (ret) {
+               dev_err(pcs->dev, "could not register single pinctrl driver\n");
+               goto free;
+@@ -1918,8 +1917,10 @@ static int pcs_probe(struct platform_device *pdev)
+       dev_info(pcs->dev, "%i pins, size %u\n", pcs->desc.npins, pcs->size);
+-      return pinctrl_enable(pcs->pctl);
++      if (pinctrl_enable(pcs->pctl))
++              goto free;
++      return 0;
+ free:
+       pcs_free_resources(pcs);
+-- 
+2.43.0
+
diff --git a/queue-5.15/pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch b/queue-5.15/pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch
new file mode 100644 (file)
index 0000000..05dbdbc
--- /dev/null
@@ -0,0 +1,44 @@
+From ab2e72fd71edc00b7e17dba48e543bd9cd5293f8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 9 Oct 2023 10:38:39 +0200
+Subject: pinctrl: ti: ti-iodelay: Drop if block with always false condition
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+
+[ Upstream commit 88b3f108502bc45e6ebd005702add46759f3f45a ]
+
+ti_iodelay_remove() is only called after ti_iodelay_probe() completed
+successfully. In this case platform_set_drvdata() was called with a
+non-NULL argument and so platform_get_drvdata() won't return NULL.
+
+Simplify by removing the if block with the always false condition.
+
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
+Link: https://lore.kernel.org/r/20231009083856.222030-4-u.kleine-koenig@pengutronix.de
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Stable-dep-of: 9b401f4a7170 ("pinctrl: ti: ti-iodelay: fix possible memory leak when pinctrl_enable() fails")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 3 ---
+ 1 file changed, 3 deletions(-)
+
+diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
+index 4e2382778d38f..75a2243ee87cc 100644
+--- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
++++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
+@@ -908,9 +908,6 @@ static int ti_iodelay_remove(struct platform_device *pdev)
+ {
+       struct ti_iodelay_device *iod = platform_get_drvdata(pdev);
+-      if (!iod)
+-              return 0;
+-
+       if (iod->pctl)
+               pinctrl_unregister(iod->pctl);
+-- 
+2.43.0
+
diff --git a/queue-5.15/pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch b/queue-5.15/pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch
new file mode 100644 (file)
index 0000000..fdb2ed9
--- /dev/null
@@ -0,0 +1,64 @@
+From db13c222e8c4da3ec66461d3a15198e0dafaa531 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 10:37:04 +0800
+Subject: pinctrl: ti: ti-iodelay: fix possible memory leak when
+ pinctrl_enable() fails
+
+From: Yang Yingliang <yangyingliang@huawei.com>
+
+[ Upstream commit 9b401f4a7170125365160c9af267a41ff6b39001 ]
+
+This driver calls pinctrl_register_and_init() which is not
+devm_ managed, it will leads memory leak if pinctrl_enable()
+fails. Replace it with devm_pinctrl_register_and_init().
+And add missing of_node_put() in the error path.
+
+Fixes: 5038a66dad01 ("pinctrl: core: delete incorrect free in pinctrl_enable()")
+Signed-off-by: Yang Yingliang <yangyingliang@huawei.com>
+Reviewed-by: Dan Carpenter <dan.carpenter@linaro.org>
+Link: https://lore.kernel.org/r/20240606023704.3931561-4-yangyingliang@huawei.com
+Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pinctrl/ti/pinctrl-ti-iodelay.c | 11 ++++++-----
+ 1 file changed, 6 insertions(+), 5 deletions(-)
+
+diff --git a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
+index 75a2243ee87cc..f3411e3eaf2ea 100644
+--- a/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
++++ b/drivers/pinctrl/ti/pinctrl-ti-iodelay.c
+@@ -883,7 +883,7 @@ static int ti_iodelay_probe(struct platform_device *pdev)
+       iod->desc.name = dev_name(dev);
+       iod->desc.owner = THIS_MODULE;
+-      ret = pinctrl_register_and_init(&iod->desc, dev, iod, &iod->pctl);
++      ret = devm_pinctrl_register_and_init(dev, &iod->desc, iod, &iod->pctl);
+       if (ret) {
+               dev_err(dev, "Failed to register pinctrl\n");
+               goto exit_out;
+@@ -891,7 +891,11 @@ static int ti_iodelay_probe(struct platform_device *pdev)
+       platform_set_drvdata(pdev, iod);
+-      return pinctrl_enable(iod->pctl);
++      ret = pinctrl_enable(iod->pctl);
++      if (ret)
++              goto exit_out;
++
++      return 0;
+ exit_out:
+       of_node_put(np);
+@@ -908,9 +912,6 @@ static int ti_iodelay_remove(struct platform_device *pdev)
+ {
+       struct ti_iodelay_device *iod = platform_get_drvdata(pdev);
+-      if (iod->pctl)
+-              pinctrl_unregister(iod->pctl);
+-
+       ti_iodelay_pinconf_deinit_dev(iod);
+       /* Expect other allocations to be freed by devm */
+-- 
+2.43.0
+
diff --git a/queue-5.15/platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch b/queue-5.15/platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch
new file mode 100644 (file)
index 0000000..4e7fe5a
--- /dev/null
@@ -0,0 +1,38 @@
+From 21e02d9ba6e78d9c513ebc10b71e222091ff2f20 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Jun 2024 11:31:10 +0000
+Subject: platform/chrome: cros_ec_debugfs: fix wrong EC message version
+
+From: Tzung-Bi Shih <tzungbi@kernel.org>
+
+[ Upstream commit c2a28647bbb4e0894e8824362410f72b06ac57a4 ]
+
+ec_read_version_supported() uses ec_params_get_cmd_versions_v1 but it
+wrongly uses message version 0.
+
+Fix it.
+
+Fixes: e86264595225 ("mfd: cros_ec: add debugfs, console log file")
+Reviewed-by: Guenter Roeck <groeck@chromium.org>
+Link: https://lore.kernel.org/r/20240611113110.16955-1-tzungbi@kernel.org
+Signed-off-by: Tzung-Bi Shih <tzungbi@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/platform/chrome/cros_ec_debugfs.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/platform/chrome/cros_ec_debugfs.c b/drivers/platform/chrome/cros_ec_debugfs.c
+index 0dbceee87a4b1..2928c3cb37854 100644
+--- a/drivers/platform/chrome/cros_ec_debugfs.c
++++ b/drivers/platform/chrome/cros_ec_debugfs.c
+@@ -326,6 +326,7 @@ static int ec_read_version_supported(struct cros_ec_dev *ec)
+       if (!msg)
+               return 0;
++      msg->version = 1;
+       msg->command = EC_CMD_GET_CMD_VERSIONS + ec->cmd_offset;
+       msg->outsize = sizeof(*params);
+       msg->insize = sizeof(*response);
+-- 
+2.43.0
+
diff --git a/queue-5.15/powerpc-xmon-fix-disassembly-cpu-feature-checks.patch b/queue-5.15/powerpc-xmon-fix-disassembly-cpu-feature-checks.patch
new file mode 100644 (file)
index 0000000..479530a
--- /dev/null
@@ -0,0 +1,99 @@
+From b70609eed8afa08ab64dda4329619641975527a9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 May 2024 22:12:47 +1000
+Subject: powerpc/xmon: Fix disassembly CPU feature checks
+
+From: Michael Ellerman <mpe@ellerman.id.au>
+
+[ Upstream commit 14196e47c5ffe32af7ed5a51c9e421c5ea5bccce ]
+
+In the xmon disassembly code there are several CPU feature checks to
+determine what dialects should be passed to the disassembler. The
+dialect controls which instructions the disassembler will recognise.
+
+Unfortunately the checks are incorrect, because instead of passing a
+single CPU feature they are passing a mask of feature bits.
+
+For example the code:
+
+  if (cpu_has_feature(CPU_FTRS_POWER5))
+      dialect |= PPC_OPCODE_POWER5;
+
+Is trying to check if the system is running on a Power5 CPU. But
+CPU_FTRS_POWER5 is a mask of *all* the feature bits that are enabled on
+a Power5.
+
+In practice the test will always return true for any 64-bit CPU, because
+at least one bit in the mask will be present in the CPU_FTRS_ALWAYS
+mask.
+
+Similarly for all the other checks against CPU_FTRS_xx masks.
+
+Rather than trying to match the disassembly behaviour exactly to the
+current CPU, just differentiate between 32-bit and 64-bit, and Altivec,
+VSX and HTM.
+
+That will cause some instructions to be shown in disassembly even
+on a CPU that doesn't support them, but that's OK, objdump -d output
+has the same behaviour, and if anything it's less confusing than some
+instructions not being disassembled.
+
+Fixes: 897f112bb42e ("[POWERPC] Import updated version of ppc disassembly code for xmon")
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://msgid.link/20240509121248.270878-2-mpe@ellerman.id.au
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/powerpc/xmon/ppc-dis.c | 33 +++++++++++----------------------
+ 1 file changed, 11 insertions(+), 22 deletions(-)
+
+diff --git a/arch/powerpc/xmon/ppc-dis.c b/arch/powerpc/xmon/ppc-dis.c
+index 75fa98221d485..af105e1bc3fca 100644
+--- a/arch/powerpc/xmon/ppc-dis.c
++++ b/arch/powerpc/xmon/ppc-dis.c
+@@ -122,32 +122,21 @@ int print_insn_powerpc (unsigned long insn, unsigned long memaddr)
+   bool insn_is_short;
+   ppc_cpu_t dialect;
+-  dialect = PPC_OPCODE_PPC | PPC_OPCODE_COMMON
+-            | PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_ALTIVEC;
++  dialect = PPC_OPCODE_PPC | PPC_OPCODE_COMMON;
+-  if (cpu_has_feature(CPU_FTRS_POWER5))
+-    dialect |= PPC_OPCODE_POWER5;
++  if (IS_ENABLED(CONFIG_PPC64))
++    dialect |= PPC_OPCODE_64 | PPC_OPCODE_POWER4 | PPC_OPCODE_CELL |
++      PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7 | PPC_OPCODE_POWER8 |
++      PPC_OPCODE_POWER9;
+-  if (cpu_has_feature(CPU_FTRS_CELL))
+-    dialect |= (PPC_OPCODE_CELL | PPC_OPCODE_ALTIVEC);
++  if (cpu_has_feature(CPU_FTR_TM))
++    dialect |= PPC_OPCODE_HTM;
+-  if (cpu_has_feature(CPU_FTRS_POWER6))
+-    dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_ALTIVEC);
++  if (cpu_has_feature(CPU_FTR_ALTIVEC))
++    dialect |= PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2;
+-  if (cpu_has_feature(CPU_FTRS_POWER7))
+-    dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7
+-                | PPC_OPCODE_ALTIVEC | PPC_OPCODE_VSX);
+-
+-  if (cpu_has_feature(CPU_FTRS_POWER8))
+-    dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7
+-              | PPC_OPCODE_POWER8 | PPC_OPCODE_HTM
+-              | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2 | PPC_OPCODE_VSX);
+-
+-  if (cpu_has_feature(CPU_FTRS_POWER9))
+-    dialect |= (PPC_OPCODE_POWER5 | PPC_OPCODE_POWER6 | PPC_OPCODE_POWER7
+-              | PPC_OPCODE_POWER8 | PPC_OPCODE_POWER9 | PPC_OPCODE_HTM
+-              | PPC_OPCODE_ALTIVEC | PPC_OPCODE_ALTIVEC2
+-              | PPC_OPCODE_VSX | PPC_OPCODE_VSX3);
++  if (cpu_has_feature(CPU_FTR_VSX))
++    dialect |= PPC_OPCODE_VSX | PPC_OPCODE_VSX3;
+   /* Get the major opcode of the insn.  */
+   opcode = NULL;
+-- 
+2.43.0
+
diff --git a/queue-5.15/pwm-stm32-always-do-lazy-disabling.patch b/queue-5.15/pwm-stm32-always-do-lazy-disabling.patch
new file mode 100644 (file)
index 0000000..779e203
--- /dev/null
@@ -0,0 +1,56 @@
+From 4f6f4fb23efb23cc044d6c9678bb8263ab661b2c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jul 2024 13:00:06 +0200
+Subject: pwm: stm32: Always do lazy disabling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
+
+[ Upstream commit 7346e7a058a2c9aa9ff1cc699c7bf18a402d9f84 ]
+
+When the state changes from enabled to disabled, polarity, duty_cycle
+and period are not configured in hardware and TIM_CCER_CCxE is just
+cleared. However if the state changes from one disabled state to
+another, all parameters are written to hardware because the early exit
+from stm32_pwm_apply() is only taken if the pwm is currently enabled.
+
+This yields surprises like: Applying
+
+       { .period = 1, .duty_cycle = 0, .enabled = false }
+
+succeeds if the pwm is initially on, but fails if it's already off
+because 1 is a too small period.
+
+Update the check for lazy disable to always exit early if the target
+state is disabled, no matter what is currently configured.
+
+Fixes: 7edf7369205b ("pwm: Add driver for STM32 plaftorm")
+Signed-off-by: Uwe Kleine-König <u.kleine-koenig@baylibre.com>
+Link: https://lore.kernel.org/r/20240703110010.672654-2-u.kleine-koenig@baylibre.com
+Signed-off-by: Uwe Kleine-König <ukleinek@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pwm/pwm-stm32.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/pwm/pwm-stm32.c b/drivers/pwm/pwm-stm32.c
+index c40a6548ce7d4..2070d107c6328 100644
+--- a/drivers/pwm/pwm-stm32.c
++++ b/drivers/pwm/pwm-stm32.c
+@@ -452,8 +452,9 @@ static int stm32_pwm_apply(struct pwm_chip *chip, struct pwm_device *pwm,
+       enabled = pwm->state.enabled;
+-      if (enabled && !state->enabled) {
+-              stm32_pwm_disable(priv, pwm->hwpwm);
++      if (!state->enabled) {
++              if (enabled)
++                      stm32_pwm_disable(priv, pwm->hwpwm);
+               return 0;
+       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-cache-release-gid-table-even-if-leak-is-detecte.patch b/queue-5.15/rdma-cache-release-gid-table-even-if-leak-is-detecte.patch
new file mode 100644 (file)
index 0000000..853a3e4
--- /dev/null
@@ -0,0 +1,58 @@
+From 69e3cf09760114eb3135bec0a680375dacda5030 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 May 2024 15:52:51 +0300
+Subject: RDMA/cache: Release GID table even if leak is detected
+
+From: Leon Romanovsky <leonro@nvidia.com>
+
+[ Upstream commit a92fbeac7e94a420b55570c10fe1b90e64da4025 ]
+
+When the table is released, we nullify pointer to GID table, it means
+that in case GID entry leak is detected, we will leak table too.
+
+Delete code that prevents table destruction.
+
+Fixes: b150c3862d21 ("IB/core: Introduce GID entry reference counts")
+Link: https://lore.kernel.org/r/a62560af06ba82c88ef9194982bfa63d14768ff9.1716900410.git.leon@kernel.org
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/core/cache.c | 14 +++++---------
+ 1 file changed, 5 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/infiniband/core/cache.c b/drivers/infiniband/core/cache.c
+index 0c98dd3dee678..98f3d8b382c15 100644
+--- a/drivers/infiniband/core/cache.c
++++ b/drivers/infiniband/core/cache.c
+@@ -794,7 +794,6 @@ static struct ib_gid_table *alloc_gid_table(int sz)
+ static void release_gid_table(struct ib_device *device,
+                             struct ib_gid_table *table)
+ {
+-      bool leak = false;
+       int i;
+       if (!table)
+@@ -803,15 +802,12 @@ static void release_gid_table(struct ib_device *device,
+       for (i = 0; i < table->sz; i++) {
+               if (is_gid_entry_free(table->data_vec[i]))
+                       continue;
+-              if (kref_read(&table->data_vec[i]->kref) > 1) {
+-                      dev_err(&device->dev,
+-                              "GID entry ref leak for index %d ref=%u\n", i,
+-                              kref_read(&table->data_vec[i]->kref));
+-                      leak = true;
+-              }
++
++              WARN_ONCE(true,
++                        "GID entry ref leak for dev %s index %d ref=%u\n",
++                        dev_name(&device->dev), i,
++                        kref_read(&table->data_vec[i]->kref));
+       }
+-      if (leak)
+-              return;
+       mutex_destroy(&table->lock);
+       kfree(table->data_vec);
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-device-return-error-earlier-if-port-in-not-vali.patch b/queue-5.15/rdma-device-return-error-earlier-if-port-in-not-vali.patch
new file mode 100644 (file)
index 0000000..aa2b125
--- /dev/null
@@ -0,0 +1,46 @@
+From 2cbf4730e252cdbc8c4c43159df9b3a3825da240 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 16:24:32 +0300
+Subject: RDMA/device: Return error earlier if port in not valid
+
+From: Leon Romanovsky <leonro@nvidia.com>
+
+[ Upstream commit 917918f57a7b139c043e78c502876f2c286f4f0a ]
+
+There is no need to allocate port data if port provided is not valid.
+
+Fixes: c2261dd76b54 ("RDMA/device: Add ib_device_set_netdev() as an alternative to get_netdev")
+Link: https://lore.kernel.org/r/022047a8b16988fc88d4426da50bf60a4833311b.1719235449.git.leon@kernel.org
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/core/device.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/infiniband/core/device.c b/drivers/infiniband/core/device.c
+index 725f2719132fb..5d1ce55fda71e 100644
+--- a/drivers/infiniband/core/device.c
++++ b/drivers/infiniband/core/device.c
+@@ -2145,6 +2145,9 @@ int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev,
+       unsigned long flags;
+       int ret;
++      if (!rdma_is_port_valid(ib_dev, port))
++              return -EINVAL;
++
+       /*
+        * Drivers wish to call this before ib_register_driver, so we have to
+        * setup the port data early.
+@@ -2153,9 +2156,6 @@ int ib_device_set_netdev(struct ib_device *ib_dev, struct net_device *ndev,
+       if (ret)
+               return ret;
+-      if (!rdma_is_port_valid(ib_dev, port))
+-              return -EINVAL;
+-
+       pdata = &ib_dev->port_data[port];
+       spin_lock_irqsave(&pdata->netdev_lock, flags);
+       old_ndev = rcu_dereference_protected(
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-hns-fix-insufficient-extend-db-for-vfs.patch b/queue-5.15/rdma-hns-fix-insufficient-extend-db-for-vfs.patch
new file mode 100644 (file)
index 0000000..f88c074
--- /dev/null
@@ -0,0 +1,50 @@
+From 7169be686000b38bd598a227bcf35fcb2f731cd7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jul 2024 21:37:04 +0800
+Subject: RDMA/hns: Fix insufficient extend DB for VFs.
+
+From: Chengchang Tang <tangchengchang@huawei.com>
+
+[ Upstream commit 0b8e658f70ffd5dc7cda3872fd524d657d4796b7 ]
+
+VFs and its PF will share the memory of the extend DB. Currently,
+the number of extend DB allocated by driver is only enough for PF.
+This leads to a probability of DB loss and some other problems in
+scenarios where both PF and VFs use a large number of QPs.
+
+Fixes: 6b63597d3540 ("RDMA/hns: Add TSQ link table support")
+Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
+Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
+Link: https://lore.kernel.org/r/20240710133705.896445-8-huangjunxian6@hisilicon.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_hw_v2.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+index 4accc9efa6946..3cd65bcca2240 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
++++ b/drivers/infiniband/hw/hns/hns_roce_hw_v2.c
+@@ -2598,14 +2598,16 @@ static int set_llm_cfg_to_hw(struct hns_roce_dev *hr_dev,
+ static struct hns_roce_link_table *
+ alloc_link_table_buf(struct hns_roce_dev *hr_dev)
+ {
++      u16 total_sl = hr_dev->caps.sl_num * hr_dev->func_num;
+       struct hns_roce_v2_priv *priv = hr_dev->priv;
+       struct hns_roce_link_table *link_tbl;
+       u32 pg_shift, size, min_size;
+       link_tbl = &priv->ext_llm;
+       pg_shift = hr_dev->caps.llm_buf_pg_sz + PAGE_SHIFT;
+-      size = hr_dev->caps.num_qps * HNS_ROCE_V2_EXT_LLM_ENTRY_SZ;
+-      min_size = HNS_ROCE_EXT_LLM_MIN_PAGES(hr_dev->caps.sl_num) << pg_shift;
++      size = hr_dev->caps.num_qps * hr_dev->func_num *
++             HNS_ROCE_V2_EXT_LLM_ENTRY_SZ;
++      min_size = HNS_ROCE_EXT_LLM_MIN_PAGES(total_sl) << pg_shift;
+       /* Alloc data table */
+       size = max(size, min_size);
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch b/queue-5.15/rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch
new file mode 100644 (file)
index 0000000..28d4e7e
--- /dev/null
@@ -0,0 +1,64 @@
+From 5c42017e8727931ae06a8347692591dc585ea045 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jul 2024 21:37:01 +0800
+Subject: RDMA/hns: Fix missing pagesize and alignment check in FRMR
+
+From: Chengchang Tang <tangchengchang@huawei.com>
+
+[ Upstream commit d387d4b54eb84208bd4ca13572e106851d0a0819 ]
+
+The offset requires 128B alignment and the page size ranges from
+4K to 128M.
+
+Fixes: 68a997c5d28c ("RDMA/hns: Add FRMR support for hip08")
+Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
+Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
+Link: https://lore.kernel.org/r/20240710133705.896445-5-huangjunxian6@hisilicon.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_device.h | 4 ++++
+ drivers/infiniband/hw/hns/hns_roce_mr.c     | 5 +++++
+ 2 files changed, 9 insertions(+)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_device.h b/drivers/infiniband/hw/hns/hns_roce_device.h
+index e02107123c970..f234fd8e4a2be 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_device.h
++++ b/drivers/infiniband/hw/hns/hns_roce_device.h
+@@ -100,6 +100,7 @@
+ #define MR_TYPE_DMA                           0x03
+ #define HNS_ROCE_FRMR_MAX_PA                  512
++#define HNS_ROCE_FRMR_ALIGN_SIZE              128
+ #define PKEY_ID                                       0xffff
+ #define GUID_LEN                              8
+@@ -220,6 +221,9 @@ enum {
+ #define HNS_HW_PAGE_SHIFT                     12
+ #define HNS_HW_PAGE_SIZE                      (1 << HNS_HW_PAGE_SHIFT)
++#define HNS_HW_MAX_PAGE_SHIFT                 27
++#define HNS_HW_MAX_PAGE_SIZE                  (1 << HNS_HW_MAX_PAGE_SHIFT)
++
+ struct hns_roce_uar {
+       u64             pfn;
+       unsigned long   index;
+diff --git a/drivers/infiniband/hw/hns/hns_roce_mr.c b/drivers/infiniband/hw/hns/hns_roce_mr.c
+index 7106e51d5fad1..938db3f5aabe6 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_mr.c
++++ b/drivers/infiniband/hw/hns/hns_roce_mr.c
+@@ -446,6 +446,11 @@ int hns_roce_map_mr_sg(struct ib_mr *ibmr, struct scatterlist *sg, int sg_nents,
+       struct hns_roce_mtr *mtr = &mr->pbl_mtr;
+       int ret, sg_num = 0;
++      if (!IS_ALIGNED(*sg_offset, HNS_ROCE_FRMR_ALIGN_SIZE) ||
++          ibmr->page_size < HNS_HW_PAGE_SIZE ||
++          ibmr->page_size > HNS_HW_MAX_PAGE_SIZE)
++              return sg_num;
++
+       mr->npages = 0;
+       mr->page_list = kvcalloc(mr->pbl_mtr.hem_cfg.buf_pg_count,
+                                sizeof(dma_addr_t), GFP_KERNEL);
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-hns-fix-undifined-behavior-caused-by-invalid-ma.patch b/queue-5.15/rdma-hns-fix-undifined-behavior-caused-by-invalid-ma.patch
new file mode 100644 (file)
index 0000000..d1a5044
--- /dev/null
@@ -0,0 +1,38 @@
+From 0abe5cfb81cb76358644b206899a0620c8eef03e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jul 2024 21:37:03 +0800
+Subject: RDMA/hns: Fix undifined behavior caused by invalid max_sge
+
+From: Chengchang Tang <tangchengchang@huawei.com>
+
+[ Upstream commit 36397b907355e2fdb5a25a02a7921a937fd8ef4c ]
+
+If max_sge has been set to 0, roundup_pow_of_two() in
+set_srq_basic_param() may have undefined behavior.
+
+Fixes: 9dd052474a26 ("RDMA/hns: Allocate one more recv SGE for HIP08")
+Signed-off-by: Chengchang Tang <tangchengchang@huawei.com>
+Signed-off-by: Junxian Huang <huangjunxian6@hisilicon.com>
+Link: https://lore.kernel.org/r/20240710133705.896445-7-huangjunxian6@hisilicon.com
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/hns/hns_roce_srq.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/hns/hns_roce_srq.c b/drivers/infiniband/hw/hns/hns_roce_srq.c
+index 35001fb99b944..873069d6ebae9 100644
+--- a/drivers/infiniband/hw/hns/hns_roce_srq.c
++++ b/drivers/infiniband/hw/hns/hns_roce_srq.c
+@@ -295,7 +295,7 @@ static int set_srq_basic_param(struct hns_roce_srq *srq,
+       max_sge = proc_srq_sge(hr_dev, srq, !!udata);
+       if (attr->max_wr > hr_dev->caps.max_srq_wrs ||
+-          attr->max_sge > max_sge) {
++          attr->max_sge > max_sge || !attr->max_sge) {
+               ibdev_err(&hr_dev->ib_dev,
+                         "invalid SRQ attr, depth = %u, sge = %u.\n",
+                         attr->max_wr, attr->max_sge);
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch b/queue-5.15/rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch
new file mode 100644 (file)
index 0000000..70d1cb8
--- /dev/null
@@ -0,0 +1,52 @@
+From d4ff5148d9cd606e6a8eb282459c15b3da3d1dd7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Jun 2024 19:17:30 +0300
+Subject: RDMA/mlx4: Fix truncated output warning in alias_GUID.c
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Leon Romanovsky <leonro@nvidia.com>
+
+[ Upstream commit 5953e0647cec703ef436ead37fed48943507b433 ]
+
+drivers/infiniband/hw/mlx4/alias_GUID.c: In function ‘mlx4_ib_init_alias_guid_service’:
+drivers/infiniband/hw/mlx4/alias_GUID.c:878:74: error: ‘%d’ directive
+output may be truncated writing between 1 and 11 bytes into a region of
+size 5 [-Werror=format-truncation=]
+  878 |                 snprintf(alias_wq_name, sizeof alias_wq_name, "alias_guid%d", i);
+      |                                                                          ^~
+drivers/infiniband/hw/mlx4/alias_GUID.c:878:63: note: directive argument in the range [-2147483641, 2147483646]
+  878 |                 snprintf(alias_wq_name, sizeof alias_wq_name, "alias_guid%d", i);
+      |                                                               ^~~~~~~~~~~~~~
+drivers/infiniband/hw/mlx4/alias_GUID.c:878:17: note: ‘snprintf’ output
+between 12 and 22 bytes into a destination of size 15
+  878 |                 snprintf(alias_wq_name, sizeof alias_wq_name, "alias_guid%d", i);
+      |                 ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+cc1: all warnings being treated as errors
+
+Fixes: a0c64a17aba8 ("mlx4: Add alias_guid mechanism")
+Link: https://lore.kernel.org/r/1951c9500109ca7e36dcd523f8a5f2d0d2a608d1.1718554641.git.leon@kernel.org
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx4/alias_GUID.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/mlx4/alias_GUID.c b/drivers/infiniband/hw/mlx4/alias_GUID.c
+index 571d9c542024c..6b8ad58590145 100644
+--- a/drivers/infiniband/hw/mlx4/alias_GUID.c
++++ b/drivers/infiniband/hw/mlx4/alias_GUID.c
+@@ -832,7 +832,7 @@ void mlx4_ib_destroy_alias_guid_service(struct mlx4_ib_dev *dev)
+ int mlx4_ib_init_alias_guid_service(struct mlx4_ib_dev *dev)
+ {
+-      char alias_wq_name[15];
++      char alias_wq_name[22];
+       int ret = 0;
+       int i, j;
+       union ib_gid gid;
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch b/queue-5.15/rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch
new file mode 100644 (file)
index 0000000..ada3968
--- /dev/null
@@ -0,0 +1,82 @@
+From f908ea9cb069d4cddd2cefd2f6ea49d6403f649f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Jun 2024 19:16:33 +0300
+Subject: RDMA/mlx4: Fix truncated output warning in mad.c
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Leon Romanovsky <leonro@nvidia.com>
+
+[ Upstream commit 0d2e6992fc956e3308cd5376c18567def4cb3967 ]
+
+Increase size of the name array to avoid truncated output warning.
+
+drivers/infiniband/hw/mlx4/mad.c: In function ‘mlx4_ib_alloc_demux_ctx’:
+drivers/infiniband/hw/mlx4/mad.c:2197:47: error: ‘%d’ directive output
+may be truncated writing between 1 and 11 bytes into a region of size 4
+[-Werror=format-truncation=]
+ 2197 |         snprintf(name, sizeof(name), "mlx4_ibt%d", port);
+      |                                               ^~
+drivers/infiniband/hw/mlx4/mad.c:2197:38: note: directive argument in
+the range [-2147483645, 2147483647]
+ 2197 |         snprintf(name, sizeof(name), "mlx4_ibt%d", port);
+      |                                      ^~~~~~~~~~~~
+drivers/infiniband/hw/mlx4/mad.c:2197:9: note: ‘snprintf’ output between
+10 and 20 bytes into a destination of size 12
+ 2197 |         snprintf(name, sizeof(name), "mlx4_ibt%d", port);
+      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+drivers/infiniband/hw/mlx4/mad.c:2205:48: error: ‘%d’ directive output
+may be truncated writing between 1 and 11 bytes into a region of size 3
+[-Werror=format-truncation=]
+ 2205 |         snprintf(name, sizeof(name), "mlx4_ibwi%d", port);
+      |                                                ^~
+drivers/infiniband/hw/mlx4/mad.c:2205:38: note: directive argument in
+the range [-2147483645, 2147483647]
+ 2205 |         snprintf(name, sizeof(name), "mlx4_ibwi%d", port);
+      |                                      ^~~~~~~~~~~~~
+drivers/infiniband/hw/mlx4/mad.c:2205:9: note: ‘snprintf’ output between
+11 and 21 bytes into a destination of size 12
+ 2205 |         snprintf(name, sizeof(name), "mlx4_ibwi%d", port);
+      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+drivers/infiniband/hw/mlx4/mad.c:2213:48: error: ‘%d’ directive output
+may be truncated writing between 1 and 11 bytes into a region of size 3
+[-Werror=format-truncation=]
+ 2213 |         snprintf(name, sizeof(name), "mlx4_ibud%d", port);
+      |                                                ^~
+drivers/infiniband/hw/mlx4/mad.c:2213:38: note: directive argument in
+the range [-2147483645, 2147483647]
+ 2213 |         snprintf(name, sizeof(name), "mlx4_ibud%d", port);
+      |                                      ^~~~~~~~~~~~~
+drivers/infiniband/hw/mlx4/mad.c:2213:9: note: ‘snprintf’ output between
+11 and 21 bytes into a destination of size 12
+ 2213 |         snprintf(name, sizeof(name), "mlx4_ibud%d", port);
+      |         ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+cc1: all warnings being treated as errors
+make[6]: *** [scripts/Makefile.build:244: drivers/infiniband/hw/mlx4/mad.o] Error 1
+
+Fixes: fc06573dfaf8 ("IB/mlx4: Initialize SR-IOV IB support for slaves in master context")
+Link: https://lore.kernel.org/r/f3798b3ce9a410257d7e1ec7c9e285f1352e256a.1718554569.git.leon@kernel.org
+Signed-off-by: Leon Romanovsky <leonro@nvidia.com>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx4/mad.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/infiniband/hw/mlx4/mad.c b/drivers/infiniband/hw/mlx4/mad.c
+index d13ecbdd43917..3d29d5baf503e 100644
+--- a/drivers/infiniband/hw/mlx4/mad.c
++++ b/drivers/infiniband/hw/mlx4/mad.c
+@@ -2158,7 +2158,7 @@ static int mlx4_ib_alloc_demux_ctx(struct mlx4_ib_dev *dev,
+                                      struct mlx4_ib_demux_ctx *ctx,
+                                      int port)
+ {
+-      char name[12];
++      char name[21];
+       int ret = 0;
+       int i;
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-mlx5-set-mkeys-for-dmabuf-at-page_size.patch b/queue-5.15/rdma-mlx5-set-mkeys-for-dmabuf-at-page_size.patch
new file mode 100644 (file)
index 0000000..fc7bd27
--- /dev/null
@@ -0,0 +1,70 @@
+From 82e6fb4d49ed7bd6d9b0c557008c540d795c9976 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Jun 2024 21:01:42 +0300
+Subject: RDMA/mlx5: Set mkeys for dmabuf at PAGE_SIZE
+
+From: Chiara Meiohas <cmeiohas@nvidia.com>
+
+[ Upstream commit a4e540119be565f47c305f295ed43f8e0bc3f5c3 ]
+
+Set the mkey for dmabuf at PAGE_SIZE to support any SGL
+after a move operation.
+
+ib_umem_find_best_pgsz returns 0 on error, so it is
+incorrect to check the returned page_size against PAGE_SIZE
+
+Fixes: 90da7dc8206a ("RDMA/mlx5: Support dma-buf based userspace memory region")
+Signed-off-by: Chiara Meiohas <cmeiohas@nvidia.com>
+Reviewed-by: Michael Guralnik <michaelgur@nvidia.com>
+Link: https://lore.kernel.org/r/1e2289b9133e89f273a4e68d459057d032cbc2ce.1718301631.git.leon@kernel.org
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/hw/mlx5/mlx5_ib.h | 13 +++++++++++++
+ drivers/infiniband/hw/mlx5/odp.c     |  6 ++----
+ 2 files changed, 15 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/infiniband/hw/mlx5/mlx5_ib.h b/drivers/infiniband/hw/mlx5/mlx5_ib.h
+index bf20a388eabe1..08c59c5a1e108 100644
+--- a/drivers/infiniband/hw/mlx5/mlx5_ib.h
++++ b/drivers/infiniband/hw/mlx5/mlx5_ib.h
+@@ -109,6 +109,19 @@ unsigned long __mlx5_umem_find_best_quantized_pgoff(
+               __mlx5_bit_sz(typ, page_offset_fld), 0, scale,                 \
+               page_offset_quantized)
++static inline unsigned long
++mlx5_umem_dmabuf_find_best_pgsz(struct ib_umem_dmabuf *umem_dmabuf)
++{
++      /*
++       * mkeys used for dmabuf are fixed at PAGE_SIZE because we must be able
++       * to hold any sgl after a move operation. Ideally the mkc page size
++       * could be changed at runtime to be optimal, but right now the driver
++       * cannot do that.
++       */
++      return ib_umem_find_best_pgsz(&umem_dmabuf->umem, PAGE_SIZE,
++                                    umem_dmabuf->umem.iova);
++}
++
+ enum {
+       MLX5_IB_MMAP_OFFSET_START = 9,
+       MLX5_IB_MMAP_OFFSET_END = 255,
+diff --git a/drivers/infiniband/hw/mlx5/odp.c b/drivers/infiniband/hw/mlx5/odp.c
+index fcf6447b4a4e0..66e53e895d341 100644
+--- a/drivers/infiniband/hw/mlx5/odp.c
++++ b/drivers/infiniband/hw/mlx5/odp.c
+@@ -704,10 +704,8 @@ static int pagefault_dmabuf_mr(struct mlx5_ib_mr *mr, size_t bcnt,
+               return err;
+       }
+-      page_size = mlx5_umem_find_best_pgsz(&umem_dmabuf->umem, mkc,
+-                                           log_page_size, 0,
+-                                           umem_dmabuf->umem.iova);
+-      if (unlikely(page_size < PAGE_SIZE)) {
++      page_size = mlx5_umem_dmabuf_find_best_pgsz(umem_dmabuf);
++      if (!page_size) {
+               ib_umem_dmabuf_unmap_pages(umem_dmabuf);
+               err = -EINVAL;
+       } else {
+-- 
+2.43.0
+
diff --git a/queue-5.15/rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch b/queue-5.15/rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch
new file mode 100644 (file)
index 0000000..adf029a
--- /dev/null
@@ -0,0 +1,53 @@
+From f3a79523a7b26c373307929df02ef5fa3deb3582 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 10:03:48 +0800
+Subject: RDMA/rxe: Don't set BTH_ACK_MASK for UC or UD QPs
+
+From: Honggang LI <honggangli@163.com>
+
+[ Upstream commit 4adcaf969d77d3d3aa3871bbadc196258a38aec6 ]
+
+BTH_ACK_MASK bit is used to indicate that an acknowledge
+(for this packet) should be scheduled by the responder.
+Both UC and UD QPs are unacknowledged, so don't set
+BTH_ACK_MASK for UC or UD QPs.
+
+Fixes: 8700e3e7c485 ("Soft RoCE driver")
+Signed-off-by: Honggang LI <honggangli@163.com>
+Link: https://lore.kernel.org/r/20240624020348.494338-1-honggangli@163.com
+Reviewed-by: Zhu Yanjun <yanjun.zhu@linux.dev>
+Signed-off-by: Leon Romanovsky <leon@kernel.org>
+Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/infiniband/sw/rxe/rxe_req.c | 7 ++++---
+ 1 file changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/infiniband/sw/rxe/rxe_req.c b/drivers/infiniband/sw/rxe/rxe_req.c
+index 8c0e7ecd41414..0938084192072 100644
+--- a/drivers/infiniband/sw/rxe/rxe_req.c
++++ b/drivers/infiniband/sw/rxe/rxe_req.c
+@@ -374,7 +374,7 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
+       int                     solicited;
+       u16                     pkey;
+       u32                     qp_num;
+-      int                     ack_req;
++      int                     ack_req = 0;
+       /* length from start of bth to end of icrc */
+       paylen = rxe_opcode[opcode].length + payload + pad + RXE_ICRC_SIZE;
+@@ -407,8 +407,9 @@ static struct sk_buff *init_req_packet(struct rxe_qp *qp,
+       qp_num = (pkt->mask & RXE_DETH_MASK) ? ibwr->wr.ud.remote_qpn :
+                                        qp->attr.dest_qp_num;
+-      ack_req = ((pkt->mask & RXE_END_MASK) ||
+-              (qp->req.noack_pkts++ > RXE_MAX_PKT_PER_ACK));
++      if (qp_type(qp) != IB_QPT_UD && qp_type(qp) != IB_QPT_UC)
++              ack_req = ((pkt->mask & RXE_END_MASK) ||
++                         (qp->req.noack_pkts++ > RXE_MAX_PKT_PER_ACK));
+       if (ack_req)
+               qp->req.noack_pkts = 0;
+-- 
+2.43.0
+
diff --git a/queue-5.15/revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch b/queue-5.15/revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch
new file mode 100644 (file)
index 0000000..3b85f7b
--- /dev/null
@@ -0,0 +1,84 @@
+From 15e5b04d6456db5fbd324a314f3543b9bc1a321b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jun 2024 10:34:38 +0200
+Subject: Revert "leds: led-core: Fix refcount leak in of_led_get()"
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Luca Ceresoli <luca.ceresoli@bootlin.com>
+
+[ Upstream commit 940b27161afc6ec53fc66245a4fb3518394cdc92 ]
+
+This reverts commit da1afe8e6099980fe1e2fd7436dca284af9d3f29.
+
+Commit 699a8c7c4bd3 ("leds: Add of_led_get() and led_put()"), introduced in
+5.5, added of_led_get() and led_put() but missed a put_device() in
+led_put(), thus creating a leak in case the consumer device is removed.
+
+Arguably device removal was not very popular, so this went apparently
+unnoticed until 2022. In January 2023 two different patches got merged to
+fix the same bug:
+
+ - commit da1afe8e6099 ("leds: led-core: Fix refcount leak in of_led_get()")
+ - commit 445110941eb9 ("leds: led-class: Add missing put_device() to led_put()")
+
+They fix the bug in two different ways, which creates no patch conflicts,
+and both were merged in v6.2. The result is that now there is one more
+put_device() than get_device()s, instead of one less.
+
+Arguably device removal is not very popular yet, so this apparently hasn't
+been noticed as well up to now. But it blew up here while I'm working with
+device tree overlay insertion and removal. The symptom is an apparently
+unrelated list of oopses on device removal, with reasons:
+
+  kernfs: can not remove 'uevent', no directory
+  kernfs: can not remove 'brightness', no directory
+  kernfs: can not remove 'max_brightness', no directory
+  ...
+
+Here sysfs fails removing attribute files, which is because the device name
+changed and so the sysfs path. This is because the device name string got
+corrupted, which is because it got freed too early and its memory reused.
+
+Different symptoms could appear in different use cases.
+
+Fix by removing one of the two fixes.
+
+The choice was to remove commit da1afe8e6099 because:
+
+ * it is calling put_device() inside of_led_get() just after getting the
+   device, thus it is basically not refcounting the LED device at all
+   during its entire lifetime
+ * it does not add a corresponding put_device() in led_get(), so it fixes
+   only the OF case
+
+The other fix (445110941eb9) is adding the put_device() in led_put() so it
+covers the entire lifetime, and it works even in the non-DT case.
+
+Fixes: da1afe8e6099 ("leds: led-core: Fix refcount leak in of_led_get()")
+Co-developed-by: Hervé Codina <herve.codina@bootlin.com>
+Signed-off-by: Hervé Codina <herve.codina@bootlin.com>
+Signed-off-by: Luca Ceresoli <luca.ceresoli@bootlin.com>
+Link: https://lore.kernel.org/r/20240625-led-class-device-leak-v2-1-75fdccf47421@bootlin.com
+Signed-off-by: Lee Jones <lee@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/leds/led-class.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/leds/led-class.c b/drivers/leds/led-class.c
+index 1024b1562aafc..6e88df4c87fa8 100644
+--- a/drivers/leds/led-class.c
++++ b/drivers/leds/led-class.c
+@@ -235,7 +235,6 @@ struct led_classdev *of_led_get(struct device_node *np, int index)
+       led_dev = class_find_device_by_of_node(leds_class, led_node);
+       of_node_put(led_node);
+-      put_device(led_dev);
+       if (!led_dev)
+               return ERR_PTR(-EPROBE_DEFER);
+-- 
+2.43.0
+
diff --git a/queue-5.15/rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch b/queue-5.15/rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch
new file mode 100644 (file)
index 0000000..f21ded2
--- /dev/null
@@ -0,0 +1,60 @@
+From 2bd8728d395f3ab08bfc47445458ef3b809ee3a0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Jun 2024 16:04:52 +0200
+Subject: rtc: interface: Add RTC offset to alarm after fix-up
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Csókás, Bence <csokas.bence@prolan.hu>
+
+[ Upstream commit 463927a8902a9f22c3633960119410f57d4c8920 ]
+
+`rtc_add_offset()` is called by `__rtc_read_time()`
+and `__rtc_read_alarm()` to add the RTC's offset to
+the raw read-outs from the device drivers. However,
+in the latter case, a fix-up algorithm is run if
+the RTC device does not report a full `struct rtc_time`
+alarm value. In that case, the offset was forgot to be
+added.
+
+Fixes: fd6792bb022e ("rtc: fix alarm read and set offset")
+
+Signed-off-by: Csókás, Bence <csokas.bence@prolan.hu>
+Link: https://lore.kernel.org/r/20240619140451.2800578-1-csokas.bence@prolan.hu
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/rtc/interface.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/rtc/interface.c b/drivers/rtc/interface.c
+index f49ab45455d7c..29c12947e73fc 100644
+--- a/drivers/rtc/interface.c
++++ b/drivers/rtc/interface.c
+@@ -274,10 +274,9 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
+                       return err;
+               /* full-function RTCs won't have such missing fields */
+-              if (rtc_valid_tm(&alarm->time) == 0) {
+-                      rtc_add_offset(rtc, &alarm->time);
+-                      return 0;
+-              }
++              err = rtc_valid_tm(&alarm->time);
++              if (!err)
++                      goto done;
+               /* get the "after" timestamp, to detect wrapped fields */
+               err = rtc_read_time(rtc, &now);
+@@ -379,6 +378,8 @@ int __rtc_read_alarm(struct rtc_device *rtc, struct rtc_wkalrm *alarm)
+       if (err)
+               dev_warn(&rtc->dev, "invalid alarm value: %ptR\n",
+                        &alarm->time);
++      else
++              rtc_add_offset(rtc, &alarm->time);
+       return err;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/s390-dasd-fix-error-checks-in-dasd_copy_pair_store.patch b/queue-5.15/s390-dasd-fix-error-checks-in-dasd_copy_pair_store.patch
new file mode 100644 (file)
index 0000000..0d666d1
--- /dev/null
@@ -0,0 +1,57 @@
+From 588080dc71b3546ffab356540eb647d5b88b7616 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 15 Jul 2024 13:24:34 +0200
+Subject: s390/dasd: fix error checks in dasd_copy_pair_store()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Carlos López <clopez@suse.de>
+
+[ Upstream commit 8e64d2356cbc800b4cd0e3e614797f76bcf0cdb8 ]
+
+dasd_add_busid() can return an error via ERR_PTR() if an allocation
+fails. However, two callsites in dasd_copy_pair_store() do not check
+the result, potentially resulting in a NULL pointer dereference. Fix
+this by checking the result with IS_ERR() and returning the error up
+the stack.
+
+Fixes: a91ff09d39f9b ("s390/dasd: add copy pair setup")
+Signed-off-by: Carlos López <clopez@suse.de>
+Signed-off-by: Stefan Haberland <sth@linux.ibm.com>
+Link: https://lore.kernel.org/r/20240715112434.2111291-3-sth@linux.ibm.com
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/s390/block/dasd_devmap.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/s390/block/dasd_devmap.c b/drivers/s390/block/dasd_devmap.c
+index 6f9f7a0723128..7447dec5ce221 100644
+--- a/drivers/s390/block/dasd_devmap.c
++++ b/drivers/s390/block/dasd_devmap.c
+@@ -2141,13 +2141,19 @@ static ssize_t dasd_copy_pair_store(struct device *dev,
+       /* allocate primary devmap if needed */
+       prim_devmap = dasd_find_busid(prim_busid);
+-      if (IS_ERR(prim_devmap))
++      if (IS_ERR(prim_devmap)) {
+               prim_devmap = dasd_add_busid(prim_busid, DASD_FEATURE_DEFAULT);
++              if (IS_ERR(prim_devmap))
++                      return PTR_ERR(prim_devmap);
++      }
+       /* allocate secondary devmap if needed */
+       sec_devmap = dasd_find_busid(sec_busid);
+-      if (IS_ERR(sec_devmap))
++      if (IS_ERR(sec_devmap)) {
+               sec_devmap = dasd_add_busid(sec_busid, DASD_FEATURE_DEFAULT);
++              if (IS_ERR(sec_devmap))
++                      return PTR_ERR(sec_devmap);
++      }
+       /* setting copy relation is only allowed for offline secondary */
+       if (sec_devmap->device)
+-- 
+2.43.0
+
diff --git a/queue-5.15/s390-mm-convert-gmap_make_secure-to-use-a-folio.patch b/queue-5.15/s390-mm-convert-gmap_make_secure-to-use-a-folio.patch
new file mode 100644 (file)
index 0000000..eba5aa6
--- /dev/null
@@ -0,0 +1,102 @@
+From d6c8728c5ee1a1cce533df963d7280109b42ff60 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 22 Mar 2024 16:11:47 +0000
+Subject: s390/mm: Convert gmap_make_secure to use a folio
+
+From: Matthew Wilcox (Oracle) <willy@infradead.org>
+
+[ Upstream commit d35c34bb32f2cc4ec0b52e91ad7a8fcab55d7856 ]
+
+Remove uses of deprecated page APIs, and move the check for large
+folios to here to avoid taking the folio lock if the folio is too large.
+We could do better here by attempting to split the large folio, but I'll
+leave that improvement for someone who can test it.
+
+Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
+Link: https://lore.kernel.org/r/20240322161149.2327518-3-willy@infradead.org
+Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
+Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/uv.c | 27 ++++++++++++++-------------
+ 1 file changed, 14 insertions(+), 13 deletions(-)
+
+diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
+index 425f6e4b30267..b54376c658688 100644
+--- a/arch/s390/kernel/uv.c
++++ b/arch/s390/kernel/uv.c
+@@ -192,13 +192,10 @@ static int expected_folio_refs(struct folio *folio)
+       return res;
+ }
+-static int make_page_secure(struct page *page, struct uv_cb_header *uvcb)
++static int make_folio_secure(struct folio *folio, struct uv_cb_header *uvcb)
+ {
+-      struct folio *folio = page_folio(page);
+       int expected, cc = 0;
+-      if (folio_test_large(folio))
+-              return -EINVAL;
+       if (folio_test_writeback(folio))
+               return -EAGAIN;
+       expected = expected_folio_refs(folio);
+@@ -264,7 +261,7 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+       bool local_drain = false;
+       spinlock_t *ptelock;
+       unsigned long uaddr;
+-      struct page *page;
++      struct folio *folio;
+       pte_t *ptep;
+       int rc;
+@@ -291,15 +288,19 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+       rc = -ENXIO;
+       ptep = get_locked_pte(gmap->mm, uaddr, &ptelock);
+       if (pte_present(*ptep) && !(pte_val(*ptep) & _PAGE_INVALID) && pte_write(*ptep)) {
+-              page = pte_page(*ptep);
++              folio = page_folio(pte_page(*ptep));
++              rc = -EINVAL;
++              if (folio_test_large(folio))
++                      goto unlock;
+               rc = -EAGAIN;
+-              if (trylock_page(page)) {
++              if (folio_trylock(folio)) {
+                       if (should_export_before_import(uvcb, gmap->mm))
+-                              uv_convert_from_secure(page_to_phys(page));
+-                      rc = make_page_secure(page, uvcb);
+-                      unlock_page(page);
++                              uv_convert_from_secure(PFN_PHYS(folio_pfn(folio)));
++                      rc = make_folio_secure(folio, uvcb);
++                      folio_unlock(folio);
+               }
+       }
++unlock:
+       pte_unmap_unlock(ptep, ptelock);
+ out:
+       mmap_read_unlock(gmap->mm);
+@@ -309,10 +310,10 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+                * If we are here because the UVC returned busy or partial
+                * completion, this is just a useless check, but it is safe.
+                */
+-              wait_on_page_writeback(page);
++              folio_wait_writeback(folio);
+       } else if (rc == -EBUSY) {
+               /*
+-               * If we have tried a local drain and the page refcount
++               * If we have tried a local drain and the folio refcount
+                * still does not match our expected safe value, try with a
+                * system wide drain. This is needed if the pagevecs holding
+                * the page are on a different CPU.
+@@ -323,7 +324,7 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+                       return -EAGAIN;
+               }
+               /*
+-               * We are here if the page refcount does not match the
++               * We are here if the folio refcount does not match the
+                * expected safe value. The main culprits are usually
+                * pagevecs. With lru_add_drain() we drain the pagevecs
+                * on the local CPU so that hopefully the refcount will
+-- 
+2.43.0
+
diff --git a/queue-5.15/s390-mm-convert-make_page_secure-to-use-a-folio.patch b/queue-5.15/s390-mm-convert-make_page_secure-to-use-a-folio.patch
new file mode 100644 (file)
index 0000000..c8c2048
--- /dev/null
@@ -0,0 +1,93 @@
+From 0e3a8d20695abe36aae478dea9b896adabaca0a7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 22 Mar 2024 16:11:46 +0000
+Subject: s390/mm: Convert make_page_secure to use a folio
+
+From: Matthew Wilcox (Oracle) <willy@infradead.org>
+
+[ Upstream commit 259e660d91d0e7261ae0ee37bb37266d6006a546 ]
+
+These page APIs are deprecated, so convert the incoming page to a folio
+and use the folio APIs instead.  The ultravisor API cannot handle large
+folios, so return -EINVAL if one has slipped through.
+
+Acked-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
+Link: https://lore.kernel.org/r/20240322161149.2327518-2-willy@infradead.org
+Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
+Stable-dep-of: 3f29f6537f54 ("s390/uv: Don't call folio_wait_writeback() without a folio reference")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/uv.c | 29 ++++++++++++++++-------------
+ 1 file changed, 16 insertions(+), 13 deletions(-)
+
+diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
+index bdf4d2bed87c5..425f6e4b30267 100644
+--- a/arch/s390/kernel/uv.c
++++ b/arch/s390/kernel/uv.c
+@@ -172,21 +172,21 @@ int uv_convert_owned_from_secure(unsigned long paddr)
+ }
+ /*
+- * Calculate the expected ref_count for a page that would otherwise have no
++ * Calculate the expected ref_count for a folio that would otherwise have no
+  * further pins. This was cribbed from similar functions in other places in
+  * the kernel, but with some slight modifications. We know that a secure
+- * page can not be a huge page for example.
++ * folio can not be a large folio, for example.
+  */
+-static int expected_page_refs(struct page *page)
++static int expected_folio_refs(struct folio *folio)
+ {
+       int res;
+-      res = page_mapcount(page);
+-      if (PageSwapCache(page)) {
++      res = folio_mapcount(folio);
++      if (folio_test_swapcache(folio)) {
+               res++;
+-      } else if (page_mapping(page)) {
++      } else if (folio_mapping(folio)) {
+               res++;
+-              if (page_has_private(page))
++              if (folio->private)
+                       res++;
+       }
+       return res;
+@@ -194,14 +194,17 @@ static int expected_page_refs(struct page *page)
+ static int make_page_secure(struct page *page, struct uv_cb_header *uvcb)
+ {
++      struct folio *folio = page_folio(page);
+       int expected, cc = 0;
+-      if (PageWriteback(page))
++      if (folio_test_large(folio))
++              return -EINVAL;
++      if (folio_test_writeback(folio))
+               return -EAGAIN;
+-      expected = expected_page_refs(page);
+-      if (!page_ref_freeze(page, expected))
++      expected = expected_folio_refs(folio);
++      if (!folio_ref_freeze(folio, expected))
+               return -EBUSY;
+-      set_bit(PG_arch_1, &page->flags);
++      set_bit(PG_arch_1, &folio->flags);
+       /*
+        * If the UVC does not succeed or fail immediately, we don't want to
+        * loop for long, or we might get stall notifications.
+@@ -211,9 +214,9 @@ static int make_page_secure(struct page *page, struct uv_cb_header *uvcb)
+        * -EAGAIN and we let the callers deal with it.
+        */
+       cc = __uv_call(0, (u64)uvcb);
+-      page_ref_unfreeze(page, expected);
++      folio_ref_unfreeze(folio, expected);
+       /*
+-       * Return -ENXIO if the page was not mapped, -EINVAL for other errors.
++       * Return -ENXIO if the folio was not mapped, -EINVAL for other errors.
+        * If busy or partially completed, return -EAGAIN.
+        */
+       if (cc == UVC_CC_OK)
+-- 
+2.43.0
+
diff --git a/queue-5.15/s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch b/queue-5.15/s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch
new file mode 100644 (file)
index 0000000..a2ccbbc
--- /dev/null
@@ -0,0 +1,53 @@
+From a48494858c36d8ad84322a602e514432042f2091 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 May 2024 20:29:46 +0200
+Subject: s390/uv: Don't call folio_wait_writeback() without a folio reference
+
+From: David Hildenbrand <david@redhat.com>
+
+[ Upstream commit 3f29f6537f54d74e64bac0a390fb2e26da25800d ]
+
+folio_wait_writeback() requires that no spinlocks are held and that
+a folio reference is held, as documented. After we dropped the PTL, the
+folio could get freed concurrently. So grab a temporary reference.
+
+Fixes: 214d9bbcd3a6 ("s390/mm: provide memory management functions for protected KVM guests")
+Reviewed-by: Claudio Imbrenda <imbrenda@linux.ibm.com>
+Signed-off-by: David Hildenbrand <david@redhat.com>
+Link: https://lore.kernel.org/r/20240508182955.358628-2-david@redhat.com
+Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
+Signed-off-by: Alexander Gordeev <agordeev@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/uv.c | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/arch/s390/kernel/uv.c b/arch/s390/kernel/uv.c
+index b54376c658688..4ec467605d328 100644
+--- a/arch/s390/kernel/uv.c
++++ b/arch/s390/kernel/uv.c
+@@ -299,6 +299,13 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+                       rc = make_folio_secure(folio, uvcb);
+                       folio_unlock(folio);
+               }
++
++              /*
++               * Once we drop the PTL, the folio may get unmapped and
++               * freed immediately. We need a temporary reference.
++               */
++              if (rc == -EAGAIN)
++                      folio_get(folio);
+       }
+ unlock:
+       pte_unmap_unlock(ptep, ptelock);
+@@ -311,6 +318,7 @@ int gmap_make_secure(struct gmap *gmap, unsigned long gaddr, void *uvcb)
+                * completion, this is just a useless check, but it is safe.
+                */
+               folio_wait_writeback(folio);
++              folio_put(folio);
+       } else if (rc == -EBUSY) {
+               /*
+                * If we have tried a local drain and the folio refcount
+-- 
+2.43.0
+
diff --git a/queue-5.15/saa7134-unchecked-i2c_transfer-function-result-fixed.patch b/queue-5.15/saa7134-unchecked-i2c_transfer-function-result-fixed.patch
new file mode 100644 (file)
index 0000000..f58c7cd
--- /dev/null
@@ -0,0 +1,51 @@
+From 226e2b08d7a0eea751ed36b68c87d712fabddeba Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 16 Feb 2024 15:40:06 +0300
+Subject: saa7134: Unchecked i2c_transfer function result fixed
+
+From: Aleksandr Burakov <a.burakov@rosalinux.ru>
+
+[ Upstream commit 9d8683b3fd93f0e378f24dc3d9604e5d7d3e0a17 ]
+
+Return value of function 'i2c_transfer' is not checked that
+may cause undefined behaviour.
+
+Found by Linux Verification Center (linuxtesting.org) with SVACE.
+
+Fixes: 2cf36ac44730 ("[PATCH] v4l: 656: added support for the following cards")
+Signed-off-by: Aleksandr Burakov <a.burakov@rosalinux.ru>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/pci/saa7134/saa7134-dvb.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/media/pci/saa7134/saa7134-dvb.c b/drivers/media/pci/saa7134/saa7134-dvb.c
+index f359cd5c006a7..c786b83a69d2b 100644
+--- a/drivers/media/pci/saa7134/saa7134-dvb.c
++++ b/drivers/media/pci/saa7134/saa7134-dvb.c
+@@ -466,7 +466,9 @@ static int philips_europa_tuner_sleep(struct dvb_frontend *fe)
+       /* switch the board to analog mode */
+       if (fe->ops.i2c_gate_ctrl)
+               fe->ops.i2c_gate_ctrl(fe, 1);
+-      i2c_transfer(&dev->i2c_adap, &analog_msg, 1);
++      if (i2c_transfer(&dev->i2c_adap, &analog_msg, 1) != 1)
++              return -EIO;
++
+       return 0;
+ }
+@@ -1018,7 +1020,9 @@ static int md8800_set_voltage2(struct dvb_frontend *fe,
+       else
+               wbuf[1] = rbuf & 0xef;
+       msg[0].len = 2;
+-      i2c_transfer(&dev->i2c_adap, msg, 1);
++      if (i2c_transfer(&dev->i2c_adap, msg, 1) != 1)
++              return -EIO;
++
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/selftests-bpf-check-length-of-recv-in-test_sockmap.patch b/queue-5.15/selftests-bpf-check-length-of-recv-in-test_sockmap.patch
new file mode 100644 (file)
index 0000000..0c467c0
--- /dev/null
@@ -0,0 +1,40 @@
+From b997a9dae422d41ca3ade8512fef185b7cdf97df Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 May 2024 14:50:03 +0800
+Subject: selftests/bpf: Check length of recv in test_sockmap
+
+From: Geliang Tang <tanggeliang@kylinos.cn>
+
+[ Upstream commit de1b5ea789dc28066cc8dc634b6825bd6148f38b ]
+
+The value of recv in msg_loop may be negative, like EWOULDBLOCK, so it's
+necessary to check if it is positive before accumulating it to bytes_recvd.
+
+Fixes: 16962b2404ac ("bpf: sockmap, add selftests")
+Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Tested-by: Jakub Sitnicki <jakub@cloudflare.com>
+Acked-by: John Fastabend <john.fastabend@gmail.com>
+Link: https://lore.kernel.org/bpf/5172563f7c7b2a2e953cef02e89fc34664a7b190.1716446893.git.tanggeliang@kylinos.cn
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/bpf/test_sockmap.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/bpf/test_sockmap.c b/tools/testing/selftests/bpf/test_sockmap.c
+index 72f88a38c3229..230ca335a9919 100644
+--- a/tools/testing/selftests/bpf/test_sockmap.c
++++ b/tools/testing/selftests/bpf/test_sockmap.c
+@@ -663,7 +663,8 @@ static int msg_loop(int fd, int iov_count, int iov_length, int cnt,
+                               }
+                       }
+-                      s->bytes_recvd += recv;
++                      if (recv > 0)
++                              s->bytes_recvd += recv;
+                       if (data) {
+                               int chunk_sz = opt->sendpage ?
+-- 
+2.43.0
+
diff --git a/queue-5.15/selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch b/queue-5.15/selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch
new file mode 100644 (file)
index 0000000..f478a3a
--- /dev/null
@@ -0,0 +1,40 @@
+From 02f7557eeb15e846840122eba154ce8f92222b4a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 Jul 2024 17:16:19 +0800
+Subject: selftests/bpf: Close fd in error path in drop_on_reuseport
+
+From: Geliang Tang <tanggeliang@kylinos.cn>
+
+[ Upstream commit adae187ebedcd95d02f045bc37dfecfd5b29434b ]
+
+In the error path when update_lookup_map() fails in drop_on_reuseport in
+prog_tests/sk_lookup.c, "server1", the fd of server 1, should be closed.
+This patch fixes this by using "goto close_srv1" lable instead of "detach"
+to close "server1" in this case.
+
+Fixes: 0ab5539f8584 ("selftests/bpf: Tests for BPF_SK_LOOKUP attach point")
+Acked-by: Eduard Zingerman <eddyz87@gmail.com>
+Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
+Link: https://lore.kernel.org/r/86aed33b4b0ea3f04497c757845cff7e8e621a2d.1720515893.git.tanggeliang@kylinos.cn
+Signed-off-by: Martin KaFai Lau <martin.lau@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/bpf/prog_tests/sk_lookup.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c
+index 6db07401bc493..651c23d6836bc 100644
+--- a/tools/testing/selftests/bpf/prog_tests/sk_lookup.c
++++ b/tools/testing/selftests/bpf/prog_tests/sk_lookup.c
+@@ -964,7 +964,7 @@ static void drop_on_reuseport(const struct test *t)
+       err = update_lookup_map(t->sock_map, SERVER_A, server1);
+       if (err)
+-              goto detach;
++              goto close_srv1;
+       /* second server on destination address we should never reach */
+       server2 = make_server(t->sotype, t->connect_to.ip, t->connect_to.port,
+-- 
+2.43.0
+
diff --git a/queue-5.15/selftests-bpf-fix-prog-numbers-in-test_sockmap.patch b/queue-5.15/selftests-bpf-fix-prog-numbers-in-test_sockmap.patch
new file mode 100644 (file)
index 0000000..6f948f9
--- /dev/null
@@ -0,0 +1,78 @@
+From 04d4a649aa9b98380a4e4e2e4b1b8af665049d81 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 17 May 2024 14:21:46 +0800
+Subject: selftests/bpf: Fix prog numbers in test_sockmap
+
+From: Geliang Tang <tanggeliang@kylinos.cn>
+
+[ Upstream commit 6c8d7598dfed759bf1d9d0322b4c2b42eb7252d8 ]
+
+bpf_prog5 and bpf_prog7 are removed from progs/test_sockmap_kern.h in
+commit d79a32129b21 ("bpf: Selftests, remove prints from sockmap tests"),
+now there are only 9 progs in it, not 11:
+
+       SEC("sk_skb1")
+       int bpf_prog1(struct __sk_buff *skb)
+       SEC("sk_skb2")
+       int bpf_prog2(struct __sk_buff *skb)
+       SEC("sk_skb3")
+       int bpf_prog3(struct __sk_buff *skb)
+       SEC("sockops")
+       int bpf_sockmap(struct bpf_sock_ops *skops)
+       SEC("sk_msg1")
+       int bpf_prog4(struct sk_msg_md *msg)
+       SEC("sk_msg2")
+       int bpf_prog6(struct sk_msg_md *msg)
+       SEC("sk_msg3")
+       int bpf_prog8(struct sk_msg_md *msg)
+       SEC("sk_msg4")
+       int bpf_prog9(struct sk_msg_md *msg)
+       SEC("sk_msg5")
+       int bpf_prog10(struct sk_msg_md *msg)
+
+This patch updates the array sizes of prog_fd[], prog_attach_type[] and
+prog_type[] from 11 to 9 accordingly.
+
+Fixes: d79a32129b21 ("bpf: Selftests, remove prints from sockmap tests")
+Signed-off-by: Geliang Tang <tanggeliang@kylinos.cn>
+Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
+Link: https://lore.kernel.org/bpf/9c10d9f974f07fcb354a43a8eca67acb2fafc587.1715926605.git.tanggeliang@kylinos.cn
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/bpf/test_sockmap.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/tools/testing/selftests/bpf/test_sockmap.c b/tools/testing/selftests/bpf/test_sockmap.c
+index 7465cbe19bb08..72f88a38c3229 100644
+--- a/tools/testing/selftests/bpf/test_sockmap.c
++++ b/tools/testing/selftests/bpf/test_sockmap.c
+@@ -65,7 +65,7 @@ int passed;
+ int failed;
+ int map_fd[9];
+ struct bpf_map *maps[9];
+-int prog_fd[11];
++int prog_fd[9];
+ int txmsg_pass;
+ int txmsg_redir;
+@@ -1708,8 +1708,6 @@ int prog_attach_type[] = {
+       BPF_SK_MSG_VERDICT,
+       BPF_SK_MSG_VERDICT,
+       BPF_SK_MSG_VERDICT,
+-      BPF_SK_MSG_VERDICT,
+-      BPF_SK_MSG_VERDICT,
+ };
+ int prog_type[] = {
+@@ -1722,8 +1720,6 @@ int prog_type[] = {
+       BPF_PROG_TYPE_SK_MSG,
+       BPF_PROG_TYPE_SK_MSG,
+       BPF_PROG_TYPE_SK_MSG,
+-      BPF_PROG_TYPE_SK_MSG,
+-      BPF_PROG_TYPE_SK_MSG,
+ };
+ static int populate_progs(char *bpf_file)
+-- 
+2.43.0
+
diff --git a/queue-5.15/selftests-forwarding-devlink_lib-wait-for-udev-event.patch b/queue-5.15/selftests-forwarding-devlink_lib-wait-for-udev-event.patch
new file mode 100644 (file)
index 0000000..58bc997
--- /dev/null
@@ -0,0 +1,77 @@
+From eee36b1df746bbf90614223fa33a58fc6ad581bd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 Jul 2024 17:27:02 +0200
+Subject: selftests: forwarding: devlink_lib: Wait for udev events after
+ reloading
+
+From: Amit Cohen <amcohen@nvidia.com>
+
+[ Upstream commit f67a90a0c8f5b3d0acc18f10650d90fec44775f9 ]
+
+Lately, an additional locking was added by commit c0a40097f0bc
+("drivers: core: synchronize really_probe() and dev_uevent()"). The
+locking protects dev_uevent() calling. This function is used to send
+messages from the kernel to user space. Uevent messages notify user space
+about changes in device states, such as when a device is added, removed,
+or changed. These messages are used by udev (or other similar user-space
+tools) to apply device-specific rules.
+
+After reloading devlink instance, udev events should be processed. This
+locking causes a short delay of udev events handling.
+
+One example for useful udev rule is renaming ports. 'forwading.config'
+can be configured to use names after udev rules are applied. Some tests run
+devlink_reload() and immediately use the updated names. This worked before
+the above mentioned commit was pushed, but now the delay of uevent messages
+causes that devlink_reload() returns before udev events are handled and
+tests fail.
+
+Adjust devlink_reload() to not assume that udev events are already
+processed when devlink reload is done, instead, wait for udev events to
+ensure they are processed before returning from the function.
+
+Without this patch:
+TESTS='rif_mac_profile' ./resource_scale.sh
+TEST: 'rif_mac_profile' 4                                           [ OK ]
+sysctl: cannot stat /proc/sys/net/ipv6/conf/swp1/disable_ipv6: No such file or directory
+sysctl: cannot stat /proc/sys/net/ipv6/conf/swp1/disable_ipv6: No such file or directory
+sysctl: cannot stat /proc/sys/net/ipv6/conf/swp2/disable_ipv6: No such file or directory
+sysctl: cannot stat /proc/sys/net/ipv6/conf/swp2/disable_ipv6: No such file or directory
+Cannot find device "swp1"
+Cannot find device "swp2"
+TEST: setup_wait_dev (: Interface swp1 does not come up.) [FAIL]
+
+With this patch:
+$ TESTS='rif_mac_profile' ./resource_scale.sh
+TEST: 'rif_mac_profile' 4                                           [ OK ]
+TEST: 'rif_mac_profile' overflow 5                                  [ OK ]
+
+This is relevant not only for this test.
+
+Fixes: bc7cbb1e9f4c ("selftests: forwarding: Add devlink_lib.sh")
+Signed-off-by: Amit Cohen <amcohen@nvidia.com>
+Reviewed-by: Ido Schimmel <idosch@nvidia.com>
+Signed-off-by: Petr Machata <petrm@nvidia.com>
+Link: https://patch.msgid.link/89367666e04b38a8993027f1526801ca327ab96a.1720709333.git.petrm@nvidia.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/forwarding/devlink_lib.sh | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/tools/testing/selftests/net/forwarding/devlink_lib.sh b/tools/testing/selftests/net/forwarding/devlink_lib.sh
+index 2c14a86adaaae..6bb0f929dad78 100644
+--- a/tools/testing/selftests/net/forwarding/devlink_lib.sh
++++ b/tools/testing/selftests/net/forwarding/devlink_lib.sh
+@@ -122,6 +122,8 @@ devlink_reload()
+       still_pending=$(devlink resource show "$DEVLINK_DEV" | \
+                       grep -c "size_new")
+       check_err $still_pending "Failed reload - There are still unset sizes"
++
++      udevadm settle
+ }
+ declare -A DEVLINK_ORIG
+-- 
+2.43.0
+
diff --git a/queue-5.15/series b/queue-5.15/series
new file mode 100644 (file)
index 0000000..123d40f
--- /dev/null
@@ -0,0 +1,165 @@
+edac-i10nm-make-skx_common.o-a-separate-module.patch
+platform-chrome-cros_ec_debugfs-fix-wrong-ec-message.patch
+block-refactor-to-use-helper.patch
+block-cleanup-bio_integrity_prep.patch
+block-initialize-integrity-buffer-to-zero-before-wri.patch
+hfsplus-fix-to-avoid-false-alarm-of-circular-locking.patch
+x86-of-return-consistent-error-type-from-x86_of_pci_.patch
+x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch
+x86-pci-xen-fix-pcibios_-return-code-handling.patch
+x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch
+hwmon-adt7475-fix-default-duty-on-fan-is-disabled.patch
+pwm-stm32-always-do-lazy-disabling.patch
+drm-meson-fix-canvas-release-in-bind-function.patch
+hwmon-max6697-fix-underflow-when-writing-limit-attri.patch
+hwmon-max6697-fix-swapped-temp-1-8-critical-alarms.patch
+arm64-dts-qcom-sdm845-add-power-domain-to-ufs-phy.patch
+arm64-dts-qcom-sm8250-switch-ufs-qmp-phy-to-new-styl.patch
+arm64-dts-qcom-sm8250-add-power-domain-to-ufs-phy.patch
+soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch
+arm64-dts-qcom-msm8996-specify-ufs-core_clk-frequenc.patch
+memory-fsl_ifc-make-fsl_ifc-config-visible-and-selec.patch
+soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch
+soc-qcom-pdr-fix-parsing-of-domains-lists.patch
+arm64-dts-rockchip-increase-vop-clk-rate-on-rk3328.patch
+arm-dts-imx6qdl-kontron-samx6i-move-phy-reset-into-p.patch
+arm-dts-imx6qdl-kontron-samx6i-fix-phy-reset.patch
+arm-dts-imx6qdl-kontron-samx6i-fix-board-reset.patch
+arm-dts-imx6qdl-kontron-samx6i-fix-spi0-chip-selects.patch
+arm-dts-imx6qdl-kontron-samx6i-fix-pcie-reset-polari.patch
+arm64-dts-mediatek-mt8183-kukui-drop-bogus-output-en.patch
+arm64-dts-mediatek-mt7622-fix-emmc-pinctrl-mux.patch
+arm64-dts-mediatek-mt8183-kukui-jacuzzi-add-ports-no.patch
+arm64-dts-amlogic-gx-correct-hdmi-clocks.patch
+m68k-atari-fix-tt-bootup-freeze-unexpected-scu-inter.patch
+x86-xen-convert-comma-to-semicolon.patch
+m68k-cmpxchg-fix-return-value-for-default-case-in-__.patch
+arm-pxa-spitz-use-gpio-descriptors-for-audio.patch
+arm-spitz-fix-gpio-assignment-for-backlight.patch
+vmlinux.lds.h-catch-.bss.l-sections-into-bss.patch
+firmware-turris-mox-rwtm-do-not-complete-if-there-ar.patch
+firmware-turris-mox-rwtm-fix-checking-return-value-o.patch
+firmware-turris-mox-rwtm-initialize-completion-befor.patch
+wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch
+selftests-bpf-fix-prog-numbers-in-test_sockmap.patch
+net-esp-cleanup-esp_output_tail_tcp-in-case-of-unsup.patch
+tcp-annotate-lockless-accesses-to-sk-sk_err_soft.patch
+tcp-annotate-lockless-access-to-sk-sk_err.patch
+tcp-add-tcp_done_with_error-helper.patch
+tcp-fix-race-in-tcp_write_err.patch
+tcp-fix-races-in-tcp_v-46-_err.patch
+net-smc-set-rmb-s-sg_max_single_alloc-limitation-onl.patch
+selftests-bpf-check-length-of-recv-in-test_sockmap.patch
+lib-objagg-fix-general-protection-fault.patch
+mlxsw-spectrum_acl_erp-fix-object-nesting-warning.patch
+mlxsw-spectrum_acl_bloom_filter-make-mlxsw_sp_acl_bf.patch
+mlxsw-spectrum_acl-fix-acl-scale-regression-and-firm.patch
+wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch
+wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch
+wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch
+net-fec-refactor-define-magic-constants.patch
+net-fec-fix-fec_ecr_en1588-being-cleared-on-link-dow.patch
+libbpf-checking-the-btf_type-kind-when-fixing-variab.patch
+ipvs-avoid-unnecessary-calls-to-skb_is_gso_sctp.patch
+netfilter-nf_tables-rise-cap-on-selinux-secmark-cont.patch
+bpftool-mount-bpffs-when-pinmaps-path-not-under-the-.patch
+perf-x86-intel-pt-fix-pt_topa_entry_for_page-address.patch
+perf-fix-perf_aux_size-for-greater-than-32-bit-size.patch
+perf-prevent-passing-zero-nr_pages-to-rb_alloc_aux.patch
+perf-fix-default-aux_watermark-calculation.patch
+wifi-virt_wifi-avoid-reporting-connection-success-wi.patch
+gss_krb5-fix-the-error-handling-path-for-crypto_sync.patch
+wifi-virt_wifi-don-t-use-strlen-in-const-context.patch
+locking-rwsem-add-__always_inline-annotation-to-__do.patch
+selftests-bpf-close-fd-in-error-path-in-drop_on_reus.patch
+bpf-annotate-btf-show-functions-with-__printf.patch
+bna-adjust-name-buf-size-of-bna_tcb-and-bna_ccb-stru.patch
+bpf-eliminate-remaining-make-w-1-warnings-in-kernel-.patch
+selftests-forwarding-devlink_lib-wait-for-udev-event.patch
+xdp-fix-invalid-wait-context-of-page_pool_destroy.patch
+drm-amd-pm-fix-aldebaran-pcie-speed-reporting.patch
+drm-amdgpu-check-if-nbio-funcs-are-null-in-amdgpu_de.patch
+drm-panel-boe-tv101wum-nl6-if-prepare-fails-disable-.patch
+drm-panel-boe-tv101wum-nl6-check-for-errors-on-the-n.patch
+media-dvb-usb-fix-unexpected-infinite-loop-in-dvb_us.patch
+media-imon-fix-race-getting-ictx-lock.patch
+media-i2c-fix-imx412-exposure-control.patch
+kvm-s390-pv-avoid-stalls-when-making-pages-secure.patch
+kvm-s390-pv-properly-handle-page-flags-for-protected.patch
+kvm-s390-pv-add-export-before-import.patch
+kvm-s390-fix-race-in-gmap_make_secure.patch
+s390-mm-convert-make_page_secure-to-use-a-folio.patch
+s390-mm-convert-gmap_make_secure-to-use-a-folio.patch
+s390-uv-don-t-call-folio_wait_writeback-without-a-fo.patch
+saa7134-unchecked-i2c_transfer-function-result-fixed.patch
+media-uvcvideo-override-default-flags.patch
+media-renesas-vsp1-fix-_irqsave-and-_irq-mix.patch
+media-renesas-vsp1-store-rpf-partition-configuration.patch
+drm-mediatek-add-missing-plane-settings-when-async-u.patch
+drm-mediatek-add-drm_mode_rotate_0-to-rotation-prope.patch
+leds-trigger-unregister-sysfs-attributes-before-call.patch
+perf-report-fix-condition-in-sort__sym_cmp.patch
+drm-etnaviv-fix-dma-direction-handling-for-cached-rw.patch
+drm-qxl-add-check-for-drm_cvt_mode.patch
+revert-leds-led-core-fix-refcount-leak-in-of_led_get.patch
+ext4-fix-infinite-loop-when-replaying-fast_commit.patch
+media-venus-flush-all-buffers-in-output-plane-stream.patch
+perf-intel-pt-fix-aux_watermark-calculation-for-64-b.patch
+perf-intel-pt-fix-exclude_guest-setting.patch
+mfd-rsmu-split-core-code-into-separate-module.patch
+mfd-omap-usb-tll-use-struct_size-to-allocate-tll.patch
+xprtrdma-fix-rpcrdma_reqs_reset.patch
+sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch
+nfsv4.1-another-fix-for-exchgid4_flag_use_pnfs_ds-fo.patch
+ext4-return-early-for-non-eligible-fast_commit-track.patch
+ext4-don-t-track-ranges-in-fast_commit-if-inode-has-.patch
+ext4-avoid-writing-unitialized-memory-to-disk-in-ea-.patch
+sparc64-fix-incorrect-function-signature-and-add-pro.patch
+sunrpc-fixup-gss_status-tracepoint-error-output.patch
+pci-fix-resource-double-counting-on-remove-rescan.patch
+clk-qcom-branch-add-helper-functions-for-setting-ret.patch
+clk-qcom-gcc-sc7280-update-force-mem-core-bit-for-uf.patch
+coresight-fix-ref-leak-when-of_coresight_parse_endpo.patch
+rdma-mlx5-set-mkeys-for-dmabuf-at-page_size.patch
+rdma-cache-release-gid-table-even-if-leak-is-detecte.patch
+input-qt1050-handle-chip_id-reading-error.patch
+rdma-mlx4-fix-truncated-output-warning-in-mad.c.patch
+rdma-mlx4-fix-truncated-output-warning-in-alias_guid.patch
+rdma-rxe-don-t-set-bth_ack_mask-for-uc-or-ud-qps.patch
+asoc-max98088-check-for-clk_prepare_enable-error.patch
+mtd-make-mtd_test.c-a-separate-module.patch
+rdma-device-return-error-earlier-if-port-in-not-vali.patch
+input-elan_i2c-do-not-leave-interrupt-disabled-on-su.patch
+pci-endpoint-clean-up-error-handling-in-vpci_scan_bu.patch
+vhost-vsock-always-initialize-seqpacket_allow.patch
+net-missing-check-virtio.patch
+mips-octeron-remove-source-file-executable-bit.patch
+powerpc-xmon-fix-disassembly-cpu-feature-checks.patch
+macintosh-therm_windtunnel-fix-module-unload.patch
+rdma-hns-fix-missing-pagesize-and-alignment-check-in.patch
+rdma-hns-fix-undifined-behavior-caused-by-invalid-ma.patch
+rdma-hns-fix-insufficient-extend-db-for-vfs.patch
+bnxt_re-fix-imm_data-endianness.patch
+netfilter-ctnetlink-use-helper-function-to-calculate.patch
+netfilter-nft_set_pipapo-constify-lookup-fn-args-whe.patch
+netfilter-nf_set_pipapo-fix-initial-map-fill.patch
+net-dsa-mv88e6xxx-limit-chip-wide-frame-size-config-.patch
+net-dsa-b53-limit-chip-wide-jumbo-frame-config-to-cp.patch
+fs-ntfs3-use-align-kernel-macro.patch
+fs-ntfs3-merge-synonym-compression_unit-and-ntfs_lzn.patch
+fs-ntfs3-fix-transform-resident-to-nonresident-for-c.patch
+fs-ntfs3-missed-ni_flag_update_parent-setting.patch
+fs-ntfs3-fix-getting-file-type.patch
+pinctrl-rockchip-update-rk3308-iomux-routes.patch
+pinctrl-core-fix-possible-memory-leak-when-pinctrl_e.patch
+pinctrl-single-fix-possible-memory-leak-when-pinctrl.patch
+pinctrl-ti-ti-iodelay-drop-if-block-with-always-fals.patch
+pinctrl-ti-ti-iodelay-fix-possible-memory-leak-when-.patch
+pinctrl-freescale-mxs-fix-refcount-of-child.patch
+fs-ntfs3-replace-inode_trylock-with-inode_lock.patch
+fs-ntfs3-fix-field-spanning-write-in-index_hdr.patch
+fs-proc-task_mmu-indicate-pm_file-for-pmd-mapped-fil.patch
+nilfs2-avoid-undefined-behavior-in-nilfs_cnt32_ge-ma.patch
+rtc-interface-add-rtc-offset-to-alarm-after-fix-up.patch
+fs-ntfs3-missed-error-return.patch
+s390-dasd-fix-error-checks-in-dasd_copy_pair_store.patch
diff --git a/queue-5.15/soc-qcom-pdr-fix-parsing-of-domains-lists.patch b/queue-5.15/soc-qcom-pdr-fix-parsing-of-domains-lists.patch
new file mode 100644 (file)
index 0000000..35c7758
--- /dev/null
@@ -0,0 +1,43 @@
+From d76e5d181bea1a7f6be46a05cf82dd2cc48488e5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 22 Jun 2024 01:03:41 +0300
+Subject: soc: qcom: pdr: fix parsing of domains lists
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit 57f20d51f35780f240ecf39d81cda23612800a92 ]
+
+While parsing the domains list, start offsets from 0 rather than from
+domains_read. The domains_read is equal to the total count of the
+domains we have seen, while the domains list in the message starts from
+offset 0.
+
+Fixes: fbe639b44a82 ("soc: qcom: Introduce Protection Domain Restart helpers")
+Tested-by: Steev Klimaszewski <steev@kali.org>
+Tested-by: Alexey Minnekhanov <alexeymin@postmarketos.org>
+Reviewed-by: Chris Lew <quic_clew@quicinc.com>
+Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20240622-qcom-pd-mapper-v9-2-a84ee3591c8e@linaro.org
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/soc/qcom/pdr_interface.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/soc/qcom/pdr_interface.c b/drivers/soc/qcom/pdr_interface.c
+index b308d942bbd6c..e20d97d7fb658 100644
+--- a/drivers/soc/qcom/pdr_interface.c
++++ b/drivers/soc/qcom/pdr_interface.c
+@@ -418,7 +418,7 @@ static int pdr_locate_service(struct pdr_handle *pdr, struct pdr_service *pds)
+               if (ret < 0)
+                       goto out;
+-              for (i = domains_read; i < resp->domain_list_len; i++) {
++              for (i = 0; i < resp->domain_list_len; i++) {
+                       entry = &resp->domain_list[i];
+                       if (strnlen(entry->name, sizeof(entry->name)) == sizeof(entry->name))
+-- 
+2.43.0
+
diff --git a/queue-5.15/soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch b/queue-5.15/soc-qcom-pdr-protect-locator_addr-with-the-main-mute.patch
new file mode 100644 (file)
index 0000000..cf09048
--- /dev/null
@@ -0,0 +1,73 @@
+From 3c1d7689484abfbb87bddef29e5ed1237fb6cd2d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 22 Jun 2024 01:03:40 +0300
+Subject: soc: qcom: pdr: protect locator_addr with the main mutex
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit 107924c14e3ddd85119ca43c26a4ee1056fa9b84 ]
+
+If the service locator server is restarted fast enough, the PDR can
+rewrite locator_addr fields concurrently. Protect them by placing
+modification of those fields under the main pdr->lock.
+
+Fixes: fbe639b44a82 ("soc: qcom: Introduce Protection Domain Restart helpers")
+Tested-by: Neil Armstrong <neil.armstrong@linaro.org> # on SM8550-QRD
+Tested-by: Steev Klimaszewski <steev@kali.org>
+Tested-by: Alexey Minnekhanov <alexeymin@postmarketos.org>
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20240622-qcom-pd-mapper-v9-1-a84ee3591c8e@linaro.org
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/soc/qcom/pdr_interface.c | 6 ++++--
+ 1 file changed, 4 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/soc/qcom/pdr_interface.c b/drivers/soc/qcom/pdr_interface.c
+index 915d5bc3d46e6..b308d942bbd6c 100644
+--- a/drivers/soc/qcom/pdr_interface.c
++++ b/drivers/soc/qcom/pdr_interface.c
+@@ -76,12 +76,12 @@ static int pdr_locator_new_server(struct qmi_handle *qmi,
+                                             locator_hdl);
+       struct pdr_service *pds;
++      mutex_lock(&pdr->lock);
+       /* Create a local client port for QMI communication */
+       pdr->locator_addr.sq_family = AF_QIPCRTR;
+       pdr->locator_addr.sq_node = svc->node;
+       pdr->locator_addr.sq_port = svc->port;
+-      mutex_lock(&pdr->lock);
+       pdr->locator_init_complete = true;
+       mutex_unlock(&pdr->lock);
+@@ -104,10 +104,10 @@ static void pdr_locator_del_server(struct qmi_handle *qmi,
+       mutex_lock(&pdr->lock);
+       pdr->locator_init_complete = false;
+-      mutex_unlock(&pdr->lock);
+       pdr->locator_addr.sq_node = 0;
+       pdr->locator_addr.sq_port = 0;
++      mutex_unlock(&pdr->lock);
+ }
+ static const struct qmi_ops pdr_locator_ops = {
+@@ -366,12 +366,14 @@ static int pdr_get_domain_list(struct servreg_get_domain_list_req *req,
+       if (ret < 0)
+               return ret;
++      mutex_lock(&pdr->lock);
+       ret = qmi_send_request(&pdr->locator_hdl,
+                              &pdr->locator_addr,
+                              &txn, SERVREG_GET_DOMAIN_LIST_REQ,
+                              SERVREG_GET_DOMAIN_LIST_REQ_MAX_LEN,
+                              servreg_get_domain_list_req_ei,
+                              req);
++      mutex_unlock(&pdr->lock);
+       if (ret < 0) {
+               qmi_txn_cancel(&txn);
+               return ret;
+-- 
+2.43.0
+
diff --git a/queue-5.15/soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch b/queue-5.15/soc-qcom-rpmh-rsc-ensure-irqs-aren-t-disabled-by-rpm.patch
new file mode 100644 (file)
index 0000000..d717d55
--- /dev/null
@@ -0,0 +1,84 @@
+From 8ce50323a23f0fadcf602dc357a86705bc18e211 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 May 2024 11:41:28 -0700
+Subject: soc: qcom: rpmh-rsc: Ensure irqs aren't disabled by
+ rpmh_rsc_send_data() callers
+
+From: Stephen Boyd <swboyd@chromium.org>
+
+[ Upstream commit e43111f52b9ec5c2d700f89a1d61c8d10dc2d9e9 ]
+
+Dan pointed out that Smatch is concerned about this code because it uses
+spin_lock_irqsave() and then calls wait_event_lock_irq() which enables
+irqs before going to sleep. The comment above the function says it
+should be called with interrupts enabled, but we simply hope that's true
+without really confirming that. Let's add a might_sleep() here to
+confirm that interrupts and preemption aren't disabled. Once we do that,
+we can change the lock to be non-saving, spin_lock_irq(), to clarify
+that we don't expect irqs to be disabled. If irqs are disabled by
+callers they're going to be enabled anyway in the wait_event_lock_irq()
+call which would be bad.
+
+This should make Smatch happier and find bad callers faster with the
+might_sleep(). We can drop the WARN_ON() in the caller because we have
+the might_sleep() now, simplifying the code.
+
+Reported-by: Dan Carpenter <dan.carpenter@linaro.org>
+Closes: https://lore.kernel.org/r/911181ed-c430-4592-ad26-4dc948834e08@moroto.mountain
+Fixes: 2bc20f3c8487 ("soc: qcom: rpmh-rsc: Sleep waiting for tcs slots to be free")
+Cc: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Stephen Boyd <swboyd@chromium.org>
+Reviewed-by: Douglas Anderson <dianders@chromium.org>
+Link: https://lore.kernel.org/r/20240509184129.3924422-1-swboyd@chromium.org
+Signed-off-by: Bjorn Andersson <andersson@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/soc/qcom/rpmh-rsc.c | 7 ++++---
+ drivers/soc/qcom/rpmh.c     | 1 -
+ 2 files changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/soc/qcom/rpmh-rsc.c b/drivers/soc/qcom/rpmh-rsc.c
+index b722e28d9ed62..4c9400cf6686b 100644
+--- a/drivers/soc/qcom/rpmh-rsc.c
++++ b/drivers/soc/qcom/rpmh-rsc.c
+@@ -608,13 +608,14 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg)
+ {
+       struct tcs_group *tcs;
+       int tcs_id;
+-      unsigned long flags;
++
++      might_sleep();
+       tcs = get_tcs_for_msg(drv, msg);
+       if (IS_ERR(tcs))
+               return PTR_ERR(tcs);
+-      spin_lock_irqsave(&drv->lock, flags);
++      spin_lock_irq(&drv->lock);
+       /* Wait forever for a free tcs. It better be there eventually! */
+       wait_event_lock_irq(drv->tcs_wait,
+@@ -632,7 +633,7 @@ int rpmh_rsc_send_data(struct rsc_drv *drv, const struct tcs_request *msg)
+               write_tcs_reg_sync(drv, RSC_DRV_CMD_ENABLE, tcs_id, 0);
+               enable_tcs_irq(drv, tcs_id, true);
+       }
+-      spin_unlock_irqrestore(&drv->lock, flags);
++      spin_unlock_irq(&drv->lock);
+       /*
+        * These two can be done after the lock is released because:
+diff --git a/drivers/soc/qcom/rpmh.c b/drivers/soc/qcom/rpmh.c
+index 01765ee9cdfb8..c6df7ac0afebc 100644
+--- a/drivers/soc/qcom/rpmh.c
++++ b/drivers/soc/qcom/rpmh.c
+@@ -189,7 +189,6 @@ static int __rpmh_write(const struct device *dev, enum rpmh_state state,
+       }
+       if (state == RPMH_ACTIVE_ONLY_STATE) {
+-              WARN_ON(irqs_disabled());
+               ret = rpmh_rsc_send_data(ctrlr_to_drv(ctrlr), &rpm_msg->msg);
+       } else {
+               /* Clean up our call by spoofing tx_done */
+-- 
+2.43.0
+
diff --git a/queue-5.15/sparc64-fix-incorrect-function-signature-and-add-pro.patch b/queue-5.15/sparc64-fix-incorrect-function-signature-and-add-pro.patch
new file mode 100644 (file)
index 0000000..5223b60
--- /dev/null
@@ -0,0 +1,75 @@
+From af51741a53b41ce5834b147319d5baf5ea1cb2e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jul 2024 11:41:53 +0200
+Subject: sparc64: Fix incorrect function signature and add prototype for
+ prom_cif_init
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Andreas Larsson <andreas@gaisler.com>
+
+[ Upstream commit a6c3ea1ec96307dbfbb2f16d96c674c5cc80f445 ]
+
+Remove the unused cif_stack argument and add a protype in oplib_64.h
+Commit ef3e035c3a9b ("sparc64: Fix register corruption in top-most
+kernel stack frame during boot.") removed the cif_stack argument to
+prom_cif init in the declaration at the caller site and the usage of it
+within prom_cif_init, but not in the function signature of the function
+itself.
+
+This also fixes the following warning:
+arch/sparc/prom/p1275.c:52:6: warning: no previous prototype for ‘prom_cif_init’
+
+Fixes: ef3e035c3a9b ("sparc64: Fix register corruption in top-most kernel stack frame during boot.")
+Link: https://lore.kernel.org/r/20240710094155.458731-3-andreas@gaisler.com
+Signed-off-by: Andreas Larsson <andreas@gaisler.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/sparc/include/asm/oplib_64.h | 1 +
+ arch/sparc/prom/init_64.c         | 3 ---
+ arch/sparc/prom/p1275.c           | 2 +-
+ 3 files changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/arch/sparc/include/asm/oplib_64.h b/arch/sparc/include/asm/oplib_64.h
+index a67abebd43592..1b86d02a84556 100644
+--- a/arch/sparc/include/asm/oplib_64.h
++++ b/arch/sparc/include/asm/oplib_64.h
+@@ -247,6 +247,7 @@ void prom_sun4v_guest_soft_state(void);
+ int prom_ihandle2path(int handle, char *buffer, int bufsize);
+ /* Client interface level routines. */
++void prom_cif_init(void *cif_handler);
+ void p1275_cmd_direct(unsigned long *);
+ #endif /* !(__SPARC64_OPLIB_H) */
+diff --git a/arch/sparc/prom/init_64.c b/arch/sparc/prom/init_64.c
+index 103aa91043185..f7b8a1a865b8f 100644
+--- a/arch/sparc/prom/init_64.c
++++ b/arch/sparc/prom/init_64.c
+@@ -26,9 +26,6 @@ phandle prom_chosen_node;
+  * routines in the prom library.
+  * It gets passed the pointer to the PROM vector.
+  */
+-
+-extern void prom_cif_init(void *);
+-
+ void __init prom_init(void *cif_handler)
+ {
+       phandle node;
+diff --git a/arch/sparc/prom/p1275.c b/arch/sparc/prom/p1275.c
+index 889aa602f8d86..51c3f984bbf72 100644
+--- a/arch/sparc/prom/p1275.c
++++ b/arch/sparc/prom/p1275.c
+@@ -49,7 +49,7 @@ void p1275_cmd_direct(unsigned long *args)
+       local_irq_restore(flags);
+ }
+-void prom_cif_init(void *cif_handler, void *cif_stack)
++void prom_cif_init(void *cif_handler)
+ {
+       p1275buf.prom_cif_handler = (void (*)(long *))cif_handler;
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch b/queue-5.15/sunrpc-avoid-soft-lockup-when-transmitting-udp-to-re.patch
new file mode 100644 (file)
index 0000000..44c914d
--- /dev/null
@@ -0,0 +1,57 @@
+From 0ef3626a452a8a5a0a26ad359f488c34bb15c6b3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 19 Jun 2024 11:05:13 +1000
+Subject: SUNRPC: avoid soft lockup when transmitting UDP to reachable server.
+
+From: NeilBrown <neilb@suse.de>
+
+[ Upstream commit 6258cf25d5e3155c3219ab5a79b970eef7996356 ]
+
+Prior to the commit identified below, call_transmit_status() would
+handle -EPERM and other errors related to an unreachable server by
+falling through to call_status() which added a 3-second delay and
+handled the failure as a timeout.
+
+Since that commit, call_transmit_status() falls through to
+handle_bind().  For UDP this moves straight on to handle_connect() and
+handle_transmit() so we immediately retransmit - and likely get the same
+error.
+
+This results in an indefinite loop in __rpc_execute() which triggers a
+soft-lockup warning.
+
+For the errors that indicate an unreachable server,
+call_transmit_status() should fall back to call_status() as it did
+before.  This cannot cause the thundering herd that the previous patch
+was avoiding, as the call_status() will insert a delay.
+
+Fixes: ed7dc973bd91 ("SUNRPC: Prevent thundering herd when the socket is not connected")
+Signed-off-by: NeilBrown <neilb@suse.de>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sunrpc/clnt.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/net/sunrpc/clnt.c b/net/sunrpc/clnt.c
+index f73d4593625cd..38071a6780211 100644
+--- a/net/sunrpc/clnt.c
++++ b/net/sunrpc/clnt.c
+@@ -2226,12 +2226,13 @@ call_transmit_status(struct rpc_task *task)
+               task->tk_action = call_transmit;
+               task->tk_status = 0;
+               break;
+-      case -ECONNREFUSED:
+       case -EHOSTDOWN:
+       case -ENETDOWN:
+       case -EHOSTUNREACH:
+       case -ENETUNREACH:
+       case -EPERM:
++              break;
++      case -ECONNREFUSED:
+               if (RPC_IS_SOFTCONN(task)) {
+                       if (!task->tk_msg.rpc_proc->p_proc)
+                               trace_xprt_ping(task->tk_xprt,
+-- 
+2.43.0
+
diff --git a/queue-5.15/sunrpc-fixup-gss_status-tracepoint-error-output.patch b/queue-5.15/sunrpc-fixup-gss_status-tracepoint-error-output.patch
new file mode 100644 (file)
index 0000000..198394e
--- /dev/null
@@ -0,0 +1,36 @@
+From 5cb70b8ec8a21a4de0d7536b38292142a8ab6034 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 11 Jul 2024 13:21:00 -0400
+Subject: SUNRPC: Fixup gss_status tracepoint error output
+
+From: Benjamin Coddington <bcodding@redhat.com>
+
+[ Upstream commit b9fae9f06d84ffab0f3f9118f3a96bbcdc528bf6 ]
+
+The GSS routine errors are values, not flags.
+
+Fixes: 0c77668ddb4e ("SUNRPC: Introduce trace points in rpc_auth_gss.ko")
+Signed-off-by: Benjamin Coddington <bcodding@redhat.com>
+Reviewed-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/trace/events/rpcgss.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/trace/events/rpcgss.h b/include/trace/events/rpcgss.h
+index 6959255ccfa98..3e4f767fbfc12 100644
+--- a/include/trace/events/rpcgss.h
++++ b/include/trace/events/rpcgss.h
+@@ -54,7 +54,7 @@ TRACE_DEFINE_ENUM(GSS_S_UNSEQ_TOKEN);
+ TRACE_DEFINE_ENUM(GSS_S_GAP_TOKEN);
+ #define show_gss_status(x)                                            \
+-      __print_flags(x, "|",                                           \
++      __print_symbolic(x,                                             \
+               { GSS_S_BAD_MECH, "GSS_S_BAD_MECH" },                   \
+               { GSS_S_BAD_NAME, "GSS_S_BAD_NAME" },                   \
+               { GSS_S_BAD_NAMETYPE, "GSS_S_BAD_NAMETYPE" },           \
+-- 
+2.43.0
+
diff --git a/queue-5.15/tcp-add-tcp_done_with_error-helper.patch b/queue-5.15/tcp-add-tcp_done_with_error-helper.patch
new file mode 100644 (file)
index 0000000..d2c705a
--- /dev/null
@@ -0,0 +1,115 @@
+From 37b3e87f385325a0a16f7040570278404ef14276 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 May 2024 12:52:50 +0000
+Subject: tcp: add tcp_done_with_error() helper
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 5e514f1cba090e1c8fff03e92a175eccfe46305f ]
+
+tcp_reset() ends with a sequence that is carefuly ordered.
+
+We need to fix [e]poll bugs in the following patches,
+it makes sense to use a common helper.
+
+Suggested-by: Neal Cardwell <ncardwell@google.com>
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Acked-by: Neal Cardwell <ncardwell@google.com>
+Link: https://lore.kernel.org/r/20240528125253.1966136-2-edumazet@google.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Stable-dep-of: 853c3bd7b791 ("tcp: fix race in tcp_write_err()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/tcp.h    |  1 +
+ net/ipv4/tcp.c       |  2 +-
+ net/ipv4/tcp_input.c | 32 +++++++++++++++++++++-----------
+ 3 files changed, 23 insertions(+), 12 deletions(-)
+
+diff --git a/include/net/tcp.h b/include/net/tcp.h
+index 30f8111f750b5..061e15a1ac87d 100644
+--- a/include/net/tcp.h
++++ b/include/net/tcp.h
+@@ -612,6 +612,7 @@ void tcp_skb_collapse_tstamp(struct sk_buff *skb,
+ /* tcp_input.c */
+ void tcp_rearm_rto(struct sock *sk);
+ void tcp_synack_rtt_meas(struct sock *sk, struct request_sock *req);
++void tcp_done_with_error(struct sock *sk, int err);
+ void tcp_reset(struct sock *sk, struct sk_buff *skb);
+ void tcp_skb_mark_lost_uncond_verify(struct tcp_sock *tp, struct sk_buff *skb);
+ void tcp_fin(struct sock *sk);
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index db3bfe1a8443c..3c85ecab14457 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -592,7 +592,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
+                */
+               mask |= EPOLLOUT | EPOLLWRNORM;
+       }
+-      /* This barrier is coupled with smp_wmb() in tcp_reset() */
++      /* This barrier is coupled with smp_wmb() in tcp_done_with_error() */
+       smp_rmb();
+       if (READ_ONCE(sk->sk_err) ||
+           !skb_queue_empty_lockless(&sk->sk_error_queue))
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index bb20ae8dba09b..c51ad6b353eef 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -4348,9 +4348,26 @@ static inline bool tcp_sequence(const struct tcp_sock *tp, u32 seq, u32 end_seq)
+               !after(seq, tp->rcv_nxt + tcp_receive_window(tp));
+ }
++
++void tcp_done_with_error(struct sock *sk, int err)
++{
++      /* This barrier is coupled with smp_rmb() in tcp_poll() */
++      WRITE_ONCE(sk->sk_err, err);
++      smp_wmb();
++
++      tcp_write_queue_purge(sk);
++      tcp_done(sk);
++
++      if (!sock_flag(sk, SOCK_DEAD))
++              sk_error_report(sk);
++}
++EXPORT_SYMBOL(tcp_done_with_error);
++
+ /* When we get a reset we do this. */
+ void tcp_reset(struct sock *sk, struct sk_buff *skb)
+ {
++      int err;
++
+       trace_tcp_receive_reset(sk);
+       /* mptcp can't tell us to ignore reset pkts,
+@@ -4362,24 +4379,17 @@ void tcp_reset(struct sock *sk, struct sk_buff *skb)
+       /* We want the right error as BSD sees it (and indeed as we do). */
+       switch (sk->sk_state) {
+       case TCP_SYN_SENT:
+-              WRITE_ONCE(sk->sk_err, ECONNREFUSED);
++              err = ECONNREFUSED;
+               break;
+       case TCP_CLOSE_WAIT:
+-              WRITE_ONCE(sk->sk_err, EPIPE);
++              err = EPIPE;
+               break;
+       case TCP_CLOSE:
+               return;
+       default:
+-              WRITE_ONCE(sk->sk_err, ECONNRESET);
++              err = ECONNRESET;
+       }
+-      /* This barrier is coupled with smp_rmb() in tcp_poll() */
+-      smp_wmb();
+-
+-      tcp_write_queue_purge(sk);
+-      tcp_done(sk);
+-
+-      if (!sock_flag(sk, SOCK_DEAD))
+-              sk_error_report(sk);
++      tcp_done_with_error(sk, err);
+ }
+ /*
+-- 
+2.43.0
+
diff --git a/queue-5.15/tcp-annotate-lockless-access-to-sk-sk_err.patch b/queue-5.15/tcp-annotate-lockless-access-to-sk-sk_err.patch
new file mode 100644 (file)
index 0000000..d191f83
--- /dev/null
@@ -0,0 +1,167 @@
+From 393ff69ea3a0afb3e0752ca4dd621a59dbd96a2d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Mar 2023 20:57:44 +0000
+Subject: tcp: annotate lockless access to sk->sk_err
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit e13ec3da05d130f0d10da8e1fbe1be26dcdb0e27 ]
+
+tcp_poll() reads sk->sk_err without socket lock held/owned.
+
+We should used READ_ONCE() here, and update writers
+to use WRITE_ONCE().
+
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Stable-dep-of: 853c3bd7b791 ("tcp: fix race in tcp_write_err()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp.c        | 11 ++++++-----
+ net/ipv4/tcp_input.c  |  6 +++---
+ net/ipv4/tcp_ipv4.c   |  4 ++--
+ net/ipv4/tcp_output.c |  2 +-
+ net/ipv4/tcp_timer.c  |  2 +-
+ net/ipv6/tcp_ipv6.c   |  4 ++--
+ 6 files changed, 15 insertions(+), 14 deletions(-)
+
+diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
+index c1602b36dee42..db3bfe1a8443c 100644
+--- a/net/ipv4/tcp.c
++++ b/net/ipv4/tcp.c
+@@ -594,7 +594,8 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
+       }
+       /* This barrier is coupled with smp_wmb() in tcp_reset() */
+       smp_rmb();
+-      if (sk->sk_err || !skb_queue_empty_lockless(&sk->sk_error_queue))
++      if (READ_ONCE(sk->sk_err) ||
++          !skb_queue_empty_lockless(&sk->sk_error_queue))
+               mask |= EPOLLERR;
+       return mask;
+@@ -2995,7 +2996,7 @@ int tcp_disconnect(struct sock *sk, int flags)
+       if (old_state == TCP_LISTEN) {
+               inet_csk_listen_stop(sk);
+       } else if (unlikely(tp->repair)) {
+-              sk->sk_err = ECONNABORTED;
++              WRITE_ONCE(sk->sk_err, ECONNABORTED);
+       } else if (tcp_need_reset(old_state) ||
+                  (tp->snd_nxt != tp->write_seq &&
+                   (1 << old_state) & (TCPF_CLOSING | TCPF_LAST_ACK))) {
+@@ -3003,9 +3004,9 @@ int tcp_disconnect(struct sock *sk, int flags)
+                * states
+                */
+               tcp_send_active_reset(sk, gfp_any());
+-              sk->sk_err = ECONNRESET;
++              WRITE_ONCE(sk->sk_err, ECONNRESET);
+       } else if (old_state == TCP_SYN_SENT)
+-              sk->sk_err = ECONNRESET;
++              WRITE_ONCE(sk->sk_err, ECONNRESET);
+       tcp_clear_xmit_timers(sk);
+       __skb_queue_purge(&sk->sk_receive_queue);
+@@ -4513,7 +4514,7 @@ int tcp_abort(struct sock *sk, int err)
+       bh_lock_sock(sk);
+       if (!sock_flag(sk, SOCK_DEAD)) {
+-              sk->sk_err = err;
++              WRITE_ONCE(sk->sk_err, err);
+               /* This barrier is coupled with smp_rmb() in tcp_poll() */
+               smp_wmb();
+               sk_error_report(sk);
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index d3273d6dce7e9..bb20ae8dba09b 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -4362,15 +4362,15 @@ void tcp_reset(struct sock *sk, struct sk_buff *skb)
+       /* We want the right error as BSD sees it (and indeed as we do). */
+       switch (sk->sk_state) {
+       case TCP_SYN_SENT:
+-              sk->sk_err = ECONNREFUSED;
++              WRITE_ONCE(sk->sk_err, ECONNREFUSED);
+               break;
+       case TCP_CLOSE_WAIT:
+-              sk->sk_err = EPIPE;
++              WRITE_ONCE(sk->sk_err, EPIPE);
+               break;
+       case TCP_CLOSE:
+               return;
+       default:
+-              sk->sk_err = ECONNRESET;
++              WRITE_ONCE(sk->sk_err, ECONNRESET);
+       }
+       /* This barrier is coupled with smp_rmb() in tcp_poll() */
+       smp_wmb();
+diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
+index 901c873fbaf5a..a1ed81ff9a81d 100644
+--- a/net/ipv4/tcp_ipv4.c
++++ b/net/ipv4/tcp_ipv4.c
+@@ -593,7 +593,7 @@ int tcp_v4_err(struct sk_buff *skb, u32 info)
+               ip_icmp_error(sk, skb, err, th->dest, info, (u8 *)th);
+               if (!sock_owned_by_user(sk)) {
+-                      sk->sk_err = err;
++                      WRITE_ONCE(sk->sk_err, err);
+                       sk_error_report(sk);
+@@ -622,7 +622,7 @@ int tcp_v4_err(struct sk_buff *skb, u32 info)
+       inet = inet_sk(sk);
+       if (!sock_owned_by_user(sk) && inet->recverr) {
+-              sk->sk_err = err;
++              WRITE_ONCE(sk->sk_err, err);
+               sk_error_report(sk);
+       } else  { /* Only an error on timeout */
+               WRITE_ONCE(sk->sk_err_soft, err);
+diff --git a/net/ipv4/tcp_output.c b/net/ipv4/tcp_output.c
+index 0fb84e57a2d49..2c9670c832020 100644
+--- a/net/ipv4/tcp_output.c
++++ b/net/ipv4/tcp_output.c
+@@ -3724,7 +3724,7 @@ static void tcp_connect_init(struct sock *sk)
+       tp->rx_opt.rcv_wscale = rcv_wscale;
+       tp->rcv_ssthresh = tp->rcv_wnd;
+-      sk->sk_err = 0;
++      WRITE_ONCE(sk->sk_err, 0);
+       sock_reset_flag(sk, SOCK_DONE);
+       tp->snd_wnd = 0;
+       tcp_init_wl(tp, 0);
+diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
+index 1a26130807f73..ed01b775b8947 100644
+--- a/net/ipv4/tcp_timer.c
++++ b/net/ipv4/tcp_timer.c
+@@ -67,7 +67,7 @@ u32 tcp_clamp_probe0_to_user_timeout(const struct sock *sk, u32 when)
+ static void tcp_write_err(struct sock *sk)
+ {
+-      sk->sk_err = READ_ONCE(sk->sk_err_soft) ? : ETIMEDOUT;
++      WRITE_ONCE(sk->sk_err, READ_ONCE(sk->sk_err_soft) ? : ETIMEDOUT);
+       sk_error_report(sk);
+       tcp_write_queue_purge(sk);
+diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
+index afdaa2e3cb6ef..c9aee34ae469f 100644
+--- a/net/ipv6/tcp_ipv6.c
++++ b/net/ipv6/tcp_ipv6.c
+@@ -486,7 +486,7 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+               ipv6_icmp_error(sk, skb, err, th->dest, ntohl(info), (u8 *)th);
+               if (!sock_owned_by_user(sk)) {
+-                      sk->sk_err = err;
++                      WRITE_ONCE(sk->sk_err, err);
+                       sk_error_report(sk);            /* Wake people up to see the error (see connect in sock.c) */
+                       tcp_done(sk);
+@@ -506,7 +506,7 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+       }
+       if (!sock_owned_by_user(sk) && np->recverr) {
+-              sk->sk_err = err;
++              WRITE_ONCE(sk->sk_err, err);
+               sk_error_report(sk);
+       } else {
+               WRITE_ONCE(sk->sk_err_soft, err);
+-- 
+2.43.0
+
diff --git a/queue-5.15/tcp-annotate-lockless-accesses-to-sk-sk_err_soft.patch b/queue-5.15/tcp-annotate-lockless-accesses-to-sk-sk_err_soft.patch
new file mode 100644 (file)
index 0000000..74007d6
--- /dev/null
@@ -0,0 +1,129 @@
+From 0e4363cd20a79791a4752b233f2bbe996a7ad8f7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 Mar 2023 20:57:41 +0000
+Subject: tcp: annotate lockless accesses to sk->sk_err_soft
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit cee1af825d65b8122627fc2efbc36c1bd51ee103 ]
+
+This field can be read/written without lock synchronization.
+
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Stable-dep-of: 853c3bd7b791 ("tcp: fix race in tcp_write_err()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp_input.c |  2 +-
+ net/ipv4/tcp_ipv4.c  |  6 +++---
+ net/ipv4/tcp_timer.c |  6 +++---
+ net/ipv6/tcp_ipv6.c  | 11 ++++++-----
+ 4 files changed, 13 insertions(+), 12 deletions(-)
+
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index 48d45022dedaf..d3273d6dce7e9 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -3915,7 +3915,7 @@ static int tcp_ack(struct sock *sk, const struct sk_buff *skb, int flag)
+       /* We passed data and got it acked, remove any soft error
+        * log. Something worked...
+        */
+-      sk->sk_err_soft = 0;
++      WRITE_ONCE(sk->sk_err_soft, 0);
+       icsk->icsk_probes_out = 0;
+       tp->rcv_tstamp = tcp_jiffies32;
+       if (!prior_packets)
+diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
+index e9b1dcf2d463a..901c873fbaf5a 100644
+--- a/net/ipv4/tcp_ipv4.c
++++ b/net/ipv4/tcp_ipv4.c
+@@ -361,7 +361,7 @@ void tcp_v4_mtu_reduced(struct sock *sk)
+        * for the case, if this connection will not able to recover.
+        */
+       if (mtu < dst_mtu(dst) && ip_dont_fragment(sk, dst))
+-              sk->sk_err_soft = EMSGSIZE;
++              WRITE_ONCE(sk->sk_err_soft, EMSGSIZE);
+       mtu = dst_mtu(dst);
+@@ -599,7 +599,7 @@ int tcp_v4_err(struct sk_buff *skb, u32 info)
+                       tcp_done(sk);
+               } else {
+-                      sk->sk_err_soft = err;
++                      WRITE_ONCE(sk->sk_err_soft, err);
+               }
+               goto out;
+       }
+@@ -625,7 +625,7 @@ int tcp_v4_err(struct sk_buff *skb, u32 info)
+               sk->sk_err = err;
+               sk_error_report(sk);
+       } else  { /* Only an error on timeout */
+-              sk->sk_err_soft = err;
++              WRITE_ONCE(sk->sk_err_soft, err);
+       }
+ out:
+diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
+index 11569900b729f..1a26130807f73 100644
+--- a/net/ipv4/tcp_timer.c
++++ b/net/ipv4/tcp_timer.c
+@@ -67,7 +67,7 @@ u32 tcp_clamp_probe0_to_user_timeout(const struct sock *sk, u32 when)
+ static void tcp_write_err(struct sock *sk)
+ {
+-      sk->sk_err = sk->sk_err_soft ? : ETIMEDOUT;
++      sk->sk_err = READ_ONCE(sk->sk_err_soft) ? : ETIMEDOUT;
+       sk_error_report(sk);
+       tcp_write_queue_purge(sk);
+@@ -110,7 +110,7 @@ static int tcp_out_of_resources(struct sock *sk, bool do_reset)
+               shift++;
+       /* If some dubious ICMP arrived, penalize even more. */
+-      if (sk->sk_err_soft)
++      if (READ_ONCE(sk->sk_err_soft))
+               shift++;
+       if (tcp_check_oom(sk, shift)) {
+@@ -146,7 +146,7 @@ static int tcp_orphan_retries(struct sock *sk, bool alive)
+       int retries = READ_ONCE(sock_net(sk)->ipv4.sysctl_tcp_orphan_retries); /* May be zero. */
+       /* We know from an ICMP that something is wrong. */
+-      if (sk->sk_err_soft && !alive)
++      if (READ_ONCE(sk->sk_err_soft) && !alive)
+               retries = 0;
+       /* However, if socket sent something recently, select some safe
+diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
+index 78c7b0fb6ffe7..afdaa2e3cb6ef 100644
+--- a/net/ipv6/tcp_ipv6.c
++++ b/net/ipv6/tcp_ipv6.c
+@@ -490,8 +490,9 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+                       sk_error_report(sk);            /* Wake people up to see the error (see connect in sock.c) */
+                       tcp_done(sk);
+-              } else
+-                      sk->sk_err_soft = err;
++              } else {
++                      WRITE_ONCE(sk->sk_err_soft, err);
++              }
+               goto out;
+       case TCP_LISTEN:
+               break;
+@@ -507,9 +508,9 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+       if (!sock_owned_by_user(sk) && np->recverr) {
+               sk->sk_err = err;
+               sk_error_report(sk);
+-      } else
+-              sk->sk_err_soft = err;
+-
++      } else {
++              WRITE_ONCE(sk->sk_err_soft, err);
++      }
+ out:
+       bh_unlock_sock(sk);
+       sock_put(sk);
+-- 
+2.43.0
+
diff --git a/queue-5.15/tcp-fix-race-in-tcp_write_err.patch b/queue-5.15/tcp-fix-race-in-tcp_write_err.patch
new file mode 100644 (file)
index 0000000..4c74737
--- /dev/null
@@ -0,0 +1,64 @@
+From 4b63d16e634179e97287f9a4713194efbd92ad76 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 May 2024 12:52:51 +0000
+Subject: tcp: fix race in tcp_write_err()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit 853c3bd7b7917670224c9fe5245bd045cac411dd ]
+
+I noticed flakes in a packetdrill test, expecting an epoll_wait()
+to return EPOLLERR | EPOLLHUP on a failed connect() attempt,
+after multiple SYN retransmits. It sometimes return EPOLLERR only.
+
+The issue is that tcp_write_err():
+ 1) writes an error in sk->sk_err,
+ 2) calls sk_error_report(),
+ 3) then calls tcp_done().
+
+tcp_done() is writing SHUTDOWN_MASK into sk->sk_shutdown,
+among other things.
+
+Problem is that the awaken user thread (from 2) sk_error_report())
+might call tcp_poll() before tcp_done() has written sk->sk_shutdown.
+
+tcp_poll() only sees a non zero sk->sk_err and returns EPOLLERR.
+
+This patch fixes the issue by making sure to call sk_error_report()
+after tcp_done().
+
+tcp_write_err() also lacks an smp_wmb().
+
+We can reuse tcp_done_with_error() to factor out the details,
+as Neal suggested.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Acked-by: Neal Cardwell <ncardwell@google.com>
+Link: https://lore.kernel.org/r/20240528125253.1966136-3-edumazet@google.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp_timer.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/net/ipv4/tcp_timer.c b/net/ipv4/tcp_timer.c
+index ed01b775b8947..1a3a84992b9be 100644
+--- a/net/ipv4/tcp_timer.c
++++ b/net/ipv4/tcp_timer.c
+@@ -67,11 +67,7 @@ u32 tcp_clamp_probe0_to_user_timeout(const struct sock *sk, u32 when)
+ static void tcp_write_err(struct sock *sk)
+ {
+-      WRITE_ONCE(sk->sk_err, READ_ONCE(sk->sk_err_soft) ? : ETIMEDOUT);
+-      sk_error_report(sk);
+-
+-      tcp_write_queue_purge(sk);
+-      tcp_done(sk);
++      tcp_done_with_error(sk, READ_ONCE(sk->sk_err_soft) ? : ETIMEDOUT);
+       __NET_INC_STATS(sock_net(sk), LINUX_MIB_TCPABORTONTIMEOUT);
+ }
+-- 
+2.43.0
+
diff --git a/queue-5.15/tcp-fix-races-in-tcp_v-46-_err.patch b/queue-5.15/tcp-fix-races-in-tcp_v-46-_err.patch
new file mode 100644 (file)
index 0000000..7ece6ca
--- /dev/null
@@ -0,0 +1,83 @@
+From 69c7f23fc0adf90401bf3443a6391ae217eb9f83 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 May 2024 12:52:53 +0000
+Subject: tcp: fix races in tcp_v[46]_err()
+
+From: Eric Dumazet <edumazet@google.com>
+
+[ Upstream commit fde6f897f2a184546bf5516ac736523ef24dc6a7 ]
+
+These functions have races when they:
+
+1) Write sk->sk_err
+2) call sk_error_report(sk)
+3) call tcp_done(sk)
+
+As described in prior patches in this series:
+
+An smp_wmb() is missing.
+We should call tcp_done() before sk_error_report(sk)
+to have consistent tcp_poll() results on SMP hosts.
+
+Use tcp_done_with_error() where we centralized the
+correct sequence.
+
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Signed-off-by: Eric Dumazet <edumazet@google.com>
+Acked-by: Neal Cardwell <ncardwell@google.com>
+Link: https://lore.kernel.org/r/20240528125253.1966136-5-edumazet@google.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp_ipv4.c | 11 +++--------
+ net/ipv6/tcp_ipv6.c | 10 +++-------
+ 2 files changed, 6 insertions(+), 15 deletions(-)
+
+diff --git a/net/ipv4/tcp_ipv4.c b/net/ipv4/tcp_ipv4.c
+index a1ed81ff9a81d..44a9fa957301b 100644
+--- a/net/ipv4/tcp_ipv4.c
++++ b/net/ipv4/tcp_ipv4.c
+@@ -592,15 +592,10 @@ int tcp_v4_err(struct sk_buff *skb, u32 info)
+               ip_icmp_error(sk, skb, err, th->dest, info, (u8 *)th);
+-              if (!sock_owned_by_user(sk)) {
+-                      WRITE_ONCE(sk->sk_err, err);
+-
+-                      sk_error_report(sk);
+-
+-                      tcp_done(sk);
+-              } else {
++              if (!sock_owned_by_user(sk))
++                      tcp_done_with_error(sk, err);
++              else
+                       WRITE_ONCE(sk->sk_err_soft, err);
+-              }
+               goto out;
+       }
+diff --git a/net/ipv6/tcp_ipv6.c b/net/ipv6/tcp_ipv6.c
+index c9aee34ae469f..fedbce7ed853e 100644
+--- a/net/ipv6/tcp_ipv6.c
++++ b/net/ipv6/tcp_ipv6.c
+@@ -485,14 +485,10 @@ static int tcp_v6_err(struct sk_buff *skb, struct inet6_skb_parm *opt,
+               ipv6_icmp_error(sk, skb, err, th->dest, ntohl(info), (u8 *)th);
+-              if (!sock_owned_by_user(sk)) {
+-                      WRITE_ONCE(sk->sk_err, err);
+-                      sk_error_report(sk);            /* Wake people up to see the error (see connect in sock.c) */
+-
+-                      tcp_done(sk);
+-              } else {
++              if (!sock_owned_by_user(sk))
++                      tcp_done_with_error(sk, err);
++              else
+                       WRITE_ONCE(sk->sk_err_soft, err);
+-              }
+               goto out;
+       case TCP_LISTEN:
+               break;
+-- 
+2.43.0
+
diff --git a/queue-5.15/vhost-vsock-always-initialize-seqpacket_allow.patch b/queue-5.15/vhost-vsock-always-initialize-seqpacket_allow.patch
new file mode 100644 (file)
index 0000000..f45a894
--- /dev/null
@@ -0,0 +1,68 @@
+From a999784dcb8fb714861cf07be1daabd43d8fd8d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 22 Apr 2024 10:03:13 -0400
+Subject: vhost/vsock: always initialize seqpacket_allow
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Michael S. Tsirkin <mst@redhat.com>
+
+[ Upstream commit 1e1fdcbdde3b7663e5d8faeb2245b9b151417d22 ]
+
+There are two issues around seqpacket_allow:
+1. seqpacket_allow is not initialized when socket is
+   created. Thus if features are never set, it will be
+   read uninitialized.
+2. if VIRTIO_VSOCK_F_SEQPACKET is set and then cleared,
+   then seqpacket_allow will not be cleared appropriately
+   (existing apps I know about don't usually do this but
+    it's legal and there's no way to be sure no one relies
+    on this).
+
+To fix:
+       - initialize seqpacket_allow after allocation
+       - set it unconditionally in set_features
+
+Reported-by: syzbot+6c21aeb59d0e82eb2782@syzkaller.appspotmail.com
+Reported-by: Jeongjun Park <aha310510@gmail.com>
+Fixes: ced7b713711f ("vhost/vsock: support SEQPACKET for transport").
+Tested-by: Arseny Krasnov <arseny.krasnov@kaspersky.com>
+Cc: David S. Miller <davem@davemloft.net>
+Cc: Stefan Hajnoczi <stefanha@redhat.com>
+Message-ID: <20240422100010-mutt-send-email-mst@kernel.org>
+Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
+Acked-by: Jason Wang <jasowang@redhat.com>
+Reviewed-by: Stefano Garzarella <sgarzare@redhat.com>
+Reviewed-by: Eugenio Pérez <eperezma@redhat.com>
+Acked-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/vhost/vsock.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/vhost/vsock.c b/drivers/vhost/vsock.c
+index 74ac0c28fe43a..531e3e139c0d0 100644
+--- a/drivers/vhost/vsock.c
++++ b/drivers/vhost/vsock.c
+@@ -684,6 +684,7 @@ static int vhost_vsock_dev_open(struct inode *inode, struct file *file)
+       }
+       vsock->guest_cid = 0; /* no CID assigned yet */
++      vsock->seqpacket_allow = false;
+       atomic_set(&vsock->queued_replies, 0);
+@@ -842,8 +843,7 @@ static int vhost_vsock_set_features(struct vhost_vsock *vsock, u64 features)
+                       goto err;
+       }
+-      if (features & (1ULL << VIRTIO_VSOCK_F_SEQPACKET))
+-              vsock->seqpacket_allow = true;
++      vsock->seqpacket_allow = features & (1ULL << VIRTIO_VSOCK_F_SEQPACKET);
+       for (i = 0; i < ARRAY_SIZE(vsock->vqs); i++) {
+               vq = &vsock->vqs[i];
+-- 
+2.43.0
+
diff --git a/queue-5.15/vmlinux.lds.h-catch-.bss.l-sections-into-bss.patch b/queue-5.15/vmlinux.lds.h-catch-.bss.l-sections-into-bss.patch
new file mode 100644 (file)
index 0000000..03f4c30
--- /dev/null
@@ -0,0 +1,57 @@
+From 8fcac2abdb4252db1359064f0e4b2322bf8d5681 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jul 2024 07:51:58 +0200
+Subject: vmlinux.lds.h: catch .bss..L* sections into BSS")
+
+From: Christophe Leroy <christophe.leroy@csgroup.eu>
+
+[ Upstream commit 1a7b7326d587c9a5e8ff067e70d6aaf0333f4bb3 ]
+
+Commit 9a427556fb8e ("vmlinux.lds.h: catch compound literals into
+data and BSS") added catches for .data..L* and .rodata..L* but missed
+.bss..L*
+
+Since commit 5431fdd2c181 ("ptrace: Convert ptrace_attach() to use
+lock guards") the following appears at build:
+
+  LD      .tmp_vmlinux.kallsyms1
+powerpc64-linux-ld: warning: orphan section `.bss..Lubsan_data33' from `kernel/ptrace.o' being placed in section `.bss..Lubsan_data33'
+  NM      .tmp_vmlinux.kallsyms1.syms
+  KSYMS   .tmp_vmlinux.kallsyms1.S
+  AS      .tmp_vmlinux.kallsyms1.S
+  LD      .tmp_vmlinux.kallsyms2
+powerpc64-linux-ld: warning: orphan section `.bss..Lubsan_data33' from `kernel/ptrace.o' being placed in section `.bss..Lubsan_data33'
+  NM      .tmp_vmlinux.kallsyms2.syms
+  KSYMS   .tmp_vmlinux.kallsyms2.S
+  AS      .tmp_vmlinux.kallsyms2.S
+  LD      vmlinux
+powerpc64-linux-ld: warning: orphan section `.bss..Lubsan_data33' from `kernel/ptrace.o' being placed in section `.bss..Lubsan_data33'
+
+Lets add .bss..L* to BSS_MAIN macro to catch those sections into BSS.
+
+Fixes: 9a427556fb8e ("vmlinux.lds.h: catch compound literals into data and BSS")
+Signed-off-by: Christophe Leroy <christophe.leroy@csgroup.eu>
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202404031349.nmKhyuUG-lkp@intel.com/
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/asm-generic/vmlinux.lds.h | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/include/asm-generic/vmlinux.lds.h b/include/asm-generic/vmlinux.lds.h
+index dd9ea351bc02e..4132a76a3e2e4 100644
+--- a/include/asm-generic/vmlinux.lds.h
++++ b/include/asm-generic/vmlinux.lds.h
+@@ -101,7 +101,7 @@
+ #define DATA_MAIN .data .data.[0-9a-zA-Z_]* .data..L* .data..compoundliteral* .data.$__unnamed_* .data.$L*
+ #define SDATA_MAIN .sdata .sdata.[0-9a-zA-Z_]*
+ #define RODATA_MAIN .rodata .rodata.[0-9a-zA-Z_]* .rodata..L*
+-#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* .bss..compoundliteral*
++#define BSS_MAIN .bss .bss.[0-9a-zA-Z_]* .bss..L* .bss..compoundliteral*
+ #define SBSS_MAIN .sbss .sbss.[0-9a-zA-Z_]*
+ #else
+ #define TEXT_MAIN .text
+-- 
+2.43.0
+
diff --git a/queue-5.15/wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch b/queue-5.15/wifi-ath11k-fix-wrong-handling-of-ccmp256-and-gcmp-c.patch
new file mode 100644 (file)
index 0000000..aa97527
--- /dev/null
@@ -0,0 +1,133 @@
+From c5c83c2ed76e6e7d7b851375ab4e4eec52f54bd0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Jun 2024 09:42:34 +0300
+Subject: wifi: ath11k: fix wrong handling of CCMP256 and GCMP ciphers
+
+From: Baochen Qiang <quic_bqiang@quicinc.com>
+
+[ Upstream commit d2b0ca38d362ebf16ca79cd7f309d5bb8b581deb ]
+
+Currently for CCMP256, GCMP128 and GCMP256 ciphers, in ath11k_install_key()
+IEEE80211_KEY_FLAG_GENERATE_IV_MGMT is not set. And in ath11k_mac_mgmt_tx_wmi()
+a length of IEEE80211_CCMP_MIC_LEN is reserved for all ciphers.
+
+This results in unexpected management frame drop in case either of above 3 ciphers
+is used. The reason is, without IEEE80211_KEY_FLAG_GENERATE_IV_MGMT set, mac80211
+will not generate CCMP/GCMP headers in frame for ath11k. Also MIC length reserved
+is wrong. Such frame is dropped later by hardware:
+
+ath11k_pci 0000:5a:00.0: mac tx mgmt frame, buf id 0
+ath11k_pci 0000:5a:00.0: mgmt tx compl ev pdev_id 1, desc_id 0, status 1
+
+From user point of view, we have observed very low throughput due to this issue:
+action frames are all dropped so ADDBA response from DUT never reaches AP. AP
+can not use aggregation thus throughput is low.
+
+Fix this by setting IEEE80211_KEY_FLAG_GENERATE_IV_MGMT flag and by reserving proper
+MIC length for those ciphers.
+
+Tested-on: WCN6855 hw2.0 PCI WLAN.HSP.1.1-03125-QCAHSPSWPL_V1_V2_SILICONZ_LITE-3.6510.30
+Tested-on: QCN9074 hw1.0 PCI WLAN.HK.2.7.0.1-01744-QCAHKSWPL_SILICONZ-1
+
+Fixes: d5c65159f289 ("ath11k: driver for Qualcomm IEEE 802.11ax devices")
+Reported-by: Yaroslav Isakov <yaroslav.isakov@gmail.com>
+Tested-by: Yaroslav Isakov <yaroslav.isakov@gmail.com>
+Closes: https://lore.kernel.org/all/CADS+iDX5=JtJr0apAtAQ02WWBxgOFEv8G063vuGYwDTC8AVZaw@mail.gmail.com
+Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://msgid.link/20240605014826.22498-1-quic_bqiang@quicinc.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/ath/ath11k/dp_rx.c |  3 +--
+ drivers/net/wireless/ath/ath11k/dp_rx.h |  3 +++
+ drivers/net/wireless/ath/ath11k/mac.c   | 15 +++++++++++----
+ 3 files changed, 15 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.c b/drivers/net/wireless/ath/ath11k/dp_rx.c
+index dfdb2eeaf040a..6920cce493f69 100644
+--- a/drivers/net/wireless/ath/ath11k/dp_rx.c
++++ b/drivers/net/wireless/ath/ath11k/dp_rx.c
+@@ -1861,8 +1861,7 @@ static void ath11k_dp_rx_h_csum_offload(struct ath11k *ar, struct sk_buff *msdu)
+                         CHECKSUM_NONE : CHECKSUM_UNNECESSARY;
+ }
+-static int ath11k_dp_rx_crypto_mic_len(struct ath11k *ar,
+-                                     enum hal_encrypt_type enctype)
++int ath11k_dp_rx_crypto_mic_len(struct ath11k *ar, enum hal_encrypt_type enctype)
+ {
+       switch (enctype) {
+       case HAL_ENCRYPT_TYPE_OPEN:
+diff --git a/drivers/net/wireless/ath/ath11k/dp_rx.h b/drivers/net/wireless/ath/ath11k/dp_rx.h
+index 623da3bf9dc81..c322e30caa968 100644
+--- a/drivers/net/wireless/ath/ath11k/dp_rx.h
++++ b/drivers/net/wireless/ath/ath11k/dp_rx.h
+@@ -1,6 +1,7 @@
+ /* SPDX-License-Identifier: BSD-3-Clause-Clear */
+ /*
+  * Copyright (c) 2018-2019 The Linux Foundation. All rights reserved.
++ * Copyright (c) 2024 Qualcomm Innovation Center, Inc. All rights reserved.
+  */
+ #ifndef ATH11K_DP_RX_H
+ #define ATH11K_DP_RX_H
+@@ -95,4 +96,6 @@ int ath11k_peer_rx_frag_setup(struct ath11k *ar, const u8 *peer_mac, int vdev_id
+ int ath11k_dp_rx_pktlog_start(struct ath11k_base *ab);
+ int ath11k_dp_rx_pktlog_stop(struct ath11k_base *ab, bool stop_timer);
++int ath11k_dp_rx_crypto_mic_len(struct ath11k *ar, enum hal_encrypt_type enctype);
++
+ #endif /* ATH11K_DP_RX_H */
+diff --git a/drivers/net/wireless/ath/ath11k/mac.c b/drivers/net/wireless/ath/ath11k/mac.c
+index c58fd836d4ade..81a8e1102d72b 100644
+--- a/drivers/net/wireless/ath/ath11k/mac.c
++++ b/drivers/net/wireless/ath/ath11k/mac.c
+@@ -2675,6 +2675,7 @@ static int ath11k_install_key(struct ath11k_vif *arvif,
+       switch (key->cipher) {
+       case WLAN_CIPHER_SUITE_CCMP:
++      case WLAN_CIPHER_SUITE_CCMP_256:
+               arg.key_cipher = WMI_CIPHER_AES_CCM;
+               /* TODO: Re-check if flag is valid */
+               key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
+@@ -2684,12 +2685,10 @@ static int ath11k_install_key(struct ath11k_vif *arvif,
+               arg.key_txmic_len = 8;
+               arg.key_rxmic_len = 8;
+               break;
+-      case WLAN_CIPHER_SUITE_CCMP_256:
+-              arg.key_cipher = WMI_CIPHER_AES_CCM;
+-              break;
+       case WLAN_CIPHER_SUITE_GCMP:
+       case WLAN_CIPHER_SUITE_GCMP_256:
+               arg.key_cipher = WMI_CIPHER_AES_GCM;
++              key->flags |= IEEE80211_KEY_FLAG_GENERATE_IV_MGMT;
+               break;
+       default:
+               ath11k_warn(ar->ab, "cipher %d is not supported\n", key->cipher);
+@@ -4204,7 +4203,10 @@ static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
+ {
+       struct ath11k_base *ab = ar->ab;
+       struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)skb->data;
++      struct ath11k_skb_cb *skb_cb = ATH11K_SKB_CB(skb);
+       struct ieee80211_tx_info *info;
++      enum hal_encrypt_type enctype;
++      unsigned int mic_len;
+       dma_addr_t paddr;
+       int buf_id;
+       int ret;
+@@ -4224,7 +4226,12 @@ static int ath11k_mac_mgmt_tx_wmi(struct ath11k *ar, struct ath11k_vif *arvif,
+                    ieee80211_is_deauth(hdr->frame_control) ||
+                    ieee80211_is_disassoc(hdr->frame_control)) &&
+                    ieee80211_has_protected(hdr->frame_control)) {
+-                      skb_put(skb, IEEE80211_CCMP_MIC_LEN);
++                      if (!(skb_cb->flags & ATH11K_SKB_CIPHER_SET))
++                              ath11k_warn(ab, "WMI management tx frame without ATH11K_SKB_CIPHER_SET");
++
++                      enctype = ath11k_dp_tx_get_encrypt_type(skb_cb->cipher);
++                      mic_len = ath11k_dp_rx_crypto_mic_len(ar, enctype);
++                      skb_put(skb, mic_len);
+               }
+       }
+-- 
+2.43.0
+
diff --git a/queue-5.15/wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch b/queue-5.15/wifi-brcmsmac-lcn-phy-code-is-used-for-bcm4313-2g-on.patch
new file mode 100644 (file)
index 0000000..cff1f2e
--- /dev/null
@@ -0,0 +1,75 @@
+From 97140c33ea43d7d4ca2bbc509c7a4381a4f6dcb0 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 May 2024 16:10:37 -0700
+Subject: wifi: brcmsmac: LCN PHY code is used for BCM4313 2G-only device
+
+From: Samasth Norway Ananda <samasth.norway.ananda@oracle.com>
+
+[ Upstream commit c636fa85feb450ca414a10010ed05361a73c93a6 ]
+
+The band_idx variable in the function wlc_lcnphy_tx_iqlo_cal() will
+never be set to 1 as BCM4313 is the only device for which the LCN PHY
+code is used. This is a 2G-only device.
+
+Fixes: 5b435de0d786 ("net: wireless: add brcm80211 drivers")
+Signed-off-by: Samasth Norway Ananda <samasth.norway.ananda@oracle.com>
+Acked-by: Arend van Spriel <arend.vanspriel@broadcom.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://msgid.link/20240509231037.2014109-1-samasth.norway.ananda@oracle.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../broadcom/brcm80211/brcmsmac/phy/phy_lcn.c  | 18 +++++++++---------
+ 1 file changed, 9 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c
+index 7717eb85a1db6..47c0e8e429e54 100644
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/phy/phy_lcn.c
+@@ -2567,7 +2567,6 @@ wlc_lcnphy_tx_iqlo_cal(struct brcms_phy *pi,
+       struct lcnphy_txgains cal_gains, temp_gains;
+       u16 hash;
+-      u8 band_idx;
+       int j;
+       u16 ncorr_override[5];
+       u16 syst_coeffs[] = { 0x0000, 0x0000, 0x0000, 0x0000, 0x0000, 0x0000,
+@@ -2599,6 +2598,9 @@ wlc_lcnphy_tx_iqlo_cal(struct brcms_phy *pi,
+       u16 *values_to_save;
+       struct brcms_phy_lcnphy *pi_lcn = pi->u.pi_lcnphy;
++      if (WARN_ON(CHSPEC_IS5G(pi->radio_chanspec)))
++              return;
++
+       values_to_save = kmalloc_array(20, sizeof(u16), GFP_ATOMIC);
+       if (NULL == values_to_save)
+               return;
+@@ -2662,20 +2664,18 @@ wlc_lcnphy_tx_iqlo_cal(struct brcms_phy *pi,
+       hash = (target_gains->gm_gain << 8) |
+              (target_gains->pga_gain << 4) | (target_gains->pad_gain);
+-      band_idx = (CHSPEC_IS5G(pi->radio_chanspec) ? 1 : 0);
+-
+       cal_gains = *target_gains;
+       memset(ncorr_override, 0, sizeof(ncorr_override));
+-      for (j = 0; j < iqcal_gainparams_numgains_lcnphy[band_idx]; j++) {
+-              if (hash == tbl_iqcal_gainparams_lcnphy[band_idx][j][0]) {
++      for (j = 0; j < iqcal_gainparams_numgains_lcnphy[0]; j++) {
++              if (hash == tbl_iqcal_gainparams_lcnphy[0][j][0]) {
+                       cal_gains.gm_gain =
+-                              tbl_iqcal_gainparams_lcnphy[band_idx][j][1];
++                              tbl_iqcal_gainparams_lcnphy[0][j][1];
+                       cal_gains.pga_gain =
+-                              tbl_iqcal_gainparams_lcnphy[band_idx][j][2];
++                              tbl_iqcal_gainparams_lcnphy[0][j][2];
+                       cal_gains.pad_gain =
+-                              tbl_iqcal_gainparams_lcnphy[band_idx][j][3];
++                              tbl_iqcal_gainparams_lcnphy[0][j][3];
+                       memcpy(ncorr_override,
+-                             &tbl_iqcal_gainparams_lcnphy[band_idx][j][3],
++                             &tbl_iqcal_gainparams_lcnphy[0][j][3],
+                              sizeof(ncorr_override));
+                       break;
+               }
+-- 
+2.43.0
+
diff --git a/queue-5.15/wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch b/queue-5.15/wifi-cfg80211-fix-typo-in-cfg80211_calculate_bitrate.patch
new file mode 100644 (file)
index 0000000..cbd42be
--- /dev/null
@@ -0,0 +1,45 @@
+From e57b80961aa1aa5d53080035f12dcf60f5b2077d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 10:06:52 +0800
+Subject: wifi: cfg80211: fix typo in cfg80211_calculate_bitrate_he()
+
+From: Baochen Qiang <quic_bqiang@quicinc.com>
+
+[ Upstream commit 9ee0d44f055276fe2802b2f65058e920853f4f99 ]
+
+rates_996 is mistakenly written as rates_969, fix it.
+
+Fixes: c4cbaf7973a7 ("cfg80211: Add support for HE")
+Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
+Link: https://msgid.link/20240606020653.33205-2-quic_bqiang@quicinc.com
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/wireless/util.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/net/wireless/util.c b/net/wireless/util.c
+index d40c2cf777dc0..a879d6b310a90 100644
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -1363,7 +1363,7 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate)
+                 5120, /*  0.833333... */
+       };
+       u32 rates_160M[3] = { 960777777, 907400000, 816666666 };
+-      u32 rates_969[3] =  { 480388888, 453700000, 408333333 };
++      u32 rates_996[3] =  { 480388888, 453700000, 408333333 };
+       u32 rates_484[3] =  { 229411111, 216666666, 195000000 };
+       u32 rates_242[3] =  { 114711111, 108333333,  97500000 };
+       u32 rates_106[3] =  {  40000000,  37777777,  34000000 };
+@@ -1388,7 +1388,7 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate)
+       else if (rate->bw == RATE_INFO_BW_80 ||
+                (rate->bw == RATE_INFO_BW_HE_RU &&
+                 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_996))
+-              result = rates_969[rate->he_gi];
++              result = rates_996[rate->he_gi];
+       else if (rate->bw == RATE_INFO_BW_40 ||
+                (rate->bw == RATE_INFO_BW_HE_RU &&
+                 rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_484))
+-- 
+2.43.0
+
diff --git a/queue-5.15/wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch b/queue-5.15/wifi-cfg80211-handle-2x996-ru-allocation-in-cfg80211.patch
new file mode 100644 (file)
index 0000000..9af6e67
--- /dev/null
@@ -0,0 +1,45 @@
+From 3c7dac9efee514abc846dde0168b94d90f70c02f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 10:06:53 +0800
+Subject: wifi: cfg80211: handle 2x996 RU allocation in
+ cfg80211_calculate_bitrate_he()
+
+From: Baochen Qiang <quic_bqiang@quicinc.com>
+
+[ Upstream commit bcbd771cd5d68c0c52567556097d75f9fc4e7cd6 ]
+
+Currently NL80211_RATE_INFO_HE_RU_ALLOC_2x996 is not handled in
+cfg80211_calculate_bitrate_he(), leading to below warning:
+
+kernel: invalid HE MCS: bw:6, ru:6
+kernel: WARNING: CPU: 0 PID: 2312 at net/wireless/util.c:1501 cfg80211_calculate_bitrate_he+0x22b/0x270 [cfg80211]
+
+Fix it by handling 2x996 RU allocation in the same way as 160 MHz bandwidth.
+
+Fixes: c4cbaf7973a7 ("cfg80211: Add support for HE")
+Signed-off-by: Baochen Qiang <quic_bqiang@quicinc.com>
+Link: https://msgid.link/20240606020653.33205-3-quic_bqiang@quicinc.com
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/wireless/util.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/net/wireless/util.c b/net/wireless/util.c
+index a879d6b310a90..6ebc6567b2875 100644
+--- a/net/wireless/util.c
++++ b/net/wireless/util.c
+@@ -1383,7 +1383,9 @@ static u32 cfg80211_calculate_bitrate_he(struct rate_info *rate)
+       if (WARN_ON_ONCE(rate->nss < 1 || rate->nss > 8))
+               return 0;
+-      if (rate->bw == RATE_INFO_BW_160)
++      if (rate->bw == RATE_INFO_BW_160 ||
++          (rate->bw == RATE_INFO_BW_HE_RU &&
++           rate->he_ru_alloc == NL80211_RATE_INFO_HE_RU_ALLOC_2x996))
+               result = rates_160M[rate->he_gi];
+       else if (rate->bw == RATE_INFO_BW_80 ||
+                (rate->bw == RATE_INFO_BW_HE_RU &&
+-- 
+2.43.0
+
diff --git a/queue-5.15/wifi-virt_wifi-avoid-reporting-connection-success-wi.patch b/queue-5.15/wifi-virt_wifi-avoid-reporting-connection-success-wi.patch
new file mode 100644 (file)
index 0000000..b68559a
--- /dev/null
@@ -0,0 +1,98 @@
+From 5cfac07ae90fa37b8d116aac76672cd0762a56f5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jul 2024 10:37:56 +0800
+Subject: wifi: virt_wifi: avoid reporting connection success with wrong SSID
+
+From: En-Wei Wu <en-wei.wu@canonical.com>
+
+[ Upstream commit b5d14b0c6716fad7f0c94ac6e1d6f60a49f985c7 ]
+
+When user issues a connection with a different SSID than the one
+virt_wifi has advertised, the __cfg80211_connect_result() will
+trigger the warning: WARN_ON(bss_not_found).
+
+The issue is because the connection code in virt_wifi does not
+check the SSID from user space (it only checks the BSSID), and
+virt_wifi will call cfg80211_connect_result() with WLAN_STATUS_SUCCESS
+even if the SSID is different from the one virt_wifi has advertised.
+Eventually cfg80211 won't be able to find the cfg80211_bss and generate
+the warning.
+
+Fixed it by checking the SSID (from user space) in the connection code.
+
+Fixes: c7cdba31ed8b ("mac80211-next: rtnetlink wifi simulation device")
+Reported-by: syzbot+d6eb9cee2885ec06f5e3@syzkaller.appspotmail.com
+Signed-off-by: En-Wei Wu <en-wei.wu@canonical.com>
+Link: https://patch.msgid.link/20240705023756.10954-1-en-wei.wu@canonical.com
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/virt_wifi.c | 19 ++++++++++++++++---
+ 1 file changed, 16 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c
+index 514f2c1124b61..ec730bc44adc1 100644
+--- a/drivers/net/wireless/virt_wifi.c
++++ b/drivers/net/wireless/virt_wifi.c
+@@ -136,6 +136,8 @@ static struct ieee80211_supported_band band_5ghz = {
+ /* Assigned at module init. Guaranteed locally-administered and unicast. */
+ static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {};
++#define VIRT_WIFI_SSID "VirtWifi"
++
+ static void virt_wifi_inform_bss(struct wiphy *wiphy)
+ {
+       u64 tsf = div_u64(ktime_get_boottime_ns(), 1000);
+@@ -146,8 +148,8 @@ static void virt_wifi_inform_bss(struct wiphy *wiphy)
+               u8 ssid[8];
+       } __packed ssid = {
+               .tag = WLAN_EID_SSID,
+-              .len = 8,
+-              .ssid = "VirtWifi",
++              .len = strlen(VIRT_WIFI_SSID),
++              .ssid = VIRT_WIFI_SSID,
+       };
+       informed_bss = cfg80211_inform_bss(wiphy, &channel_5ghz,
+@@ -213,6 +215,8 @@ struct virt_wifi_netdev_priv {
+       struct net_device *upperdev;
+       u32 tx_packets;
+       u32 tx_failed;
++      u32 connect_requested_ssid_len;
++      u8 connect_requested_ssid[IEEE80211_MAX_SSID_LEN];
+       u8 connect_requested_bss[ETH_ALEN];
+       bool is_up;
+       bool is_connected;
+@@ -229,6 +233,12 @@ static int virt_wifi_connect(struct wiphy *wiphy, struct net_device *netdev,
+       if (priv->being_deleted || !priv->is_up)
+               return -EBUSY;
++      if (!sme->ssid)
++              return -EINVAL;
++
++      priv->connect_requested_ssid_len = sme->ssid_len;
++      memcpy(priv->connect_requested_ssid, sme->ssid, sme->ssid_len);
++
+       could_schedule = schedule_delayed_work(&priv->connect, HZ * 2);
+       if (!could_schedule)
+               return -EBUSY;
+@@ -252,12 +262,15 @@ static void virt_wifi_connect_complete(struct work_struct *work)
+               container_of(work, struct virt_wifi_netdev_priv, connect.work);
+       u8 *requested_bss = priv->connect_requested_bss;
+       bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid);
++      bool right_ssid = priv->connect_requested_ssid_len == strlen(VIRT_WIFI_SSID) &&
++                        !memcmp(priv->connect_requested_ssid, VIRT_WIFI_SSID,
++                                priv->connect_requested_ssid_len);
+       u16 status = WLAN_STATUS_SUCCESS;
+       if (is_zero_ether_addr(requested_bss))
+               requested_bss = NULL;
+-      if (!priv->is_up || (requested_bss && !right_addr))
++      if (!priv->is_up || (requested_bss && !right_addr) || !right_ssid)
+               status = WLAN_STATUS_UNSPECIFIED_FAILURE;
+       else
+               priv->is_connected = true;
+-- 
+2.43.0
+
diff --git a/queue-5.15/wifi-virt_wifi-don-t-use-strlen-in-const-context.patch b/queue-5.15/wifi-virt_wifi-don-t-use-strlen-in-const-context.patch
new file mode 100644 (file)
index 0000000..638d02e
--- /dev/null
@@ -0,0 +1,56 @@
+From cb53b2affc55be9a6f1bc442ef7ec4925857bf99 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 9 Jul 2024 08:34:09 +0200
+Subject: wifi: virt_wifi: don't use strlen() in const context
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+[ Upstream commit 6e909f489191b365364e9d636dec33b5dfd4e5eb ]
+
+Looks like not all compilers allow strlen(constant) as
+a constant, so don't do that. Instead, revert back to
+defining the length as the first submission had it.
+
+Fixes: b5d14b0c6716 ("wifi: virt_wifi: avoid reporting connection success with wrong SSID")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202407090934.NnR1TUbW-lkp@intel.com/
+Closes: https://lore.kernel.org/oe-kbuild-all/202407090944.mpwLHGt9-lkp@intel.com/
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/virt_wifi.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/wireless/virt_wifi.c b/drivers/net/wireless/virt_wifi.c
+index ec730bc44adc1..dd6675436bda6 100644
+--- a/drivers/net/wireless/virt_wifi.c
++++ b/drivers/net/wireless/virt_wifi.c
+@@ -137,6 +137,7 @@ static struct ieee80211_supported_band band_5ghz = {
+ static u8 fake_router_bssid[ETH_ALEN] __ro_after_init = {};
+ #define VIRT_WIFI_SSID "VirtWifi"
++#define VIRT_WIFI_SSID_LEN 8
+ static void virt_wifi_inform_bss(struct wiphy *wiphy)
+ {
+@@ -148,7 +149,7 @@ static void virt_wifi_inform_bss(struct wiphy *wiphy)
+               u8 ssid[8];
+       } __packed ssid = {
+               .tag = WLAN_EID_SSID,
+-              .len = strlen(VIRT_WIFI_SSID),
++              .len = VIRT_WIFI_SSID_LEN,
+               .ssid = VIRT_WIFI_SSID,
+       };
+@@ -262,7 +263,7 @@ static void virt_wifi_connect_complete(struct work_struct *work)
+               container_of(work, struct virt_wifi_netdev_priv, connect.work);
+       u8 *requested_bss = priv->connect_requested_bss;
+       bool right_addr = ether_addr_equal(requested_bss, fake_router_bssid);
+-      bool right_ssid = priv->connect_requested_ssid_len == strlen(VIRT_WIFI_SSID) &&
++      bool right_ssid = priv->connect_requested_ssid_len == VIRT_WIFI_SSID_LEN &&
+                         !memcmp(priv->connect_requested_ssid, VIRT_WIFI_SSID,
+                                 priv->connect_requested_ssid_len);
+       u16 status = WLAN_STATUS_SUCCESS;
+-- 
+2.43.0
+
diff --git a/queue-5.15/x86-of-return-consistent-error-type-from-x86_of_pci_.patch b/queue-5.15/x86-of-return-consistent-error-type-from-x86_of_pci_.patch
new file mode 100644 (file)
index 0000000..29642c8
--- /dev/null
@@ -0,0 +1,45 @@
+From 0242a3b4acfdaf996ee261ff1d8fb30a274c0363 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 May 2024 15:55:35 +0300
+Subject: x86/of: Return consistent error type from x86_of_pci_irq_enable()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit ec0b4c4d45cf7cf9a6c9626a494a89cb1ae7c645 ]
+
+x86_of_pci_irq_enable() returns PCIBIOS_* code received from
+pci_read_config_byte() directly and also -EINVAL which are not
+compatible error types. x86_of_pci_irq_enable() is used as
+(*pcibios_enable_irq) function which should not return PCIBIOS_* codes.
+
+Convert the PCIBIOS_* return code from pci_read_config_byte() into
+normal errno using pcibios_err_to_errno().
+
+Fixes: 96e0a0797eba ("x86: dtb: Add support for PCI devices backed by dtb nodes")
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Link: https://lore.kernel.org/r/20240527125538.13620-1-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/kernel/devicetree.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/arch/x86/kernel/devicetree.c b/arch/x86/kernel/devicetree.c
+index 6a4cb71c24983..bd4386bf51ac9 100644
+--- a/arch/x86/kernel/devicetree.c
++++ b/arch/x86/kernel/devicetree.c
+@@ -92,7 +92,7 @@ static int x86_of_pci_irq_enable(struct pci_dev *dev)
+       ret = pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
+       if (ret)
+-              return ret;
++              return pcibios_err_to_errno(ret);
+       if (!pin)
+               return 0;
+-- 
+2.43.0
+
diff --git a/queue-5.15/x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch b/queue-5.15/x86-pci-intel_mid_pci-fix-pcibios_-return-code-handl.patch
new file mode 100644 (file)
index 0000000..3983979
--- /dev/null
@@ -0,0 +1,53 @@
+From cadf554a3da3d12ef472664385a064ec619eae81 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 May 2024 15:55:36 +0300
+Subject: x86/pci/intel_mid_pci: Fix PCIBIOS_* return code handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit 724852059e97c48557151b3aa4af424614819752 ]
+
+intel_mid_pci_irq_enable() uses pci_read_config_byte() that returns
+PCIBIOS_* codes. The error handling, however, assumes the codes are
+normal errnos because it checks for < 0.
+
+intel_mid_pci_irq_enable() also returns the PCIBIOS_* code back to the
+caller but the function is used as the (*pcibios_enable_irq) function
+which should return normal errnos.
+
+Convert the error check to plain non-zero check which works for
+PCIBIOS_* return codes and convert the PCIBIOS_* return code using
+pcibios_err_to_errno() into normal errno before returning it.
+
+Fixes: 5b395e2be6c4 ("x86/platform/intel-mid: Make IRQ allocation a bit more flexible")
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Reviewed-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Link: https://lore.kernel.org/r/20240527125538.13620-2-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/pci/intel_mid_pci.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/x86/pci/intel_mid_pci.c b/arch/x86/pci/intel_mid_pci.c
+index 8edd622066044..722a33be08a18 100644
+--- a/arch/x86/pci/intel_mid_pci.c
++++ b/arch/x86/pci/intel_mid_pci.c
+@@ -233,9 +233,9 @@ static int intel_mid_pci_irq_enable(struct pci_dev *dev)
+               return 0;
+       ret = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi);
+-      if (ret < 0) {
++      if (ret) {
+               dev_warn(&dev->dev, "Failed to read interrupt line: %d\n", ret);
+-              return ret;
++              return pcibios_err_to_errno(ret);
+       }
+       id = x86_match_cpu(intel_mid_cpu_ids);
+-- 
+2.43.0
+
diff --git a/queue-5.15/x86-pci-xen-fix-pcibios_-return-code-handling.patch b/queue-5.15/x86-pci-xen-fix-pcibios_-return-code-handling.patch
new file mode 100644 (file)
index 0000000..cb76255
--- /dev/null
@@ -0,0 +1,54 @@
+From f8585b5049a8db24794cf8f4cefab9356aa34ece Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 May 2024 15:55:37 +0300
+Subject: x86/pci/xen: Fix PCIBIOS_* return code handling
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit e9d7b435dfaec58432f4106aaa632bf39f52ce9f ]
+
+xen_pcifront_enable_irq() uses pci_read_config_byte() that returns
+PCIBIOS_* codes. The error handling, however, assumes the codes are
+normal errnos because it checks for < 0.
+
+xen_pcifront_enable_irq() also returns the PCIBIOS_* code back to the
+caller but the function is used as the (*pcibios_enable_irq) function
+which should return normal errnos.
+
+Convert the error check to plain non-zero check which works for
+PCIBIOS_* return codes and convert the PCIBIOS_* return code using
+pcibios_err_to_errno() into normal errno before returning it.
+
+Fixes: 3f2a230caf21 ("xen: handled remapped IRQs when enabling a pcifront PCI device.")
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Reviewed-by: Juergen Gross <jgross@suse.com>
+Link: https://lore.kernel.org/r/20240527125538.13620-3-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/pci/xen.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/x86/pci/xen.c b/arch/x86/pci/xen.c
+index f153e9ab8c966..8e4165b5b295b 100644
+--- a/arch/x86/pci/xen.c
++++ b/arch/x86/pci/xen.c
+@@ -37,10 +37,10 @@ static int xen_pcifront_enable_irq(struct pci_dev *dev)
+       u8 gsi;
+       rc = pci_read_config_byte(dev, PCI_INTERRUPT_LINE, &gsi);
+-      if (rc < 0) {
++      if (rc) {
+               dev_warn(&dev->dev, "Xen PCI: failed to read interrupt line: %d\n",
+                        rc);
+-              return rc;
++              return pcibios_err_to_errno(rc);
+       }
+       /* In PV DomU the Xen PCI backend puts the PIRQ in the interrupt line.*/
+       pirq = gsi;
+-- 
+2.43.0
+
diff --git a/queue-5.15/x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch b/queue-5.15/x86-platform-iosf_mbi-convert-pcibios_-return-codes-.patch
new file mode 100644 (file)
index 0000000..d512be7
--- /dev/null
@@ -0,0 +1,54 @@
+From 144764e2353e2b659856cbe3c4f0a2b535781b2e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 27 May 2024 15:55:38 +0300
+Subject: x86/platform/iosf_mbi: Convert PCIBIOS_* return codes to errnos
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+
+[ Upstream commit 7821fa101eab529521aa4b724bf708149d70820c ]
+
+iosf_mbi_pci_{read,write}_mdr() use pci_{read,write}_config_dword()
+that return PCIBIOS_* codes but functions also return -ENODEV which are
+not compatible error codes. As neither of the functions are related to
+PCI read/write functions, they should return normal errnos.
+
+Convert PCIBIOS_* returns code using pcibios_err_to_errno() into normal
+errno before returning it.
+
+Fixes: 46184415368a ("arch: x86: New MailBox support driver for Intel SOC's")
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Link: https://lore.kernel.org/r/20240527125538.13620-4-ilpo.jarvinen@linux.intel.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/platform/intel/iosf_mbi.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/x86/platform/intel/iosf_mbi.c b/arch/x86/platform/intel/iosf_mbi.c
+index fdd49d70b4373..c81cea208c2c4 100644
+--- a/arch/x86/platform/intel/iosf_mbi.c
++++ b/arch/x86/platform/intel/iosf_mbi.c
+@@ -62,7 +62,7 @@ static int iosf_mbi_pci_read_mdr(u32 mcrx, u32 mcr, u32 *mdr)
+ fail_read:
+       dev_err(&mbi_pdev->dev, "PCI config access failed with %d\n", result);
+-      return result;
++      return pcibios_err_to_errno(result);
+ }
+ static int iosf_mbi_pci_write_mdr(u32 mcrx, u32 mcr, u32 mdr)
+@@ -91,7 +91,7 @@ static int iosf_mbi_pci_write_mdr(u32 mcrx, u32 mcr, u32 mdr)
+ fail_write:
+       dev_err(&mbi_pdev->dev, "PCI config access failed with %d\n", result);
+-      return result;
++      return pcibios_err_to_errno(result);
+ }
+ int iosf_mbi_read(u8 port, u8 opcode, u32 offset, u32 *mdr)
+-- 
+2.43.0
+
diff --git a/queue-5.15/x86-xen-convert-comma-to-semicolon.patch b/queue-5.15/x86-xen-convert-comma-to-semicolon.patch
new file mode 100644 (file)
index 0000000..0cb3663
--- /dev/null
@@ -0,0 +1,46 @@
+From 162dc4e03f1746619217283bded447536b04f52a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 11:10:10 +0800
+Subject: x86/xen: Convert comma to semicolon
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 349d271416c61f82b853336509b1d0dc04c1fcbb ]
+
+Replace a comma between expression statements by a semicolon.
+
+Fixes: 8310b77b48c5 ("Xen/gnttab: handle p2m update errors on a per-slot basis")
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Reviewed-by: Juergen Gross <jgross@suse.com>
+Link: https://lore.kernel.org/r/20240702031010.1411875-1-nichen@iscas.ac.cn
+Signed-off-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/xen/p2m.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/arch/x86/xen/p2m.c b/arch/x86/xen/p2m.c
+index 5e6e236977c75..9b3a9fa4a0ade 100644
+--- a/arch/x86/xen/p2m.c
++++ b/arch/x86/xen/p2m.c
+@@ -736,7 +736,7 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
+                * immediate unmapping.
+                */
+               map_ops[i].status = GNTST_general_error;
+-              unmap[0].host_addr = map_ops[i].host_addr,
++              unmap[0].host_addr = map_ops[i].host_addr;
+               unmap[0].handle = map_ops[i].handle;
+               map_ops[i].handle = INVALID_GRANT_HANDLE;
+               if (map_ops[i].flags & GNTMAP_device_map)
+@@ -746,7 +746,7 @@ int set_foreign_p2m_mapping(struct gnttab_map_grant_ref *map_ops,
+               if (kmap_ops) {
+                       kmap_ops[i].status = GNTST_general_error;
+-                      unmap[1].host_addr = kmap_ops[i].host_addr,
++                      unmap[1].host_addr = kmap_ops[i].host_addr;
+                       unmap[1].handle = kmap_ops[i].handle;
+                       kmap_ops[i].handle = INVALID_GRANT_HANDLE;
+                       if (kmap_ops[i].flags & GNTMAP_device_map)
+-- 
+2.43.0
+
diff --git a/queue-5.15/xdp-fix-invalid-wait-context-of-page_pool_destroy.patch b/queue-5.15/xdp-fix-invalid-wait-context-of-page_pool_destroy.patch
new file mode 100644 (file)
index 0000000..7b06c8b
--- /dev/null
@@ -0,0 +1,142 @@
+From cfefafc1d85d23b4970feb728ab6245f1304b3c9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 12 Jul 2024 09:51:16 +0000
+Subject: xdp: fix invalid wait context of page_pool_destroy()
+
+From: Taehee Yoo <ap420073@gmail.com>
+
+[ Upstream commit 59a931c5b732ca5fc2ca727f5a72aeabaafa85ec ]
+
+If the driver uses a page pool, it creates a page pool with
+page_pool_create().
+The reference count of page pool is 1 as default.
+A page pool will be destroyed only when a reference count reaches 0.
+page_pool_destroy() is used to destroy page pool, it decreases a
+reference count.
+When a page pool is destroyed, ->disconnect() is called, which is
+mem_allocator_disconnect().
+This function internally acquires mutex_lock().
+
+If the driver uses XDP, it registers a memory model with
+xdp_rxq_info_reg_mem_model().
+The xdp_rxq_info_reg_mem_model() internally increases a page pool
+reference count if a memory model is a page pool.
+Now the reference count is 2.
+
+To destroy a page pool, the driver should call both page_pool_destroy()
+and xdp_unreg_mem_model().
+The xdp_unreg_mem_model() internally calls page_pool_destroy().
+Only page_pool_destroy() decreases a reference count.
+
+If a driver calls page_pool_destroy() then xdp_unreg_mem_model(), we
+will face an invalid wait context warning.
+Because xdp_unreg_mem_model() calls page_pool_destroy() with
+rcu_read_lock().
+The page_pool_destroy() internally acquires mutex_lock().
+
+Splat looks like:
+=============================
+[ BUG: Invalid wait context ]
+6.10.0-rc6+ #4 Tainted: G W
+-----------------------------
+ethtool/1806 is trying to lock:
+ffffffff90387b90 (mem_id_lock){+.+.}-{4:4}, at: mem_allocator_disconnect+0x73/0x150
+other info that might help us debug this:
+context-{5:5}
+3 locks held by ethtool/1806:
+stack backtrace:
+CPU: 0 PID: 1806 Comm: ethtool Tainted: G W 6.10.0-rc6+ #4 f916f41f172891c800f2fed
+Hardware name: ASUS System Product Name/PRIME Z690-P D4, BIOS 0603 11/01/2021
+Call Trace:
+<TASK>
+dump_stack_lvl+0x7e/0xc0
+__lock_acquire+0x1681/0x4de0
+? _printk+0x64/0xe0
+? __pfx_mark_lock.part.0+0x10/0x10
+? __pfx___lock_acquire+0x10/0x10
+lock_acquire+0x1b3/0x580
+? mem_allocator_disconnect+0x73/0x150
+? __wake_up_klogd.part.0+0x16/0xc0
+? __pfx_lock_acquire+0x10/0x10
+? dump_stack_lvl+0x91/0xc0
+__mutex_lock+0x15c/0x1690
+? mem_allocator_disconnect+0x73/0x150
+? __pfx_prb_read_valid+0x10/0x10
+? mem_allocator_disconnect+0x73/0x150
+? __pfx_llist_add_batch+0x10/0x10
+? console_unlock+0x193/0x1b0
+? lockdep_hardirqs_on+0xbe/0x140
+? __pfx___mutex_lock+0x10/0x10
+? tick_nohz_tick_stopped+0x16/0x90
+? __irq_work_queue_local+0x1e5/0x330
+? irq_work_queue+0x39/0x50
+? __wake_up_klogd.part.0+0x79/0xc0
+? mem_allocator_disconnect+0x73/0x150
+mem_allocator_disconnect+0x73/0x150
+? __pfx_mem_allocator_disconnect+0x10/0x10
+? mark_held_locks+0xa5/0xf0
+? rcu_is_watching+0x11/0xb0
+page_pool_release+0x36e/0x6d0
+page_pool_destroy+0xd7/0x440
+xdp_unreg_mem_model+0x1a7/0x2a0
+? __pfx_xdp_unreg_mem_model+0x10/0x10
+? kfree+0x125/0x370
+? bnxt_free_ring.isra.0+0x2eb/0x500
+? bnxt_free_mem+0x5ac/0x2500
+xdp_rxq_info_unreg+0x4a/0xd0
+bnxt_free_mem+0x1356/0x2500
+bnxt_close_nic+0xf0/0x3b0
+? __pfx_bnxt_close_nic+0x10/0x10
+? ethnl_parse_bit+0x2c6/0x6d0
+? __pfx___nla_validate_parse+0x10/0x10
+? __pfx_ethnl_parse_bit+0x10/0x10
+bnxt_set_features+0x2a8/0x3e0
+__netdev_update_features+0x4dc/0x1370
+? ethnl_parse_bitset+0x4ff/0x750
+? __pfx_ethnl_parse_bitset+0x10/0x10
+? __pfx___netdev_update_features+0x10/0x10
+? mark_held_locks+0xa5/0xf0
+? _raw_spin_unlock_irqrestore+0x42/0x70
+? __pm_runtime_resume+0x7d/0x110
+ethnl_set_features+0x32d/0xa20
+
+To fix this problem, it uses rhashtable_lookup_fast() instead of
+rhashtable_lookup() with rcu_read_lock().
+Using xa without rcu_read_lock() here is safe.
+xa is freed by __xdp_mem_allocator_rcu_free() and this is called by
+call_rcu() of mem_xa_remove().
+The mem_xa_remove() is called by page_pool_destroy() if a reference
+count reaches 0.
+The xa is already protected by the reference count mechanism well in the
+control plane.
+So removing rcu_read_lock() for page_pool_destroy() is safe.
+
+Fixes: c3f812cea0d7 ("page_pool: do not release pool until inflight == 0.")
+Signed-off-by: Taehee Yoo <ap420073@gmail.com>
+Reviewed-by: Jakub Kicinski <kuba@kernel.org>
+Link: https://patch.msgid.link/20240712095116.3801586-1-ap420073@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/core/xdp.c | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/net/core/xdp.c b/net/core/xdp.c
+index e9a9694c4fdcc..4a9c2f4eceda8 100644
+--- a/net/core/xdp.c
++++ b/net/core/xdp.c
+@@ -124,10 +124,8 @@ void xdp_unreg_mem_model(struct xdp_mem_info *mem)
+               return;
+       if (type == MEM_TYPE_PAGE_POOL) {
+-              rcu_read_lock();
+-              xa = rhashtable_lookup(mem_id_ht, &id, mem_id_rht_params);
++              xa = rhashtable_lookup_fast(mem_id_ht, &id, mem_id_rht_params);
+               page_pool_destroy(xa->page_pool);
+-              rcu_read_unlock();
+       }
+ }
+ EXPORT_SYMBOL_GPL(xdp_unreg_mem_model);
+-- 
+2.43.0
+
diff --git a/queue-5.15/xprtrdma-fix-rpcrdma_reqs_reset.patch b/queue-5.15/xprtrdma-fix-rpcrdma_reqs_reset.patch
new file mode 100644 (file)
index 0000000..4fb160c
--- /dev/null
@@ -0,0 +1,85 @@
+From a92960bfe62507f3b4ddeb227d2d007275688cb8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 4 Jun 2024 15:45:23 -0400
+Subject: xprtrdma: Fix rpcrdma_reqs_reset()
+
+From: Chuck Lever <chuck.lever@oracle.com>
+
+[ Upstream commit acd9f2dd23c632568156217aac7a05f5a0313152 ]
+
+Avoid FastReg operations getting MW_BIND_ERR after a reconnect.
+
+rpcrdma_reqs_reset() is called on transport tear-down to get each
+rpcrdma_req back into a clean state.
+
+MRs on req->rl_registered are waiting for a FastReg, are already
+registered, or are waiting for invalidation. If the transport is
+being torn down when reqs_reset() is called, the matching LocalInv
+might never be posted. That leaves these MR registered /and/ on
+req->rl_free_mrs, where they can be re-used for the next
+connection.
+
+Since xprtrdma does not keep specific track of the MR state, it's
+not possible to know what state these MRs are in, so the only safe
+thing to do is release them immediately.
+
+Fixes: 5de55ce951a1 ("xprtrdma: Release in-flight MRs on disconnect")
+Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/sunrpc/xprtrdma/frwr_ops.c |  3 ++-
+ net/sunrpc/xprtrdma/verbs.c    | 16 +++++++++++++++-
+ 2 files changed, 17 insertions(+), 2 deletions(-)
+
+diff --git a/net/sunrpc/xprtrdma/frwr_ops.c b/net/sunrpc/xprtrdma/frwr_ops.c
+index f700b34a5bfd2..551f3dd4e6237 100644
+--- a/net/sunrpc/xprtrdma/frwr_ops.c
++++ b/net/sunrpc/xprtrdma/frwr_ops.c
+@@ -96,7 +96,8 @@ static void frwr_mr_put(struct rpcrdma_mr *mr)
+       rpcrdma_mr_push(mr, &mr->mr_req->rl_free_mrs);
+ }
+-/* frwr_reset - Place MRs back on the free list
++/**
++ * frwr_reset - Place MRs back on @req's free list
+  * @req: request to reset
+  *
+  * Used after a failed marshal. For FRWR, this means the MRs
+diff --git a/net/sunrpc/xprtrdma/verbs.c b/net/sunrpc/xprtrdma/verbs.c
+index 34413d4ab0e52..b61ade10254d4 100644
+--- a/net/sunrpc/xprtrdma/verbs.c
++++ b/net/sunrpc/xprtrdma/verbs.c
+@@ -924,6 +924,8 @@ static int rpcrdma_reqs_setup(struct rpcrdma_xprt *r_xprt)
+ static void rpcrdma_req_reset(struct rpcrdma_req *req)
+ {
++      struct rpcrdma_mr *mr;
++
+       /* Credits are valid for only one connection */
+       req->rl_slot.rq_cong = 0;
+@@ -933,7 +935,19 @@ static void rpcrdma_req_reset(struct rpcrdma_req *req)
+       rpcrdma_regbuf_dma_unmap(req->rl_sendbuf);
+       rpcrdma_regbuf_dma_unmap(req->rl_recvbuf);
+-      frwr_reset(req);
++      /* The verbs consumer can't know the state of an MR on the
++       * req->rl_registered list unless a successful completion
++       * has occurred, so they cannot be re-used.
++       */
++      while ((mr = rpcrdma_mr_pop(&req->rl_registered))) {
++              struct rpcrdma_buffer *buf = &mr->mr_xprt->rx_buf;
++
++              spin_lock(&buf->rb_lock);
++              list_del(&mr->mr_all);
++              spin_unlock(&buf->rb_lock);
++
++              frwr_mr_release(mr);
++      }
+ }
+ /* ASSUMPTION: the rb_allreqs list is stable for the duration,
+-- 
+2.43.0
+