]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
Fixes for 6.6
authorSasha Levin <sashal@kernel.org>
Sun, 8 Sep 2024 13:22:02 +0000 (09:22 -0400)
committerSasha Levin <sashal@kernel.org>
Sun, 8 Sep 2024 13:22:02 +0000 (09:22 -0400)
Signed-off-by: Sasha Levin <sashal@kernel.org>
139 files changed:
queue-6.6/accel-habanalabs-gaudi2-unsecure-edma-max-outstandin.patch [new file with mode: 0644]
queue-6.6/af_unix-remove-put_pid-put_cred-in-copy_peercred.patch [new file with mode: 0644]
queue-6.6/alsa-control-apply-sanity-check-of-input-values-for-.patch [new file with mode: 0644]
queue-6.6/alsa-hda-add-input-value-sanity-checks-to-hdmi-chann.patch [new file with mode: 0644]
queue-6.6/asoc-tas2781-replace-bexx_to_cpup-with-get_unaligned.patch [new file with mode: 0644]
queue-6.6/asoc-topology-properly-initialize-soc_enum-values.patch [new file with mode: 0644]
queue-6.6/ata-pata_macio-use-warn-instead-of-bug.patch [new file with mode: 0644]
queue-6.6/bareudp-fix-device-stats-updates.patch [new file with mode: 0644]
queue-6.6/bluetooth-btnxpuart-fix-null-pointer-dereference-in-.patch [new file with mode: 0644]
queue-6.6/bluetooth-hci_conn-fix-uaf-write-in-__hci_acl_create.patch [new file with mode: 0644]
queue-6.6/bluetooth-hci_conn-only-do-acl-connections-sequentia.patch [new file with mode: 0644]
queue-6.6/bluetooth-hci_event-use-hci-error-defines-instead-of.patch [new file with mode: 0644]
queue-6.6/bluetooth-hci_sync-add-helper-functions-to-manipulat.patch [new file with mode: 0644]
queue-6.6/bluetooth-hci_sync-attempt-to-dequeue-connection-att.patch [new file with mode: 0644]
queue-6.6/bluetooth-hci_sync-introduce-hci_cmd_sync_run-hci_cm.patch [new file with mode: 0644]
queue-6.6/bluetooth-mgmt-fix-not-generating-command-complete-f.patch [new file with mode: 0644]
queue-6.6/bluetooth-qca-if-memdump-doesn-t-work-re-enable-ibs.patch [new file with mode: 0644]
queue-6.6/bluetooth-remove-pending-acl-connection-attempts.patch [new file with mode: 0644]
queue-6.6/bpf-add-sockptr-support-for-getsockopt.patch [new file with mode: 0644]
queue-6.6/bpf-add-sockptr-support-for-setsockopt.patch [new file with mode: 0644]
queue-6.6/bpf-net-fix-a-potential-race-in-do_sock_getsockopt.patch [new file with mode: 0644]
queue-6.6/bpf-verifier-correct-tail_call_reachable-for-bpf-pro.patch [new file with mode: 0644]
queue-6.6/btrfs-clean-up-our-handling-of-refs-0-in-snapshot-de.patch [new file with mode: 0644]
queue-6.6/btrfs-initialize-location-to-fix-wmaybe-uninitialize.patch [new file with mode: 0644]
queue-6.6/btrfs-replace-bug_on-with-assert-in-walk_down_proc.patch [new file with mode: 0644]
queue-6.6/btrfs-replace-bug_on-with-error-handling-at-update_r.patch [new file with mode: 0644]
queue-6.6/can-bcm-remove-proc-entry-when-dev-is-unregistered.patch [new file with mode: 0644]
queue-6.6/can-kvaser_pciefd-move-reset-of-dma-rx-buffers-to-th.patch [new file with mode: 0644]
queue-6.6/can-kvaser_pciefd-remove-unnecessary-comment.patch [new file with mode: 0644]
queue-6.6/can-kvaser_pciefd-rename-board_irq-to-pci_irq.patch [new file with mode: 0644]
queue-6.6/can-kvaser_pciefd-skip-redundant-null-pointer-check-.patch [new file with mode: 0644]
queue-6.6/can-kvaser_pciefd-use-a-single-write-when-releasing-.patch [new file with mode: 0644]
queue-6.6/can-m_can-release-irq-on-error-in-m_can_open.patch [new file with mode: 0644]
queue-6.6/can-mcp251xfd-fix-ring-configuration-when-switching-.patch [new file with mode: 0644]
queue-6.6/cgroup-protect-css-cgroup-write-under-css_set_lock.patch [new file with mode: 0644]
queue-6.6/cifs-fix-falloc_fl_zero_range-to-preflush-buffered-p.patch [new file with mode: 0644]
queue-6.6/crypto-qat-fix-unintentional-re-enabling-of-error-in.patch [new file with mode: 0644]
queue-6.6/cxl-region-verify-target-positions-using-the-ordered.patch [new file with mode: 0644]
queue-6.6/devres-initialize-an-uninitialized-struct-member.patch [new file with mode: 0644]
queue-6.6/dm-init-handle-minors-larger-than-255.patch [new file with mode: 0644]
queue-6.6/dma-mapping-benchmark-don-t-starve-others-when-doing.patch [new file with mode: 0644]
queue-6.6/drm-amd-display-check-denominator-pbn_div-before-use.patch [new file with mode: 0644]
queue-6.6/drm-amd-display-check-hdcp-returned-status.patch [new file with mode: 0644]
queue-6.6/drm-amd-display-run-dc_log_dc-after-checking-link-li.patch [new file with mode: 0644]
queue-6.6/drm-amdgpu-check-for-linear_aligned-correctly-in-che.patch [new file with mode: 0644]
queue-6.6/drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch [new file with mode: 0644]
queue-6.6/drm-amdgpu-fix-smatch-static-checker-warning.patch [new file with mode: 0644]
queue-6.6/drm-amdgpu-reject-gang-submit-on-reserved-vmids.patch [new file with mode: 0644]
queue-6.6/drm-amdgpu-set-no_hw_access-when-vf-request-full-gpu.patch [new file with mode: 0644]
queue-6.6/elf-fix-kernel.randomize_va_space-double-read.patch [new file with mode: 0644]
queue-6.6/ext4-fix-possible-tid_t-sequence-overflows.patch [new file with mode: 0644]
queue-6.6/firmware-cs_dsp-don-t-allow-writes-to-read-only-cont.patch [new file with mode: 0644]
queue-6.6/fou-fix-null-ptr-deref-in-gro.patch [new file with mode: 0644]
queue-6.6/fs-ntfs3-check-more-cases-when-directory-is-corrupte.patch [new file with mode: 0644]
queue-6.6/fs-ntfs3-one-more-reason-to-mark-inode-bad.patch [new file with mode: 0644]
queue-6.6/hid-amd_sfh-free-driver_data-after-destroying-hid-de.patch [new file with mode: 0644]
queue-6.6/hid-cougar-fix-slab-out-of-bounds-read-in-cougar_rep.patch [new file with mode: 0644]
queue-6.6/hwmon-adc128d818-fix-underflows-seen-when-writing-li.patch [new file with mode: 0644]
queue-6.6/hwmon-hp-wmi-sensors-check-if-wmi-event-data-exists.patch [new file with mode: 0644]
queue-6.6/hwmon-lm95234-fix-underflows-seen-when-writing-limit.patch [new file with mode: 0644]
queue-6.6/hwmon-nct6775-core-fix-underflows-seen-when-writing-.patch [new file with mode: 0644]
queue-6.6/hwmon-w83627ehf-fix-underflows-seen-when-writing-lim.patch [new file with mode: 0644]
queue-6.6/i3c-master-svc-resend-target-address-when-get-nack.patch [new file with mode: 0644]
queue-6.6/i3c-mipi-i3c-hci-error-out-instead-on-bug_on-in-ibi-.patch [new file with mode: 0644]
queue-6.6/ice-add-netif_device_attach-detach-into-pf-reset-flo.patch [new file with mode: 0644]
queue-6.6/ice-check-all-ice_vsi_rebuild-errors-in-function.patch [new file with mode: 0644]
queue-6.6/ice-do-not-bring-the-vsi-up-if-it-was-down-before-th.patch [new file with mode: 0644]
queue-6.6/ice-protect-xdp-configuration-with-a-mutex.patch [new file with mode: 0644]
queue-6.6/igb-fix-not-clearing-timesync-interrupts-for-82580.patch [new file with mode: 0644]
queue-6.6/igc-unlock-on-error-in-igc_io_resume.patch [new file with mode: 0644]
queue-6.6/input-ili210x-use-kvmalloc-to-allocate-buffer-for-fi.patch [new file with mode: 0644]
queue-6.6/input-uinput-reject-requests-with-unreasonable-numbe.patch [new file with mode: 0644]
queue-6.6/iommu-sun50i-clear-bypass-register.patch [new file with mode: 0644]
queue-6.6/iommu-vt-d-handle-volatile-descriptor-status-read.patch [new file with mode: 0644]
queue-6.6/irqchip-armada-370-xp-do-not-allow-mapping-irq-0-and.patch [new file with mode: 0644]
queue-6.6/irqchip-gic-v4-always-configure-affinity-on-vpe-acti.patch [new file with mode: 0644]
queue-6.6/irqchip-gic-v4-make-sure-a-vpe-is-locked-when-vmapp-.patch [new file with mode: 0644]
queue-6.6/jbd2-avoid-mount-failed-when-commit-block-is-partial.patch [new file with mode: 0644]
queue-6.6/kselftests-dmabuf-heaps-ensure-the-driver-name-is-nu.patch [new file with mode: 0644]
queue-6.6/leds-spi-byte-call-of_node_put-on-error-path.patch [new file with mode: 0644]
queue-6.6/lib-generic-radix-tree.c-fix-rare-race-in-__genradix.patch [new file with mode: 0644]
queue-6.6/libbpf-add-null-checks-to-bpf_object__-prev_map-next.patch [new file with mode: 0644]
queue-6.6/loongarch-use-correct-api-to-map-cmdline-in-relocate.patch [new file with mode: 0644]
queue-6.6/media-qcom-camss-add-check-for-v4l2_fwnode_endpoint_.patch [new file with mode: 0644]
queue-6.6/media-vivid-don-t-set-hdmi-tx-controls-if-there-are-.patch [new file with mode: 0644]
queue-6.6/media-vivid-fix-wrong-sizeimage-value-for-mplane.patch [new file with mode: 0644]
queue-6.6/mips-cevt-r4k-don-t-call-get_c0_compare_int-if-timer.patch [new file with mode: 0644]
queue-6.6/net-bridge-br_fdb_external_learn_add-always-set-ext_.patch [new file with mode: 0644]
queue-6.6/net-dpaa-avoid-on-stack-arrays-of-nr_cpus-elements.patch [new file with mode: 0644]
queue-6.6/net-dsa-vsc73xx-fix-possible-subblocks-range-of-capt.patch [new file with mode: 0644]
queue-6.6/net-phy-fix-missing-of_node_put-for-leds.patch [new file with mode: 0644]
queue-6.6/net-socket-break-down-__sys_getsockopt.patch [new file with mode: 0644]
queue-6.6/net-socket-break-down-__sys_setsockopt.patch [new file with mode: 0644]
queue-6.6/netfilter-nf_conncount-fix-wrong-variable-type.patch [new file with mode: 0644]
queue-6.6/nfsv4-add-missing-rescheduling-points-in-nfs_client_.patch [new file with mode: 0644]
queue-6.6/of-irq-prevent-device-address-out-of-bounds-read-in-.patch [new file with mode: 0644]
queue-6.6/pci-add-missing-bridge-lock-to-pci_bus_lock.patch [new file with mode: 0644]
queue-6.6/pci-hotplug-pnv_php-fix-hotplug-driver-crash-on-powe.patch [new file with mode: 0644]
queue-6.6/pci-keystone-add-workaround-for-errata-i2037-am65x-s.patch [new file with mode: 0644]
queue-6.6/pcmcia-use-resource_size-function-on-resource-object.patch [new file with mode: 0644]
queue-6.6/phy-zynqmp-take-the-phy-mutex-in-xlate.patch [new file with mode: 0644]
queue-6.6/platform-x86-dell-smbios-fix-error-path-in-dell_smbi.patch [new file with mode: 0644]
queue-6.6/r8152-fix-the-firmware-doesn-t-work.patch [new file with mode: 0644]
queue-6.6/regmap-maple-work-around-gcc-14.1-false-positive-war.patch [new file with mode: 0644]
queue-6.6/regulator-core-stub-devm_regulator_bulk_get_const-if.patch [new file with mode: 0644]
queue-6.6/riscv-kprobes-use-patch_text_nosync-for-insn-slots.patch [new file with mode: 0644]
queue-6.6/riscv-set-trap-vector-earlier.patch [new file with mode: 0644]
queue-6.6/rust-kbuild-fix-export-of-bss-symbols.patch [new file with mode: 0644]
queue-6.6/rust-use-awk-instead-of-recent-xargs.patch [new file with mode: 0644]
queue-6.6/s390-vmlinux.lds.s-move-ro_after_init-section-behind.patch [new file with mode: 0644]
queue-6.6/scsi-pm80xx-set-phy-enable_completion-only-when-we-w.patch [new file with mode: 0644]
queue-6.6/scsi-ufs-core-remove-scsi-host-only-if-added.patch [new file with mode: 0644]
queue-6.6/selftests-net-enable-bind-tests.patch [new file with mode: 0644]
queue-6.6/series
queue-6.6/smack-unix-sockets-fix-accept-ed-socket-label.patch [new file with mode: 0644]
queue-6.6/smb-server-fix-potential-null-ptr-deref-of-lease_ctx.patch [new file with mode: 0644]
queue-6.6/smp-add-missing-destroy_work_on_stack-call-in-smp_ca.patch [new file with mode: 0644]
queue-6.6/spi-hisi-kunpeng-add-verification-for-the-max_freque.patch [new file with mode: 0644]
queue-6.6/spi-spi-fsl-lpspi-limit-prescale-bit-in-tcr-register.patch [new file with mode: 0644]
queue-6.6/squashfs-sanity-check-symbolic-link-size.patch [new file with mode: 0644]
queue-6.6/tcp-don-t-drop-syn-ack-for-simultaneous-connect.patch [new file with mode: 0644]
queue-6.6/udf-avoid-excessive-partition-lengths.patch [new file with mode: 0644]
queue-6.6/um-line-always-fill-error_out-in-setup_one_line.patch [new file with mode: 0644]
queue-6.6/usb-gadget-aspeed_udc-validate-endpoint-index-for-as.patch [new file with mode: 0644]
queue-6.6/usb-uas-set-host-status-byte-on-data-completion-erro.patch [new file with mode: 0644]
queue-6.6/usbnet-ipheth-race-between-ipheth_close-and-error-ha.patch [new file with mode: 0644]
queue-6.6/usbnet-modern-method-to-get-random-mac.patch [new file with mode: 0644]
queue-6.6/vfio-spapr-always-clear-tces-before-unsetting-the-wi.patch [new file with mode: 0644]
queue-6.6/vfs-fix-potential-circular-locking-through-setxattr-.patch [new file with mode: 0644]
queue-6.6/virtio_ring-fix-kmsan-error-for-premapped-mode.patch [new file with mode: 0644]
queue-6.6/wifi-ath12k-fix-firmware-crash-due-to-invalid-peer-n.patch [new file with mode: 0644]
queue-6.6/wifi-ath12k-fix-uninitialize-symbol-error-on-ath12k_.patch [new file with mode: 0644]
queue-6.6/wifi-brcmsmac-advertise-mfp_capable-to-enable-wpa3.patch [new file with mode: 0644]
queue-6.6/wifi-iwlwifi-mvm-use-iwl_fw_check-for-link-id-check.patch [new file with mode: 0644]
queue-6.6/wifi-mt76-mt7921-fix-null-pointer-access-in-mt7921_i.patch [new file with mode: 0644]
queue-6.6/wifi-mwifiex-do-not-return-unused-priv-in-mwifiex_ge.patch [new file with mode: 0644]
queue-6.6/wifi-rtw88-usb-schedule-rx-work-after-everything-is-.patch [new file with mode: 0644]
queue-6.6/x86-kmsan-fix-hook-for-unaligned-accesses.patch [new file with mode: 0644]
queue-6.6/xen-privcmd-fix-possible-access-to-a-freed-kirqfd-in.patch [new file with mode: 0644]

diff --git a/queue-6.6/accel-habanalabs-gaudi2-unsecure-edma-max-outstandin.patch b/queue-6.6/accel-habanalabs-gaudi2-unsecure-edma-max-outstandin.patch
new file mode 100644 (file)
index 0000000..b59f8ab
--- /dev/null
@@ -0,0 +1,35 @@
+From a2fa79a1ad6d1adfd3d74998b10f50e95cc8d991 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 26 Mar 2024 08:01:02 +0200
+Subject: accel/habanalabs/gaudi2: unsecure edma max outstanding register
+
+From: Rakesh Ughreja <rughreja@habana.ai>
+
+[ Upstream commit 3309887c6ff8ca2ac05a74e1ee5d1c44829f63f2 ]
+
+Netowrk EDMAs uses more outstanding transfers so this needs to be
+programmed by EDMA firmware.
+
+Signed-off-by: Rakesh Ughreja <rughreja@habana.ai>
+Reviewed-by: Ofir Bitton <obitton@habana.ai>
+Signed-off-by: Ofir Bitton <obitton@habana.ai>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/accel/habanalabs/gaudi2/gaudi2_security.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/accel/habanalabs/gaudi2/gaudi2_security.c b/drivers/accel/habanalabs/gaudi2/gaudi2_security.c
+index 908710524dc9..493e556cd31b 100644
+--- a/drivers/accel/habanalabs/gaudi2/gaudi2_security.c
++++ b/drivers/accel/habanalabs/gaudi2/gaudi2_security.c
+@@ -479,6 +479,7 @@ static const u32 gaudi2_pb_dcr0_edma0_unsecured_regs[] = {
+       mmDCORE0_EDMA0_CORE_CTX_TE_NUMROWS,
+       mmDCORE0_EDMA0_CORE_CTX_IDX,
+       mmDCORE0_EDMA0_CORE_CTX_IDX_INC,
++      mmDCORE0_EDMA0_CORE_WR_COMP_MAX_OUTSTAND,
+       mmDCORE0_EDMA0_CORE_RD_LBW_RATE_LIM_CFG,
+       mmDCORE0_EDMA0_QM_CQ_CFG0_0,
+       mmDCORE0_EDMA0_QM_CQ_CFG0_1,
+-- 
+2.43.0
+
diff --git a/queue-6.6/af_unix-remove-put_pid-put_cred-in-copy_peercred.patch b/queue-6.6/af_unix-remove-put_pid-put_cred-in-copy_peercred.patch
new file mode 100644 (file)
index 0000000..8826012
--- /dev/null
@@ -0,0 +1,58 @@
+From d8486a9e8550f3f96db5a18c9530d226490c1fc4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jun 2024 13:56:22 -0700
+Subject: af_unix: Remove put_pid()/put_cred() in copy_peercred().
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ Upstream commit e4bd881d987121dbf1a288641491955a53d9f8f7 ]
+
+When (AF_UNIX, SOCK_STREAM) socket connect()s to a listening socket,
+the listener's sk_peer_pid/sk_peer_cred are copied to the client in
+copy_peercred().
+
+Then, the client's sk_peer_pid and sk_peer_cred are always NULL, so
+we need not call put_pid() and put_cred() there.
+
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/unix/af_unix.c | 9 +--------
+ 1 file changed, 1 insertion(+), 8 deletions(-)
+
+diff --git a/net/unix/af_unix.c b/net/unix/af_unix.c
+index b7f62442d826..dca4429014db 100644
+--- a/net/unix/af_unix.c
++++ b/net/unix/af_unix.c
+@@ -693,9 +693,6 @@ static void init_peercred(struct sock *sk)
+ static void copy_peercred(struct sock *sk, struct sock *peersk)
+ {
+-      const struct cred *old_cred;
+-      struct pid *old_pid;
+-
+       if (sk < peersk) {
+               spin_lock(&sk->sk_peer_lock);
+               spin_lock_nested(&peersk->sk_peer_lock, SINGLE_DEPTH_NESTING);
+@@ -703,16 +700,12 @@ static void copy_peercred(struct sock *sk, struct sock *peersk)
+               spin_lock(&peersk->sk_peer_lock);
+               spin_lock_nested(&sk->sk_peer_lock, SINGLE_DEPTH_NESTING);
+       }
+-      old_pid = sk->sk_peer_pid;
+-      old_cred = sk->sk_peer_cred;
++
+       sk->sk_peer_pid  = get_pid(peersk->sk_peer_pid);
+       sk->sk_peer_cred = get_cred(peersk->sk_peer_cred);
+       spin_unlock(&sk->sk_peer_lock);
+       spin_unlock(&peersk->sk_peer_lock);
+-
+-      put_pid(old_pid);
+-      put_cred(old_cred);
+ }
+ static int unix_listen(struct socket *sock, int backlog)
+-- 
+2.43.0
+
diff --git a/queue-6.6/alsa-control-apply-sanity-check-of-input-values-for-.patch b/queue-6.6/alsa-control-apply-sanity-check-of-input-values-for-.patch
new file mode 100644 (file)
index 0000000..65a1529
--- /dev/null
@@ -0,0 +1,61 @@
+From 27ca110e17c79af00c8431b75020f48e78844670 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Jun 2024 09:34:44 +0200
+Subject: ALSA: control: Apply sanity check of input values for user elements
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit 50ed081284fe2bfd1f25e8b92f4f6a4990e73c0a ]
+
+Although we have already a mechanism for sanity checks of input values
+for control writes, it's not applied unless the kconfig
+CONFIG_SND_CTL_INPUT_VALIDATION is set due to the performance reason.
+Nevertheless, it still makes sense to apply the same check for user
+elements despite of its cost, as that's the only way to filter out the
+invalid values; the user controls are handled solely in ALSA core
+code, and there is no corresponding driver, after all.
+
+This patch adds the same input value validation for user control
+elements at its put callback.  The kselftest will be happier with this
+change, as the incorrect values will be bailed out now with errors.
+
+For other normal controls, the check is applied still only when
+CONFIG_SND_CTL_INPUT_VALIDATION is set.
+
+Reported-by: Paul Menzel <pmenzel@molgen.mpg.de>
+Closes: https://lore.kernel.org/r/1d44be36-9bb9-4d82-8953-5ae2a4f09405@molgen.mpg.de
+Reviewed-by: Jaroslav Kysela <perex@perex.cz>
+Reviewed-by: Mark Brown <broonie@kernel.org>
+Reviewed-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://lore.kernel.org/20240616073454.16512-4-tiwai@suse.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/core/control.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/sound/core/control.c b/sound/core/control.c
+index 59c8658966d4..dd4bdb39782c 100644
+--- a/sound/core/control.c
++++ b/sound/core/control.c
+@@ -1553,12 +1553,16 @@ static int snd_ctl_elem_user_get(struct snd_kcontrol *kcontrol,
+ static int snd_ctl_elem_user_put(struct snd_kcontrol *kcontrol,
+                                struct snd_ctl_elem_value *ucontrol)
+ {
+-      int change;
++      int err, change;
+       struct user_element *ue = kcontrol->private_data;
+       unsigned int size = ue->elem_data_size;
+       char *dst = ue->elem_data +
+                       snd_ctl_get_ioff(kcontrol, &ucontrol->id) * size;
++      err = sanity_check_input_values(ue->card, ucontrol, &ue->info, false);
++      if (err < 0)
++              return err;
++
+       change = memcmp(&ucontrol->value, dst, size) != 0;
+       if (change)
+               memcpy(dst, &ucontrol->value, size);
+-- 
+2.43.0
+
diff --git a/queue-6.6/alsa-hda-add-input-value-sanity-checks-to-hdmi-chann.patch b/queue-6.6/alsa-hda-add-input-value-sanity-checks-to-hdmi-chann.patch
new file mode 100644 (file)
index 0000000..d192df7
--- /dev/null
@@ -0,0 +1,61 @@
+From dba810c0946ed5c17401579acf38ecbc61629f18 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Jun 2024 09:34:47 +0200
+Subject: ALSA: hda: Add input value sanity checks to HDMI channel map controls
+
+From: Takashi Iwai <tiwai@suse.de>
+
+[ Upstream commit 6278056e42d953e207e2afd416be39d09ed2d496 ]
+
+Add a simple sanity check to HD-audio HDMI Channel Map controls.
+Although the value might not be accepted for the actual connection, we
+can filter out some bogus values beforehand, and that should be enough
+for making kselftest happier.
+
+Reviewed-by: Jaroslav Kysela <perex@perex.cz>
+Signed-off-by: Takashi Iwai <tiwai@suse.de>
+Link: https://lore.kernel.org/20240616073454.16512-7-tiwai@suse.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/hda/hdmi_chmap.c | 18 ++++++++++++++++++
+ 1 file changed, 18 insertions(+)
+
+diff --git a/sound/hda/hdmi_chmap.c b/sound/hda/hdmi_chmap.c
+index 5d8e1d944b0a..7b276047f85a 100644
+--- a/sound/hda/hdmi_chmap.c
++++ b/sound/hda/hdmi_chmap.c
+@@ -753,6 +753,20 @@ static int hdmi_chmap_ctl_get(struct snd_kcontrol *kcontrol,
+       return 0;
+ }
++/* a simple sanity check for input values to chmap kcontrol */
++static int chmap_value_check(struct hdac_chmap *hchmap,
++                           const struct snd_ctl_elem_value *ucontrol)
++{
++      int i;
++
++      for (i = 0; i < hchmap->channels_max; i++) {
++              if (ucontrol->value.integer.value[i] < 0 ||
++                  ucontrol->value.integer.value[i] > SNDRV_CHMAP_LAST)
++                      return -EINVAL;
++      }
++      return 0;
++}
++
+ static int hdmi_chmap_ctl_put(struct snd_kcontrol *kcontrol,
+                             struct snd_ctl_elem_value *ucontrol)
+ {
+@@ -764,6 +778,10 @@ static int hdmi_chmap_ctl_put(struct snd_kcontrol *kcontrol,
+       unsigned char chmap[8], per_pin_chmap[8];
+       int i, err, ca, prepared = 0;
++      err = chmap_value_check(hchmap, ucontrol);
++      if (err < 0)
++              return err;
++
+       /* No monitor is connected in dyn_pcm_assign.
+        * It's invalid to setup the chmap
+        */
+-- 
+2.43.0
+
diff --git a/queue-6.6/asoc-tas2781-replace-bexx_to_cpup-with-get_unaligned.patch b/queue-6.6/asoc-tas2781-replace-bexx_to_cpup-with-get_unaligned.patch
new file mode 100644 (file)
index 0000000..475a8fc
--- /dev/null
@@ -0,0 +1,312 @@
+From 62143e8b49da4239077bba6e300a41c4b5dae019 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 7 Jul 2024 16:30:07 +0800
+Subject: ASoc: TAS2781: replace beXX_to_cpup with get_unaligned_beXX for
+ potentially broken alignment
+
+From: Shenghao Ding <shenghao-ding@ti.com>
+
+[ Upstream commit 1cc509edbe23b61e8c245611bd15d88edb635a38 ]
+
+Use get_unaligned_be16 instead of be16_to_cpup and get_unaligned_be32
+instead of be32_to_cpup for potentially broken alignment.
+
+Signed-off-by: Shenghao Ding <shenghao-ding@ti.com>
+Link: https://patch.msgid.link/20240707083011.98-1-shenghao-ding@ti.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/codecs/tas2781-fmwlib.c | 71 +++++++++++++++----------------
+ 1 file changed, 35 insertions(+), 36 deletions(-)
+
+diff --git a/sound/soc/codecs/tas2781-fmwlib.c b/sound/soc/codecs/tas2781-fmwlib.c
+index 41ad82a42916..3639dcd0bbb2 100644
+--- a/sound/soc/codecs/tas2781-fmwlib.c
++++ b/sound/soc/codecs/tas2781-fmwlib.c
+@@ -21,7 +21,7 @@
+ #include <sound/soc.h>
+ #include <sound/tlv.h>
+ #include <sound/tas2781.h>
+-
++#include <asm/unaligned.h>
+ #define ERROR_PRAM_CRCCHK                     0x0000000
+ #define ERROR_YRAM_CRCCHK                     0x0000001
+@@ -125,8 +125,7 @@ static struct tasdevice_config_info *tasdevice_add_config(
+       /* convert data[offset], data[offset + 1], data[offset + 2] and
+        * data[offset + 3] into host
+        */
+-      cfg_info->nblocks =
+-              be32_to_cpup((__be32 *)&config_data[config_offset]);
++      cfg_info->nblocks = get_unaligned_be32(&config_data[config_offset]);
+       config_offset += 4;
+       /* Several kinds of dsp/algorithm firmwares can run on tas2781,
+@@ -170,14 +169,14 @@ static struct tasdevice_config_info *tasdevice_add_config(
+               }
+               bk_da[i]->yram_checksum =
+-                      be16_to_cpup((__be16 *)&config_data[config_offset]);
++                      get_unaligned_be16(&config_data[config_offset]);
+               config_offset += 2;
+               bk_da[i]->block_size =
+-                      be32_to_cpup((__be32 *)&config_data[config_offset]);
++                      get_unaligned_be32(&config_data[config_offset]);
+               config_offset += 4;
+               bk_da[i]->n_subblks =
+-                      be32_to_cpup((__be32 *)&config_data[config_offset]);
++                      get_unaligned_be32(&config_data[config_offset]);
+               config_offset += 4;
+@@ -227,7 +226,7 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
+       }
+       buf = (unsigned char *)fmw->data;
+-      fw_hdr->img_sz = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_hdr->img_sz = get_unaligned_be32(&buf[offset]);
+       offset += 4;
+       if (fw_hdr->img_sz != fmw->size) {
+               dev_err(tas_priv->dev,
+@@ -238,9 +237,9 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
+               goto out;
+       }
+-      fw_hdr->checksum = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_hdr->checksum = get_unaligned_be32(&buf[offset]);
+       offset += 4;
+-      fw_hdr->binary_version_num = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_hdr->binary_version_num = get_unaligned_be32(&buf[offset]);
+       if (fw_hdr->binary_version_num < 0x103) {
+               dev_err(tas_priv->dev, "File version 0x%04x is too low",
+                       fw_hdr->binary_version_num);
+@@ -249,7 +248,7 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
+               goto out;
+       }
+       offset += 4;
+-      fw_hdr->drv_fw_version = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_hdr->drv_fw_version = get_unaligned_be32(&buf[offset]);
+       offset += 8;
+       fw_hdr->plat_type = buf[offset];
+       offset += 1;
+@@ -277,11 +276,11 @@ int tasdevice_rca_parser(void *context, const struct firmware *fmw)
+       for (i = 0; i < TASDEVICE_DEVICE_SUM; i++, offset++)
+               fw_hdr->devs[i] = buf[offset];
+-      fw_hdr->nconfig = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_hdr->nconfig = get_unaligned_be32(&buf[offset]);
+       offset += 4;
+       for (i = 0; i < TASDEVICE_CONFIG_SUM; i++) {
+-              fw_hdr->config_size[i] = be32_to_cpup((__be32 *)&buf[offset]);
++              fw_hdr->config_size[i] = get_unaligned_be32(&buf[offset]);
+               offset += 4;
+               total_config_sz += fw_hdr->config_size[i];
+       }
+@@ -330,7 +329,7 @@ static int fw_parse_block_data_kernel(struct tasdevice_fw *tas_fmw,
+       /* convert data[offset], data[offset + 1], data[offset + 2] and
+        * data[offset + 3] into host
+        */
+-      block->type = be32_to_cpup((__be32 *)&data[offset]);
++      block->type = get_unaligned_be32(&data[offset]);
+       offset += 4;
+       block->is_pchksum_present = data[offset];
+@@ -345,10 +344,10 @@ static int fw_parse_block_data_kernel(struct tasdevice_fw *tas_fmw,
+       block->ychksum = data[offset];
+       offset++;
+-      block->blk_size = be32_to_cpup((__be32 *)&data[offset]);
++      block->blk_size = get_unaligned_be32(&data[offset]);
+       offset += 4;
+-      block->nr_subblocks = be32_to_cpup((__be32 *)&data[offset]);
++      block->nr_subblocks = get_unaligned_be32(&data[offset]);
+       offset += 4;
+       if (offset + block->blk_size > fmw->size) {
+@@ -381,7 +380,7 @@ static int fw_parse_data_kernel(struct tasdevice_fw *tas_fmw,
+               offset = -EINVAL;
+               goto out;
+       }
+-      img_data->nr_blk = be32_to_cpup((__be32 *)&data[offset]);
++      img_data->nr_blk = get_unaligned_be32(&data[offset]);
+       offset += 4;
+       img_data->dev_blks = kcalloc(img_data->nr_blk,
+@@ -477,14 +476,14 @@ static int fw_parse_variable_header_kernel(
+               offset = -EINVAL;
+               goto out;
+       }
+-      fw_hdr->device_family = be16_to_cpup((__be16 *)&buf[offset]);
++      fw_hdr->device_family = get_unaligned_be16(&buf[offset]);
+       if (fw_hdr->device_family != 0) {
+               dev_err(tas_priv->dev, "%s:not TAS device\n", __func__);
+               offset = -EINVAL;
+               goto out;
+       }
+       offset += 2;
+-      fw_hdr->device = be16_to_cpup((__be16 *)&buf[offset]);
++      fw_hdr->device = get_unaligned_be16(&buf[offset]);
+       if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE ||
+               fw_hdr->device == 6) {
+               dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device);
+@@ -502,7 +501,7 @@ static int fw_parse_variable_header_kernel(
+               goto out;
+       }
+-      tas_fmw->nr_programs = be32_to_cpup((__be32 *)&buf[offset]);
++      tas_fmw->nr_programs = get_unaligned_be32(&buf[offset]);
+       offset += 4;
+       if (tas_fmw->nr_programs == 0 || tas_fmw->nr_programs >
+@@ -521,14 +520,14 @@ static int fw_parse_variable_header_kernel(
+       for (i = 0; i < tas_fmw->nr_programs; i++) {
+               program = &(tas_fmw->programs[i]);
+-              program->prog_size = be32_to_cpup((__be32 *)&buf[offset]);
++              program->prog_size = get_unaligned_be32(&buf[offset]);
+               offset += 4;
+       }
+       /* Skip the unused prog_size */
+       offset += 4 * (TASDEVICE_MAXPROGRAM_NUM_KERNEL - tas_fmw->nr_programs);
+-      tas_fmw->nr_configurations = be32_to_cpup((__be32 *)&buf[offset]);
++      tas_fmw->nr_configurations = get_unaligned_be32(&buf[offset]);
+       offset += 4;
+       /* The max number of config in firmware greater than 4 pieces of
+@@ -560,7 +559,7 @@ static int fw_parse_variable_header_kernel(
+       for (i = 0; i < tas_fmw->nr_programs; i++) {
+               config = &(tas_fmw->configs[i]);
+-              config->cfg_size = be32_to_cpup((__be32 *)&buf[offset]);
++              config->cfg_size = get_unaligned_be32(&buf[offset]);
+               offset += 4;
+       }
+@@ -598,7 +597,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
+               switch (subblk_typ) {
+               case TASDEVICE_CMD_SING_W: {
+                       int i;
+-                      unsigned short len = be16_to_cpup((__be16 *)&data[2]);
++                      unsigned short len = get_unaligned_be16(&data[2]);
+                       subblk_offset += 2;
+                       if (subblk_offset + 4 * len > sublocksize) {
+@@ -624,7 +623,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
+               }
+                       break;
+               case TASDEVICE_CMD_BURST: {
+-                      unsigned short len = be16_to_cpup((__be16 *)&data[2]);
++                      unsigned short len = get_unaligned_be16(&data[2]);
+                       subblk_offset += 2;
+                       if (subblk_offset + 4 + len > sublocksize) {
+@@ -665,7 +664,7 @@ static int tasdevice_process_block(void *context, unsigned char *data,
+                               is_err = true;
+                               break;
+                       }
+-                      sleep_time = be16_to_cpup((__be16 *)&data[2]) * 1000;
++                      sleep_time = get_unaligned_be16(&data[2]) * 1000;
+                       usleep_range(sleep_time, sleep_time + 50);
+                       subblk_offset += 2;
+               }
+@@ -940,7 +939,7 @@ static int fw_parse_variable_hdr(struct tasdevice_priv
+       offset += len;
+-      fw_hdr->device_family = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_hdr->device_family = get_unaligned_be32(&buf[offset]);
+       if (fw_hdr->device_family != 0) {
+               dev_err(tas_priv->dev, "%s: not TAS device\n", __func__);
+               offset = -EINVAL;
+@@ -948,7 +947,7 @@ static int fw_parse_variable_hdr(struct tasdevice_priv
+       }
+       offset += 4;
+-      fw_hdr->device = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_hdr->device = get_unaligned_be32(&buf[offset]);
+       if (fw_hdr->device >= TASDEVICE_DSP_TAS_MAX_DEVICE ||
+               fw_hdr->device == 6) {
+               dev_err(tas_priv->dev, "Unsupported dev %d\n", fw_hdr->device);
+@@ -993,7 +992,7 @@ static int fw_parse_block_data(struct tasdevice_fw *tas_fmw,
+               offset = -EINVAL;
+               goto out;
+       }
+-      block->type = be32_to_cpup((__be32 *)&data[offset]);
++      block->type = get_unaligned_be32(&data[offset]);
+       offset += 4;
+       if (tas_fmw->fw_hdr.fixed_hdr.drv_ver >= PPC_DRIVER_CRCCHK) {
+@@ -1018,7 +1017,7 @@ static int fw_parse_block_data(struct tasdevice_fw *tas_fmw,
+               block->is_ychksum_present = 0;
+       }
+-      block->nr_cmds = be32_to_cpup((__be32 *)&data[offset]);
++      block->nr_cmds = get_unaligned_be32(&data[offset]);
+       offset += 4;
+       n = block->nr_cmds * 4;
+@@ -1069,7 +1068,7 @@ static int fw_parse_data(struct tasdevice_fw *tas_fmw,
+               goto out;
+       }
+       offset += n;
+-      img_data->nr_blk = be16_to_cpup((__be16 *)&data[offset]);
++      img_data->nr_blk = get_unaligned_be16(&data[offset]);
+       offset += 2;
+       img_data->dev_blks = kcalloc(img_data->nr_blk,
+@@ -1106,7 +1105,7 @@ static int fw_parse_program_data(struct tasdevice_priv *tas_priv,
+               offset = -EINVAL;
+               goto out;
+       }
+-      tas_fmw->nr_programs = be16_to_cpup((__be16 *)&buf[offset]);
++      tas_fmw->nr_programs = get_unaligned_be16(&buf[offset]);
+       offset += 2;
+       if (tas_fmw->nr_programs == 0) {
+@@ -1173,7 +1172,7 @@ static int fw_parse_configuration_data(
+               offset = -EINVAL;
+               goto out;
+       }
+-      tas_fmw->nr_configurations = be16_to_cpup((__be16 *)&data[offset]);
++      tas_fmw->nr_configurations = get_unaligned_be16(&data[offset]);
+       offset += 2;
+       if (tas_fmw->nr_configurations == 0) {
+@@ -1805,7 +1804,7 @@ static int fw_parse_header(struct tasdevice_priv *tas_priv,
+       /* Convert data[offset], data[offset + 1], data[offset + 2] and
+        * data[offset + 3] into host
+        */
+-      fw_fixed_hdr->fwsize = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_fixed_hdr->fwsize = get_unaligned_be32(&buf[offset]);
+       offset += 4;
+       if (fw_fixed_hdr->fwsize != fmw->size) {
+               dev_err(tas_priv->dev, "File size not match, %lu %u",
+@@ -1814,9 +1813,9 @@ static int fw_parse_header(struct tasdevice_priv *tas_priv,
+               goto out;
+       }
+       offset += 4;
+-      fw_fixed_hdr->ppcver = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_fixed_hdr->ppcver = get_unaligned_be32(&buf[offset]);
+       offset += 8;
+-      fw_fixed_hdr->drv_ver = be32_to_cpup((__be32 *)&buf[offset]);
++      fw_fixed_hdr->drv_ver = get_unaligned_be32(&buf[offset]);
+       offset += 72;
+  out:
+@@ -1858,7 +1857,7 @@ static int fw_parse_calibration_data(struct tasdevice_priv *tas_priv,
+               offset = -EINVAL;
+               goto out;
+       }
+-      tas_fmw->nr_calibrations = be16_to_cpup((__be16 *)&data[offset]);
++      tas_fmw->nr_calibrations = get_unaligned_be16(&data[offset]);
+       offset += 2;
+       if (tas_fmw->nr_calibrations != 1) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/asoc-topology-properly-initialize-soc_enum-values.patch b/queue-6.6/asoc-topology-properly-initialize-soc_enum-values.patch
new file mode 100644 (file)
index 0000000..b87c8a9
--- /dev/null
@@ -0,0 +1,38 @@
+From cee4a726740d251ec0d065fb855d67cc39f13c00 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jun 2024 12:18:40 +0200
+Subject: ASoC: topology: Properly initialize soc_enum values
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
+
+[ Upstream commit 8ec2a2643544ce352f012ad3d248163199d05dfc ]
+
+soc_tplg_denum_create_values() should properly set its values field.
+
+Signed-off-by: Amadeusz Sławiński <amadeuszx.slawinski@linux.intel.com>
+Link: https://patch.msgid.link/20240627101850.2191513-4-amadeuszx.slawinski@linux.intel.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ sound/soc/soc-topology.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/sound/soc/soc-topology.c b/sound/soc/soc-topology.c
+index 7e8fca0b0662..a643ef654b9d 100644
+--- a/sound/soc/soc-topology.c
++++ b/sound/soc/soc-topology.c
+@@ -851,6 +851,8 @@ static int soc_tplg_denum_create_values(struct soc_tplg *tplg, struct soc_enum *
+               se->dobj.control.dvalues[i] = le32_to_cpu(ec->values[i]);
+       }
++      se->items = le32_to_cpu(ec->items);
++      se->values = (const unsigned int *)se->dobj.control.dvalues;
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/ata-pata_macio-use-warn-instead-of-bug.patch b/queue-6.6/ata-pata_macio-use-warn-instead-of-bug.patch
new file mode 100644 (file)
index 0000000..970a475
--- /dev/null
@@ -0,0 +1,53 @@
+From 23b0525f3d7d71c7fd020372259c9f7dca05b572 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 20 Aug 2024 13:04:07 +1000
+Subject: ata: pata_macio: Use WARN instead of BUG
+
+From: Michael Ellerman <mpe@ellerman.id.au>
+
+[ Upstream commit d4bc0a264fb482b019c84fbc7202dd3cab059087 ]
+
+The overflow/underflow conditions in pata_macio_qc_prep() should never
+happen. But if they do there's no need to kill the system entirely, a
+WARN and failing the IO request should be sufficient and might allow the
+system to keep running.
+
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Signed-off-by: Damien Le Moal <dlemoal@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ata/pata_macio.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ata/pata_macio.c b/drivers/ata/pata_macio.c
+index 17f6ccee53c7..ffbb2e8591ce 100644
+--- a/drivers/ata/pata_macio.c
++++ b/drivers/ata/pata_macio.c
+@@ -541,7 +541,8 @@ static enum ata_completion_errors pata_macio_qc_prep(struct ata_queued_cmd *qc)
+               while (sg_len) {
+                       /* table overflow should never happen */
+-                      BUG_ON (pi++ >= MAX_DCMDS);
++                      if (WARN_ON_ONCE(pi >= MAX_DCMDS))
++                              return AC_ERR_SYSTEM;
+                       len = (sg_len < MAX_DBDMA_SEG) ? sg_len : MAX_DBDMA_SEG;
+                       table->command = cpu_to_le16(write ? OUTPUT_MORE: INPUT_MORE);
+@@ -553,11 +554,13 @@ static enum ata_completion_errors pata_macio_qc_prep(struct ata_queued_cmd *qc)
+                       addr += len;
+                       sg_len -= len;
+                       ++table;
++                      ++pi;
+               }
+       }
+       /* Should never happen according to Tejun */
+-      BUG_ON(!pi);
++      if (WARN_ON_ONCE(!pi))
++              return AC_ERR_SYSTEM;
+       /* Convert the last command to an input/output */
+       table--;
+-- 
+2.43.0
+
diff --git a/queue-6.6/bareudp-fix-device-stats-updates.patch b/queue-6.6/bareudp-fix-device-stats-updates.patch
new file mode 100644 (file)
index 0000000..a2061c9
--- /dev/null
@@ -0,0 +1,106 @@
+From 0534d40da4d369ab7a39181d3fc2db458b4544b4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 30 Aug 2024 17:31:07 +0200
+Subject: bareudp: Fix device stats updates.
+
+From: Guillaume Nault <gnault@redhat.com>
+
+[ Upstream commit 4963d2343af81f493519f9c3ea9f2169eaa7353a ]
+
+Bareudp devices update their stats concurrently.
+Therefore they need proper atomic increments.
+
+Fixes: 571912c69f0e ("net: UDP tunnel encapsulation module for tunnelling different protocols like MPLS, IP, NSH etc.")
+Signed-off-by: Guillaume Nault <gnault@redhat.com>
+Reviewed-by: Willem de Bruijn <willemb@google.com>
+Link: https://patch.msgid.link/04b7b9d0b480158eb3ab4366ec80aa2ab7e41fcb.1725031794.git.gnault@redhat.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/bareudp.c | 22 +++++++++++-----------
+ 1 file changed, 11 insertions(+), 11 deletions(-)
+
+diff --git a/drivers/net/bareudp.c b/drivers/net/bareudp.c
+index 683203f87ae2..277493e41b07 100644
+--- a/drivers/net/bareudp.c
++++ b/drivers/net/bareudp.c
+@@ -82,7 +82,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
+               if (skb_copy_bits(skb, BAREUDP_BASE_HLEN, &ipversion,
+                                 sizeof(ipversion))) {
+-                      bareudp->dev->stats.rx_dropped++;
++                      DEV_STATS_INC(bareudp->dev, rx_dropped);
+                       goto drop;
+               }
+               ipversion >>= 4;
+@@ -92,7 +92,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
+               } else if (ipversion == 6 && bareudp->multi_proto_mode) {
+                       proto = htons(ETH_P_IPV6);
+               } else {
+-                      bareudp->dev->stats.rx_dropped++;
++                      DEV_STATS_INC(bareudp->dev, rx_dropped);
+                       goto drop;
+               }
+       } else if (bareudp->ethertype == htons(ETH_P_MPLS_UC)) {
+@@ -106,7 +106,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
+                                  ipv4_is_multicast(tunnel_hdr->daddr)) {
+                               proto = htons(ETH_P_MPLS_MC);
+                       } else {
+-                              bareudp->dev->stats.rx_dropped++;
++                              DEV_STATS_INC(bareudp->dev, rx_dropped);
+                               goto drop;
+                       }
+               } else {
+@@ -122,7 +122,7 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
+                                  (addr_type & IPV6_ADDR_MULTICAST)) {
+                               proto = htons(ETH_P_MPLS_MC);
+                       } else {
+-                              bareudp->dev->stats.rx_dropped++;
++                              DEV_STATS_INC(bareudp->dev, rx_dropped);
+                               goto drop;
+                       }
+               }
+@@ -134,12 +134,12 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
+                                proto,
+                                !net_eq(bareudp->net,
+                                dev_net(bareudp->dev)))) {
+-              bareudp->dev->stats.rx_dropped++;
++              DEV_STATS_INC(bareudp->dev, rx_dropped);
+               goto drop;
+       }
+       tun_dst = udp_tun_rx_dst(skb, family, TUNNEL_KEY, 0, 0);
+       if (!tun_dst) {
+-              bareudp->dev->stats.rx_dropped++;
++              DEV_STATS_INC(bareudp->dev, rx_dropped);
+               goto drop;
+       }
+       skb_dst_set(skb, &tun_dst->dst);
+@@ -165,8 +165,8 @@ static int bareudp_udp_encap_recv(struct sock *sk, struct sk_buff *skb)
+                                                    &((struct ipv6hdr *)oiph)->saddr);
+               }
+               if (err > 1) {
+-                      ++bareudp->dev->stats.rx_frame_errors;
+-                      ++bareudp->dev->stats.rx_errors;
++                      DEV_STATS_INC(bareudp->dev, rx_frame_errors);
++                      DEV_STATS_INC(bareudp->dev, rx_errors);
+                       goto drop;
+               }
+       }
+@@ -462,11 +462,11 @@ static netdev_tx_t bareudp_xmit(struct sk_buff *skb, struct net_device *dev)
+       dev_kfree_skb(skb);
+       if (err == -ELOOP)
+-              dev->stats.collisions++;
++              DEV_STATS_INC(dev, collisions);
+       else if (err == -ENETUNREACH)
+-              dev->stats.tx_carrier_errors++;
++              DEV_STATS_INC(dev, tx_carrier_errors);
+-      dev->stats.tx_errors++;
++      DEV_STATS_INC(dev, tx_errors);
+       return NETDEV_TX_OK;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-btnxpuart-fix-null-pointer-dereference-in-.patch b/queue-6.6/bluetooth-btnxpuart-fix-null-pointer-dereference-in-.patch
new file mode 100644 (file)
index 0000000..a93fdea
--- /dev/null
@@ -0,0 +1,100 @@
+From 4ba69641e7ed5e2306135ec34572406675371067 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 15 May 2024 12:36:55 +0530
+Subject: Bluetooth: btnxpuart: Fix Null pointer dereference in
+ btnxpuart_flush()
+
+From: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
+
+[ Upstream commit c68bbf5e334b35b36ac5b9f0419f1f93f796bad1 ]
+
+This adds a check before freeing the rx->skb in flush and close
+functions to handle the kernel crash seen while removing driver after FW
+download fails or before FW download completes.
+
+dmesg log:
+[   54.634586] Unable to handle kernel NULL pointer dereference at virtual address 0000000000000080
+[   54.643398] Mem abort info:
+[   54.646204]   ESR = 0x0000000096000004
+[   54.649964]   EC = 0x25: DABT (current EL), IL = 32 bits
+[   54.655286]   SET = 0, FnV = 0
+[   54.658348]   EA = 0, S1PTW = 0
+[   54.661498]   FSC = 0x04: level 0 translation fault
+[   54.666391] Data abort info:
+[   54.669273]   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
+[   54.674768]   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
+[   54.674771]   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
+[   54.674775] user pgtable: 4k pages, 48-bit VAs, pgdp=0000000048860000
+[   54.674780] [0000000000000080] pgd=0000000000000000, p4d=0000000000000000
+[   54.703880] Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
+[   54.710152] Modules linked in: btnxpuart(-) overlay fsl_jr_uio caam_jr caamkeyblob_desc caamhash_desc caamalg_desc crypto_engine authenc libdes crct10dif_ce polyval_ce polyval_generic snd_soc_imx_spdif snd_soc_imx_card snd_soc_ak5558 snd_soc_ak4458 caam secvio error snd_soc_fsl_micfil snd_soc_fsl_spdif snd_soc_fsl_sai snd_soc_fsl_utils imx_pcm_dma gpio_ir_recv rc_core sch_fq_codel fuse
+[   54.744357] CPU: 3 PID: 72 Comm: kworker/u9:0 Not tainted 6.6.3-otbr-g128004619037 #2
+[   54.744364] Hardware name: FSL i.MX8MM EVK board (DT)
+[   54.744368] Workqueue: hci0 hci_power_on
+[   54.757244] pstate: 60000005 (nZCv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
+[   54.757249] pc : kfree_skb_reason+0x18/0xb0
+[   54.772299] lr : btnxpuart_flush+0x40/0x58 [btnxpuart]
+[   54.782921] sp : ffff8000805ebca0
+[   54.782923] x29: ffff8000805ebca0 x28: ffffa5c6cf1869c0 x27: ffffa5c6cf186000
+[   54.782931] x26: ffff377b84852400 x25: ffff377b848523c0 x24: ffff377b845e7230
+[   54.782938] x23: ffffa5c6ce8dbe08 x22: ffffa5c6ceb65410 x21: 00000000ffffff92
+[   54.782945] x20: ffffa5c6ce8dbe98 x19: ffffffffffffffac x18: ffffffffffffffff
+[   54.807651] x17: 0000000000000000 x16: ffffa5c6ce2824ec x15: ffff8001005eb857
+[   54.821917] x14: 0000000000000000 x13: ffffa5c6cf1a02e0 x12: 0000000000000642
+[   54.821924] x11: 0000000000000040 x10: ffffa5c6cf19d690 x9 : ffffa5c6cf19d688
+[   54.821931] x8 : ffff377b86000028 x7 : 0000000000000000 x6 : 0000000000000000
+[   54.821938] x5 : ffff377b86000000 x4 : 0000000000000000 x3 : 0000000000000000
+[   54.843331] x2 : 0000000000000000 x1 : 0000000000000002 x0 : ffffffffffffffac
+[   54.857599] Call trace:
+[   54.857601]  kfree_skb_reason+0x18/0xb0
+[   54.863878]  btnxpuart_flush+0x40/0x58 [btnxpuart]
+[   54.863888]  hci_dev_open_sync+0x3a8/0xa04
+[   54.872773]  hci_power_on+0x54/0x2e4
+[   54.881832]  process_one_work+0x138/0x260
+[   54.881842]  worker_thread+0x32c/0x438
+[   54.881847]  kthread+0x118/0x11c
+[   54.881853]  ret_from_fork+0x10/0x20
+[   54.896406] Code: a9be7bfd 910003fd f9000bf3 aa0003f3 (b940d400)
+[   54.896410] ---[ end trace 0000000000000000 ]---
+
+Signed-off-by: Neeraj Sanjay Kale <neeraj.sanjaykale@nxp.com>
+Tested-by: Guillaume Legoupil <guillaume.legoupil@nxp.com>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/bluetooth/btnxpuart.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/bluetooth/btnxpuart.c b/drivers/bluetooth/btnxpuart.c
+index 814dd966b1a4..5ee9a8b8dcfd 100644
+--- a/drivers/bluetooth/btnxpuart.c
++++ b/drivers/bluetooth/btnxpuart.c
+@@ -1326,8 +1326,10 @@ static int btnxpuart_close(struct hci_dev *hdev)
+       serdev_device_close(nxpdev->serdev);
+       skb_queue_purge(&nxpdev->txq);
+-      kfree_skb(nxpdev->rx_skb);
+-      nxpdev->rx_skb = NULL;
++      if (!IS_ERR_OR_NULL(nxpdev->rx_skb)) {
++              kfree_skb(nxpdev->rx_skb);
++              nxpdev->rx_skb = NULL;
++      }
+       clear_bit(BTNXPUART_SERDEV_OPEN, &nxpdev->tx_state);
+       return 0;
+ }
+@@ -1342,8 +1344,10 @@ static int btnxpuart_flush(struct hci_dev *hdev)
+       cancel_work_sync(&nxpdev->tx_work);
+-      kfree_skb(nxpdev->rx_skb);
+-      nxpdev->rx_skb = NULL;
++      if (!IS_ERR_OR_NULL(nxpdev->rx_skb)) {
++              kfree_skb(nxpdev->rx_skb);
++              nxpdev->rx_skb = NULL;
++      }
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-hci_conn-fix-uaf-write-in-__hci_acl_create.patch b/queue-6.6/bluetooth-hci_conn-fix-uaf-write-in-__hci_acl_create.patch
new file mode 100644 (file)
index 0000000..bfd2234
--- /dev/null
@@ -0,0 +1,99 @@
+From 01b28988cf6058313b1852cf1ef577c03d0878a4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 9 Feb 2024 09:08:06 -0500
+Subject: Bluetooth: hci_conn: Fix UAF Write in
+ __hci_acl_create_connection_sync
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit 5f641f03abccddd1a37233ff1b8e774b9ff1f4e8 ]
+
+This fixes the UAF on __hci_acl_create_connection_sync caused by
+connection abortion, it uses the same logic as to LE_LINK which uses
+hci_cmd_sync_cancel to prevent the callback to run if the connection is
+abort prematurely.
+
+Reported-by: syzbot+3f0a39be7a2035700868@syzkaller.appspotmail.com
+Fixes: 45340097ce6e ("Bluetooth: hci_conn: Only do ACL connections sequentially")
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/bluetooth/hci_sync.h |  3 +--
+ net/bluetooth/hci_conn.c         |  3 ++-
+ net/bluetooth/hci_sync.c         | 16 ++++++++++------
+ 3 files changed, 13 insertions(+), 9 deletions(-)
+
+diff --git a/include/net/bluetooth/hci_sync.h b/include/net/bluetooth/hci_sync.h
+index 532230150cc9..37ca8477b3f4 100644
+--- a/include/net/bluetooth/hci_sync.h
++++ b/include/net/bluetooth/hci_sync.h
+@@ -141,5 +141,4 @@ int hci_le_big_terminate_sync(struct hci_dev *hdev, u8 handle);
+ int hci_le_pa_terminate_sync(struct hci_dev *hdev, u16 handle);
+-int hci_acl_create_connection_sync(struct hci_dev *hdev,
+-                                 struct hci_conn *conn);
++int hci_connect_acl_sync(struct hci_dev *hdev, struct hci_conn *conn);
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index 36731d047f16..d15c8ce4b418 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -1650,7 +1650,7 @@ struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
+               acl->pending_sec_level = sec_level;
+               acl->auth_type = auth_type;
+-              err = hci_acl_create_connection_sync(hdev, acl);
++              err = hci_connect_acl_sync(hdev, acl);
+               if (err) {
+                       hci_conn_del(acl);
+                       return ERR_PTR(err);
+@@ -2913,6 +2913,7 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)
+        */
+       if (conn->state == BT_CONNECT && hdev->req_status == HCI_REQ_PEND) {
+               switch (hci_skb_event(hdev->sent_cmd)) {
++              case HCI_EV_CONN_COMPLETE:
+               case HCI_EV_LE_CONN_COMPLETE:
+               case HCI_EV_LE_ENHANCED_CONN_COMPLETE:
+               case HCI_EVT_LE_CIS_ESTABLISHED:
+diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
+index 165c532fa2a2..19ceb7ce66bf 100644
+--- a/net/bluetooth/hci_sync.c
++++ b/net/bluetooth/hci_sync.c
+@@ -6578,13 +6578,18 @@ int hci_update_adv_data(struct hci_dev *hdev, u8 instance)
+                                 UINT_PTR(instance), NULL);
+ }
+-static int __hci_acl_create_connection_sync(struct hci_dev *hdev, void *data)
++static int hci_acl_create_conn_sync(struct hci_dev *hdev, void *data)
+ {
+-      struct hci_conn *conn = data;
++      struct hci_conn *conn;
++      u16 handle = PTR_UINT(data);
+       struct inquiry_entry *ie;
+       struct hci_cp_create_conn cp;
+       int err;
++      conn = hci_conn_hash_lookup_handle(hdev, handle);
++      if (!conn)
++              return 0;
++
+       /* Many controllers disallow HCI Create Connection while it is doing
+        * HCI Inquiry. So we cancel the Inquiry first before issuing HCI Create
+        * Connection. This may cause the MGMT discovering state to become false
+@@ -6641,9 +6646,8 @@ static int __hci_acl_create_connection_sync(struct hci_dev *hdev, void *data)
+       return err;
+ }
+-int hci_acl_create_connection_sync(struct hci_dev *hdev,
+-                                 struct hci_conn *conn)
++int hci_connect_acl_sync(struct hci_dev *hdev, struct hci_conn *conn)
+ {
+-      return hci_cmd_sync_queue(hdev, __hci_acl_create_connection_sync,
+-                                conn, NULL);
++      return hci_cmd_sync_queue(hdev, hci_acl_create_conn_sync,
++                                UINT_PTR(conn->handle), NULL);
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-hci_conn-only-do-acl-connections-sequentia.patch b/queue-6.6/bluetooth-hci_conn-only-do-acl-connections-sequentia.patch
new file mode 100644 (file)
index 0000000..be86112
--- /dev/null
@@ -0,0 +1,253 @@
+From c2aa11a9b2d198461818c86065417a6ce2f574c3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Feb 2024 12:08:13 +0100
+Subject: Bluetooth: hci_conn: Only do ACL connections sequentially
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jonas Dreßler <verdre@v0yd.nl>
+
+[ Upstream commit 45340097ce6ea7e875674a5a7d24c95ecbc93ef9 ]
+
+Pretty much all bluetooth chipsets only support paging a single device at
+a time, and if they don't reject a secondary "Create Connection" request
+while another is still ongoing, they'll most likely serialize those
+requests in the firware.
+
+With commit 4c67bc74f016 ("[Bluetooth] Support concurrent connect
+requests") we started adding some serialization of our own in case the
+adapter returns "Command Disallowed" HCI error.
+
+This commit was using the BT_CONNECT2 state for the serialization, this
+state is also used for a few more things (most notably to indicate we're
+waiting for an inquiry to cancel) and therefore a bit unreliable. Also
+not all BT firwares would respond with "Command Disallowed" on too many
+connection requests, some will also respond with "Hardware Failure"
+(BCM4378), and others will error out later and send a "Connect Complete"
+event with error "Rejected Limited Resources" (Marvell 88W8897).
+
+We can clean things up a bit and also make the serialization more reliable
+by using our hci_sync machinery to always do "Create Connection" requests
+in a sequential manner.
+
+This is very similar to what we're already doing for establishing LE
+connections, and it works well there.
+
+Note that this causes a test failure in mgmt-tester (test "Pair Device
+- Power off 1") because the hci_abort_conn_sync() changes the error we
+return on timeout of the "Create Connection". We'll fix this on the
+mgmt-tester side by adjusting the expected error for the test.
+
+Signed-off-by: Jonas Dreßler <verdre@v0yd.nl>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/bluetooth/hci.h      |  1 +
+ include/net/bluetooth/hci_sync.h |  3 ++
+ net/bluetooth/hci_conn.c         | 69 ++++---------------------------
+ net/bluetooth/hci_sync.c         | 70 ++++++++++++++++++++++++++++++++
+ 4 files changed, 83 insertions(+), 60 deletions(-)
+
+diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
+index 1c427dd2d418..2129d071c372 100644
+--- a/include/net/bluetooth/hci.h
++++ b/include/net/bluetooth/hci.h
+@@ -430,6 +430,7 @@ enum {
+ #define HCI_NCMD_TIMEOUT      msecs_to_jiffies(4000)  /* 4 seconds */
+ #define HCI_ACL_TX_TIMEOUT    msecs_to_jiffies(45000) /* 45 seconds */
+ #define HCI_AUTO_OFF_TIMEOUT  msecs_to_jiffies(2000)  /* 2 seconds */
++#define HCI_ACL_CONN_TIMEOUT  msecs_to_jiffies(20000) /* 20 seconds */
+ #define HCI_LE_CONN_TIMEOUT   msecs_to_jiffies(20000) /* 20 seconds */
+ #define HCI_LE_AUTOCONN_TIMEOUT       msecs_to_jiffies(4000)  /* 4 seconds */
+diff --git a/include/net/bluetooth/hci_sync.h b/include/net/bluetooth/hci_sync.h
+index 4cb048bdcb1e..532230150cc9 100644
+--- a/include/net/bluetooth/hci_sync.h
++++ b/include/net/bluetooth/hci_sync.h
+@@ -140,3 +140,6 @@ int hci_le_terminate_big_sync(struct hci_dev *hdev, u8 handle, u8 reason);
+ int hci_le_big_terminate_sync(struct hci_dev *hdev, u8 handle);
+ int hci_le_pa_terminate_sync(struct hci_dev *hdev, u16 handle);
++
++int hci_acl_create_connection_sync(struct hci_dev *hdev,
++                                 struct hci_conn *conn);
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index dc1c07c7d4ff..04fe901a47f7 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -178,64 +178,6 @@ static void hci_conn_cleanup(struct hci_conn *conn)
+       hci_dev_put(hdev);
+ }
+-static void hci_acl_create_connection(struct hci_conn *conn)
+-{
+-      struct hci_dev *hdev = conn->hdev;
+-      struct inquiry_entry *ie;
+-      struct hci_cp_create_conn cp;
+-
+-      BT_DBG("hcon %p", conn);
+-
+-      /* Many controllers disallow HCI Create Connection while it is doing
+-       * HCI Inquiry. So we cancel the Inquiry first before issuing HCI Create
+-       * Connection. This may cause the MGMT discovering state to become false
+-       * without user space's request but it is okay since the MGMT Discovery
+-       * APIs do not promise that discovery should be done forever. Instead,
+-       * the user space monitors the status of MGMT discovering and it may
+-       * request for discovery again when this flag becomes false.
+-       */
+-      if (test_bit(HCI_INQUIRY, &hdev->flags)) {
+-              /* Put this connection to "pending" state so that it will be
+-               * executed after the inquiry cancel command complete event.
+-               */
+-              conn->state = BT_CONNECT2;
+-              hci_send_cmd(hdev, HCI_OP_INQUIRY_CANCEL, 0, NULL);
+-              return;
+-      }
+-
+-      conn->state = BT_CONNECT;
+-      conn->out = true;
+-      conn->role = HCI_ROLE_MASTER;
+-
+-      conn->attempt++;
+-
+-      conn->link_policy = hdev->link_policy;
+-
+-      memset(&cp, 0, sizeof(cp));
+-      bacpy(&cp.bdaddr, &conn->dst);
+-      cp.pscan_rep_mode = 0x02;
+-
+-      ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
+-      if (ie) {
+-              if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
+-                      cp.pscan_rep_mode = ie->data.pscan_rep_mode;
+-                      cp.pscan_mode     = ie->data.pscan_mode;
+-                      cp.clock_offset   = ie->data.clock_offset |
+-                                          cpu_to_le16(0x8000);
+-              }
+-
+-              memcpy(conn->dev_class, ie->data.dev_class, 3);
+-      }
+-
+-      cp.pkt_type = cpu_to_le16(conn->pkt_type);
+-      if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
+-              cp.role_switch = 0x01;
+-      else
+-              cp.role_switch = 0x00;
+-
+-      hci_send_cmd(hdev, HCI_OP_CREATE_CONN, sizeof(cp), &cp);
+-}
+-
+ int hci_disconnect(struct hci_conn *conn, __u8 reason)
+ {
+       BT_DBG("hcon %p", conn);
+@@ -1702,10 +1644,17 @@ struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
+       acl->conn_reason = conn_reason;
+       if (acl->state == BT_OPEN || acl->state == BT_CLOSED) {
++              int err;
++
+               acl->sec_level = BT_SECURITY_LOW;
+               acl->pending_sec_level = sec_level;
+               acl->auth_type = auth_type;
+-              hci_acl_create_connection(acl);
++
++              err = hci_acl_create_connection_sync(hdev, acl);
++              if (err) {
++                      hci_conn_del(acl);
++                      return ERR_PTR(err);
++              }
+       }
+       return acl;
+@@ -2627,7 +2576,7 @@ void hci_conn_check_pending(struct hci_dev *hdev)
+       conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2);
+       if (conn)
+-              hci_acl_create_connection(conn);
++              hci_acl_create_connection_sync(hdev, conn);
+       hci_dev_unlock(hdev);
+ }
+diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
+index 38fee34887d8..165c532fa2a2 100644
+--- a/net/bluetooth/hci_sync.c
++++ b/net/bluetooth/hci_sync.c
+@@ -6577,3 +6577,73 @@ int hci_update_adv_data(struct hci_dev *hdev, u8 instance)
+       return hci_cmd_sync_queue(hdev, _update_adv_data_sync,
+                                 UINT_PTR(instance), NULL);
+ }
++
++static int __hci_acl_create_connection_sync(struct hci_dev *hdev, void *data)
++{
++      struct hci_conn *conn = data;
++      struct inquiry_entry *ie;
++      struct hci_cp_create_conn cp;
++      int err;
++
++      /* Many controllers disallow HCI Create Connection while it is doing
++       * HCI Inquiry. So we cancel the Inquiry first before issuing HCI Create
++       * Connection. This may cause the MGMT discovering state to become false
++       * without user space's request but it is okay since the MGMT Discovery
++       * APIs do not promise that discovery should be done forever. Instead,
++       * the user space monitors the status of MGMT discovering and it may
++       * request for discovery again when this flag becomes false.
++       */
++      if (test_bit(HCI_INQUIRY, &hdev->flags)) {
++              err = __hci_cmd_sync_status(hdev, HCI_OP_INQUIRY_CANCEL, 0,
++                                          NULL, HCI_CMD_TIMEOUT);
++              if (err)
++                      bt_dev_warn(hdev, "Failed to cancel inquiry %d", err);
++      }
++
++      conn->state = BT_CONNECT;
++      conn->out = true;
++      conn->role = HCI_ROLE_MASTER;
++
++      conn->attempt++;
++
++      conn->link_policy = hdev->link_policy;
++
++      memset(&cp, 0, sizeof(cp));
++      bacpy(&cp.bdaddr, &conn->dst);
++      cp.pscan_rep_mode = 0x02;
++
++      ie = hci_inquiry_cache_lookup(hdev, &conn->dst);
++      if (ie) {
++              if (inquiry_entry_age(ie) <= INQUIRY_ENTRY_AGE_MAX) {
++                      cp.pscan_rep_mode = ie->data.pscan_rep_mode;
++                      cp.pscan_mode     = ie->data.pscan_mode;
++                      cp.clock_offset   = ie->data.clock_offset |
++                                          cpu_to_le16(0x8000);
++              }
++
++              memcpy(conn->dev_class, ie->data.dev_class, 3);
++      }
++
++      cp.pkt_type = cpu_to_le16(conn->pkt_type);
++      if (lmp_rswitch_capable(hdev) && !(hdev->link_mode & HCI_LM_MASTER))
++              cp.role_switch = 0x01;
++      else
++              cp.role_switch = 0x00;
++
++      err = __hci_cmd_sync_status_sk(hdev, HCI_OP_CREATE_CONN,
++                                     sizeof(cp), &cp,
++                                     HCI_EV_CONN_COMPLETE,
++                                     HCI_ACL_CONN_TIMEOUT, NULL);
++
++      if (err == -ETIMEDOUT)
++              hci_abort_conn_sync(hdev, conn, HCI_ERROR_LOCAL_HOST_TERM);
++
++      return err;
++}
++
++int hci_acl_create_connection_sync(struct hci_dev *hdev,
++                                 struct hci_conn *conn)
++{
++      return hci_cmd_sync_queue(hdev, __hci_acl_create_connection_sync,
++                                conn, NULL);
++}
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-hci_event-use-hci-error-defines-instead-of.patch b/queue-6.6/bluetooth-hci_event-use-hci-error-defines-instead-of.patch
new file mode 100644 (file)
index 0000000..86a212e
--- /dev/null
@@ -0,0 +1,82 @@
+From 72f28887838ef412056357de8dfbfdf81ee719d4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 8 Jan 2024 23:46:07 +0100
+Subject: Bluetooth: hci_event: Use HCI error defines instead of magic values
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jonas Dreßler <verdre@v0yd.nl>
+
+[ Upstream commit 79c0868ad65a8fc7cdfaa5f2b77a4b70d0b0ea16 ]
+
+We have error defines already, so let's use them.
+
+Signed-off-by: Jonas Dreßler <verdre@v0yd.nl>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/bluetooth/hci.h | 2 ++
+ net/bluetooth/hci_event.c   | 8 ++++----
+ 2 files changed, 6 insertions(+), 4 deletions(-)
+
+diff --git a/include/net/bluetooth/hci.h b/include/net/bluetooth/hci.h
+index d2a280a42f3b..1c427dd2d418 100644
+--- a/include/net/bluetooth/hci.h
++++ b/include/net/bluetooth/hci.h
+@@ -644,6 +644,7 @@ enum {
+ #define HCI_ERROR_PIN_OR_KEY_MISSING  0x06
+ #define HCI_ERROR_MEMORY_EXCEEDED     0x07
+ #define HCI_ERROR_CONNECTION_TIMEOUT  0x08
++#define HCI_ERROR_COMMAND_DISALLOWED  0x0c
+ #define HCI_ERROR_REJ_LIMITED_RESOURCES       0x0d
+ #define HCI_ERROR_REJ_BAD_ADDR                0x0f
+ #define HCI_ERROR_INVALID_PARAMETERS  0x12
+@@ -652,6 +653,7 @@ enum {
+ #define HCI_ERROR_REMOTE_POWER_OFF    0x15
+ #define HCI_ERROR_LOCAL_HOST_TERM     0x16
+ #define HCI_ERROR_PAIRING_NOT_ALLOWED 0x18
++#define HCI_ERROR_UNSUPPORTED_REMOTE_FEATURE  0x1e
+ #define HCI_ERROR_INVALID_LL_PARAMS   0x1e
+ #define HCI_ERROR_UNSPECIFIED         0x1f
+ #define HCI_ERROR_ADVERTISING_TIMEOUT 0x3c
+diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
+index 727f040b6529..dc80c1560357 100644
+--- a/net/bluetooth/hci_event.c
++++ b/net/bluetooth/hci_event.c
+@@ -93,11 +93,11 @@ static u8 hci_cc_inquiry_cancel(struct hci_dev *hdev, void *data,
+       /* It is possible that we receive Inquiry Complete event right
+        * before we receive Inquiry Cancel Command Complete event, in
+        * which case the latter event should have status of Command
+-       * Disallowed (0x0c). This should not be treated as error, since
++       * Disallowed. This should not be treated as error, since
+        * we actually achieve what Inquiry Cancel wants to achieve,
+        * which is to end the last Inquiry session.
+        */
+-      if (rp->status == 0x0c && !test_bit(HCI_INQUIRY, &hdev->flags)) {
++      if (rp->status == HCI_ERROR_COMMAND_DISALLOWED && !test_bit(HCI_INQUIRY, &hdev->flags)) {
+               bt_dev_warn(hdev, "Ignoring error of Inquiry Cancel command");
+               rp->status = 0x00;
+       }
+@@ -2285,7 +2285,7 @@ static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
+       if (status) {
+               if (conn && conn->state == BT_CONNECT) {
+-                      if (status != 0x0c || conn->attempt > 2) {
++                      if (status != HCI_ERROR_COMMAND_DISALLOWED || conn->attempt > 2) {
+                               conn->state = BT_CLOSED;
+                               hci_connect_cfm(conn, status);
+                               hci_conn_del(conn);
+@@ -6430,7 +6430,7 @@ static void hci_le_remote_feat_complete_evt(struct hci_dev *hdev, void *data,
+                        * transition into connected state and mark it as
+                        * successful.
+                        */
+-                      if (!conn->out && ev->status == 0x1a &&
++                      if (!conn->out && ev->status == HCI_ERROR_UNSUPPORTED_REMOTE_FEATURE &&
+                           (hdev->le_features[0] & HCI_LE_PERIPHERAL_FEATURES))
+                               status = 0x00;
+                       else
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-hci_sync-add-helper-functions-to-manipulat.patch b/queue-6.6/bluetooth-hci_sync-add-helper-functions-to-manipulat.patch
new file mode 100644 (file)
index 0000000..9237776
--- /dev/null
@@ -0,0 +1,211 @@
+From 622134bc804f29b24a5a76299e8230653d8c3ca6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 9 Aug 2023 13:43:53 -0700
+Subject: Bluetooth: hci_sync: Add helper functions to manipulate cmd_sync
+ queue
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit 505ea2b295929e7be2b4e1bc86ee31cb7862fb01 ]
+
+This adds functions to queue, dequeue and lookup into the cmd_sync
+list.
+
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/bluetooth/hci_sync.h |  12 +++
+ net/bluetooth/hci_sync.c         | 132 +++++++++++++++++++++++++++++--
+ 2 files changed, 136 insertions(+), 8 deletions(-)
+
+diff --git a/include/net/bluetooth/hci_sync.h b/include/net/bluetooth/hci_sync.h
+index 37ca8477b3f4..24c0053d8f0c 100644
+--- a/include/net/bluetooth/hci_sync.h
++++ b/include/net/bluetooth/hci_sync.h
+@@ -50,6 +50,18 @@ int hci_cmd_sync_submit(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                       void *data, hci_cmd_sync_work_destroy_t destroy);
+ int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                      void *data, hci_cmd_sync_work_destroy_t destroy);
++struct hci_cmd_sync_work_entry *
++hci_cmd_sync_lookup_entry(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                        void *data, hci_cmd_sync_work_destroy_t destroy);
++int hci_cmd_sync_queue_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                          void *data, hci_cmd_sync_work_destroy_t destroy);
++void hci_cmd_sync_cancel_entry(struct hci_dev *hdev,
++                             struct hci_cmd_sync_work_entry *entry);
++bool hci_cmd_sync_dequeue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                        void *data, hci_cmd_sync_work_destroy_t destroy);
++bool hci_cmd_sync_dequeue_once(struct hci_dev *hdev,
++                            hci_cmd_sync_work_func_t func, void *data,
++                            hci_cmd_sync_work_destroy_t destroy);
+ int hci_update_eir_sync(struct hci_dev *hdev);
+ int hci_update_class_sync(struct hci_dev *hdev);
+diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
+index 19ceb7ce66bf..ed18e35c7097 100644
+--- a/net/bluetooth/hci_sync.c
++++ b/net/bluetooth/hci_sync.c
+@@ -651,6 +651,17 @@ void hci_cmd_sync_init(struct hci_dev *hdev)
+       INIT_DELAYED_WORK(&hdev->adv_instance_expire, adv_timeout_expire);
+ }
++static void _hci_cmd_sync_cancel_entry(struct hci_dev *hdev,
++                                     struct hci_cmd_sync_work_entry *entry,
++                                     int err)
++{
++      if (entry->destroy)
++              entry->destroy(hdev, entry->data, err);
++
++      list_del(&entry->list);
++      kfree(entry);
++}
++
+ void hci_cmd_sync_clear(struct hci_dev *hdev)
+ {
+       struct hci_cmd_sync_work_entry *entry, *tmp;
+@@ -659,13 +670,8 @@ void hci_cmd_sync_clear(struct hci_dev *hdev)
+       cancel_work_sync(&hdev->reenable_adv_work);
+       mutex_lock(&hdev->cmd_sync_work_lock);
+-      list_for_each_entry_safe(entry, tmp, &hdev->cmd_sync_work_list, list) {
+-              if (entry->destroy)
+-                      entry->destroy(hdev, entry->data, -ECANCELED);
+-
+-              list_del(&entry->list);
+-              kfree(entry);
+-      }
++      list_for_each_entry_safe(entry, tmp, &hdev->cmd_sync_work_list, list)
++              _hci_cmd_sync_cancel_entry(hdev, entry, -ECANCELED);
+       mutex_unlock(&hdev->cmd_sync_work_lock);
+ }
+@@ -757,6 +763,115 @@ int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+ }
+ EXPORT_SYMBOL(hci_cmd_sync_queue);
++static struct hci_cmd_sync_work_entry *
++_hci_cmd_sync_lookup_entry(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                         void *data, hci_cmd_sync_work_destroy_t destroy)
++{
++      struct hci_cmd_sync_work_entry *entry, *tmp;
++
++      list_for_each_entry_safe(entry, tmp, &hdev->cmd_sync_work_list, list) {
++              if (func && entry->func != func)
++                      continue;
++
++              if (data && entry->data != data)
++                      continue;
++
++              if (destroy && entry->destroy != destroy)
++                      continue;
++
++              return entry;
++      }
++
++      return NULL;
++}
++
++/* Queue HCI command entry once:
++ *
++ * - Lookup if an entry already exist and only if it doesn't creates a new entry
++ *   and queue it.
++ */
++int hci_cmd_sync_queue_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                          void *data, hci_cmd_sync_work_destroy_t destroy)
++{
++      if (hci_cmd_sync_lookup_entry(hdev, func, data, destroy))
++              return 0;
++
++      return hci_cmd_sync_queue(hdev, func, data, destroy);
++}
++EXPORT_SYMBOL(hci_cmd_sync_queue_once);
++
++/* Lookup HCI command entry:
++ *
++ * - Return first entry that matches by function callback or data or
++ *   destroy callback.
++ */
++struct hci_cmd_sync_work_entry *
++hci_cmd_sync_lookup_entry(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                        void *data, hci_cmd_sync_work_destroy_t destroy)
++{
++      struct hci_cmd_sync_work_entry *entry;
++
++      mutex_lock(&hdev->cmd_sync_work_lock);
++      entry = _hci_cmd_sync_lookup_entry(hdev, func, data, destroy);
++      mutex_unlock(&hdev->cmd_sync_work_lock);
++
++      return entry;
++}
++EXPORT_SYMBOL(hci_cmd_sync_lookup_entry);
++
++/* Cancel HCI command entry */
++void hci_cmd_sync_cancel_entry(struct hci_dev *hdev,
++                             struct hci_cmd_sync_work_entry *entry)
++{
++      mutex_lock(&hdev->cmd_sync_work_lock);
++      _hci_cmd_sync_cancel_entry(hdev, entry, -ECANCELED);
++      mutex_unlock(&hdev->cmd_sync_work_lock);
++}
++EXPORT_SYMBOL(hci_cmd_sync_cancel_entry);
++
++/* Dequeue one HCI command entry:
++ *
++ * - Lookup and cancel first entry that matches.
++ */
++bool hci_cmd_sync_dequeue_once(struct hci_dev *hdev,
++                             hci_cmd_sync_work_func_t func,
++                             void *data, hci_cmd_sync_work_destroy_t destroy)
++{
++      struct hci_cmd_sync_work_entry *entry;
++
++      entry = hci_cmd_sync_lookup_entry(hdev, func, data, destroy);
++      if (!entry)
++              return false;
++
++      hci_cmd_sync_cancel_entry(hdev, entry);
++
++      return true;
++}
++EXPORT_SYMBOL(hci_cmd_sync_dequeue_once);
++
++/* Dequeue HCI command entry:
++ *
++ * - Lookup and cancel any entry that matches by function callback or data or
++ *   destroy callback.
++ */
++bool hci_cmd_sync_dequeue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                        void *data, hci_cmd_sync_work_destroy_t destroy)
++{
++      struct hci_cmd_sync_work_entry *entry;
++      bool ret = false;
++
++      mutex_lock(&hdev->cmd_sync_work_lock);
++      while ((entry = _hci_cmd_sync_lookup_entry(hdev, func, data,
++                                                 destroy))) {
++              _hci_cmd_sync_cancel_entry(hdev, entry, -ECANCELED);
++              ret = true;
++      }
++      mutex_unlock(&hdev->cmd_sync_work_lock);
++
++      return ret;
++}
++EXPORT_SYMBOL(hci_cmd_sync_dequeue);
++
+ int hci_update_eir_sync(struct hci_dev *hdev)
+ {
+       struct hci_cp_write_eir cp;
+@@ -3048,7 +3163,8 @@ int hci_update_passive_scan(struct hci_dev *hdev)
+           hci_dev_test_flag(hdev, HCI_UNREGISTER))
+               return 0;
+-      return hci_cmd_sync_queue(hdev, update_passive_scan_sync, NULL, NULL);
++      return hci_cmd_sync_queue_once(hdev, update_passive_scan_sync, NULL,
++                                     NULL);
+ }
+ int hci_write_sc_support_sync(struct hci_dev *hdev, u8 val)
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-hci_sync-attempt-to-dequeue-connection-att.patch b/queue-6.6/bluetooth-hci_sync-attempt-to-dequeue-connection-att.patch
new file mode 100644 (file)
index 0000000..faa215b
--- /dev/null
@@ -0,0 +1,321 @@
+From 54088ccf94b7dfbafef65b6a66f46a7d0a084b29 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 13 Feb 2024 09:59:32 -0500
+Subject: Bluetooth: hci_sync: Attempt to dequeue connection attempt
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit 881559af5f5c545f6828e7c74d79813eb886d523 ]
+
+If connection is still queued/pending in the cmd_sync queue it means no
+command has been generated and it should be safe to just dequeue the
+callback when it is being aborted.
+
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/bluetooth/hci_core.h | 19 ++++++++
+ include/net/bluetooth/hci_sync.h | 10 +++--
+ net/bluetooth/hci_conn.c         | 70 ++++++------------------------
+ net/bluetooth/hci_sync.c         | 74 ++++++++++++++++++++++++++++----
+ 4 files changed, 102 insertions(+), 71 deletions(-)
+
+diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
+index 850f0e46aecf..29f1549ee111 100644
+--- a/include/net/bluetooth/hci_core.h
++++ b/include/net/bluetooth/hci_core.h
+@@ -1041,6 +1041,24 @@ static inline unsigned int hci_conn_count(struct hci_dev *hdev)
+       return c->acl_num + c->sco_num + c->le_num + c->iso_num;
+ }
++static inline bool hci_conn_valid(struct hci_dev *hdev, struct hci_conn *conn)
++{
++      struct hci_conn_hash *h = &hdev->conn_hash;
++      struct hci_conn  *c;
++
++      rcu_read_lock();
++
++      list_for_each_entry_rcu(c, &h->list, list) {
++              if (c == conn) {
++                      rcu_read_unlock();
++                      return true;
++              }
++      }
++      rcu_read_unlock();
++
++      return false;
++}
++
+ static inline __u8 hci_conn_lookup_type(struct hci_dev *hdev, __u16 handle)
+ {
+       struct hci_conn_hash *h = &hdev->conn_hash;
+@@ -1430,6 +1448,7 @@ struct hci_conn *hci_connect_le_scan(struct hci_dev *hdev, bdaddr_t *dst,
+ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
+                               u8 dst_type, bool dst_resolved, u8 sec_level,
+                               u16 conn_timeout, u8 role);
++void hci_connect_le_scan_cleanup(struct hci_conn *conn, u8 status);
+ struct hci_conn *hci_connect_acl(struct hci_dev *hdev, bdaddr_t *dst,
+                                u8 sec_level, u8 auth_type,
+                                enum conn_reasons conn_reason);
+diff --git a/include/net/bluetooth/hci_sync.h b/include/net/bluetooth/hci_sync.h
+index 24c0053d8f0c..534c3386e714 100644
+--- a/include/net/bluetooth/hci_sync.h
++++ b/include/net/bluetooth/hci_sync.h
+@@ -50,11 +50,11 @@ int hci_cmd_sync_submit(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                       void *data, hci_cmd_sync_work_destroy_t destroy);
+ int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                      void *data, hci_cmd_sync_work_destroy_t destroy);
++int hci_cmd_sync_queue_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                          void *data, hci_cmd_sync_work_destroy_t destroy);
+ struct hci_cmd_sync_work_entry *
+ hci_cmd_sync_lookup_entry(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                         void *data, hci_cmd_sync_work_destroy_t destroy);
+-int hci_cmd_sync_queue_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+-                          void *data, hci_cmd_sync_work_destroy_t destroy);
+ void hci_cmd_sync_cancel_entry(struct hci_dev *hdev,
+                              struct hci_cmd_sync_work_entry *entry);
+ bool hci_cmd_sync_dequeue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+@@ -141,8 +141,6 @@ struct hci_conn;
+ int hci_abort_conn_sync(struct hci_dev *hdev, struct hci_conn *conn, u8 reason);
+-int hci_le_create_conn_sync(struct hci_dev *hdev, struct hci_conn *conn);
+-
+ int hci_le_create_cis_sync(struct hci_dev *hdev);
+ int hci_le_remove_cig_sync(struct hci_dev *hdev, u8 handle);
+@@ -154,3 +152,7 @@ int hci_le_big_terminate_sync(struct hci_dev *hdev, u8 handle);
+ int hci_le_pa_terminate_sync(struct hci_dev *hdev, u16 handle);
+ int hci_connect_acl_sync(struct hci_dev *hdev, struct hci_conn *conn);
++
++int hci_connect_le_sync(struct hci_dev *hdev, struct hci_conn *conn);
++
++int hci_cancel_connect_sync(struct hci_dev *hdev, struct hci_conn *conn);
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index d15c8ce4b418..efa0881a90e1 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -68,7 +68,7 @@ static const struct sco_param esco_param_msbc[] = {
+ };
+ /* This function requires the caller holds hdev->lock */
+-static void hci_connect_le_scan_cleanup(struct hci_conn *conn, u8 status)
++void hci_connect_le_scan_cleanup(struct hci_conn *conn, u8 status)
+ {
+       struct hci_conn_params *params;
+       struct hci_dev *hdev = conn->hdev;
+@@ -1143,6 +1143,9 @@ void hci_conn_del(struct hci_conn *conn)
+        * rest of hci_conn_del.
+        */
+       hci_conn_cleanup(conn);
++
++      /* Dequeue callbacks using connection pointer as data */
++      hci_cmd_sync_dequeue(hdev, NULL, conn, NULL);
+ }
+ struct hci_dev *hci_get_route(bdaddr_t *dst, bdaddr_t *src, uint8_t src_type)
+@@ -1276,53 +1279,6 @@ u8 hci_conn_set_handle(struct hci_conn *conn, u16 handle)
+       return 0;
+ }
+-static void create_le_conn_complete(struct hci_dev *hdev, void *data, int err)
+-{
+-      struct hci_conn *conn;
+-      u16 handle = PTR_UINT(data);
+-
+-      conn = hci_conn_hash_lookup_handle(hdev, handle);
+-      if (!conn)
+-              return;
+-
+-      bt_dev_dbg(hdev, "err %d", err);
+-
+-      hci_dev_lock(hdev);
+-
+-      if (!err) {
+-              hci_connect_le_scan_cleanup(conn, 0x00);
+-              goto done;
+-      }
+-
+-      /* Check if connection is still pending */
+-      if (conn != hci_lookup_le_connect(hdev))
+-              goto done;
+-
+-      /* Flush to make sure we send create conn cancel command if needed */
+-      flush_delayed_work(&conn->le_conn_timeout);
+-      hci_conn_failed(conn, bt_status(err));
+-
+-done:
+-      hci_dev_unlock(hdev);
+-}
+-
+-static int hci_connect_le_sync(struct hci_dev *hdev, void *data)
+-{
+-      struct hci_conn *conn;
+-      u16 handle = PTR_UINT(data);
+-
+-      conn = hci_conn_hash_lookup_handle(hdev, handle);
+-      if (!conn)
+-              return 0;
+-
+-      bt_dev_dbg(hdev, "conn %p", conn);
+-
+-      clear_bit(HCI_CONN_SCANNING, &conn->flags);
+-      conn->state = BT_CONNECT;
+-
+-      return hci_le_create_conn_sync(hdev, conn);
+-}
+-
+ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
+                               u8 dst_type, bool dst_resolved, u8 sec_level,
+                               u16 conn_timeout, u8 role)
+@@ -1389,9 +1345,7 @@ struct hci_conn *hci_connect_le(struct hci_dev *hdev, bdaddr_t *dst,
+       conn->sec_level = BT_SECURITY_LOW;
+       conn->conn_timeout = conn_timeout;
+-      err = hci_cmd_sync_queue(hdev, hci_connect_le_sync,
+-                               UINT_PTR(conn->handle),
+-                               create_le_conn_complete);
++      err = hci_connect_le_sync(hdev, conn);
+       if (err) {
+               hci_conn_del(conn);
+               return ERR_PTR(err);
+@@ -2880,12 +2834,10 @@ u32 hci_conn_get_phy(struct hci_conn *conn)
+ static int abort_conn_sync(struct hci_dev *hdev, void *data)
+ {
+-      struct hci_conn *conn;
+-      u16 handle = PTR_UINT(data);
++      struct hci_conn *conn = data;
+-      conn = hci_conn_hash_lookup_handle(hdev, handle);
+-      if (!conn)
+-              return 0;
++      if (!hci_conn_valid(hdev, conn))
++              return -ECANCELED;
+       return hci_abort_conn_sync(hdev, conn, conn->abort_reason);
+ }
+@@ -2920,8 +2872,10 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)
+                       hci_cmd_sync_cancel(hdev, ECANCELED);
+                       break;
+               }
++      /* Cancel connect attempt if still queued/pending */
++      } else if (!hci_cancel_connect_sync(hdev, conn)) {
++              return 0;
+       }
+-      return hci_cmd_sync_queue(hdev, abort_conn_sync, UINT_PTR(conn->handle),
+-                                NULL);
++      return hci_cmd_sync_queue_once(hdev, abort_conn_sync, conn, NULL);
+ }
+diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
+index ed18e35c7097..3131daff56f4 100644
+--- a/net/bluetooth/hci_sync.c
++++ b/net/bluetooth/hci_sync.c
+@@ -6370,12 +6370,21 @@ static int hci_le_ext_create_conn_sync(struct hci_dev *hdev,
+                                       conn->conn_timeout, NULL);
+ }
+-int hci_le_create_conn_sync(struct hci_dev *hdev, struct hci_conn *conn)
++static int hci_le_create_conn_sync(struct hci_dev *hdev, void *data)
+ {
+       struct hci_cp_le_create_conn cp;
+       struct hci_conn_params *params;
+       u8 own_addr_type;
+       int err;
++      struct hci_conn *conn = data;
++
++      if (!hci_conn_valid(hdev, conn))
++              return -ECANCELED;
++
++      bt_dev_dbg(hdev, "conn %p", conn);
++
++      clear_bit(HCI_CONN_SCANNING, &conn->flags);
++      conn->state = BT_CONNECT;
+       /* If requested to connect as peripheral use directed advertising */
+       if (conn->role == HCI_ROLE_SLAVE) {
+@@ -6696,16 +6705,11 @@ int hci_update_adv_data(struct hci_dev *hdev, u8 instance)
+ static int hci_acl_create_conn_sync(struct hci_dev *hdev, void *data)
+ {
+-      struct hci_conn *conn;
+-      u16 handle = PTR_UINT(data);
++      struct hci_conn *conn = data;
+       struct inquiry_entry *ie;
+       struct hci_cp_create_conn cp;
+       int err;
+-      conn = hci_conn_hash_lookup_handle(hdev, handle);
+-      if (!conn)
+-              return 0;
+-
+       /* Many controllers disallow HCI Create Connection while it is doing
+        * HCI Inquiry. So we cancel the Inquiry first before issuing HCI Create
+        * Connection. This may cause the MGMT discovering state to become false
+@@ -6764,6 +6768,58 @@ static int hci_acl_create_conn_sync(struct hci_dev *hdev, void *data)
+ int hci_connect_acl_sync(struct hci_dev *hdev, struct hci_conn *conn)
+ {
+-      return hci_cmd_sync_queue(hdev, hci_acl_create_conn_sync,
+-                                UINT_PTR(conn->handle), NULL);
++      return hci_cmd_sync_queue_once(hdev, hci_acl_create_conn_sync, conn,
++                                     NULL);
++}
++
++static void create_le_conn_complete(struct hci_dev *hdev, void *data, int err)
++{
++      struct hci_conn *conn = data;
++
++      bt_dev_dbg(hdev, "err %d", err);
++
++      if (err == -ECANCELED)
++              return;
++
++      hci_dev_lock(hdev);
++
++      if (!err) {
++              hci_connect_le_scan_cleanup(conn, 0x00);
++              goto done;
++      }
++
++      /* Check if connection is still pending */
++      if (conn != hci_lookup_le_connect(hdev))
++              goto done;
++
++      /* Flush to make sure we send create conn cancel command if needed */
++      flush_delayed_work(&conn->le_conn_timeout);
++      hci_conn_failed(conn, bt_status(err));
++
++done:
++      hci_dev_unlock(hdev);
++}
++
++int hci_connect_le_sync(struct hci_dev *hdev, struct hci_conn *conn)
++{
++      return hci_cmd_sync_queue_once(hdev, hci_le_create_conn_sync, conn,
++                                     create_le_conn_complete);
++}
++
++int hci_cancel_connect_sync(struct hci_dev *hdev, struct hci_conn *conn)
++{
++      if (conn->state != BT_OPEN)
++              return -EINVAL;
++
++      switch (conn->type) {
++      case ACL_LINK:
++              return !hci_cmd_sync_dequeue_once(hdev,
++                                                hci_acl_create_conn_sync,
++                                                conn, NULL);
++      case LE_LINK:
++              return !hci_cmd_sync_dequeue_once(hdev, hci_le_create_conn_sync,
++                                                conn, create_le_conn_complete);
++      }
++
++      return -ENOENT;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-hci_sync-introduce-hci_cmd_sync_run-hci_cm.patch b/queue-6.6/bluetooth-hci_sync-introduce-hci_cmd_sync_run-hci_cm.patch
new file mode 100644 (file)
index 0000000..59eebbe
--- /dev/null
@@ -0,0 +1,106 @@
+From f15ede29cb23b420164f881f9aa2eb089d5e601b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 Aug 2024 15:47:30 -0400
+Subject: Bluetooth: hci_sync: Introduce hci_cmd_sync_run/hci_cmd_sync_run_once
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit c898f6d7b093bd71e66569cd6797c87d4056f44b ]
+
+This introduces hci_cmd_sync_run/hci_cmd_sync_run_once which acts like
+hci_cmd_sync_queue/hci_cmd_sync_queue_once but runs immediately when
+already on hdev->cmd_sync_work context.
+
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/bluetooth/hci_sync.h |  4 +++
+ net/bluetooth/hci_sync.c         | 42 ++++++++++++++++++++++++++++++--
+ 2 files changed, 44 insertions(+), 2 deletions(-)
+
+diff --git a/include/net/bluetooth/hci_sync.h b/include/net/bluetooth/hci_sync.h
+index 534c3386e714..3cb2d10cac93 100644
+--- a/include/net/bluetooth/hci_sync.h
++++ b/include/net/bluetooth/hci_sync.h
+@@ -52,6 +52,10 @@ int hci_cmd_sync_queue(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                      void *data, hci_cmd_sync_work_destroy_t destroy);
+ int hci_cmd_sync_queue_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                           void *data, hci_cmd_sync_work_destroy_t destroy);
++int hci_cmd_sync_run(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                   void *data, hci_cmd_sync_work_destroy_t destroy);
++int hci_cmd_sync_run_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                        void *data, hci_cmd_sync_work_destroy_t destroy);
+ struct hci_cmd_sync_work_entry *
+ hci_cmd_sync_lookup_entry(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+                         void *data, hci_cmd_sync_work_destroy_t destroy);
+diff --git a/net/bluetooth/hci_sync.c b/net/bluetooth/hci_sync.c
+index 3131daff56f4..f3c51315eb16 100644
+--- a/net/bluetooth/hci_sync.c
++++ b/net/bluetooth/hci_sync.c
+@@ -114,7 +114,7 @@ static void hci_cmd_sync_add(struct hci_request *req, u16 opcode, u32 plen,
+       skb_queue_tail(&req->cmd_q, skb);
+ }
+-static int hci_cmd_sync_run(struct hci_request *req)
++static int hci_req_sync_run(struct hci_request *req)
+ {
+       struct hci_dev *hdev = req->hdev;
+       struct sk_buff *skb;
+@@ -164,7 +164,7 @@ struct sk_buff *__hci_cmd_sync_sk(struct hci_dev *hdev, u16 opcode, u32 plen,
+       hdev->req_status = HCI_REQ_PEND;
+-      err = hci_cmd_sync_run(&req);
++      err = hci_req_sync_run(&req);
+       if (err < 0)
+               return ERR_PTR(err);
+@@ -800,6 +800,44 @@ int hci_cmd_sync_queue_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
+ }
+ EXPORT_SYMBOL(hci_cmd_sync_queue_once);
++/* Run HCI command:
++ *
++ * - hdev must be running
++ * - if on cmd_sync_work then run immediately otherwise queue
++ */
++int hci_cmd_sync_run(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                   void *data, hci_cmd_sync_work_destroy_t destroy)
++{
++      /* Only queue command if hdev is running which means it had been opened
++       * and is either on init phase or is already up.
++       */
++      if (!test_bit(HCI_RUNNING, &hdev->flags))
++              return -ENETDOWN;
++
++      /* If on cmd_sync_work then run immediately otherwise queue */
++      if (current_work() == &hdev->cmd_sync_work)
++              return func(hdev, data);
++
++      return hci_cmd_sync_submit(hdev, func, data, destroy);
++}
++EXPORT_SYMBOL(hci_cmd_sync_run);
++
++/* Run HCI command entry once:
++ *
++ * - Lookup if an entry already exist and only if it doesn't creates a new entry
++ *   and run it.
++ * - if on cmd_sync_work then run immediately otherwise queue
++ */
++int hci_cmd_sync_run_once(struct hci_dev *hdev, hci_cmd_sync_work_func_t func,
++                        void *data, hci_cmd_sync_work_destroy_t destroy)
++{
++      if (hci_cmd_sync_lookup_entry(hdev, func, data, destroy))
++              return 0;
++
++      return hci_cmd_sync_run(hdev, func, data, destroy);
++}
++EXPORT_SYMBOL(hci_cmd_sync_run_once);
++
+ /* Lookup HCI command entry:
+  *
+  * - Return first entry that matches by function callback or data or
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-mgmt-fix-not-generating-command-complete-f.patch b/queue-6.6/bluetooth-mgmt-fix-not-generating-command-complete-f.patch
new file mode 100644 (file)
index 0000000..453e386
--- /dev/null
@@ -0,0 +1,193 @@
+From 70ae1cd775f9cf7724777bd03e25218bdce873d3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 26 Aug 2024 16:14:04 -0400
+Subject: Bluetooth: MGMT: Fix not generating command complete for
+ MGMT_OP_DISCONNECT
+
+From: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+
+[ Upstream commit 227a0cdf4a028a73dc256d0f5144b4808d718893 ]
+
+MGMT_OP_DISCONNECT can be called while mgmt_device_connected has not
+been called yet, which will cause the connection procedure to be
+aborted, so mgmt_device_disconnected shall still respond with command
+complete to MGMT_OP_DISCONNECT and just not emit
+MGMT_EV_DEVICE_DISCONNECTED since MGMT_EV_DEVICE_CONNECTED was never
+sent.
+
+To fix this MGMT_OP_DISCONNECT is changed to work similarly to other
+command which do use hci_cmd_sync_queue and then use hci_conn_abort to
+disconnect and returns the result, in order for hci_conn_abort to be
+used from hci_cmd_sync context it now uses hci_cmd_sync_run_once.
+
+Link: https://github.com/bluez/bluez/issues/932
+Fixes: 12d4a3b2ccb3 ("Bluetooth: Move check for MGMT_CONNECTED flag into mgmt.c")
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bluetooth/hci_conn.c |  6 ++-
+ net/bluetooth/mgmt.c     | 84 ++++++++++++++++++++--------------------
+ 2 files changed, 47 insertions(+), 43 deletions(-)
+
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index efa0881a90e1..d8a01eb016ad 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -2877,5 +2877,9 @@ int hci_abort_conn(struct hci_conn *conn, u8 reason)
+               return 0;
+       }
+-      return hci_cmd_sync_queue_once(hdev, abort_conn_sync, conn, NULL);
++      /* Run immediately if on cmd_sync_work since this may be called
++       * as a result to MGMT_OP_DISCONNECT/MGMT_OP_UNPAIR which does
++       * already queue its callback on cmd_sync_work.
++       */
++      return hci_cmd_sync_run_once(hdev, abort_conn_sync, conn, NULL);
+ }
+diff --git a/net/bluetooth/mgmt.c b/net/bluetooth/mgmt.c
+index bad365f3d7bf..4ae9029b5785 100644
+--- a/net/bluetooth/mgmt.c
++++ b/net/bluetooth/mgmt.c
+@@ -2918,7 +2918,12 @@ static int unpair_device_sync(struct hci_dev *hdev, void *data)
+       if (!conn)
+               return 0;
+-      return hci_abort_conn_sync(hdev, conn, HCI_ERROR_REMOTE_USER_TERM);
++      /* Disregard any possible error since the likes of hci_abort_conn_sync
++       * will clean up the connection no matter the error.
++       */
++      hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
++
++      return 0;
+ }
+ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
+@@ -3050,13 +3055,44 @@ static int unpair_device(struct sock *sk, struct hci_dev *hdev, void *data,
+       return err;
+ }
++static void disconnect_complete(struct hci_dev *hdev, void *data, int err)
++{
++      struct mgmt_pending_cmd *cmd = data;
++
++      cmd->cmd_complete(cmd, mgmt_status(err));
++      mgmt_pending_free(cmd);
++}
++
++static int disconnect_sync(struct hci_dev *hdev, void *data)
++{
++      struct mgmt_pending_cmd *cmd = data;
++      struct mgmt_cp_disconnect *cp = cmd->param;
++      struct hci_conn *conn;
++
++      if (cp->addr.type == BDADDR_BREDR)
++              conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
++                                             &cp->addr.bdaddr);
++      else
++              conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr,
++                                             le_addr_type(cp->addr.type));
++
++      if (!conn)
++              return -ENOTCONN;
++
++      /* Disregard any possible error since the likes of hci_abort_conn_sync
++       * will clean up the connection no matter the error.
++       */
++      hci_abort_conn(conn, HCI_ERROR_REMOTE_USER_TERM);
++
++      return 0;
++}
++
+ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
+                     u16 len)
+ {
+       struct mgmt_cp_disconnect *cp = data;
+       struct mgmt_rp_disconnect rp;
+       struct mgmt_pending_cmd *cmd;
+-      struct hci_conn *conn;
+       int err;
+       bt_dev_dbg(hdev, "sock %p", sk);
+@@ -3079,27 +3115,7 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
+               goto failed;
+       }
+-      if (pending_find(MGMT_OP_DISCONNECT, hdev)) {
+-              err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
+-                                      MGMT_STATUS_BUSY, &rp, sizeof(rp));
+-              goto failed;
+-      }
+-
+-      if (cp->addr.type == BDADDR_BREDR)
+-              conn = hci_conn_hash_lookup_ba(hdev, ACL_LINK,
+-                                             &cp->addr.bdaddr);
+-      else
+-              conn = hci_conn_hash_lookup_le(hdev, &cp->addr.bdaddr,
+-                                             le_addr_type(cp->addr.type));
+-
+-      if (!conn || conn->state == BT_OPEN || conn->state == BT_CLOSED) {
+-              err = mgmt_cmd_complete(sk, hdev->id, MGMT_OP_DISCONNECT,
+-                                      MGMT_STATUS_NOT_CONNECTED, &rp,
+-                                      sizeof(rp));
+-              goto failed;
+-      }
+-
+-      cmd = mgmt_pending_add(sk, MGMT_OP_DISCONNECT, hdev, data, len);
++      cmd = mgmt_pending_new(sk, MGMT_OP_DISCONNECT, hdev, data, len);
+       if (!cmd) {
+               err = -ENOMEM;
+               goto failed;
+@@ -3107,9 +3123,10 @@ static int disconnect(struct sock *sk, struct hci_dev *hdev, void *data,
+       cmd->cmd_complete = generic_cmd_complete;
+-      err = hci_disconnect(conn, HCI_ERROR_REMOTE_USER_TERM);
++      err = hci_cmd_sync_queue(hdev, disconnect_sync, cmd,
++                               disconnect_complete);
+       if (err < 0)
+-              mgmt_pending_remove(cmd);
++              mgmt_pending_free(cmd);
+ failed:
+       hci_dev_unlock(hdev);
+@@ -9627,18 +9644,6 @@ void mgmt_device_connected(struct hci_dev *hdev, struct hci_conn *conn,
+       mgmt_event_skb(skb, NULL);
+ }
+-static void disconnect_rsp(struct mgmt_pending_cmd *cmd, void *data)
+-{
+-      struct sock **sk = data;
+-
+-      cmd->cmd_complete(cmd, 0);
+-
+-      *sk = cmd->sk;
+-      sock_hold(*sk);
+-
+-      mgmt_pending_remove(cmd);
+-}
+-
+ static void unpair_device_rsp(struct mgmt_pending_cmd *cmd, void *data)
+ {
+       struct hci_dev *hdev = data;
+@@ -9679,8 +9684,6 @@ void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
+       if (link_type != ACL_LINK && link_type != LE_LINK)
+               return;
+-      mgmt_pending_foreach(MGMT_OP_DISCONNECT, hdev, disconnect_rsp, &sk);
+-
+       bacpy(&ev.addr.bdaddr, bdaddr);
+       ev.addr.type = link_to_bdaddr(link_type, addr_type);
+       ev.reason = reason;
+@@ -9693,9 +9696,6 @@ void mgmt_device_disconnected(struct hci_dev *hdev, bdaddr_t *bdaddr,
+       if (sk)
+               sock_put(sk);
+-
+-      mgmt_pending_foreach(MGMT_OP_UNPAIR_DEVICE, hdev, unpair_device_rsp,
+-                           hdev);
+ }
+ void mgmt_disconnect_failed(struct hci_dev *hdev, bdaddr_t *bdaddr,
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-qca-if-memdump-doesn-t-work-re-enable-ibs.patch b/queue-6.6/bluetooth-qca-if-memdump-doesn-t-work-re-enable-ibs.patch
new file mode 100644 (file)
index 0000000..428f69b
--- /dev/null
@@ -0,0 +1,47 @@
+From 41cb8474993c747117fe822305ff7c08a4ea72d2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 21 Aug 2024 15:43:40 -0700
+Subject: Bluetooth: qca: If memdump doesn't work, re-enable IBS
+
+From: Douglas Anderson <dianders@chromium.org>
+
+[ Upstream commit 8ae22de9d2eae3c432de64bf2b3a5a69cf1d1124 ]
+
+On systems in the field, we are seeing this sometimes in the kernel logs:
+  Bluetooth: qca_controller_memdump() hci0: hci_devcd_init Return:-95
+
+This means that _something_ decided that it wanted to get a memdump
+but then hci_devcd_init() returned -EOPNOTSUPP (AKA -95).
+
+The cleanup code in qca_controller_memdump() when we get back an error
+from hci_devcd_init() undoes most things but forgets to clear
+QCA_IBS_DISABLED. One side effect of this is that, during the next
+suspend, qca_suspend() will always get a timeout.
+
+Let's fix it so that we clear the bit.
+
+Fixes: 06d3fdfcdf5c ("Bluetooth: hci_qca: Add qcom devcoredump support")
+Reviewed-by: Guenter Roeck <groeck@chromium.org>
+Reviewed-by: Stephen Boyd <swboyd@chromium.org>
+Signed-off-by: Douglas Anderson <dianders@chromium.org>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/bluetooth/hci_qca.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/bluetooth/hci_qca.c b/drivers/bluetooth/hci_qca.c
+index 9082456d80fb..7a552387129e 100644
+--- a/drivers/bluetooth/hci_qca.c
++++ b/drivers/bluetooth/hci_qca.c
+@@ -1090,6 +1090,7 @@ static void qca_controller_memdump(struct work_struct *work)
+                               qca->memdump_state = QCA_MEMDUMP_COLLECTED;
+                               cancel_delayed_work(&qca->ctrl_memdump_timeout);
+                               clear_bit(QCA_MEMDUMP_COLLECTION, &qca->flags);
++                              clear_bit(QCA_IBS_DISABLED, &qca->flags);
+                               mutex_unlock(&qca->hci_memdump_lock);
+                               return;
+                       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/bluetooth-remove-pending-acl-connection-attempts.patch b/queue-6.6/bluetooth-remove-pending-acl-connection-attempts.patch
new file mode 100644 (file)
index 0000000..3070384
--- /dev/null
@@ -0,0 +1,152 @@
+From dd5a3bea42c5b3981d40f82ad4bac744b4f4f44c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Feb 2024 12:08:14 +0100
+Subject: Bluetooth: Remove pending ACL connection attempts
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jonas Dreßler <verdre@v0yd.nl>
+
+[ Upstream commit 4aa42119d971603dc9e4d8cf4f53d5fcf082ea7d ]
+
+With the last commit we moved to using the hci_sync queue for "Create
+Connection" requests, removing the need for retrying the paging after
+finished/failed "Create Connection" requests and after the end of
+inquiries.
+
+hci_conn_check_pending() was used to trigger this retry, we can remove it
+now.
+
+Note that we can also remove the special handling for COMMAND_DISALLOWED
+errors in the completion handler of "Create Connection", because "Create
+Connection" requests are now always serialized.
+
+This is somewhat reverting commit 4c67bc74f016 ("[Bluetooth] Support
+concurrent connect requests").
+
+With this, the BT_CONNECT2 state of ACL hci_conn objects should now be
+back to meaning only one thing: That we received a "Connection Request"
+from another device (see hci_conn_request_evt), but the response to that
+is going to be deferred.
+
+Signed-off-by: Jonas Dreßler <verdre@v0yd.nl>
+Signed-off-by: Luiz Augusto von Dentz <luiz.von.dentz@intel.com>
+Stable-dep-of: 227a0cdf4a02 ("Bluetooth: MGMT: Fix not generating command complete for MGMT_OP_DISCONNECT")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/bluetooth/hci_core.h |  1 -
+ net/bluetooth/hci_conn.c         | 16 ----------------
+ net/bluetooth/hci_event.c        | 21 ++++-----------------
+ 3 files changed, 4 insertions(+), 34 deletions(-)
+
+diff --git a/include/net/bluetooth/hci_core.h b/include/net/bluetooth/hci_core.h
+index 070c794e6a42..850f0e46aecf 100644
+--- a/include/net/bluetooth/hci_core.h
++++ b/include/net/bluetooth/hci_core.h
+@@ -1417,7 +1417,6 @@ struct hci_conn *hci_conn_add_unset(struct hci_dev *hdev, int type,
+                                   bdaddr_t *dst, u8 role);
+ void hci_conn_del(struct hci_conn *conn);
+ void hci_conn_hash_flush(struct hci_dev *hdev);
+-void hci_conn_check_pending(struct hci_dev *hdev);
+ struct hci_chan *hci_chan_create(struct hci_conn *conn);
+ void hci_chan_del(struct hci_chan *chan);
+diff --git a/net/bluetooth/hci_conn.c b/net/bluetooth/hci_conn.c
+index 04fe901a47f7..36731d047f16 100644
+--- a/net/bluetooth/hci_conn.c
++++ b/net/bluetooth/hci_conn.c
+@@ -2565,22 +2565,6 @@ void hci_conn_hash_flush(struct hci_dev *hdev)
+       }
+ }
+-/* Check pending connect attempts */
+-void hci_conn_check_pending(struct hci_dev *hdev)
+-{
+-      struct hci_conn *conn;
+-
+-      BT_DBG("hdev %s", hdev->name);
+-
+-      hci_dev_lock(hdev);
+-
+-      conn = hci_conn_hash_lookup_state(hdev, ACL_LINK, BT_CONNECT2);
+-      if (conn)
+-              hci_acl_create_connection_sync(hdev, conn);
+-
+-      hci_dev_unlock(hdev);
+-}
+-
+ static u32 get_link_mode(struct hci_conn *conn)
+ {
+       u32 link_mode = 0;
+diff --git a/net/bluetooth/hci_event.c b/net/bluetooth/hci_event.c
+index dc80c1560357..d81c7fccdd40 100644
+--- a/net/bluetooth/hci_event.c
++++ b/net/bluetooth/hci_event.c
+@@ -118,8 +118,6 @@ static u8 hci_cc_inquiry_cancel(struct hci_dev *hdev, void *data,
+               hci_discovery_set_state(hdev, DISCOVERY_STOPPED);
+       hci_dev_unlock(hdev);
+-      hci_conn_check_pending(hdev);
+-
+       return rp->status;
+ }
+@@ -150,8 +148,6 @@ static u8 hci_cc_exit_periodic_inq(struct hci_dev *hdev, void *data,
+       hci_dev_clear_flag(hdev, HCI_PERIODIC_INQ);
+-      hci_conn_check_pending(hdev);
+-
+       return rp->status;
+ }
+@@ -2257,10 +2253,8 @@ static void hci_cs_inquiry(struct hci_dev *hdev, __u8 status)
+ {
+       bt_dev_dbg(hdev, "status 0x%2.2x", status);
+-      if (status) {
+-              hci_conn_check_pending(hdev);
++      if (status)
+               return;
+-      }
+       if (hci_sent_cmd_data(hdev, HCI_OP_INQUIRY))
+               set_bit(HCI_INQUIRY, &hdev->flags);
+@@ -2285,12 +2279,9 @@ static void hci_cs_create_conn(struct hci_dev *hdev, __u8 status)
+       if (status) {
+               if (conn && conn->state == BT_CONNECT) {
+-                      if (status != HCI_ERROR_COMMAND_DISALLOWED || conn->attempt > 2) {
+-                              conn->state = BT_CLOSED;
+-                              hci_connect_cfm(conn, status);
+-                              hci_conn_del(conn);
+-                      } else
+-                              conn->state = BT_CONNECT2;
++                      conn->state = BT_CLOSED;
++                      hci_connect_cfm(conn, status);
++                      hci_conn_del(conn);
+               }
+       } else {
+               if (!conn) {
+@@ -2980,8 +2971,6 @@ static void hci_inquiry_complete_evt(struct hci_dev *hdev, void *data,
+       bt_dev_dbg(hdev, "status 0x%2.2x", ev->status);
+-      hci_conn_check_pending(hdev);
+-
+       if (!test_and_clear_bit(HCI_INQUIRY, &hdev->flags))
+               return;
+@@ -3228,8 +3217,6 @@ static void hci_conn_complete_evt(struct hci_dev *hdev, void *data,
+ unlock:
+       hci_dev_unlock(hdev);
+-
+-      hci_conn_check_pending(hdev);
+ }
+ static void hci_reject_conn(struct hci_dev *hdev, bdaddr_t *bdaddr)
+-- 
+2.43.0
+
diff --git a/queue-6.6/bpf-add-sockptr-support-for-getsockopt.patch b/queue-6.6/bpf-add-sockptr-support-for-getsockopt.patch
new file mode 100644 (file)
index 0000000..35400a4
--- /dev/null
@@ -0,0 +1,129 @@
+From b449aff2ab4abbc5713a20bfbeec63d8bcc39580 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 16 Oct 2023 06:47:39 -0700
+Subject: bpf: Add sockptr support for getsockopt
+
+From: Breno Leitao <leitao@debian.org>
+
+[ Upstream commit a615f67e1a426f35366b8398c11f31c148e7df48 ]
+
+The whole network stack uses sockptr, and while it doesn't move to
+something more modern, let's use sockptr in getsockptr BPF hooks, so, it
+could be used by other callers.
+
+The main motivation for this change is to use it in the io_uring
+{g,s}etsockopt(), which will use a userspace pointer for *optval, but, a
+kernel value for optlen.
+
+Link: https://lore.kernel.org/all/ZSArfLaaGcfd8LH8@gmail.com/
+
+Signed-off-by: Breno Leitao <leitao@debian.org>
+Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
+Link: https://lore.kernel.org/r/20231016134750.1381153-2-leitao@debian.org
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/bpf-cgroup.h |  5 +++--
+ kernel/bpf/cgroup.c        | 20 +++++++++++---------
+ net/socket.c               |  5 +++--
+ 3 files changed, 17 insertions(+), 13 deletions(-)
+
+diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h
+index 31561e789715..c4956a48ab3e 100644
+--- a/include/linux/bpf-cgroup.h
++++ b/include/linux/bpf-cgroup.h
+@@ -140,9 +140,10 @@ int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head,
+ int __cgroup_bpf_run_filter_setsockopt(struct sock *sock, int *level,
+                                      int *optname, char __user *optval,
+                                      int *optlen, char **kernel_optval);
++
+ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
+-                                     int optname, char __user *optval,
+-                                     int __user *optlen, int max_optlen,
++                                     int optname, sockptr_t optval,
++                                     sockptr_t optlen, int max_optlen,
+                                      int retval);
+ int __cgroup_bpf_run_filter_getsockopt_kern(struct sock *sk, int level,
+diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
+index ac37bd53aee0..caae07cc885e 100644
+--- a/kernel/bpf/cgroup.c
++++ b/kernel/bpf/cgroup.c
+@@ -1889,8 +1889,8 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level,
+ }
+ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
+-                                     int optname, char __user *optval,
+-                                     int __user *optlen, int max_optlen,
++                                     int optname, sockptr_t optval,
++                                     sockptr_t optlen, int max_optlen,
+                                      int retval)
+ {
+       struct cgroup *cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data);
+@@ -1917,8 +1917,8 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
+                * one that kernel returned as well to let
+                * BPF programs inspect the value.
+                */
+-
+-              if (get_user(ctx.optlen, optlen)) {
++              if (copy_from_sockptr(&ctx.optlen, optlen,
++                                    sizeof(ctx.optlen))) {
+                       ret = -EFAULT;
+                       goto out;
+               }
+@@ -1929,8 +1929,8 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
+               }
+               orig_optlen = ctx.optlen;
+-              if (copy_from_user(ctx.optval, optval,
+-                                 min(ctx.optlen, max_optlen)) != 0) {
++              if (copy_from_sockptr(ctx.optval, optval,
++                                    min(ctx.optlen, max_optlen))) {
+                       ret = -EFAULT;
+                       goto out;
+               }
+@@ -1944,7 +1944,8 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
+       if (ret < 0)
+               goto out;
+-      if (optval && (ctx.optlen > max_optlen || ctx.optlen < 0)) {
++      if (!sockptr_is_null(optval) &&
++          (ctx.optlen > max_optlen || ctx.optlen < 0)) {
+               if (orig_optlen > PAGE_SIZE && ctx.optlen >= 0) {
+                       pr_info_once("bpf getsockopt: ignoring program buffer with optlen=%d (max_optlen=%d)\n",
+                                    ctx.optlen, max_optlen);
+@@ -1956,11 +1957,12 @@ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
+       }
+       if (ctx.optlen != 0) {
+-              if (optval && copy_to_user(optval, ctx.optval, ctx.optlen)) {
++              if (!sockptr_is_null(optval) &&
++                  copy_to_sockptr(optval, ctx.optval, ctx.optlen)) {
+                       ret = -EFAULT;
+                       goto out;
+               }
+-              if (put_user(ctx.optlen, optlen)) {
++              if (copy_to_sockptr(optlen, &ctx.optlen, sizeof(ctx.optlen))) {
+                       ret = -EFAULT;
+                       goto out;
+               }
+diff --git a/net/socket.c b/net/socket.c
+index 8d83c4bb163b..b2d75d5661be 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -2375,8 +2375,9 @@ int __sys_getsockopt(int fd, int level, int optname, char __user *optval,
+       if (!in_compat_syscall())
+               err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname,
+-                                                   optval, optlen, max_optlen,
+-                                                   err);
++                                                   USER_SOCKPTR(optval),
++                                                   USER_SOCKPTR(optlen),
++                                                   max_optlen, err);
+ out_put:
+       fput_light(sock->file, fput_needed);
+       return err;
+-- 
+2.43.0
+
diff --git a/queue-6.6/bpf-add-sockptr-support-for-setsockopt.patch b/queue-6.6/bpf-add-sockptr-support-for-setsockopt.patch
new file mode 100644 (file)
index 0000000..c7e73e6
--- /dev/null
@@ -0,0 +1,83 @@
+From 850d058869c92302cea52c6481a77abe301e9a0a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 16 Oct 2023 06:47:40 -0700
+Subject: bpf: Add sockptr support for setsockopt
+
+From: Breno Leitao <leitao@debian.org>
+
+[ Upstream commit 3f31e0d14d44ad491a81b7c1f83f32fbc300a867 ]
+
+The whole network stack uses sockptr, and while it doesn't move to
+something more modern, let's use sockptr in setsockptr BPF hooks, so, it
+could be used by other callers.
+
+The main motivation for this change is to use it in the io_uring
+{g,s}etsockopt(), which will use a userspace pointer for *optval, but, a
+kernel value for optlen.
+
+Link: https://lore.kernel.org/all/ZSArfLaaGcfd8LH8@gmail.com/
+
+Signed-off-by: Breno Leitao <leitao@debian.org>
+Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
+Link: https://lore.kernel.org/r/20231016134750.1381153-3-leitao@debian.org
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/bpf-cgroup.h | 2 +-
+ kernel/bpf/cgroup.c        | 5 +++--
+ net/socket.c               | 2 +-
+ 3 files changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h
+index c4956a48ab3e..ebfd3c5a776a 100644
+--- a/include/linux/bpf-cgroup.h
++++ b/include/linux/bpf-cgroup.h
+@@ -138,7 +138,7 @@ int __cgroup_bpf_run_filter_sysctl(struct ctl_table_header *head,
+                                  enum cgroup_bpf_attach_type atype);
+ int __cgroup_bpf_run_filter_setsockopt(struct sock *sock, int *level,
+-                                     int *optname, char __user *optval,
++                                     int *optname, sockptr_t optval,
+                                      int *optlen, char **kernel_optval);
+ int __cgroup_bpf_run_filter_getsockopt(struct sock *sk, int level,
+diff --git a/kernel/bpf/cgroup.c b/kernel/bpf/cgroup.c
+index caae07cc885e..913a6a7e62ca 100644
+--- a/kernel/bpf/cgroup.c
++++ b/kernel/bpf/cgroup.c
+@@ -1799,7 +1799,7 @@ static bool sockopt_buf_allocated(struct bpf_sockopt_kern *ctx,
+ }
+ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level,
+-                                     int *optname, char __user *optval,
++                                     int *optname, sockptr_t optval,
+                                      int *optlen, char **kernel_optval)
+ {
+       struct cgroup *cgrp = sock_cgroup_ptr(&sk->sk_cgrp_data);
+@@ -1822,7 +1822,8 @@ int __cgroup_bpf_run_filter_setsockopt(struct sock *sk, int *level,
+       ctx.optlen = *optlen;
+-      if (copy_from_user(ctx.optval, optval, min(*optlen, max_optlen)) != 0) {
++      if (copy_from_sockptr(ctx.optval, optval,
++                            min(*optlen, max_optlen))) {
+               ret = -EFAULT;
+               goto out;
+       }
+diff --git a/net/socket.c b/net/socket.c
+index b2d75d5661be..f0f087004728 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -2307,7 +2307,7 @@ int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval,
+       if (!in_compat_syscall())
+               err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname,
+-                                                   user_optval, &optlen,
++                                                   optval, &optlen,
+                                                    &kernel_optval);
+       if (err < 0)
+               goto out_put;
+-- 
+2.43.0
+
diff --git a/queue-6.6/bpf-net-fix-a-potential-race-in-do_sock_getsockopt.patch b/queue-6.6/bpf-net-fix-a-potential-race-in-do_sock_getsockopt.patch
new file mode 100644 (file)
index 0000000..c60ec12
--- /dev/null
@@ -0,0 +1,94 @@
+From 2cf07c4a40571ef93c411808d99d34c35e9826cb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 30 Aug 2024 16:25:17 +0800
+Subject: bpf, net: Fix a potential race in do_sock_getsockopt()
+
+From: Tze-nan Wu <Tze-nan.Wu@mediatek.com>
+
+[ Upstream commit 33f339a1ba54e56bba57ee9a77c71e385ab4825c ]
+
+There's a potential race when `cgroup_bpf_enabled(CGROUP_GETSOCKOPT)` is
+false during the execution of `BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN`, but
+becomes true when `BPF_CGROUP_RUN_PROG_GETSOCKOPT` is called.
+This inconsistency can lead to `BPF_CGROUP_RUN_PROG_GETSOCKOPT` receiving
+an "-EFAULT" from `__cgroup_bpf_run_filter_getsockopt(max_optlen=0)`.
+Scenario shown as below:
+
+           `process A`                      `process B`
+           -----------                      ------------
+  BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN
+                                            enable CGROUP_GETSOCKOPT
+  BPF_CGROUP_RUN_PROG_GETSOCKOPT (-EFAULT)
+
+To resolve this, remove the `BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN` macro and
+directly uses `copy_from_sockptr` to ensure that `max_optlen` is always
+set before `BPF_CGROUP_RUN_PROG_GETSOCKOPT` is invoked.
+
+Fixes: 0d01da6afc54 ("bpf: implement getsockopt and setsockopt hooks")
+Co-developed-by: Yanghui Li <yanghui.li@mediatek.com>
+Signed-off-by: Yanghui Li <yanghui.li@mediatek.com>
+Co-developed-by: Cheng-Jui Wang <cheng-jui.wang@mediatek.com>
+Signed-off-by: Cheng-Jui Wang <cheng-jui.wang@mediatek.com>
+Signed-off-by: Tze-nan Wu <Tze-nan.Wu@mediatek.com>
+Acked-by: Stanislav Fomichev <sdf@fomichev.me>
+Acked-by: Alexei Starovoitov <ast@kernel.org>
+Link: https://patch.msgid.link/20240830082518.23243-1-Tze-nan.Wu@mediatek.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/bpf-cgroup.h | 9 ---------
+ net/socket.c               | 4 ++--
+ 2 files changed, 2 insertions(+), 11 deletions(-)
+
+diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h
+index 2aa82b7aed89..d4f2c8706042 100644
+--- a/include/linux/bpf-cgroup.h
++++ b/include/linux/bpf-cgroup.h
+@@ -375,14 +375,6 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
+       __ret;                                                                 \
+ })
+-#define BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen)                             \
+-({                                                                           \
+-      int __ret = 0;                                                         \
+-      if (cgroup_bpf_enabled(CGROUP_GETSOCKOPT))                             \
+-              copy_from_sockptr(&__ret, optlen, sizeof(int));                \
+-      __ret;                                                                 \
+-})
+-
+ #define BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock, level, optname, optval, optlen,   \
+                                      max_optlen, retval)                     \
+ ({                                                                           \
+@@ -500,7 +492,6 @@ static inline int bpf_percpu_cgroup_storage_update(struct bpf_map *map,
+ #define BPF_CGROUP_RUN_PROG_SOCK_OPS(sock_ops) ({ 0; })
+ #define BPF_CGROUP_RUN_PROG_DEVICE_CGROUP(atype, major, minor, access) ({ 0; })
+ #define BPF_CGROUP_RUN_PROG_SYSCTL(head,table,write,buf,count,pos) ({ 0; })
+-#define BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen) ({ 0; })
+ #define BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock, level, optname, optval, \
+                                      optlen, max_optlen, retval) ({ retval; })
+ #define BPF_CGROUP_RUN_PROG_GETSOCKOPT_KERN(sock, level, optname, optval, \
+diff --git a/net/socket.c b/net/socket.c
+index d275f5f14882..9db33cd4a71b 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -2355,7 +2355,7 @@ INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level,
+ int do_sock_getsockopt(struct socket *sock, bool compat, int level,
+                      int optname, sockptr_t optval, sockptr_t optlen)
+ {
+-      int max_optlen __maybe_unused;
++      int max_optlen __maybe_unused = 0;
+       const struct proto_ops *ops;
+       int err;
+@@ -2364,7 +2364,7 @@ int do_sock_getsockopt(struct socket *sock, bool compat, int level,
+               return err;
+       if (!compat)
+-              max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen);
++              copy_from_sockptr(&max_optlen, optlen, sizeof(int));
+       ops = READ_ONCE(sock->ops);
+       if (level == SOL_SOCKET) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/bpf-verifier-correct-tail_call_reachable-for-bpf-pro.patch b/queue-6.6/bpf-verifier-correct-tail_call_reachable-for-bpf-pro.patch
new file mode 100644 (file)
index 0000000..608aa82
--- /dev/null
@@ -0,0 +1,41 @@
+From 86fedbd1ff636dc7cab303350acd3565158c1559 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 10 Jun 2024 20:42:23 +0800
+Subject: bpf, verifier: Correct tail_call_reachable for bpf prog
+
+From: Leon Hwang <hffilwlqm@gmail.com>
+
+[ Upstream commit 01793ed86b5d7df1e956520b5474940743eb7ed8 ]
+
+It's confusing to inspect 'prog->aux->tail_call_reachable' with drgn[0],
+when bpf prog has tail call but 'tail_call_reachable' is false.
+
+This patch corrects 'tail_call_reachable' when bpf prog has tail call.
+
+Signed-off-by: Leon Hwang <hffilwlqm@gmail.com>
+Link: https://lore.kernel.org/r/20240610124224.34673-2-hffilwlqm@gmail.com
+Signed-off-by: Alexei Starovoitov <ast@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/bpf/verifier.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c
+index 3f1a9cd7fc9e..9d5699942273 100644
+--- a/kernel/bpf/verifier.c
++++ b/kernel/bpf/verifier.c
+@@ -3064,8 +3064,10 @@ static int check_subprogs(struct bpf_verifier_env *env)
+               if (code == (BPF_JMP | BPF_CALL) &&
+                   insn[i].src_reg == 0 &&
+-                  insn[i].imm == BPF_FUNC_tail_call)
++                  insn[i].imm == BPF_FUNC_tail_call) {
+                       subprog[cur_subprog].has_tail_call = true;
++                      subprog[cur_subprog].tail_call_reachable = true;
++              }
+               if (BPF_CLASS(code) == BPF_LD &&
+                   (BPF_MODE(code) == BPF_ABS || BPF_MODE(code) == BPF_IND))
+                       subprog[cur_subprog].has_ld_abs = true;
+-- 
+2.43.0
+
diff --git a/queue-6.6/btrfs-clean-up-our-handling-of-refs-0-in-snapshot-de.patch b/queue-6.6/btrfs-clean-up-our-handling-of-refs-0-in-snapshot-de.patch
new file mode 100644 (file)
index 0000000..46a40a1
--- /dev/null
@@ -0,0 +1,90 @@
+From 0bd6504e69a7e239b76deebdb1f55b82d271dabf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 May 2024 14:12:13 -0400
+Subject: btrfs: clean up our handling of refs == 0 in snapshot delete
+
+From: Josef Bacik <josef@toxicpanda.com>
+
+[ Upstream commit b8ccef048354074a548f108e51d0557d6adfd3a3 ]
+
+In reada we BUG_ON(refs == 0), which could be unkind since we aren't
+holding a lock on the extent leaf and thus could get a transient
+incorrect answer.  In walk_down_proc we also BUG_ON(refs == 0), which
+could happen if we have extent tree corruption.  Change that to return
+-EUCLEAN.  In do_walk_down() we catch this case and handle it correctly,
+however we return -EIO, which -EUCLEAN is a more appropriate error code.
+Finally in walk_up_proc we have the same BUG_ON(refs == 0), so convert
+that to proper error handling.  Also adjust the error message so we can
+actually do something with the information.
+
+Signed-off-by: Josef Bacik <josef@toxicpanda.com>
+Reviewed-by: David Sterba <dsterba@suse.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/btrfs/extent-tree.c | 28 +++++++++++++++++++++++-----
+ 1 file changed, 23 insertions(+), 5 deletions(-)
+
+diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
+index 2d39481fb3ce..72851adc1fee 100644
+--- a/fs/btrfs/extent-tree.c
++++ b/fs/btrfs/extent-tree.c
+@@ -5085,7 +5085,15 @@ static noinline void reada_walk_down(struct btrfs_trans_handle *trans,
+               /* We don't care about errors in readahead. */
+               if (ret < 0)
+                       continue;
+-              BUG_ON(refs == 0);
++
++              /*
++               * This could be racey, it's conceivable that we raced and end
++               * up with a bogus refs count, if that's the case just skip, if
++               * we are actually corrupt we will notice when we look up
++               * everything again with our locks.
++               */
++              if (refs == 0)
++                      continue;
+               if (wc->stage == DROP_REFERENCE) {
+                       if (refs == 1)
+@@ -5152,7 +5160,11 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans,
+               BUG_ON(ret == -ENOMEM);
+               if (ret)
+                       return ret;
+-              BUG_ON(wc->refs[level] == 0);
++              if (unlikely(wc->refs[level] == 0)) {
++                      btrfs_err(fs_info, "bytenr %llu has 0 references, expect > 0",
++                                eb->start);
++                      return -EUCLEAN;
++              }
+       }
+       if (wc->stage == DROP_REFERENCE) {
+@@ -5286,8 +5298,9 @@ static noinline int do_walk_down(struct btrfs_trans_handle *trans,
+               goto out_unlock;
+       if (unlikely(wc->refs[level - 1] == 0)) {
+-              btrfs_err(fs_info, "Missing references.");
+-              ret = -EIO;
++              btrfs_err(fs_info, "bytenr %llu has 0 references, expect > 0",
++                        bytenr);
++              ret = -EUCLEAN;
+               goto out_unlock;
+       }
+       *lookup_info = 0;
+@@ -5487,7 +5500,12 @@ static noinline int walk_up_proc(struct btrfs_trans_handle *trans,
+                               path->locks[level] = 0;
+                               return ret;
+                       }
+-                      BUG_ON(wc->refs[level] == 0);
++                      if (unlikely(wc->refs[level] == 0)) {
++                              btrfs_tree_unlock_rw(eb, path->locks[level]);
++                              btrfs_err(fs_info, "bytenr %llu has 0 references, expect > 0",
++                                        eb->start);
++                              return -EUCLEAN;
++                      }
+                       if (wc->refs[level] == 1) {
+                               btrfs_tree_unlock_rw(eb, path->locks[level]);
+                               path->locks[level] = 0;
+-- 
+2.43.0
+
diff --git a/queue-6.6/btrfs-initialize-location-to-fix-wmaybe-uninitialize.patch b/queue-6.6/btrfs-initialize-location-to-fix-wmaybe-uninitialize.patch
new file mode 100644 (file)
index 0000000..2eb34dd
--- /dev/null
@@ -0,0 +1,56 @@
+From d970a6e578674d0d65eb8e3a384676271e26a1f2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jul 2024 21:59:24 +0200
+Subject: btrfs: initialize location to fix -Wmaybe-uninitialized in
+ btrfs_lookup_dentry()
+
+From: David Sterba <dsterba@suse.com>
+
+[ Upstream commit b8e947e9f64cac9df85a07672b658df5b2bcff07 ]
+
+Some arch + compiler combinations report a potentially unused variable
+location in btrfs_lookup_dentry(). This is a false alert as the variable
+is passed by value and always valid or there's an error. The compilers
+cannot probably reason about that although btrfs_inode_by_name() is in
+the same file.
+
+   >  + /kisskb/src/fs/btrfs/inode.c: error: 'location.objectid' may be used
+   +uninitialized in this function [-Werror=maybe-uninitialized]:  => 5603:9
+   >  + /kisskb/src/fs/btrfs/inode.c: error: 'location.type' may be used
+   +uninitialized in this function [-Werror=maybe-uninitialized]:  => 5674:5
+
+   m68k-gcc8/m68k-allmodconfig
+   mips-gcc8/mips-allmodconfig
+   powerpc-gcc5/powerpc-all{mod,yes}config
+   powerpc-gcc5/ppc64_defconfig
+
+Initialize it to zero, this should fix the warnings and won't change the
+behaviour as btrfs_inode_by_name() accepts only a root or inode item
+types, otherwise returns an error.
+
+Reported-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Tested-by: Geert Uytterhoeven <geert@linux-m68k.org>
+Link: https://lore.kernel.org/linux-btrfs/bd4e9928-17b3-9257-8ba7-6b7f9bbb639a@linux-m68k.org/
+Reviewed-by: Qu Wenruo <wqu@suse.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/btrfs/inode.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/fs/btrfs/inode.c b/fs/btrfs/inode.c
+index 18ce5353092d..a42238211887 100644
+--- a/fs/btrfs/inode.c
++++ b/fs/btrfs/inode.c
+@@ -5668,7 +5668,7 @@ struct inode *btrfs_lookup_dentry(struct inode *dir, struct dentry *dentry)
+       struct inode *inode;
+       struct btrfs_root *root = BTRFS_I(dir)->root;
+       struct btrfs_root *sub_root = root;
+-      struct btrfs_key location;
++      struct btrfs_key location = { 0 };
+       u8 di_type = 0;
+       int ret = 0;
+-- 
+2.43.0
+
diff --git a/queue-6.6/btrfs-replace-bug_on-with-assert-in-walk_down_proc.patch b/queue-6.6/btrfs-replace-bug_on-with-assert-in-walk_down_proc.patch
new file mode 100644 (file)
index 0000000..40a46ba
--- /dev/null
@@ -0,0 +1,46 @@
+From e2f0f6ce9f6e36cf723b5b4bf642706dbffe476b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 7 May 2024 14:12:12 -0400
+Subject: btrfs: replace BUG_ON with ASSERT in walk_down_proc()
+
+From: Josef Bacik <josef@toxicpanda.com>
+
+[ Upstream commit 1f9d44c0a12730a24f8bb75c5e1102207413cc9b ]
+
+We have a couple of areas where we check to make sure the tree block is
+locked before looking up or messing with references.  This is old code
+so it has this as BUG_ON().  Convert this to ASSERT() for developers.
+
+Signed-off-by: Josef Bacik <josef@toxicpanda.com>
+Reviewed-by: David Sterba <dsterba@suse.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/btrfs/extent-tree.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/fs/btrfs/extent-tree.c b/fs/btrfs/extent-tree.c
+index c6ecfd05e1db..2d39481fb3ce 100644
+--- a/fs/btrfs/extent-tree.c
++++ b/fs/btrfs/extent-tree.c
+@@ -5144,7 +5144,7 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans,
+       if (lookup_info &&
+           ((wc->stage == DROP_REFERENCE && wc->refs[level] != 1) ||
+            (wc->stage == UPDATE_BACKREF && !(wc->flags[level] & flag)))) {
+-              BUG_ON(!path->locks[level]);
++              ASSERT(path->locks[level]);
+               ret = btrfs_lookup_extent_info(trans, fs_info,
+                                              eb->start, level, 1,
+                                              &wc->refs[level],
+@@ -5168,7 +5168,7 @@ static noinline int walk_down_proc(struct btrfs_trans_handle *trans,
+       /* wc->stage == UPDATE_BACKREF */
+       if (!(wc->flags[level] & flag)) {
+-              BUG_ON(!path->locks[level]);
++              ASSERT(path->locks[level]);
+               ret = btrfs_inc_ref(trans, root, eb, 1);
+               BUG_ON(ret); /* -ENOMEM */
+               ret = btrfs_dec_ref(trans, root, eb, 0);
+-- 
+2.43.0
+
diff --git a/queue-6.6/btrfs-replace-bug_on-with-error-handling-at-update_r.patch b/queue-6.6/btrfs-replace-bug_on-with-error-handling-at-update_r.patch
new file mode 100644 (file)
index 0000000..7edd66d
--- /dev/null
@@ -0,0 +1,50 @@
+From bf71fbf7db2c8e25d2802997ccb89826f83e809d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 18 Jun 2024 15:55:16 +0100
+Subject: btrfs: replace BUG_ON() with error handling at update_ref_for_cow()
+
+From: Filipe Manana <fdmanana@suse.com>
+
+[ Upstream commit b56329a782314fde5b61058e2a25097af7ccb675 ]
+
+Instead of a BUG_ON() just return an error, log an error message and
+abort the transaction in case we find an extent buffer belonging to the
+relocation tree that doesn't have the full backref flag set. This is
+unexpected and should never happen (save for bugs or a potential bad
+memory).
+
+Reviewed-by: Qu Wenruo <wqu@suse.com>
+Signed-off-by: Filipe Manana <fdmanana@suse.com>
+Reviewed-by: David Sterba <dsterba@suse.com>
+Signed-off-by: David Sterba <dsterba@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/btrfs/ctree.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/fs/btrfs/ctree.c b/fs/btrfs/ctree.c
+index 118ad4d2cbbe..2eb4e03080ac 100644
+--- a/fs/btrfs/ctree.c
++++ b/fs/btrfs/ctree.c
+@@ -451,8 +451,16 @@ static noinline int update_ref_for_cow(struct btrfs_trans_handle *trans,
+       }
+       owner = btrfs_header_owner(buf);
+-      BUG_ON(owner == BTRFS_TREE_RELOC_OBJECTID &&
+-             !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF));
++      if (unlikely(owner == BTRFS_TREE_RELOC_OBJECTID &&
++                   !(flags & BTRFS_BLOCK_FLAG_FULL_BACKREF))) {
++              btrfs_crit(fs_info,
++"found tree block at bytenr %llu level %d root %llu refs %llu flags %llx without full backref flag set",
++                         buf->start, btrfs_header_level(buf),
++                         btrfs_root_id(root), refs, flags);
++              ret = -EUCLEAN;
++              btrfs_abort_transaction(trans, ret);
++              return ret;
++      }
+       if (refs > 1) {
+               if ((owner == root->root_key.objectid ||
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-bcm-remove-proc-entry-when-dev-is-unregistered.patch b/queue-6.6/can-bcm-remove-proc-entry-when-dev-is-unregistered.patch
new file mode 100644 (file)
index 0000000..e5d0029
--- /dev/null
@@ -0,0 +1,99 @@
+From 53d563b349da50100dd787511e76d7bdb5979c04 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 22 Jul 2024 12:28:42 -0700
+Subject: can: bcm: Remove proc entry when dev is unregistered.
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ Upstream commit 76fe372ccb81b0c89b6cd2fec26e2f38c958be85 ]
+
+syzkaller reported a warning in bcm_connect() below. [0]
+
+The repro calls connect() to vxcan1, removes vxcan1, and calls
+connect() with ifindex == 0.
+
+Calling connect() for a BCM socket allocates a proc entry.
+Then, bcm_sk(sk)->bound is set to 1 to prevent further connect().
+
+However, removing the bound device resets bcm_sk(sk)->bound to 0
+in bcm_notify().
+
+The 2nd connect() tries to allocate a proc entry with the same
+name and sets NULL to bcm_sk(sk)->bcm_proc_read, leaking the
+original proc entry.
+
+Since the proc entry is available only for connect()ed sockets,
+let's clean up the entry when the bound netdev is unregistered.
+
+[0]:
+proc_dir_entry 'can-bcm/2456' already registered
+WARNING: CPU: 1 PID: 394 at fs/proc/generic.c:376 proc_register+0x645/0x8f0 fs/proc/generic.c:375
+Modules linked in:
+CPU: 1 PID: 394 Comm: syz-executor403 Not tainted 6.10.0-rc7-g852e42cc2dd4
+Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.3-0-ga6ed6b701f0a-prebuilt.qemu.org 04/01/2014
+RIP: 0010:proc_register+0x645/0x8f0 fs/proc/generic.c:375
+Code: 00 00 00 00 00 48 85 ed 0f 85 97 02 00 00 4d 85 f6 0f 85 9f 02 00 00 48 c7 c7 9b cb cf 87 48 89 de 4c 89 fa e8 1c 6f eb fe 90 <0f> 0b 90 90 48 c7 c7 98 37 99 89 e8 cb 7e 22 05 bb 00 00 00 10 48
+RSP: 0018:ffa0000000cd7c30 EFLAGS: 00010246
+RAX: 9e129be1950f0200 RBX: ff1100011b51582c RCX: ff1100011857cd80
+RDX: 0000000000000000 RSI: 0000000000000000 RDI: 0000000000000002
+RBP: 0000000000000000 R08: ffd400000000000f R09: ff1100013e78cac0
+R10: ffac800000cd7980 R11: ff1100013e12b1f0 R12: 0000000000000000
+R13: 0000000000000000 R14: 0000000000000000 R15: ff1100011a99a2ec
+FS:  00007fbd7086f740(0000) GS:ff1100013fd00000(0000) knlGS:0000000000000000
+CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+CR2: 00000000200071c0 CR3: 0000000118556004 CR4: 0000000000771ef0
+DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
+DR3: 0000000000000000 DR6: 00000000fffe07f0 DR7: 0000000000000400
+PKRU: 55555554
+Call Trace:
+ <TASK>
+ proc_create_net_single+0x144/0x210 fs/proc/proc_net.c:220
+ bcm_connect+0x472/0x840 net/can/bcm.c:1673
+ __sys_connect_file net/socket.c:2049 [inline]
+ __sys_connect+0x5d2/0x690 net/socket.c:2066
+ __do_sys_connect net/socket.c:2076 [inline]
+ __se_sys_connect net/socket.c:2073 [inline]
+ __x64_sys_connect+0x8f/0x100 net/socket.c:2073
+ do_syscall_x64 arch/x86/entry/common.c:52 [inline]
+ do_syscall_64+0xd9/0x1c0 arch/x86/entry/common.c:83
+ entry_SYSCALL_64_after_hwframe+0x4b/0x53
+RIP: 0033:0x7fbd708b0e5d
+Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 73 9f 1b 00 f7 d8 64 89 01 48
+RSP: 002b:00007fff8cd33f08 EFLAGS: 00000246 ORIG_RAX: 000000000000002a
+RAX: ffffffffffffffda RBX: 0000000000000003 RCX: 00007fbd708b0e5d
+RDX: 0000000000000010 RSI: 0000000020000040 RDI: 0000000000000003
+RBP: 0000000000000000 R08: 0000000000000040 R09: 0000000000000040
+R10: 0000000000000040 R11: 0000000000000246 R12: 00007fff8cd34098
+R13: 0000000000401280 R14: 0000000000406de8 R15: 00007fbd70ab9000
+ </TASK>
+remove_proc_entry: removing non-empty directory 'net/can-bcm', leaking at least '2456'
+
+Fixes: ffd980f976e7 ("[CAN]: Add broadcast manager (bcm) protocol")
+Reported-by: syzkaller <syzkaller@googlegroups.com>
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Link: https://lore.kernel.org/all/20240722192842.37421-1-kuniyu@amazon.com
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/can/bcm.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/net/can/bcm.c b/net/can/bcm.c
+index 9168114fc87f..00208ee13e57 100644
+--- a/net/can/bcm.c
++++ b/net/can/bcm.c
+@@ -1428,6 +1428,10 @@ static void bcm_notify(struct bcm_sock *bo, unsigned long msg,
+               /* remove device reference, if this is our bound device */
+               if (bo->bound && bo->ifindex == dev->ifindex) {
++#if IS_ENABLED(CONFIG_PROC_FS)
++                      if (sock_net(sk)->can.bcmproc_dir && bo->bcm_proc_read)
++                              remove_proc_entry(bo->procname, sock_net(sk)->can.bcmproc_dir);
++#endif
+                       bo->bound   = 0;
+                       bo->ifindex = 0;
+                       notify_enodev = 1;
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-kvaser_pciefd-move-reset-of-dma-rx-buffers-to-th.patch b/queue-6.6/can-kvaser_pciefd-move-reset-of-dma-rx-buffers-to-th.patch
new file mode 100644 (file)
index 0000000..0fc3639
--- /dev/null
@@ -0,0 +1,100 @@
+From 0bde641b93c31bc392b6af829a175c0743e076fc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jun 2024 20:13:19 +0200
+Subject: can: kvaser_pciefd: Move reset of DMA RX buffers to the end of the
+ ISR
+
+From: Martin Jocic <martin.jocic@kvaser.com>
+
+[ Upstream commit 48f827d4f48f5243e37b9240029ce3f456d1f490 ]
+
+A new interrupt is triggered by resetting the DMA RX buffers.
+Since MSI interrupts are faster than legacy interrupts, the reset
+of the DMA buffers must be moved to the very end of the ISR,
+otherwise a new MSI interrupt will be masked by the current one.
+
+Signed-off-by: Martin Jocic <martin.jocic@kvaser.com>
+Link: https://lore.kernel.org/all/20240620181320.235465-2-martin.jocic@kvaser.com
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/kvaser_pciefd.c | 30 ++++++++++++++++++------------
+ 1 file changed, 18 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c
+index a933b4c8165c..96b6e3d13e67 100644
+--- a/drivers/net/can/kvaser_pciefd.c
++++ b/drivers/net/can/kvaser_pciefd.c
+@@ -1580,23 +1580,15 @@ static int kvaser_pciefd_read_buffer(struct kvaser_pciefd *pcie, int dma_buf)
+       return res;
+ }
+-static void kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie)
++static u32 kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie)
+ {
+       u32 irq = ioread32(KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG);
+-      if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0) {
++      if (irq & KVASER_PCIEFD_SRB_IRQ_DPD0)
+               kvaser_pciefd_read_buffer(pcie, 0);
+-              /* Reset DMA buffer 0 */
+-              iowrite32(KVASER_PCIEFD_SRB_CMD_RDB0,
+-                        KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG);
+-      }
+-      if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1) {
++      if (irq & KVASER_PCIEFD_SRB_IRQ_DPD1)
+               kvaser_pciefd_read_buffer(pcie, 1);
+-              /* Reset DMA buffer 1 */
+-              iowrite32(KVASER_PCIEFD_SRB_CMD_RDB1,
+-                        KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG);
+-      }
+       if (irq & KVASER_PCIEFD_SRB_IRQ_DOF0 ||
+           irq & KVASER_PCIEFD_SRB_IRQ_DOF1 ||
+@@ -1605,6 +1597,7 @@ static void kvaser_pciefd_receive_irq(struct kvaser_pciefd *pcie)
+               dev_err(&pcie->pci->dev, "DMA IRQ error 0x%08X\n", irq);
+       iowrite32(irq, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_IRQ_REG);
++      return irq;
+ }
+ static void kvaser_pciefd_transmit_irq(struct kvaser_pciefd_can *can)
+@@ -1632,19 +1625,32 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)
+       struct kvaser_pciefd *pcie = (struct kvaser_pciefd *)dev;
+       const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask;
+       u32 pci_irq = ioread32(KVASER_PCIEFD_PCI_IRQ_ADDR(pcie));
++      u32 srb_irq = 0;
+       int i;
+       if (!(pci_irq & irq_mask->all))
+               return IRQ_NONE;
+       if (pci_irq & irq_mask->kcan_rx0)
+-              kvaser_pciefd_receive_irq(pcie);
++              srb_irq = kvaser_pciefd_receive_irq(pcie);
+       for (i = 0; i < pcie->nr_channels; i++) {
+               if (pci_irq & irq_mask->kcan_tx[i])
+                       kvaser_pciefd_transmit_irq(pcie->can[i]);
+       }
++      if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD0) {
++              /* Reset DMA buffer 0, may trigger new interrupt */
++              iowrite32(KVASER_PCIEFD_SRB_CMD_RDB0,
++                        KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG);
++      }
++
++      if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD1) {
++              /* Reset DMA buffer 1, may trigger new interrupt */
++              iowrite32(KVASER_PCIEFD_SRB_CMD_RDB1,
++                        KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG);
++      }
++
+       return IRQ_HANDLED;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-kvaser_pciefd-remove-unnecessary-comment.patch b/queue-6.6/can-kvaser_pciefd-remove-unnecessary-comment.patch
new file mode 100644 (file)
index 0000000..595cc18
--- /dev/null
@@ -0,0 +1,35 @@
+From 12368497a790e56740742daa34a4b12b40cde9aa Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 14 Jun 2024 17:15:20 +0200
+Subject: can: kvaser_pciefd: Remove unnecessary comment
+
+From: Martin Jocic <martin.jocic@kvaser.com>
+
+[ Upstream commit 11d186697ceb10b68c6a1fd505635346b1ccd055 ]
+
+The code speaks for itself.
+
+Signed-off-by: Martin Jocic <martin.jocic@kvaser.com>
+Link: https://lore.kernel.org/all/20240614151524.2718287-4-martin.jocic@kvaser.com
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/kvaser_pciefd.c | 1 -
+ 1 file changed, 1 deletion(-)
+
+diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c
+index 076fc2f5b34b..00cfa23a8dcf 100644
+--- a/drivers/net/can/kvaser_pciefd.c
++++ b/drivers/net/can/kvaser_pciefd.c
+@@ -1641,7 +1641,6 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)
+               kvaser_pciefd_receive_irq(pcie);
+       for (i = 0; i < pcie->nr_channels; i++) {
+-              /* Check that mask matches channel (i) IRQ mask */
+               if (board_irq & irq_mask->kcan_tx[i])
+                       kvaser_pciefd_transmit_irq(pcie->can[i]);
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-kvaser_pciefd-rename-board_irq-to-pci_irq.patch b/queue-6.6/can-kvaser_pciefd-rename-board_irq-to-pci_irq.patch
new file mode 100644 (file)
index 0000000..d38989e
--- /dev/null
@@ -0,0 +1,50 @@
+From 15adef599076966c90d1cd385ca1f42142410273 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 14 Jun 2024 17:15:23 +0200
+Subject: can: kvaser_pciefd: Rename board_irq to pci_irq
+
+From: Martin Jocic <martin.jocic@kvaser.com>
+
+[ Upstream commit cbf88a6ba7bb6ce0d3131b119298f73bd7b18459 ]
+
+Rename the variable name board_irq in the ISR to pci_irq to
+be more specific and to match the macro by which it is read.
+
+Signed-off-by: Martin Jocic <martin.jocic@kvaser.com>
+Link: https://lore.kernel.org/all/20240614151524.2718287-7-martin.jocic@kvaser.com
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/kvaser_pciefd.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c
+index 00cfa23a8dcf..a933b4c8165c 100644
+--- a/drivers/net/can/kvaser_pciefd.c
++++ b/drivers/net/can/kvaser_pciefd.c
+@@ -1631,17 +1631,17 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)
+ {
+       struct kvaser_pciefd *pcie = (struct kvaser_pciefd *)dev;
+       const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask;
+-      u32 board_irq = ioread32(KVASER_PCIEFD_PCI_IRQ_ADDR(pcie));
++      u32 pci_irq = ioread32(KVASER_PCIEFD_PCI_IRQ_ADDR(pcie));
+       int i;
+-      if (!(board_irq & irq_mask->all))
++      if (!(pci_irq & irq_mask->all))
+               return IRQ_NONE;
+-      if (board_irq & irq_mask->kcan_rx0)
++      if (pci_irq & irq_mask->kcan_rx0)
+               kvaser_pciefd_receive_irq(pcie);
+       for (i = 0; i < pcie->nr_channels; i++) {
+-              if (board_irq & irq_mask->kcan_tx[i])
++              if (pci_irq & irq_mask->kcan_tx[i])
+                       kvaser_pciefd_transmit_irq(pcie->can[i]);
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-kvaser_pciefd-skip-redundant-null-pointer-check-.patch b/queue-6.6/can-kvaser_pciefd-skip-redundant-null-pointer-check-.patch
new file mode 100644 (file)
index 0000000..4eb0caf
--- /dev/null
@@ -0,0 +1,45 @@
+From 3cc9f8bfd1ba3a213651ad6f5cad5838aa573ab3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 14 Jun 2024 17:15:19 +0200
+Subject: can: kvaser_pciefd: Skip redundant NULL pointer check in ISR
+
+From: Martin Jocic <martin.jocic@kvaser.com>
+
+[ Upstream commit ac765219c2c4e44f29063724c8d36435a3e61985 ]
+
+This check is already done at the creation of the net devices in
+kvaser_pciefd_setup_can_ctrls called from kvaser_pciefd_probe.
+
+If it fails, the driver won't load, so there should be no need to
+repeat the check inside the ISR. The number of channels is read
+from the FPGA and should be trusted.
+
+Signed-off-by: Martin Jocic <martin.jocic@kvaser.com>
+Link: https://lore.kernel.org/all/20240614151524.2718287-3-martin.jocic@kvaser.com
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Stable-dep-of: dd885d90c047 ("can: kvaser_pciefd: Use a single write when releasing RX buffers")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/kvaser_pciefd.c | 6 ------
+ 1 file changed, 6 deletions(-)
+
+diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c
+index a57005faa04f..076fc2f5b34b 100644
+--- a/drivers/net/can/kvaser_pciefd.c
++++ b/drivers/net/can/kvaser_pciefd.c
+@@ -1641,12 +1641,6 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)
+               kvaser_pciefd_receive_irq(pcie);
+       for (i = 0; i < pcie->nr_channels; i++) {
+-              if (!pcie->can[i]) {
+-                      dev_err(&pcie->pci->dev,
+-                              "IRQ mask points to unallocated controller\n");
+-                      break;
+-              }
+-
+               /* Check that mask matches channel (i) IRQ mask */
+               if (board_irq & irq_mask->kcan_tx[i])
+                       kvaser_pciefd_transmit_irq(pcie->can[i]);
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-kvaser_pciefd-use-a-single-write-when-releasing-.patch b/queue-6.6/can-kvaser_pciefd-use-a-single-write-when-releasing-.patch
new file mode 100644 (file)
index 0000000..d6a5998
--- /dev/null
@@ -0,0 +1,84 @@
+From 4dc4d8001fac8d9798013765bdcad8b9f73d7a3e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 30 Aug 2024 17:31:13 +0200
+Subject: can: kvaser_pciefd: Use a single write when releasing RX buffers
+
+From: Martin Jocic <martin.jocic@kvaser.com>
+
+[ Upstream commit dd885d90c047dbdd2773c1d33954cbd8747d81e2 ]
+
+Kvaser's PCIe cards uses the KCAN FPGA IP block which has dual 4K
+buffers for incoming messages shared by all (currently up to eight)
+channels. While the driver processes messages in one buffer, new
+incoming messages are stored in the other and so on.
+
+The design of KCAN is such that a buffer must be fully read and then
+released. Releasing a buffer will make the FPGA switch buffers. If the
+other buffer contains at least one incoming message the FPGA will also
+instantly issue a new interrupt, if not the interrupt will be issued
+after receiving the first new message.
+
+With IRQx interrupts, it takes a little time for the interrupt to
+happen, enough for any previous ISR call to do it's business and
+return, but MSI interrupts are way faster so this time is reduced to
+almost nothing.
+
+So with MSI, releasing the buffer HAS to be the very last action of
+the ISR before returning, otherwise the new interrupt might be
+"masked" by the kernel because the previous ISR call hasn't returned.
+And the interrupts are edge-triggered so we cannot loose one, or the
+ping-pong reading process will stop.
+
+This is why this patch modifies the driver to use a single write to
+the SRB_CMD register before returning.
+
+Signed-off-by: Martin Jocic <martin.jocic@kvaser.com>
+Reviewed-by: Vincent Mailhol <mailhol.vincent@wanadoo.fr>
+Link: https://patch.msgid.link/20240830153113.2081440-1-martin.jocic@kvaser.com
+Fixes: 26ad340e582d ("can: kvaser_pciefd: Add driver for Kvaser PCIEcan devices")
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/kvaser_pciefd.c | 18 ++++++++----------
+ 1 file changed, 8 insertions(+), 10 deletions(-)
+
+diff --git a/drivers/net/can/kvaser_pciefd.c b/drivers/net/can/kvaser_pciefd.c
+index 96b6e3d13e67..c490b4ba065b 100644
+--- a/drivers/net/can/kvaser_pciefd.c
++++ b/drivers/net/can/kvaser_pciefd.c
+@@ -1626,6 +1626,7 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)
+       const struct kvaser_pciefd_irq_mask *irq_mask = pcie->driver_data->irq_mask;
+       u32 pci_irq = ioread32(KVASER_PCIEFD_PCI_IRQ_ADDR(pcie));
+       u32 srb_irq = 0;
++      u32 srb_release = 0;
+       int i;
+       if (!(pci_irq & irq_mask->all))
+@@ -1639,17 +1640,14 @@ static irqreturn_t kvaser_pciefd_irq_handler(int irq, void *dev)
+                       kvaser_pciefd_transmit_irq(pcie->can[i]);
+       }
+-      if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD0) {
+-              /* Reset DMA buffer 0, may trigger new interrupt */
+-              iowrite32(KVASER_PCIEFD_SRB_CMD_RDB0,
+-                        KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG);
+-      }
++      if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD0)
++              srb_release |= KVASER_PCIEFD_SRB_CMD_RDB0;
+-      if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD1) {
+-              /* Reset DMA buffer 1, may trigger new interrupt */
+-              iowrite32(KVASER_PCIEFD_SRB_CMD_RDB1,
+-                        KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG);
+-      }
++      if (srb_irq & KVASER_PCIEFD_SRB_IRQ_DPD1)
++              srb_release |= KVASER_PCIEFD_SRB_CMD_RDB1;
++
++      if (srb_release)
++              iowrite32(srb_release, KVASER_PCIEFD_SRB_ADDR(pcie) + KVASER_PCIEFD_SRB_CMD_REG);
+       return IRQ_HANDLED;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-m_can-release-irq-on-error-in-m_can_open.patch b/queue-6.6/can-m_can-release-irq-on-error-in-m_can_open.patch
new file mode 100644 (file)
index 0000000..14ce281
--- /dev/null
@@ -0,0 +1,54 @@
+From 3e27a0a638f967a7387abb223db894698d6da6e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 5 Aug 2024 15:01:58 +0100
+Subject: can: m_can: Release irq on error in m_can_open
+
+From: Simon Horman <horms@kernel.org>
+
+[ Upstream commit 06d4ef3056a7ac31be331281bb7a6302ef5a7f8a ]
+
+It appears that the irq requested in m_can_open() may be leaked
+if an error subsequently occurs: if m_can_start() fails.
+
+Address this by calling free_irq in the unwind path for
+such cases.
+
+Flagged by Smatch.
+Compile tested only.
+
+Fixes: eaacfeaca7ad ("can: m_can: Call the RAM init directly from m_can_chip_config")
+Acked-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Simon Horman <horms@kernel.org>
+Link: https://lore.kernel.org/all/20240805-mcan-irq-v2-1-7154c0484819@kernel.org
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/m_can/m_can.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/can/m_can/m_can.c b/drivers/net/can/m_can/m_can.c
+index 2395b1225cc8..fb77fd74de27 100644
+--- a/drivers/net/can/m_can/m_can.c
++++ b/drivers/net/can/m_can/m_can.c
+@@ -1871,7 +1871,7 @@ static int m_can_open(struct net_device *dev)
+       /* start the m_can controller */
+       err = m_can_start(dev);
+       if (err)
+-              goto exit_irq_fail;
++              goto exit_start_fail;
+       if (!cdev->is_peripheral)
+               napi_enable(&cdev->napi);
+@@ -1880,6 +1880,9 @@ static int m_can_open(struct net_device *dev)
+       return 0;
++exit_start_fail:
++      if (cdev->is_peripheral || dev->irq)
++              free_irq(dev->irq, dev);
+ exit_irq_fail:
+       if (cdev->is_peripheral)
+               destroy_workqueue(cdev->tx_wq);
+-- 
+2.43.0
+
diff --git a/queue-6.6/can-mcp251xfd-fix-ring-configuration-when-switching-.patch b/queue-6.6/can-mcp251xfd-fix-ring-configuration-when-switching-.patch
new file mode 100644 (file)
index 0000000..8772c7f
--- /dev/null
@@ -0,0 +1,84 @@
+From a4fce128c2c323f3e4345f3ab11404d3ebf43340 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jul 2024 17:28:27 +0200
+Subject: can: mcp251xfd: fix ring configuration when switching from CAN-CC to
+ CAN-FD mode
+
+From: Marc Kleine-Budde <mkl@pengutronix.de>
+
+[ Upstream commit 50ea5449c56310d2d31c28ba91a59232116d3c1e ]
+
+If the ring (rx, tx) and/or coalescing parameters (rx-frames-irq,
+tx-frames-irq) have been configured while the interface was in CAN-CC
+mode, but the interface is brought up in CAN-FD mode, the ring
+parameters might be too big.
+
+Use the default CAN-FD values in this case.
+
+Fixes: 9263c2e92be9 ("can: mcp251xfd: ring: add support for runtime configurable RX/TX ring parameters")
+Link: https://lore.kernel.org/all/20240805-mcp251xfd-fix-ringconfig-v1-1-72086f0ca5ee@pengutronix.de
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c | 11 +++++++++-
+ .../net/can/spi/mcp251xfd/mcp251xfd-ring.c    | 20 ++++++++++++++++---
+ 2 files changed, 27 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c
+index 9e8e82cdba46..61b0d6fa52dd 100644
+--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c
++++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ram.c
+@@ -97,7 +97,16 @@ void can_ram_get_layout(struct can_ram_layout *layout,
+       if (ring) {
+               u8 num_rx_coalesce = 0, num_tx_coalesce = 0;
+-              num_rx = can_ram_rounddown_pow_of_two(config, &config->rx, 0, ring->rx_pending);
++              /* If the ring parameters have been configured in
++               * CAN-CC mode, but and we are in CAN-FD mode now,
++               * they might be to big. Use the default CAN-FD values
++               * in this case.
++               */
++              num_rx = ring->rx_pending;
++              if (num_rx > layout->max_rx)
++                      num_rx = layout->default_rx;
++
++              num_rx = can_ram_rounddown_pow_of_two(config, &config->rx, 0, num_rx);
+               /* The ethtool doc says:
+                * To disable coalescing, set usecs = 0 and max_frames = 1.
+diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
+index 4cb79a4f2461..3a941a71c78f 100644
+--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
++++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
+@@ -468,11 +468,25 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
+       /* switching from CAN-2.0 to CAN-FD mode or vice versa */
+       if (fd_mode != test_bit(MCP251XFD_FLAGS_FD_MODE, priv->flags)) {
++              const struct ethtool_ringparam ring = {
++                      .rx_pending = priv->rx_obj_num,
++                      .tx_pending = priv->tx->obj_num,
++              };
++              const struct ethtool_coalesce ec = {
++                      .rx_coalesce_usecs_irq = priv->rx_coalesce_usecs_irq,
++                      .rx_max_coalesced_frames_irq = priv->rx_obj_num_coalesce_irq,
++                      .tx_coalesce_usecs_irq = priv->tx_coalesce_usecs_irq,
++                      .tx_max_coalesced_frames_irq = priv->tx_obj_num_coalesce_irq,
++              };
+               struct can_ram_layout layout;
+-              can_ram_get_layout(&layout, &mcp251xfd_ram_config, NULL, NULL, fd_mode);
+-              priv->rx_obj_num = layout.default_rx;
+-              tx_ring->obj_num = layout.default_tx;
++              can_ram_get_layout(&layout, &mcp251xfd_ram_config, &ring, &ec, fd_mode);
++
++              priv->rx_obj_num = layout.cur_rx;
++              priv->rx_obj_num_coalesce_irq = layout.rx_coalesce;
++
++              tx_ring->obj_num = layout.cur_tx;
++              priv->tx_obj_num_coalesce_irq = layout.tx_coalesce;
+       }
+       if (fd_mode) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/cgroup-protect-css-cgroup-write-under-css_set_lock.patch b/queue-6.6/cgroup-protect-css-cgroup-write-under-css_set_lock.patch
new file mode 100644 (file)
index 0000000..7ce107c
--- /dev/null
@@ -0,0 +1,45 @@
+From 0a261663b2f6bb93bdf61798b1321880e8a3f147 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jul 2024 14:52:29 -0400
+Subject: cgroup: Protect css->cgroup write under css_set_lock
+
+From: Waiman Long <longman@redhat.com>
+
+[ Upstream commit 57b56d16800e8961278ecff0dc755d46c4575092 ]
+
+The writing of css->cgroup associated with the cgroup root in
+rebind_subsystems() is currently protected only by cgroup_mutex.
+However, the reading of css->cgroup in both proc_cpuset_show() and
+proc_cgroup_show() is protected just by css_set_lock. That makes the
+readers susceptible to racing problems like data tearing or caching.
+It is also a problem that can be reported by KCSAN.
+
+This can be fixed by using READ_ONCE() and WRITE_ONCE() to access
+css->cgroup. Alternatively, the writing of css->cgroup can be moved
+under css_set_lock as well which is done by this patch.
+
+Signed-off-by: Waiman Long <longman@redhat.com>
+Signed-off-by: Tejun Heo <tj@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/cgroup/cgroup.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kernel/cgroup/cgroup.c b/kernel/cgroup/cgroup.c
+index 5eca6281d1aa..660817c125e7 100644
+--- a/kernel/cgroup/cgroup.c
++++ b/kernel/cgroup/cgroup.c
+@@ -1829,9 +1829,9 @@ int rebind_subsystems(struct cgroup_root *dst_root, u16 ss_mask)
+               RCU_INIT_POINTER(scgrp->subsys[ssid], NULL);
+               rcu_assign_pointer(dcgrp->subsys[ssid], css);
+               ss->root = dst_root;
+-              css->cgroup = dcgrp;
+               spin_lock_irq(&css_set_lock);
++              css->cgroup = dcgrp;
+               WARN_ON(!list_empty(&dcgrp->e_csets[ss->id]));
+               list_for_each_entry_safe(cset, cset_pos, &scgrp->e_csets[ss->id],
+                                        e_cset_node[ss->id]) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/cifs-fix-falloc_fl_zero_range-to-preflush-buffered-p.patch b/queue-6.6/cifs-fix-falloc_fl_zero_range-to-preflush-buffered-p.patch
new file mode 100644 (file)
index 0000000..adab6a6
--- /dev/null
@@ -0,0 +1,103 @@
+From 68ce9b149718eed60ef3d24875ad67cad65360d2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 28 Aug 2024 21:08:25 +0100
+Subject: cifs: Fix FALLOC_FL_ZERO_RANGE to preflush buffered part of target
+ region
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit 91d1dfae464987aaf6c79ff51d8674880fb3be77 ]
+
+Under certain conditions, the range to be cleared by FALLOC_FL_ZERO_RANGE
+may only be buffered locally and not yet have been flushed to the server.
+For example:
+
+       xfs_io -f -t -c "pwrite -S 0x41 0 4k" \
+                    -c "pwrite -S 0x42 4k 4k" \
+                    -c "fzero 0 4k" \
+                    -c "pread -v 0 8k" /xfstest.test/foo
+
+will write two 4KiB blocks of data, which get buffered in the pagecache,
+and then fallocate() is used to clear the first 4KiB block on the server -
+but we don't flush the data first, which means the EOF position on the
+server is wrong, and so the FSCTL_SET_ZERO_DATA RPC fails (and xfs_io
+ignores the error), but then when we try to read it, we see the old data.
+
+Fix this by preflushing any part of the target region that above the
+server's idea of the EOF position to force the server to update its EOF
+position.
+
+Note, however, that we don't want to simply expand the file by moving the
+EOF before doing the FSCTL_SET_ZERO_DATA[*] because someone else might see
+the zeroed region or if the RPC fails we then have to try to clean it up or
+risk getting corruption.
+
+[*] And we have to move the EOF first otherwise FSCTL_SET_ZERO_DATA won't
+do what we want.
+
+This fixes the generic/008 xfstest.
+
+[!] Note: A better way to do this might be to split the operation into two
+parts: we only do FSCTL_SET_ZERO_DATA for the part of the range below the
+server's EOF and then, if that worked, invalidate the buffered pages for the
+part above the range.
+
+Fixes: 6b69040247e1 ("cifs/smb3: Fix data inconsistent when zero file range")
+Signed-off-by: David Howells <dhowells@redhat.com>
+cc: Steve French <stfrench@microsoft.com>
+cc: Zhang Xiaoxu <zhangxiaoxu5@huawei.com>
+cc: Pavel Shilovsky <pshilov@microsoft.com>
+cc: Paulo Alcantara <pc@manguebit.com>
+cc: Shyam Prasad N <nspmangalore@gmail.com>
+cc: Rohith Surabattula <rohiths.msft@gmail.com>
+cc: Jeff Layton <jlayton@kernel.org>
+cc: linux-cifs@vger.kernel.org
+cc: linux-mm@kvack.org
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/smb/client/smb2ops.c | 16 ++++++++++++++--
+ 1 file changed, 14 insertions(+), 2 deletions(-)
+
+diff --git a/fs/smb/client/smb2ops.c b/fs/smb/client/smb2ops.c
+index 012d6ec12a69..acd5d7d79352 100644
+--- a/fs/smb/client/smb2ops.c
++++ b/fs/smb/client/smb2ops.c
+@@ -3186,13 +3186,15 @@ static long smb3_zero_data(struct file *file, struct cifs_tcon *tcon,
+ }
+ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
+-                          loff_t offset, loff_t len, bool keep_size)
++                          unsigned long long offset, unsigned long long len,
++                          bool keep_size)
+ {
+       struct cifs_ses *ses = tcon->ses;
+       struct inode *inode = file_inode(file);
+       struct cifsInodeInfo *cifsi = CIFS_I(inode);
+       struct cifsFileInfo *cfile = file->private_data;
+-      unsigned long long new_size;
++      struct netfs_inode *ictx = netfs_inode(inode);
++      unsigned long long i_size, new_size, remote_size;
+       long rc;
+       unsigned int xid;
+@@ -3204,6 +3206,16 @@ static long smb3_zero_range(struct file *file, struct cifs_tcon *tcon,
+       inode_lock(inode);
+       filemap_invalidate_lock(inode->i_mapping);
++      i_size = i_size_read(inode);
++      remote_size = ictx->remote_i_size;
++      if (offset + len >= remote_size && offset < i_size) {
++              unsigned long long top = umin(offset + len, i_size);
++
++              rc = filemap_write_and_wait_range(inode->i_mapping, offset, top - 1);
++              if (rc < 0)
++                      goto zero_range_exit;
++      }
++
+       /*
+        * We zero the range through ioctl, so we need remove the page caches
+        * first, otherwise the data may be inconsistent with the server.
+-- 
+2.43.0
+
diff --git a/queue-6.6/crypto-qat-fix-unintentional-re-enabling-of-error-in.patch b/queue-6.6/crypto-qat-fix-unintentional-re-enabling-of-error-in.patch
new file mode 100644 (file)
index 0000000..d814846
--- /dev/null
@@ -0,0 +1,65 @@
+From 4daf52f688f4c20ca10ad33fc91734be1aa395e4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jun 2024 15:41:19 +0100
+Subject: crypto: qat - fix unintentional re-enabling of error interrupts
+
+From: Hareshx Sankar Raj <hareshx.sankar.raj@intel.com>
+
+[ Upstream commit f0622894c59458fceb33c4197462bc2006f3fc6b ]
+
+The logic that detects pending VF2PF interrupts unintentionally clears
+the section of the error mask register(s) not related to VF2PF.
+This might cause interrupts unrelated to VF2PF, reported through
+errsou3 and errsou5, to be reported again after the execution
+of the function disable_pending_vf2pf_interrupts() in dh895xcc
+and GEN2 devices.
+
+Fix by updating only section of errmsk3 and errmsk5 related to VF2PF.
+
+Signed-off-by: Hareshx Sankar Raj <hareshx.sankar.raj@intel.com>
+Reviewed-by: Damian Muszynski <damian.muszynski@intel.com>
+Signed-off-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
+Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c       | 4 +++-
+ .../crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c  | 8 ++++++--
+ 2 files changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c b/drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c
+index 70ef11963938..43af81fcab86 100644
+--- a/drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c
++++ b/drivers/crypto/intel/qat/qat_common/adf_gen2_pfvf.c
+@@ -100,7 +100,9 @@ static u32 adf_gen2_disable_pending_vf2pf_interrupts(void __iomem *pmisc_addr)
+       errmsk3 |= ADF_GEN2_ERR_MSK_VF2PF(ADF_GEN2_VF_MSK);
+       ADF_CSR_WR(pmisc_addr, ADF_GEN2_ERRMSK3, errmsk3);
+-      errmsk3 &= ADF_GEN2_ERR_MSK_VF2PF(sources | disabled);
++      /* Update only section of errmsk3 related to VF2PF */
++      errmsk3 &= ~ADF_GEN2_ERR_MSK_VF2PF(ADF_GEN2_VF_MSK);
++      errmsk3 |= ADF_GEN2_ERR_MSK_VF2PF(sources | disabled);
+       ADF_CSR_WR(pmisc_addr, ADF_GEN2_ERRMSK3, errmsk3);
+       /* Return the sources of the (new) interrupt(s) */
+diff --git a/drivers/crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c b/drivers/crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c
+index 09551f949126..0e40897cc983 100644
+--- a/drivers/crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c
++++ b/drivers/crypto/intel/qat/qat_dh895xcc/adf_dh895xcc_hw_data.c
+@@ -191,8 +191,12 @@ static u32 disable_pending_vf2pf_interrupts(void __iomem *pmisc_addr)
+       ADF_CSR_WR(pmisc_addr, ADF_GEN2_ERRMSK3, errmsk3);
+       ADF_CSR_WR(pmisc_addr, ADF_GEN2_ERRMSK5, errmsk5);
+-      errmsk3 &= ADF_DH895XCC_ERR_MSK_VF2PF_L(sources | disabled);
+-      errmsk5 &= ADF_DH895XCC_ERR_MSK_VF2PF_U(sources | disabled);
++      /* Update only section of errmsk3 and errmsk5 related to VF2PF */
++      errmsk3 &= ~ADF_DH895XCC_ERR_MSK_VF2PF_L(ADF_DH895XCC_VF_MSK);
++      errmsk5 &= ~ADF_DH895XCC_ERR_MSK_VF2PF_U(ADF_DH895XCC_VF_MSK);
++
++      errmsk3 |= ADF_DH895XCC_ERR_MSK_VF2PF_L(sources | disabled);
++      errmsk5 |= ADF_DH895XCC_ERR_MSK_VF2PF_U(sources | disabled);
+       ADF_CSR_WR(pmisc_addr, ADF_GEN2_ERRMSK3, errmsk3);
+       ADF_CSR_WR(pmisc_addr, ADF_GEN2_ERRMSK5, errmsk5);
+-- 
+2.43.0
+
diff --git a/queue-6.6/cxl-region-verify-target-positions-using-the-ordered.patch b/queue-6.6/cxl-region-verify-target-positions-using-the-ordered.patch
new file mode 100644 (file)
index 0000000..40fbbc4
--- /dev/null
@@ -0,0 +1,59 @@
+From 268cc23a8d96001c2543d6b6e3a92aa1b2b1b32e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 22:29:51 -0700
+Subject: cxl/region: Verify target positions using the ordered target list
+
+From: Alison Schofield <alison.schofield@intel.com>
+
+[ Upstream commit 82a3e3a235633aa0575fac9507d648dd80f3437f ]
+
+When a root decoder is configured the interleave target list is read
+from the BIOS populated CFMWS structure. Per the CXL spec 3.1 Table
+9-22 the target list is in interleave order. The CXL driver populates
+its decoder target list in the same order and stores it in 'struct
+cxl_switch_decoder' field "@target: active ordered target list in
+current decoder configuration"
+
+Given the promise of an ordered list, the driver can stop duplicating
+the work of BIOS and simply check target positions against the ordered
+list during region configuration.
+
+The simplified check against the ordered list is presented here.
+A follow-on patch will remove the unused code.
+
+For Modulo arithmetic this is not a fix, only a simplification.
+For XOR arithmetic this is a fix for HB IW of 3,6,12.
+
+Fixes: f9db85bfec0d ("cxl/acpi: Support CXL XOR Interleave Math (CXIMS)")
+Signed-off-by: Alison Schofield <alison.schofield@intel.com>
+Reviewed-by: Dan Williams <dan.j.williams@intel.com>
+Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Link: https://patch.msgid.link/35d08d3aba08fee0f9b86ab1cef0c25116ca8a55.1719980933.git.alison.schofield@intel.com
+Signed-off-by: Dave Jiang <dave.jiang@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/cxl/core/region.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/cxl/core/region.c b/drivers/cxl/core/region.c
+index bc5a43897d57..5060d9802795 100644
+--- a/drivers/cxl/core/region.c
++++ b/drivers/cxl/core/region.c
+@@ -1528,10 +1528,13 @@ static int cxl_region_attach_position(struct cxl_region *cxlr,
+                                     const struct cxl_dport *dport, int pos)
+ {
+       struct cxl_memdev *cxlmd = cxled_to_memdev(cxled);
++      struct cxl_switch_decoder *cxlsd = &cxlrd->cxlsd;
++      struct cxl_decoder *cxld = &cxlsd->cxld;
++      int iw = cxld->interleave_ways;
+       struct cxl_port *iter;
+       int rc;
+-      if (cxlrd->calc_hb(cxlrd, pos) != dport) {
++      if (dport != cxlrd->cxlsd.target[pos % iw]) {
+               dev_dbg(&cxlr->dev, "%s:%s invalid target position for %s\n",
+                       dev_name(&cxlmd->dev), dev_name(&cxled->cxld.dev),
+                       dev_name(&cxlrd->cxlsd.cxld.dev));
+-- 
+2.43.0
+
diff --git a/queue-6.6/devres-initialize-an-uninitialized-struct-member.patch b/queue-6.6/devres-initialize-an-uninitialized-struct-member.patch
new file mode 100644 (file)
index 0000000..4667dec
--- /dev/null
@@ -0,0 +1,35 @@
+From bf60f251227f29f6f822bcb22c45c58d3044a268 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 22:51:52 +0800
+Subject: devres: Initialize an uninitialized struct member
+
+From: Zijun Hu <quic_zijuhu@quicinc.com>
+
+[ Upstream commit 56a20ad349b5c51909cf8810f7c79b288864ad33 ]
+
+Initialize an uninitialized struct member for driver API
+devres_open_group().
+
+Signed-off-by: Zijun Hu <quic_zijuhu@quicinc.com>
+Link: https://lore.kernel.org/r/1719931914-19035-4-git-send-email-quic_zijuhu@quicinc.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/base/devres.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/base/devres.c b/drivers/base/devres.c
+index 8d709dbd4e0c..e9b0d94aeabd 100644
+--- a/drivers/base/devres.c
++++ b/drivers/base/devres.c
+@@ -567,6 +567,7 @@ void * devres_open_group(struct device *dev, void *id, gfp_t gfp)
+       grp->id = grp;
+       if (id)
+               grp->id = id;
++      grp->color = 0;
+       spin_lock_irqsave(&dev->devres_lock, flags);
+       add_dr(dev, &grp->node[0]);
+-- 
+2.43.0
+
diff --git a/queue-6.6/dm-init-handle-minors-larger-than-255.patch b/queue-6.6/dm-init-handle-minors-larger-than-255.patch
new file mode 100644 (file)
index 0000000..689f69e
--- /dev/null
@@ -0,0 +1,43 @@
+From 6f250c10b8318ef723c1ab5b74f869ddaf1e9976 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 12:13:24 +0200
+Subject: dm init: Handle minors larger than 255
+
+From: Benjamin Marzinski <bmarzins@redhat.com>
+
+[ Upstream commit 140ce37fd78a629105377e17842465258a5459ef ]
+
+dm_parse_device_entry() simply copies the minor number into dmi.dev, but
+the dev_t format splits the minor number between the lowest 8 bytes and
+highest 12 bytes. If the minor number is larger than 255, part of it
+will end up getting treated as the major number
+
+Fix this by checking that the minor number is valid and then encoding it
+as a dev_t.
+
+Signed-off-by: Benjamin Marzinski <bmarzins@redhat.com>
+Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/md/dm-init.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/md/dm-init.c b/drivers/md/dm-init.c
+index 2a71bcdba92d..b37bbe762500 100644
+--- a/drivers/md/dm-init.c
++++ b/drivers/md/dm-init.c
+@@ -212,8 +212,10 @@ static char __init *dm_parse_device_entry(struct dm_device *dev, char *str)
+       strscpy(dev->dmi.uuid, field[1], sizeof(dev->dmi.uuid));
+       /* minor */
+       if (strlen(field[2])) {
+-              if (kstrtoull(field[2], 0, &dev->dmi.dev))
++              if (kstrtoull(field[2], 0, &dev->dmi.dev) ||
++                  dev->dmi.dev >= (1 << MINORBITS))
+                       return ERR_PTR(-EINVAL);
++              dev->dmi.dev = huge_encode_dev((dev_t)dev->dmi.dev);
+               dev->dmi.flags |= DM_PERSISTENT_DEV_FLAG;
+       }
+       /* flags */
+-- 
+2.43.0
+
diff --git a/queue-6.6/dma-mapping-benchmark-don-t-starve-others-when-doing.patch b/queue-6.6/dma-mapping-benchmark-don-t-starve-others-when-doing.patch
new file mode 100644 (file)
index 0000000..10f595f
--- /dev/null
@@ -0,0 +1,110 @@
+From 90ffa65d38d556a0631baa519689dacdfe1dcae3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jun 2024 17:28:55 +0800
+Subject: dma-mapping: benchmark: Don't starve others when doing the test
+
+From: Yicong Yang <yangyicong@hisilicon.com>
+
+[ Upstream commit 54624acf8843375a6de3717ac18df3b5104c39c5 ]
+
+The test thread will start N benchmark kthreads and then schedule out
+until the test time finished and notify the benchmark kthreads to stop.
+The benchmark kthreads will keep running until notified to stop.
+There's a problem with current implementation when the benchmark
+kthreads number is equal to the CPUs on a non-preemptible kernel:
+since the scheduler will balance the kthreads across the CPUs and
+when the test time's out the test thread won't get a chance to be
+scheduled on any CPU then cannot notify the benchmark kthreads to stop.
+
+This can be easily reproduced on a VM (simulated with 16 CPUs) with
+PREEMPT_VOLUNTARY:
+estuary:/mnt$ ./dma_map_benchmark -t 16 -s 1
+ rcu: INFO: rcu_sched self-detected stall on CPU
+ rcu:     10-...!: (5221 ticks this GP) idle=ed24/1/0x4000000000000000 softirq=142/142 fqs=0
+ rcu:     (t=5254 jiffies g=-559 q=45 ncpus=16)
+ rcu: rcu_sched kthread starved for 5255 jiffies! g-559 f0x0 RCU_GP_WAIT_FQS(5) ->state=0x0 ->cpu=12
+ rcu:     Unless rcu_sched kthread gets sufficient CPU time, OOM is now expected behavior.
+ rcu: RCU grace-period kthread stack dump:
+ task:rcu_sched       state:R  running task     stack:0     pid:16    tgid:16    ppid:2      flags:0x00000008
+ Call trace
+  __switch_to+0xec/0x138
+  __schedule+0x2f8/0x1080
+  schedule+0x30/0x130
+  schedule_timeout+0xa0/0x188
+  rcu_gp_fqs_loop+0x128/0x528
+  rcu_gp_kthread+0x1c8/0x208
+  kthread+0xec/0xf8
+  ret_from_fork+0x10/0x20
+ Sending NMI from CPU 10 to CPUs 0:
+ NMI backtrace for cpu 0
+ CPU: 0 PID: 332 Comm: dma-map-benchma Not tainted 6.10.0-rc1-vanilla-LSE #8
+ Hardware name: QEMU KVM Virtual Machine, BIOS 0.0.0 02/06/2015
+ pstate: 20400005 (nzCv daif +PAN -UAO -TCO -DIT -SSBS BTYPE=--)
+ pc : arm_smmu_cmdq_issue_cmdlist+0x218/0x730
+ lr : arm_smmu_cmdq_issue_cmdlist+0x488/0x730
+ sp : ffff80008748b630
+ x29: ffff80008748b630 x28: 0000000000000000 x27: ffff80008748b780
+ x26: 0000000000000000 x25: 000000000000bc70 x24: 000000000001bc70
+ x23: ffff0000c12af080 x22: 0000000000010000 x21: 000000000000ffff
+ x20: ffff80008748b700 x19: ffff0000c12af0c0 x18: 0000000000010000
+ x17: 0000000000000001 x16: 0000000000000040 x15: ffffffffffffffff
+ x14: 0001ffffffffffff x13: 000000000000ffff x12: 00000000000002f1
+ x11: 000000000001ffff x10: 0000000000000031 x9 : ffff800080b6b0b8
+ x8 : ffff0000c2a48000 x7 : 000000000001bc71 x6 : 0001800000000000
+ x5 : 00000000000002f1 x4 : 01ffffffffffffff x3 : 000000000009aaf1
+ x2 : 0000000000000018 x1 : 000000000000000f x0 : ffff0000c12af18c
+ Call trace:
+  arm_smmu_cmdq_issue_cmdlist+0x218/0x730
+  __arm_smmu_tlb_inv_range+0xe0/0x1a8
+  arm_smmu_iotlb_sync+0xc0/0x128
+  __iommu_dma_unmap+0x248/0x320
+  iommu_dma_unmap_page+0x5c/0xe8
+  dma_unmap_page_attrs+0x38/0x1d0
+  map_benchmark_thread+0x118/0x2c0
+  kthread+0xec/0xf8
+  ret_from_fork+0x10/0x20
+
+Solve this by adding scheduling point in the kthread loop,
+so if there're other threads in the system they may have
+a chance to run, especially the thread to notify the test
+end. However this may degrade the test concurrency so it's
+recommended to run this on an idle system.
+
+Signed-off-by: Yicong Yang <yangyicong@hisilicon.com>
+Acked-by: Barry Song <baohua@kernel.org>
+Signed-off-by: Christoph Hellwig <hch@lst.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/dma/map_benchmark.c | 16 ++++++++++++++++
+ 1 file changed, 16 insertions(+)
+
+diff --git a/kernel/dma/map_benchmark.c b/kernel/dma/map_benchmark.c
+index 4950e0b622b1..cc19a3efea89 100644
+--- a/kernel/dma/map_benchmark.c
++++ b/kernel/dma/map_benchmark.c
+@@ -89,6 +89,22 @@ static int map_benchmark_thread(void *data)
+               atomic64_add(map_sq, &map->sum_sq_map);
+               atomic64_add(unmap_sq, &map->sum_sq_unmap);
+               atomic64_inc(&map->loops);
++
++              /*
++               * We may test for a long time so periodically check whether
++               * we need to schedule to avoid starving the others. Otherwise
++               * we may hangup the kernel in a non-preemptible kernel when
++               * the test kthreads number >= CPU number, the test kthreads
++               * will run endless on every CPU since the thread resposible
++               * for notifying the kthread stop (in do_map_benchmark())
++               * could not be scheduled.
++               *
++               * Note this may degrade the test concurrency since the test
++               * threads may need to share the CPU time with other load
++               * in the system. So it's recommended to run this benchmark
++               * on an idle system.
++               */
++              cond_resched();
+       }
+ out:
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amd-display-check-denominator-pbn_div-before-use.patch b/queue-6.6/drm-amd-display-check-denominator-pbn_div-before-use.patch
new file mode 100644 (file)
index 0000000..59333df
--- /dev/null
@@ -0,0 +1,40 @@
+From d0f9ed32cd678f36ae895737f5f74ed2aa48d372 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 18 Jun 2024 16:21:20 -0600
+Subject: drm/amd/display: Check denominator pbn_div before used
+
+From: Alex Hung <alex.hung@amd.com>
+
+[ Upstream commit 116a678f3a9abc24f5c9d2525b7393d18d9eb58e ]
+
+[WHAT & HOW]
+A denominator cannot be 0, and is checked before used.
+
+This fixes 1 DIVIDE_BY_ZERO issue reported by Coverity.
+
+Reviewed-by: Harry Wentland <harry.wentland@amd.com>
+Signed-off-by: Jerry Zuo <jerry.zuo@amd.com>
+Signed-off-by: Alex Hung <alex.hung@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+index 44c155683824..f0ebf686b06f 100644
+--- a/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
++++ b/drivers/gpu/drm/amd/display/amdgpu_dm/amdgpu_dm.c
+@@ -6937,7 +6937,7 @@ static int dm_update_mst_vcpi_slots_for_dsc(struct drm_atomic_state *state,
+                       }
+               }
+-              if (j == dc_state->stream_count)
++              if (j == dc_state->stream_count || pbn_div == 0)
+                       continue;
+               slot_num = DIV_ROUND_UP(pbn, pbn_div);
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amd-display-check-hdcp-returned-status.patch b/queue-6.6/drm-amd-display-check-hdcp-returned-status.patch
new file mode 100644 (file)
index 0000000..24fc7f8
--- /dev/null
@@ -0,0 +1,57 @@
+From 4b9e163803f47631a8fd691a4ffd73e5af3b5c6e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Jun 2024 10:36:49 -0600
+Subject: drm/amd/display: Check HDCP returned status
+
+From: Alex Hung <alex.hung@amd.com>
+
+[ Upstream commit 5d93060d430b359e16e7c555c8f151ead1ac614b ]
+
+[WHAT & HOW]
+Check mod_hdcp_execute_and_set() return values in authenticated_dp.
+
+This fixes 3 CHECKED_RETURN issues reported by Coverity.
+
+Reviewed-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
+Signed-off-by: Alex Hung <alex.hung@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../amd/display/modules/hdcp/hdcp1_execution.c    | 15 +++++++++------
+ 1 file changed, 9 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_execution.c b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_execution.c
+index 1ddb4f5eac8e..93c0455766dd 100644
+--- a/drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_execution.c
++++ b/drivers/gpu/drm/amd/display/modules/hdcp/hdcp1_execution.c
+@@ -433,17 +433,20 @@ static enum mod_hdcp_status authenticated_dp(struct mod_hdcp *hdcp,
+       }
+       if (status == MOD_HDCP_STATUS_SUCCESS)
+-              mod_hdcp_execute_and_set(mod_hdcp_read_bstatus,
++              if (!mod_hdcp_execute_and_set(mod_hdcp_read_bstatus,
+                               &input->bstatus_read, &status,
+-                              hdcp, "bstatus_read");
++                              hdcp, "bstatus_read"))
++                      goto out;
+       if (status == MOD_HDCP_STATUS_SUCCESS)
+-              mod_hdcp_execute_and_set(check_link_integrity_dp,
++              if (!mod_hdcp_execute_and_set(check_link_integrity_dp,
+                               &input->link_integrity_check, &status,
+-                              hdcp, "link_integrity_check");
++                              hdcp, "link_integrity_check"))
++                      goto out;
+       if (status == MOD_HDCP_STATUS_SUCCESS)
+-              mod_hdcp_execute_and_set(check_no_reauthentication_request_dp,
++              if (!mod_hdcp_execute_and_set(check_no_reauthentication_request_dp,
+                               &input->reauth_request_check, &status,
+-                              hdcp, "reauth_request_check");
++                              hdcp, "reauth_request_check"))
++                      goto out;
+ out:
+       return status;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amd-display-run-dc_log_dc-after-checking-link-li.patch b/queue-6.6/drm-amd-display-run-dc_log_dc-after-checking-link-li.patch
new file mode 100644 (file)
index 0000000..ed7f1fc
--- /dev/null
@@ -0,0 +1,48 @@
+From ce9381087b8310328ff0572e1d7c80dcc88958cf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 7 Jun 2024 09:21:30 -0600
+Subject: drm/amd/display: Run DC_LOG_DC after checking link->link_enc
+
+From: Alex Hung <alex.hung@amd.com>
+
+[ Upstream commit 3a82f62b0d9d7687eac47603bb6cd14a50fa718b ]
+
+[WHAT]
+The DC_LOG_DC should be run after link->link_enc is checked, not before.
+
+This fixes 1 REVERSE_INULL issue reported by Coverity.
+
+Reviewed-by: Rodrigo Siqueira <rodrigo.siqueira@amd.com>
+Signed-off-by: Alex Hung <alex.hung@amd.com>
+Tested-by: Daniel Wheeler <daniel.wheeler@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/display/dc/link/link_factory.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/display/dc/link/link_factory.c b/drivers/gpu/drm/amd/display/dc/link/link_factory.c
+index 2c366866f570..33bb96f770b8 100644
+--- a/drivers/gpu/drm/amd/display/dc/link/link_factory.c
++++ b/drivers/gpu/drm/amd/display/dc/link/link_factory.c
+@@ -629,14 +629,14 @@ static bool construct_phy(struct dc_link *link,
+       link->link_enc =
+               link->dc->res_pool->funcs->link_enc_create(dc_ctx, &enc_init_data);
+-      DC_LOG_DC("BIOS object table - DP_IS_USB_C: %d", link->link_enc->features.flags.bits.DP_IS_USB_C);
+-      DC_LOG_DC("BIOS object table - IS_DP2_CAPABLE: %d", link->link_enc->features.flags.bits.IS_DP2_CAPABLE);
+-
+       if (!link->link_enc) {
+               DC_ERROR("Failed to create link encoder!\n");
+               goto link_enc_create_fail;
+       }
++      DC_LOG_DC("BIOS object table - DP_IS_USB_C: %d", link->link_enc->features.flags.bits.DP_IS_USB_C);
++      DC_LOG_DC("BIOS object table - IS_DP2_CAPABLE: %d", link->link_enc->features.flags.bits.IS_DP2_CAPABLE);
++
+       /* Update link encoder tracking variables. These are used for the dynamic
+        * assignment of link encoders to streams.
+        */
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amdgpu-check-for-linear_aligned-correctly-in-che.patch b/queue-6.6/drm-amdgpu-check-for-linear_aligned-correctly-in-che.patch
new file mode 100644 (file)
index 0000000..5c58bc4
--- /dev/null
@@ -0,0 +1,40 @@
+From 2fcac24926eb2897aa7fff1f0d298eebe6bc641d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 1 Jun 2024 16:36:27 -0400
+Subject: drm/amdgpu: check for LINEAR_ALIGNED correctly in
+ check_tiling_flags_gfx6
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marek Olšák <marek.olsak@amd.com>
+
+[ Upstream commit 11317d2963fa79767cd7c6231a00a9d77f2e0f54 ]
+
+Fix incorrect check.
+
+Signed-off-by: Marek Olšák <marek.olsak@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@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_display.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+index 578aeba49ea8..82ad2b01f2e9 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_display.c
+@@ -909,8 +909,7 @@ static int check_tiling_flags_gfx6(struct amdgpu_framebuffer *afb)
+ {
+       u64 micro_tile_mode;
+-      /* Zero swizzle mode means linear */
+-      if (AMDGPU_TILING_GET(afb->tiling_flags, SWIZZLE_MODE) == 0)
++      if (AMDGPU_TILING_GET(afb->tiling_flags, ARRAY_MODE) == 1) /* LINEAR_ALIGNED */
+               return 0;
+       micro_tile_mode = AMDGPU_TILING_GET(afb->tiling_flags, MICRO_TILE_MODE);
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch b/queue-6.6/drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch
new file mode 100644 (file)
index 0000000..3162615
--- /dev/null
@@ -0,0 +1,72 @@
+From 44749571cdfaf77c0c8257cab4cabd8ae23c5acc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 07:58:24 +0200
+Subject: drm/amdgpu: clear RB_OVERFLOW bit when enabling interrupts
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Danijel Slivka <danijel.slivka@amd.com>
+
+[ Upstream commit afbf7955ff01e952dbdd465fa25a2ba92d00291c ]
+
+Why:
+Setting IH_RB_WPTR register to 0 will not clear the RB_OVERFLOW bit
+if RB_ENABLE is not set.
+
+How to fix:
+Set WPTR_OVERFLOW_CLEAR bit after RB_ENABLE bit is set.
+The RB_ENABLE bit is required to be set, together with
+WPTR_OVERFLOW_ENABLE bit so that setting WPTR_OVERFLOW_CLEAR bit
+would clear the RB_OVERFLOW.
+
+Signed-off-by: Danijel Slivka <danijel.slivka@amd.com>
+Reviewed-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/ih_v6_0.c | 28 ++++++++++++++++++++++++++++
+ 1 file changed, 28 insertions(+)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c b/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c
+index f432dc72df6a..725b1a585088 100644
+--- a/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/ih_v6_0.c
+@@ -135,6 +135,34 @@ static int ih_v6_0_toggle_ring_interrupts(struct amdgpu_device *adev,
+       tmp = RREG32(ih_regs->ih_rb_cntl);
+       tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, RB_ENABLE, (enable ? 1 : 0));
++
++      if (enable) {
++              /* Unset the CLEAR_OVERFLOW bit to make sure the next step
++               * is switching the bit from 0 to 1
++               */
++              tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0);
++              if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) {
++                      if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp))
++                              return -ETIMEDOUT;
++              } else {
++                      WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp);
++              }
++
++              /* Clear RB_OVERFLOW bit */
++              tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 1);
++              if (amdgpu_sriov_vf(adev) && amdgpu_sriov_reg_indirect_ih(adev)) {
++                      if (psp_reg_program(&adev->psp, ih_regs->psp_reg_id, tmp))
++                              return -ETIMEDOUT;
++              } else {
++                      WREG32_NO_KIQ(ih_regs->ih_rb_cntl, tmp);
++              }
++
++              /* Unset the CLEAR_OVERFLOW bit immediately so new overflows
++               * can be detected.
++               */
++              tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, WPTR_OVERFLOW_CLEAR, 0);
++      }
++
+       /* enable_intr field is only valid in ring0 */
+       if (ih == &adev->irq.ih)
+               tmp = REG_SET_FIELD(tmp, IH_RB_CNTL, ENABLE_INTR, (enable ? 1 : 0));
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amdgpu-fix-smatch-static-checker-warning.patch b/queue-6.6/drm-amdgpu-fix-smatch-static-checker-warning.patch
new file mode 100644 (file)
index 0000000..1373cdb
--- /dev/null
@@ -0,0 +1,42 @@
+From 984311dd2d0b596eb003c997291e17b0d73aea32 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jun 2024 17:53:30 +0800
+Subject: drm/amdgpu: Fix smatch static checker warning
+
+From: Hawking Zhang <Hawking.Zhang@amd.com>
+
+[ Upstream commit bdbdc7cecd00305dc844a361f9883d3a21022027 ]
+
+adev->gfx.imu.funcs could be NULL
+
+Signed-off-by: Hawking Zhang <Hawking.Zhang@amd.com>
+Reviewed-by: Likun Gao <Likun.Gao@amd.com>
+Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
+index c81e98f0d17f..c813cd7b015e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
++++ b/drivers/gpu/drm/amd/amdgpu/gfx_v11_0.c
+@@ -4269,11 +4269,11 @@ static int gfx_v11_0_hw_init(void *handle)
+                       /* RLC autoload sequence 1: Program rlc ram */
+                       if (adev->gfx.imu.funcs->program_rlc_ram)
+                               adev->gfx.imu.funcs->program_rlc_ram(adev);
++                      /* rlc autoload firmware */
++                      r = gfx_v11_0_rlc_backdoor_autoload_enable(adev);
++                      if (r)
++                              return r;
+               }
+-              /* rlc autoload firmware */
+-              r = gfx_v11_0_rlc_backdoor_autoload_enable(adev);
+-              if (r)
+-                      return r;
+       } else {
+               if (adev->firmware.load_type == AMDGPU_FW_LOAD_DIRECT) {
+                       if (adev->gfx.imu.funcs && (amdgpu_dpm > 0)) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amdgpu-reject-gang-submit-on-reserved-vmids.patch b/queue-6.6/drm-amdgpu-reject-gang-submit-on-reserved-vmids.patch
new file mode 100644 (file)
index 0000000..279d2b6
--- /dev/null
@@ -0,0 +1,99 @@
+From 198e43ddd583bdef3d68c25bd2e53b9a47308c98 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 19 Jan 2024 14:57:29 +0100
+Subject: drm/amdgpu: reject gang submit on reserved VMIDs
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Christian König <christian.koenig@amd.com>
+
+[ Upstream commit 320debca1ba3a81c87247eac84eff976ead09ee0 ]
+
+A gang submit won't work if the VMID is reserved and we can't flush out
+VM changes from multiple engines at the same time.
+
+Signed-off-by: Christian König <christian.koenig@amd.com>
+Reviewed-by: Alex Deucher <alexander.deucher@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_cs.c  | 15 +++++++++++++++
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c | 15 ++++++++++++++-
+ drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h |  1 +
+ 3 files changed, 30 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+index 61668a784315..e361dc37a089 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_cs.c
+@@ -1096,6 +1096,21 @@ static int amdgpu_cs_vm_handling(struct amdgpu_cs_parser *p)
+       unsigned int i;
+       int r;
++      /*
++       * We can't use gang submit on with reserved VMIDs when the VM changes
++       * can't be invalidated by more than one engine at the same time.
++       */
++      if (p->gang_size > 1 && !p->adev->vm_manager.concurrent_flush) {
++              for (i = 0; i < p->gang_size; ++i) {
++                      struct drm_sched_entity *entity = p->entities[i];
++                      struct drm_gpu_scheduler *sched = entity->rq->sched;
++                      struct amdgpu_ring *ring = to_amdgpu_ring(sched);
++
++                      if (amdgpu_vmid_uses_reserved(vm, ring->vm_hub))
++                              return -EINVAL;
++              }
++      }
++
+       r = amdgpu_vm_clear_freed(adev, vm, NULL);
+       if (r)
+               return r;
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
+index ff1ea99292fb..69dfc699d78b 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.c
+@@ -409,7 +409,7 @@ int amdgpu_vmid_grab(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
+       if (r || !idle)
+               goto error;
+-      if (vm->reserved_vmid[vmhub] || (enforce_isolation && (vmhub == AMDGPU_GFXHUB(0)))) {
++      if (amdgpu_vmid_uses_reserved(vm, vmhub)) {
+               r = amdgpu_vmid_grab_reserved(vm, ring, job, &id, fence);
+               if (r || !id)
+                       goto error;
+@@ -459,6 +459,19 @@ int amdgpu_vmid_grab(struct amdgpu_vm *vm, struct amdgpu_ring *ring,
+       return r;
+ }
++/*
++ * amdgpu_vmid_uses_reserved - check if a VM will use a reserved VMID
++ * @vm: the VM to check
++ * @vmhub: the VMHUB which will be used
++ *
++ * Returns: True if the VM will use a reserved VMID.
++ */
++bool amdgpu_vmid_uses_reserved(struct amdgpu_vm *vm, unsigned int vmhub)
++{
++      return vm->reserved_vmid[vmhub] ||
++              (enforce_isolation && (vmhub == AMDGPU_GFXHUB(0)));
++}
++
+ int amdgpu_vmid_alloc_reserved(struct amdgpu_device *adev,
+                              unsigned vmhub)
+ {
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
+index fa8c42c83d5d..240fa6751260 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_ids.h
+@@ -78,6 +78,7 @@ void amdgpu_pasid_free_delayed(struct dma_resv *resv,
+ bool amdgpu_vmid_had_gpu_reset(struct amdgpu_device *adev,
+                              struct amdgpu_vmid *id);
++bool amdgpu_vmid_uses_reserved(struct amdgpu_vm *vm, unsigned int vmhub);
+ int amdgpu_vmid_alloc_reserved(struct amdgpu_device *adev,
+                               unsigned vmhub);
+ void amdgpu_vmid_free_reserved(struct amdgpu_device *adev,
+-- 
+2.43.0
+
diff --git a/queue-6.6/drm-amdgpu-set-no_hw_access-when-vf-request-full-gpu.patch b/queue-6.6/drm-amdgpu-set-no_hw_access-when-vf-request-full-gpu.patch
new file mode 100644 (file)
index 0000000..ab08997
--- /dev/null
@@ -0,0 +1,46 @@
+From 3695024ed8ad1176d0b9460b7cbca8e37bdef1d4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jun 2024 15:06:23 +0800
+Subject: drm/amdgpu: Set no_hw_access when VF request full GPU fails
+
+From: Yifan Zha <Yifan.Zha@amd.com>
+
+[ Upstream commit 33f23fc3155b13c4a96d94a0a22dc26db767440b ]
+
+[Why]
+If VF request full GPU access and the request failed,
+the VF driver can get stuck accessing registers for an extended period during
+the unload of KMS.
+
+[How]
+Set no_hw_access flag when VF request for full GPU access fails
+This prevents further hardware access attempts, avoiding the prolonged
+stuck state.
+
+Signed-off-by: Yifan Zha <Yifan.Zha@amd.com>
+Acked-by: Alex Deucher <alexander.deucher@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_virt.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+index d9dc675b46ae..22575422ca7e 100644
+--- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
++++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
+@@ -137,8 +137,10 @@ int amdgpu_virt_request_full_gpu(struct amdgpu_device *adev, bool init)
+       if (virt->ops && virt->ops->req_full_gpu) {
+               r = virt->ops->req_full_gpu(adev, init);
+-              if (r)
++              if (r) {
++                      adev->no_hw_access = true;
+                       return r;
++              }
+               adev->virt.caps &= ~AMDGPU_SRIOV_CAPS_RUNTIME;
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/elf-fix-kernel.randomize_va_space-double-read.patch b/queue-6.6/elf-fix-kernel.randomize_va_space-double-read.patch
new file mode 100644 (file)
index 0000000..1f6af55
--- /dev/null
@@ -0,0 +1,49 @@
+From 7584bc8cbc056ca6007cb18067d2388cfc1632ce Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jun 2024 21:54:50 +0300
+Subject: ELF: fix kernel.randomize_va_space double read
+
+From: Alexey Dobriyan <adobriyan@gmail.com>
+
+[ Upstream commit 2a97388a807b6ab5538aa8f8537b2463c6988bd2 ]
+
+ELF loader uses "randomize_va_space" twice. It is sysctl and can change
+at any moment, so 2 loads could see 2 different values in theory with
+unpredictable consequences.
+
+Issue exactly one load for consistent value across one exec.
+
+Signed-off-by: Alexey Dobriyan <adobriyan@gmail.com>
+Link: https://lore.kernel.org/r/3329905c-7eb8-400a-8f0a-d87cff979b5b@p183
+Signed-off-by: Kees Cook <kees@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/binfmt_elf.c | 5 +++--
+ 1 file changed, 3 insertions(+), 2 deletions(-)
+
+diff --git a/fs/binfmt_elf.c b/fs/binfmt_elf.c
+index 7b3d2d491407..fb2c8d14327a 100644
+--- a/fs/binfmt_elf.c
++++ b/fs/binfmt_elf.c
+@@ -1008,7 +1008,8 @@ static int load_elf_binary(struct linux_binprm *bprm)
+       if (elf_read_implies_exec(*elf_ex, executable_stack))
+               current->personality |= READ_IMPLIES_EXEC;
+-      if (!(current->personality & ADDR_NO_RANDOMIZE) && randomize_va_space)
++      const int snapshot_randomize_va_space = READ_ONCE(randomize_va_space);
++      if (!(current->personality & ADDR_NO_RANDOMIZE) && snapshot_randomize_va_space)
+               current->flags |= PF_RANDOMIZE;
+       setup_new_exec(bprm);
+@@ -1300,7 +1301,7 @@ static int load_elf_binary(struct linux_binprm *bprm)
+       mm->end_data = end_data;
+       mm->start_stack = bprm->p;
+-      if ((current->flags & PF_RANDOMIZE) && (randomize_va_space > 1)) {
++      if ((current->flags & PF_RANDOMIZE) && (snapshot_randomize_va_space > 1)) {
+               /*
+                * For architectures with ELF randomization, when executing
+                * a loader directly (i.e. no interpreter listed in ELF
+-- 
+2.43.0
+
diff --git a/queue-6.6/ext4-fix-possible-tid_t-sequence-overflows.patch b/queue-6.6/ext4-fix-possible-tid_t-sequence-overflows.patch
new file mode 100644 (file)
index 0000000..0e2f0f1
--- /dev/null
@@ -0,0 +1,67 @@
+From d16eb3155b0adc5bcf8294dcb0087f66100ce84f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 29 May 2024 10:20:30 +0100
+Subject: ext4: fix possible tid_t sequence overflows
+
+From: Luis Henriques (SUSE) <luis.henriques@linux.dev>
+
+[ Upstream commit 63469662cc45d41705f14b4648481d5d29cf5999 ]
+
+In the fast commit code there are a few places where tid_t variables are
+being compared without taking into account the fact that these sequence
+numbers may wrap.  Fix this issue by using the helper functions tid_gt()
+and tid_geq().
+
+Signed-off-by: Luis Henriques (SUSE) <luis.henriques@linux.dev>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Reviewed-by: Harshad Shirwadkar <harshadshirwadkar@gmail.com>
+Link: https://patch.msgid.link/20240529092030.9557-3-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 | 8 ++++----
+ 1 file changed, 4 insertions(+), 4 deletions(-)
+
+diff --git a/fs/ext4/fast_commit.c b/fs/ext4/fast_commit.c
+index 5d473e50598f..f32a91d7c05d 100644
+--- a/fs/ext4/fast_commit.c
++++ b/fs/ext4/fast_commit.c
+@@ -353,7 +353,7 @@ void ext4_fc_mark_ineligible(struct super_block *sb, int reason, handle_t *handl
+               read_unlock(&sbi->s_journal->j_state_lock);
+       }
+       spin_lock(&sbi->s_fc_lock);
+-      if (sbi->s_fc_ineligible_tid < tid)
++      if (tid_gt(tid, sbi->s_fc_ineligible_tid))
+               sbi->s_fc_ineligible_tid = tid;
+       spin_unlock(&sbi->s_fc_lock);
+       WARN_ON(reason >= EXT4_FC_REASON_MAX);
+@@ -1213,7 +1213,7 @@ int ext4_fc_commit(journal_t *journal, tid_t commit_tid)
+       if (ret == -EALREADY) {
+               /* There was an ongoing commit, check if we need to restart */
+               if (atomic_read(&sbi->s_fc_subtid) <= subtid &&
+-                      commit_tid > journal->j_commit_sequence)
++                  tid_gt(commit_tid, journal->j_commit_sequence))
+                       goto restart_fc;
+               ext4_fc_update_stats(sb, EXT4_FC_STATUS_SKIPPED, 0, 0,
+                               commit_tid);
+@@ -1288,7 +1288,7 @@ static void ext4_fc_cleanup(journal_t *journal, int full, tid_t tid)
+               list_del_init(&iter->i_fc_list);
+               ext4_clear_inode_state(&iter->vfs_inode,
+                                      EXT4_STATE_FC_COMMITTING);
+-              if (iter->i_sync_tid <= tid)
++              if (tid_geq(tid, iter->i_sync_tid))
+                       ext4_fc_reset_inode(&iter->vfs_inode);
+               /* Make sure EXT4_STATE_FC_COMMITTING bit is clear */
+               smp_mb();
+@@ -1319,7 +1319,7 @@ static void ext4_fc_cleanup(journal_t *journal, int full, tid_t tid)
+       list_splice_init(&sbi->s_fc_q[FC_Q_STAGING],
+                               &sbi->s_fc_q[FC_Q_MAIN]);
+-      if (tid >= sbi->s_fc_ineligible_tid) {
++      if (tid_geq(tid, sbi->s_fc_ineligible_tid)) {
+               sbi->s_fc_ineligible_tid = 0;
+               ext4_clear_mount_flag(sb, EXT4_MF_FC_INELIGIBLE);
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/firmware-cs_dsp-don-t-allow-writes-to-read-only-cont.patch b/queue-6.6/firmware-cs_dsp-don-t-allow-writes-to-read-only-cont.patch
new file mode 100644 (file)
index 0000000..e3f5c48
--- /dev/null
@@ -0,0 +1,48 @@
+From 49ce28339842093a8ae46be4f44e187e014a45ae Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 12:08:09 +0100
+Subject: firmware: cs_dsp: Don't allow writes to read-only controls
+
+From: Richard Fitzgerald <rf@opensource.cirrus.com>
+
+[ Upstream commit 62412a9357b16a4e39dc582deb2e2a682b92524c ]
+
+Add a check to cs_dsp_coeff_write_ctrl() to abort if the control
+is not writeable.
+
+The cs_dsp code originated as an ASoC driver (wm_adsp) where all
+controls were exported as ALSA controls. It relied on ALSA to
+enforce the read-only permission. Now that the code has been
+separated from ALSA/ASoC it must perform its own permission check.
+
+This isn't currently causing any problems so there shouldn't be any
+need to backport this. If the client of cs_dsp exposes the control as
+an ALSA control, it should set permissions on that ALSA control to
+protect it. The few uses of cs_dsp_coeff_write_ctrl() inside drivers
+are for writable controls.
+
+Signed-off-by: Richard Fitzgerald <rf@opensource.cirrus.com>
+Link: https://patch.msgid.link/20240702110809.16836-1-rf@opensource.cirrus.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/firmware/cirrus/cs_dsp.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/firmware/cirrus/cs_dsp.c b/drivers/firmware/cirrus/cs_dsp.c
+index a1da7581adb0..e62ffffe5fb8 100644
+--- a/drivers/firmware/cirrus/cs_dsp.c
++++ b/drivers/firmware/cirrus/cs_dsp.c
+@@ -796,6 +796,9 @@ int cs_dsp_coeff_write_ctrl(struct cs_dsp_coeff_ctl *ctl,
+       lockdep_assert_held(&ctl->dsp->pwr_lock);
++      if (ctl->flags && !(ctl->flags & WMFW_CTL_FLAG_WRITEABLE))
++              return -EPERM;
++
+       if (len + off * sizeof(u32) > ctl->len)
+               return -EINVAL;
+-- 
+2.43.0
+
diff --git a/queue-6.6/fou-fix-null-ptr-deref-in-gro.patch b/queue-6.6/fou-fix-null-ptr-deref-in-gro.patch
new file mode 100644 (file)
index 0000000..c4a5c0e
--- /dev/null
@@ -0,0 +1,172 @@
+From e72fa8303bfa931f7dc4a7c73219dfe4f363012e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 2 Sep 2024 10:39:27 -0700
+Subject: fou: Fix null-ptr-deref in GRO.
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ Upstream commit 7e4196935069947d8b70b09c1660b67b067e75cb ]
+
+We observed a null-ptr-deref in fou_gro_receive() while shutting down
+a host.  [0]
+
+The NULL pointer is sk->sk_user_data, and the offset 8 is of protocol
+in struct fou.
+
+When fou_release() is called due to netns dismantle or explicit tunnel
+teardown, udp_tunnel_sock_release() sets NULL to sk->sk_user_data.
+Then, the tunnel socket is destroyed after a single RCU grace period.
+
+So, in-flight udp4_gro_receive() could find the socket and execute the
+FOU GRO handler, where sk->sk_user_data could be NULL.
+
+Let's use rcu_dereference_sk_user_data() in fou_from_sock() and add NULL
+checks in FOU GRO handlers.
+
+[0]:
+BUG: kernel NULL pointer dereference, address: 0000000000000008
+ PF: supervisor read access in kernel mode
+ PF: error_code(0x0000) - not-present page
+PGD 80000001032f4067 P4D 80000001032f4067 PUD 103240067 PMD 0
+SMP PTI
+CPU: 0 PID: 0 Comm: swapper/0 Not tainted 5.10.216-204.855.amzn2.x86_64 #1
+Hardware name: Amazon EC2 c5.large/, BIOS 1.0 10/16/2017
+RIP: 0010:fou_gro_receive (net/ipv4/fou.c:233) [fou]
+Code: 41 5f c3 cc cc cc cc e8 e7 2e 69 f4 0f 1f 80 00 00 00 00 0f 1f 44 00 00 49 89 f8 41 54 48 89 f7 48 89 d6 49 8b 80 88 02 00 00 <0f> b6 48 08 0f b7 42 4a 66 25 fd fd 80 cc 02 66 89 42 4a 0f b6 42
+RSP: 0018:ffffa330c0003d08 EFLAGS: 00010297
+RAX: 0000000000000000 RBX: ffff93d9e3a6b900 RCX: 0000000000000010
+RDX: ffff93d9e3a6b900 RSI: ffff93d9e3a6b900 RDI: ffff93dac2e24d08
+RBP: ffff93d9e3a6b900 R08: ffff93dacbce6400 R09: 0000000000000002
+R10: 0000000000000000 R11: ffffffffb5f369b0 R12: ffff93dacbce6400
+R13: ffff93dac2e24d08 R14: 0000000000000000 R15: ffffffffb4edd1c0
+FS:  0000000000000000(0000) GS:ffff93daee800000(0000) knlGS:0000000000000000
+CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+CR2: 0000000000000008 CR3: 0000000102140001 CR4: 00000000007706f0
+DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
+DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
+PKRU: 55555554
+Call Trace:
+ <IRQ>
+ ? show_trace_log_lvl (arch/x86/kernel/dumpstack.c:259)
+ ? __die_body.cold (arch/x86/kernel/dumpstack.c:478 arch/x86/kernel/dumpstack.c:420)
+ ? no_context (arch/x86/mm/fault.c:752)
+ ? exc_page_fault (arch/x86/include/asm/irqflags.h:49 arch/x86/include/asm/irqflags.h:89 arch/x86/mm/fault.c:1435 arch/x86/mm/fault.c:1483)
+ ? asm_exc_page_fault (arch/x86/include/asm/idtentry.h:571)
+ ? fou_gro_receive (net/ipv4/fou.c:233) [fou]
+ udp_gro_receive (include/linux/netdevice.h:2552 net/ipv4/udp_offload.c:559)
+ udp4_gro_receive (net/ipv4/udp_offload.c:604)
+ inet_gro_receive (net/ipv4/af_inet.c:1549 (discriminator 7))
+ dev_gro_receive (net/core/dev.c:6035 (discriminator 4))
+ napi_gro_receive (net/core/dev.c:6170)
+ ena_clean_rx_irq (drivers/amazon/net/ena/ena_netdev.c:1558) [ena]
+ ena_io_poll (drivers/amazon/net/ena/ena_netdev.c:1742) [ena]
+ napi_poll (net/core/dev.c:6847)
+ net_rx_action (net/core/dev.c:6917)
+ __do_softirq (arch/x86/include/asm/jump_label.h:25 include/linux/jump_label.h:200 include/trace/events/irq.h:142 kernel/softirq.c:299)
+ asm_call_irq_on_stack (arch/x86/entry/entry_64.S:809)
+</IRQ>
+ do_softirq_own_stack (arch/x86/include/asm/irq_stack.h:27 arch/x86/include/asm/irq_stack.h:77 arch/x86/kernel/irq_64.c:77)
+ irq_exit_rcu (kernel/softirq.c:393 kernel/softirq.c:423 kernel/softirq.c:435)
+ common_interrupt (arch/x86/kernel/irq.c:239)
+ asm_common_interrupt (arch/x86/include/asm/idtentry.h:626)
+RIP: 0010:acpi_idle_do_entry (arch/x86/include/asm/irqflags.h:49 arch/x86/include/asm/irqflags.h:89 drivers/acpi/processor_idle.c:114 drivers/acpi/processor_idle.c:575)
+Code: 8b 15 d1 3c c4 02 ed c3 cc cc cc cc 65 48 8b 04 25 40 ef 01 00 48 8b 00 a8 08 75 eb 0f 1f 44 00 00 0f 00 2d d5 09 55 00 fb f4 <fa> c3 cc cc cc cc e9 be fc ff ff 66 66 2e 0f 1f 84 00 00 00 00 00
+RSP: 0018:ffffffffb5603e58 EFLAGS: 00000246
+RAX: 0000000000004000 RBX: ffff93dac0929c00 RCX: ffff93daee833900
+RDX: ffff93daee800000 RSI: ffff93daee87dc00 RDI: ffff93daee87dc64
+RBP: 0000000000000001 R08: ffffffffb5e7b6c0 R09: 0000000000000044
+R10: ffff93daee831b04 R11: 00000000000001cd R12: 0000000000000001
+R13: ffffffffb5e7b740 R14: 0000000000000001 R15: 0000000000000000
+ ? sched_clock_cpu (kernel/sched/clock.c:371)
+ acpi_idle_enter (drivers/acpi/processor_idle.c:712 (discriminator 3))
+ cpuidle_enter_state (drivers/cpuidle/cpuidle.c:237)
+ cpuidle_enter (drivers/cpuidle/cpuidle.c:353)
+ cpuidle_idle_call (kernel/sched/idle.c:158 kernel/sched/idle.c:239)
+ do_idle (kernel/sched/idle.c:302)
+ cpu_startup_entry (kernel/sched/idle.c:395 (discriminator 1))
+ start_kernel (init/main.c:1048)
+ secondary_startup_64_no_verify (arch/x86/kernel/head_64.S:310)
+Modules linked in: udp_diag tcp_diag inet_diag nft_nat ipip tunnel4 dummy fou ip_tunnel nft_masq nft_chain_nat nf_nat wireguard nft_ct curve25519_x86_64 libcurve25519_generic nf_conntrack libchacha20poly1305 nf_defrag_ipv6 nf_defrag_ipv4 nft_objref chacha_x86_64 nft_counter nf_tables nfnetlink poly1305_x86_64 ip6_udp_tunnel udp_tunnel libchacha crc32_pclmul ghash_clmulni_intel aesni_intel crypto_simd cryptd glue_helper mousedev psmouse button ena ptp pps_core crc32c_intel
+CR2: 0000000000000008
+
+Fixes: d92283e338f6 ("fou: change to use UDP socket GRO")
+Reported-by: Alphonse Kurian <alkurian@amazon.com>
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Link: https://patch.msgid.link/20240902173927.62706-1-kuniyu@amazon.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/fou_core.c | 29 ++++++++++++++++++++++++-----
+ 1 file changed, 24 insertions(+), 5 deletions(-)
+
+diff --git a/net/ipv4/fou_core.c b/net/ipv4/fou_core.c
+index b38b82ae903d..e0b8d6b17a34 100644
+--- a/net/ipv4/fou_core.c
++++ b/net/ipv4/fou_core.c
+@@ -50,7 +50,7 @@ struct fou_net {
+ static inline struct fou *fou_from_sock(struct sock *sk)
+ {
+-      return sk->sk_user_data;
++      return rcu_dereference_sk_user_data(sk);
+ }
+ static int fou_recv_pull(struct sk_buff *skb, struct fou *fou, size_t len)
+@@ -233,9 +233,15 @@ static struct sk_buff *fou_gro_receive(struct sock *sk,
+                                      struct sk_buff *skb)
+ {
+       const struct net_offload __rcu **offloads;
+-      u8 proto = fou_from_sock(sk)->protocol;
++      struct fou *fou = fou_from_sock(sk);
+       const struct net_offload *ops;
+       struct sk_buff *pp = NULL;
++      u8 proto;
++
++      if (!fou)
++              goto out;
++
++      proto = fou->protocol;
+       /* We can clear the encap_mark for FOU as we are essentially doing
+        * one of two possible things.  We are either adding an L4 tunnel
+@@ -263,14 +269,24 @@ static int fou_gro_complete(struct sock *sk, struct sk_buff *skb,
+                           int nhoff)
+ {
+       const struct net_offload __rcu **offloads;
+-      u8 proto = fou_from_sock(sk)->protocol;
++      struct fou *fou = fou_from_sock(sk);
+       const struct net_offload *ops;
+-      int err = -ENOSYS;
++      u8 proto;
++      int err;
++
++      if (!fou) {
++              err = -ENOENT;
++              goto out;
++      }
++
++      proto = fou->protocol;
+       offloads = NAPI_GRO_CB(skb)->is_ipv6 ? inet6_offloads : inet_offloads;
+       ops = rcu_dereference(offloads[proto]);
+-      if (WARN_ON(!ops || !ops->callbacks.gro_complete))
++      if (WARN_ON(!ops || !ops->callbacks.gro_complete)) {
++              err = -ENOSYS;
+               goto out;
++      }
+       err = ops->callbacks.gro_complete(skb, nhoff);
+@@ -320,6 +336,9 @@ static struct sk_buff *gue_gro_receive(struct sock *sk,
+       struct gro_remcsum grc;
+       u8 proto;
++      if (!fou)
++              goto out;
++
+       skb_gro_remcsum_init(&grc);
+       off = skb_gro_offset(skb);
+-- 
+2.43.0
+
diff --git a/queue-6.6/fs-ntfs3-check-more-cases-when-directory-is-corrupte.patch b/queue-6.6/fs-ntfs3-check-more-cases-when-directory-is-corrupte.patch
new file mode 100644 (file)
index 0000000..44eee52
--- /dev/null
@@ -0,0 +1,162 @@
+From 0a929c37cdf754b43094ced9c835d76ac35b83d4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 14:53:57 +0300
+Subject: fs/ntfs3: Check more cases when directory is corrupted
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit 744375343662058cbfda96d871786e5a5cbe1947 ]
+
+Mark ntfs dirty in this case.
+Rename ntfs_filldir to ntfs_dir_emit.
+
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/dir.c | 52 +++++++++++++++++++++++++++++++-------------------
+ 1 file changed, 32 insertions(+), 20 deletions(-)
+
+diff --git a/fs/ntfs3/dir.c b/fs/ntfs3/dir.c
+index 9d0a09f00b38..e1b856ecce61 100644
+--- a/fs/ntfs3/dir.c
++++ b/fs/ntfs3/dir.c
+@@ -272,9 +272,12 @@ struct inode *dir_search_u(struct inode *dir, const struct cpu_str *uni,
+       return err == -ENOENT ? NULL : err ? ERR_PTR(err) : inode;
+ }
+-static inline int ntfs_filldir(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
+-                             const struct NTFS_DE *e, u8 *name,
+-                             struct dir_context *ctx)
++/*
++ * returns false if 'ctx' if full
++ */
++static inline bool ntfs_dir_emit(struct ntfs_sb_info *sbi,
++                               struct ntfs_inode *ni, const struct NTFS_DE *e,
++                               u8 *name, struct dir_context *ctx)
+ {
+       const struct ATTR_FILE_NAME *fname;
+       unsigned long ino;
+@@ -284,29 +287,29 @@ static inline int ntfs_filldir(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
+       fname = Add2Ptr(e, sizeof(struct NTFS_DE));
+       if (fname->type == FILE_NAME_DOS)
+-              return 0;
++              return true;
+       if (!mi_is_ref(&ni->mi, &fname->home))
+-              return 0;
++              return true;
+       ino = ino_get(&e->ref);
+       if (ino == MFT_REC_ROOT)
+-              return 0;
++              return true;
+       /* Skip meta files. Unless option to show metafiles is set. */
+       if (!sbi->options->showmeta && ntfs_is_meta_file(sbi, ino))
+-              return 0;
++              return true;
+       if (sbi->options->nohidden && (fname->dup.fa & FILE_ATTRIBUTE_HIDDEN))
+-              return 0;
++              return true;
+       name_len = ntfs_utf16_to_nls(sbi, fname->name, fname->name_len, name,
+                                    PATH_MAX);
+       if (name_len <= 0) {
+               ntfs_warn(sbi->sb, "failed to convert name for inode %lx.",
+                         ino);
+-              return 0;
++              return true;
+       }
+       /*
+@@ -336,17 +339,20 @@ static inline int ntfs_filldir(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
+               }
+       }
+-      return !dir_emit(ctx, (s8 *)name, name_len, ino, dt_type);
++      return dir_emit(ctx, (s8 *)name, name_len, ino, dt_type);
+ }
+ /*
+  * ntfs_read_hdr - Helper function for ntfs_readdir().
++ *
++ * returns 0 if ok.
++ * returns -EINVAL if directory is corrupted.
++ * returns +1 if 'ctx' is full.
+  */
+ static int ntfs_read_hdr(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
+                        const struct INDEX_HDR *hdr, u64 vbo, u64 pos,
+                        u8 *name, struct dir_context *ctx)
+ {
+-      int err;
+       const struct NTFS_DE *e;
+       u32 e_size;
+       u32 end = le32_to_cpu(hdr->used);
+@@ -354,12 +360,12 @@ static int ntfs_read_hdr(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
+       for (;; off += e_size) {
+               if (off + sizeof(struct NTFS_DE) > end)
+-                      return -1;
++                      return -EINVAL;
+               e = Add2Ptr(hdr, off);
+               e_size = le16_to_cpu(e->size);
+               if (e_size < sizeof(struct NTFS_DE) || off + e_size > end)
+-                      return -1;
++                      return -EINVAL;
+               if (de_is_last(e))
+                       return 0;
+@@ -369,14 +375,15 @@ static int ntfs_read_hdr(struct ntfs_sb_info *sbi, struct ntfs_inode *ni,
+                       continue;
+               if (le16_to_cpu(e->key_size) < SIZEOF_ATTRIBUTE_FILENAME)
+-                      return -1;
++                      return -EINVAL;
+               ctx->pos = vbo + off;
+               /* Submit the name to the filldir callback. */
+-              err = ntfs_filldir(sbi, ni, e, name, ctx);
+-              if (err)
+-                      return err;
++              if (!ntfs_dir_emit(sbi, ni, e, name, ctx)) {
++                      /* ctx is full. */
++                      return +1;
++              }
+       }
+ }
+@@ -475,8 +482,6 @@ static int ntfs_readdir(struct file *file, struct dir_context *ctx)
+               vbo = (u64)bit << index_bits;
+               if (vbo >= i_size) {
+-                      ntfs_inode_err(dir, "Looks like your dir is corrupt");
+-                      ctx->pos = eod;
+                       err = -EINVAL;
+                       goto out;
+               }
+@@ -499,9 +504,16 @@ static int ntfs_readdir(struct file *file, struct dir_context *ctx)
+       __putname(name);
+       put_indx_node(node);
+-      if (err == -ENOENT) {
++      if (err == 1) {
++              /* 'ctx' is full. */
++              err = 0;
++      } else if (err == -ENOENT) {
+               err = 0;
+               ctx->pos = pos;
++      } else if (err < 0) {
++              if (err == -EINVAL)
++                      ntfs_inode_err(dir, "directory corrupted");
++              ctx->pos = eod;
+       }
+       return err;
+-- 
+2.43.0
+
diff --git a/queue-6.6/fs-ntfs3-one-more-reason-to-mark-inode-bad.patch b/queue-6.6/fs-ntfs3-one-more-reason-to-mark-inode-bad.patch
new file mode 100644 (file)
index 0000000..0554f1d
--- /dev/null
@@ -0,0 +1,36 @@
+From fa8580ed89aa0ff4dfdad45615652937b624f194 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 May 2024 10:55:12 +0300
+Subject: fs/ntfs3: One more reason to mark inode bad
+
+From: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+
+[ Upstream commit a0dde5d7a58b6bf9184ef3d8c6e62275c3645584 ]
+
+In addition to returning an error, mark the node as bad.
+
+Signed-off-by: Konstantin Komarov <almaz.alexandrovich@paragon-software.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/ntfs3/frecord.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/fs/ntfs3/frecord.c b/fs/ntfs3/frecord.c
+index 45b687aff700..f7c381730b39 100644
+--- a/fs/ntfs3/frecord.c
++++ b/fs/ntfs3/frecord.c
+@@ -1601,8 +1601,10 @@ int ni_delete_all(struct ntfs_inode *ni)
+               asize = le32_to_cpu(attr->size);
+               roff = le16_to_cpu(attr->nres.run_off);
+-              if (roff > asize)
++              if (roff > asize) {
++                      _ntfs_bad_inode(&ni->vfs_inode);
+                       return -EINVAL;
++              }
+               /* run==1 means unpack and deallocate. */
+               run_unpack_ex(RUN_DEALLOCATE, sbi, ni->mi.rno, svcn, evcn, svcn,
+-- 
+2.43.0
+
diff --git a/queue-6.6/hid-amd_sfh-free-driver_data-after-destroying-hid-de.patch b/queue-6.6/hid-amd_sfh-free-driver_data-after-destroying-hid-de.patch
new file mode 100644 (file)
index 0000000..fbc67c1
--- /dev/null
@@ -0,0 +1,311 @@
+From 4011b4af9655a7281fe86d241f3e861ae7f2f6d8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 23 Jul 2024 10:44:35 +0200
+Subject: HID: amd_sfh: free driver_data after destroying hid device
+
+From: Olivier Sobrie <olivier@sobrie.be>
+
+[ Upstream commit 97155021ae17b86985121b33cf8098bcde00d497 ]
+
+HID driver callbacks aren't called anymore once hid_destroy_device() has
+been called. Hence, hid driver_data should be freed only after the
+hid_destroy_device() function returned as driver_data is used in several
+callbacks.
+
+I observed a crash with kernel 6.10.0 on my T14s Gen 3, after enabling
+KASAN to debug memory allocation, I got this output:
+
+  [   13.050438] ==================================================================
+  [   13.054060] BUG: KASAN: slab-use-after-free in amd_sfh_get_report+0x3ec/0x530 [amd_sfh]
+  [   13.054809] psmouse serio1: trackpoint: Synaptics TrackPoint firmware: 0x02, buttons: 3/3
+  [   13.056432] Read of size 8 at addr ffff88813152f408 by task (udev-worker)/479
+
+  [   13.060970] CPU: 5 PID: 479 Comm: (udev-worker) Not tainted 6.10.0-arch1-2 #1 893bb55d7f0073f25c46adbb49eb3785fefd74b0
+  [   13.063978] Hardware name: LENOVO 21CQCTO1WW/21CQCTO1WW, BIOS R22ET70W (1.40 ) 03/21/2024
+  [   13.067860] Call Trace:
+  [   13.069383] input: TPPS/2 Synaptics TrackPoint as /devices/platform/i8042/serio1/input/input8
+  [   13.071486]  <TASK>
+  [   13.071492]  dump_stack_lvl+0x5d/0x80
+  [   13.074870] snd_hda_intel 0000:33:00.6: enabling device (0000 -> 0002)
+  [   13.078296]  ? amd_sfh_get_report+0x3ec/0x530 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.082199]  print_report+0x174/0x505
+  [   13.085776]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
+  [   13.089367]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.093255]  ? amd_sfh_get_report+0x3ec/0x530 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.097464]  kasan_report+0xc8/0x150
+  [   13.101461]  ? amd_sfh_get_report+0x3ec/0x530 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.105802]  amd_sfh_get_report+0x3ec/0x530 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.110303]  amdtp_hid_request+0xb8/0x110 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.114879]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.119450]  sensor_hub_get_feature+0x1d3/0x540 [hid_sensor_hub 3f13be3016ff415bea03008d45d99da837ee3082]
+  [   13.124097]  hid_sensor_parse_common_attributes+0x4d0/0xad0 [hid_sensor_iio_common c3a5cbe93969c28b122609768bbe23efe52eb8f5]
+  [   13.127404]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.131925]  ? __pfx_hid_sensor_parse_common_attributes+0x10/0x10 [hid_sensor_iio_common c3a5cbe93969c28b122609768bbe23efe52eb8f5]
+  [   13.136455]  ? _raw_spin_lock_irqsave+0x96/0xf0
+  [   13.140197]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
+  [   13.143602]  ? devm_iio_device_alloc+0x34/0x50 [industrialio 3d261d5e5765625d2b052be40e526d62b1d2123b]
+  [   13.147234]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.150446]  ? __devm_add_action+0x167/0x1d0
+  [   13.155061]  hid_gyro_3d_probe+0x120/0x7f0 [hid_sensor_gyro_3d 63da36a143b775846ab2dbb86c343b401b5e3172]
+  [   13.158581]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.161814]  platform_probe+0xa2/0x150
+  [   13.165029]  really_probe+0x1e3/0x8a0
+  [   13.168243]  __driver_probe_device+0x18c/0x370
+  [   13.171500]  driver_probe_device+0x4a/0x120
+  [   13.175000]  __driver_attach+0x190/0x4a0
+  [   13.178521]  ? __pfx___driver_attach+0x10/0x10
+  [   13.181771]  bus_for_each_dev+0x106/0x180
+  [   13.185033]  ? __pfx__raw_spin_lock+0x10/0x10
+  [   13.188229]  ? __pfx_bus_for_each_dev+0x10/0x10
+  [   13.191446]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.194382]  bus_add_driver+0x29e/0x4d0
+  [   13.197328]  driver_register+0x1a5/0x360
+  [   13.200283]  ? __pfx_hid_gyro_3d_platform_driver_init+0x10/0x10 [hid_sensor_gyro_3d 63da36a143b775846ab2dbb86c343b401b5e3172]
+  [   13.203362]  do_one_initcall+0xa7/0x380
+  [   13.206432]  ? __pfx_do_one_initcall+0x10/0x10
+  [   13.210175]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.213211]  ? kasan_unpoison+0x44/0x70
+  [   13.216688]  do_init_module+0x238/0x750
+  [   13.219696]  load_module+0x5011/0x6af0
+  [   13.223096]  ? kasan_save_stack+0x30/0x50
+  [   13.226743]  ? kasan_save_track+0x14/0x30
+  [   13.230080]  ? kasan_save_free_info+0x3b/0x60
+  [   13.233323]  ? poison_slab_object+0x109/0x180
+  [   13.236778]  ? __pfx_load_module+0x10/0x10
+  [   13.239703]  ? poison_slab_object+0x109/0x180
+  [   13.243070]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.245924]  ? init_module_from_file+0x13d/0x150
+  [   13.248745]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.251503]  ? init_module_from_file+0xdf/0x150
+  [   13.254198]  init_module_from_file+0xdf/0x150
+  [   13.256826]  ? __pfx_init_module_from_file+0x10/0x10
+  [   13.259428]  ? kasan_save_track+0x14/0x30
+  [   13.261959]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.264471]  ? kasan_save_free_info+0x3b/0x60
+  [   13.267026]  ? poison_slab_object+0x109/0x180
+  [   13.269494]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.271949]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.274324]  ? _raw_spin_lock+0x85/0xe0
+  [   13.276671]  ? __pfx__raw_spin_lock+0x10/0x10
+  [   13.278963]  ? __rseq_handle_notify_resume+0x1a6/0xad0
+  [   13.281193]  idempotent_init_module+0x23b/0x650
+  [   13.283420]  ? __pfx_idempotent_init_module+0x10/0x10
+  [   13.285619]  ? __pfx___seccomp_filter+0x10/0x10
+  [   13.287714]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.289828]  ? __fget_light+0x57/0x420
+  [   13.291870]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.293880]  ? security_capable+0x74/0xb0
+  [   13.295820]  __x64_sys_finit_module+0xbe/0x130
+  [   13.297874]  do_syscall_64+0x82/0x190
+  [   13.299898]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.301905]  ? irqtime_account_irq+0x3d/0x1f0
+  [   13.303877]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.305753]  ? __irq_exit_rcu+0x4e/0x130
+  [   13.307577]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.309489]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
+  [   13.311371] RIP: 0033:0x7a21f96ade9d
+  [   13.313234] Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 63 de 0c 00 f7 d8 64 89 01 48
+  [   13.317051] RSP: 002b:00007ffeae934e78 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
+  [   13.319024] RAX: ffffffffffffffda RBX: 00005987276bfcf0 RCX: 00007a21f96ade9d
+  [   13.321100] RDX: 0000000000000004 RSI: 00007a21f8eda376 RDI: 000000000000001c
+  [   13.323314] RBP: 00007a21f8eda376 R08: 0000000000000001 R09: 00007ffeae934ec0
+  [   13.325505] R10: 0000000000000050 R11: 0000000000000246 R12: 0000000000020000
+  [   13.327637] R13: 00005987276c1250 R14: 0000000000000000 R15: 00005987276c4530
+  [   13.329737]  </TASK>
+
+  [   13.333945] Allocated by task 139:
+  [   13.336111]  kasan_save_stack+0x30/0x50
+  [   13.336121]  kasan_save_track+0x14/0x30
+  [   13.336125]  __kasan_kmalloc+0xaa/0xb0
+  [   13.336129]  amdtp_hid_probe+0xb1/0x440 [amd_sfh]
+  [   13.336138]  amd_sfh_hid_client_init+0xb8a/0x10f0 [amd_sfh]
+  [   13.336144]  sfh_init_work+0x47/0x120 [amd_sfh]
+  [   13.336150]  process_one_work+0x673/0xeb0
+  [   13.336155]  worker_thread+0x795/0x1250
+  [   13.336160]  kthread+0x290/0x350
+  [   13.336164]  ret_from_fork+0x34/0x70
+  [   13.336169]  ret_from_fork_asm+0x1a/0x30
+
+  [   13.338175] Freed by task 139:
+  [   13.340064]  kasan_save_stack+0x30/0x50
+  [   13.340072]  kasan_save_track+0x14/0x30
+  [   13.340076]  kasan_save_free_info+0x3b/0x60
+  [   13.340081]  poison_slab_object+0x109/0x180
+  [   13.340085]  __kasan_slab_free+0x32/0x50
+  [   13.340089]  kfree+0xe5/0x310
+  [   13.340094]  amdtp_hid_remove+0xb2/0x160 [amd_sfh]
+  [   13.340102]  amd_sfh_hid_client_deinit+0x324/0x640 [amd_sfh]
+  [   13.340107]  amd_sfh_hid_client_init+0x94a/0x10f0 [amd_sfh]
+  [   13.340113]  sfh_init_work+0x47/0x120 [amd_sfh]
+  [   13.340118]  process_one_work+0x673/0xeb0
+  [   13.340123]  worker_thread+0x795/0x1250
+  [   13.340127]  kthread+0x290/0x350
+  [   13.340132]  ret_from_fork+0x34/0x70
+  [   13.340136]  ret_from_fork_asm+0x1a/0x30
+
+  [   13.342482] The buggy address belongs to the object at ffff88813152f400
+                  which belongs to the cache kmalloc-64 of size 64
+  [   13.347357] The buggy address is located 8 bytes inside of
+                  freed 64-byte region [ffff88813152f400, ffff88813152f440)
+
+  [   13.347367] The buggy address belongs to the physical page:
+  [   13.355409] page: refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x13152f
+  [   13.355416] anon flags: 0x2ffff8000000000(node=0|zone=2|lastcpupid=0x1ffff)
+  [   13.355423] page_type: 0xffffefff(slab)
+  [   13.355429] raw: 02ffff8000000000 ffff8881000428c0 ffffea0004c43a00 0000000000000005
+  [   13.355435] raw: 0000000000000000 0000000000200020 00000001ffffefff 0000000000000000
+  [   13.355439] page dumped because: kasan: bad access detected
+
+  [   13.357295] Memory state around the buggy address:
+  [   13.357299]  ffff88813152f300: fa fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
+  [   13.357303]  ffff88813152f380: fa fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
+  [   13.357306] >ffff88813152f400: fa fb fb fb fb fb fb fb fc fc fc fc fc fc fc fc
+  [   13.357309]                       ^
+  [   13.357311]  ffff88813152f480: 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc fc
+  [   13.357315]  ffff88813152f500: 00 00 00 00 00 00 00 06 fc fc fc fc fc fc fc fc
+  [   13.357318] ==================================================================
+  [   13.357405] Disabling lock debugging due to kernel taint
+  [   13.383534] Oops: general protection fault, probably for non-canonical address 0xe0a1bc4140000013: 0000 [#1] PREEMPT SMP KASAN NOPTI
+  [   13.383544] KASAN: maybe wild-memory-access in range [0x050e020a00000098-0x050e020a0000009f]
+  [   13.383551] CPU: 3 PID: 479 Comm: (udev-worker) Tainted: G    B              6.10.0-arch1-2 #1 893bb55d7f0073f25c46adbb49eb3785fefd74b0
+  [   13.383561] Hardware name: LENOVO 21CQCTO1WW/21CQCTO1WW, BIOS R22ET70W (1.40 ) 03/21/2024
+  [   13.383565] RIP: 0010:amd_sfh_get_report+0x81/0x530 [amd_sfh]
+  [   13.383580] Code: 89 fa 48 c1 ea 03 80 3c 02 00 0f 85 78 03 00 00 48 b8 00 00 00 00 00 fc ff df 4c 8b 63 08 49 8d 7c 24 10 48 89 fa 48 c1 ea 03 <0f> b6 04 02 84 c0 74 08 3c 03 0f 8e 1a 03 00 00 45 8b 74 24 10 45
+  [   13.383585] RSP: 0018:ffff8881261f7388 EFLAGS: 00010212
+  [   13.383592] RAX: dffffc0000000000 RBX: ffff88813152f400 RCX: 0000000000000002
+  [   13.383597] RDX: 00a1c04140000013 RSI: 0000000000000008 RDI: 050e020a0000009b
+  [   13.383600] RBP: ffff88814d010000 R08: 0000000000000002 R09: fffffbfff3ddb8c0
+  [   13.383604] R10: ffffffff9eedc607 R11: ffff88810ce98000 R12: 050e020a0000008b
+  [   13.383607] R13: ffff88814d010000 R14: dffffc0000000000 R15: 0000000000000004
+  [   13.383611] FS:  00007a21f94d0880(0000) GS:ffff8887e7d80000(0000) knlGS:0000000000000000
+  [   13.383615] CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+  [   13.383618] CR2: 00007e0014c438f0 CR3: 000000012614c000 CR4: 0000000000f50ef0
+  [   13.383622] PKRU: 55555554
+  [   13.383625] Call Trace:
+  [   13.383629]  <TASK>
+  [   13.383632]  ? __die_body.cold+0x19/0x27
+  [   13.383644]  ? die_addr+0x46/0x70
+  [   13.383652]  ? exc_general_protection+0x150/0x240
+  [   13.383664]  ? asm_exc_general_protection+0x26/0x30
+  [   13.383674]  ? amd_sfh_get_report+0x81/0x530 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.383686]  ? amd_sfh_get_report+0x3ec/0x530 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.383697]  amdtp_hid_request+0xb8/0x110 [amd_sfh 05f43221435b5205f734cd9da29399130f398a38]
+  [   13.383706]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.383713]  sensor_hub_get_feature+0x1d3/0x540 [hid_sensor_hub 3f13be3016ff415bea03008d45d99da837ee3082]
+  [   13.383727]  hid_sensor_parse_common_attributes+0x4d0/0xad0 [hid_sensor_iio_common c3a5cbe93969c28b122609768bbe23efe52eb8f5]
+  [   13.383739]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.383745]  ? __pfx_hid_sensor_parse_common_attributes+0x10/0x10 [hid_sensor_iio_common c3a5cbe93969c28b122609768bbe23efe52eb8f5]
+  [   13.383753]  ? _raw_spin_lock_irqsave+0x96/0xf0
+  [   13.383762]  ? __pfx__raw_spin_lock_irqsave+0x10/0x10
+  [   13.383768]  ? devm_iio_device_alloc+0x34/0x50 [industrialio 3d261d5e5765625d2b052be40e526d62b1d2123b]
+  [   13.383790]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.383795]  ? __devm_add_action+0x167/0x1d0
+  [   13.383806]  hid_gyro_3d_probe+0x120/0x7f0 [hid_sensor_gyro_3d 63da36a143b775846ab2dbb86c343b401b5e3172]
+  [   13.383818]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.383826]  platform_probe+0xa2/0x150
+  [   13.383832]  really_probe+0x1e3/0x8a0
+  [   13.383838]  __driver_probe_device+0x18c/0x370
+  [   13.383844]  driver_probe_device+0x4a/0x120
+  [   13.383851]  __driver_attach+0x190/0x4a0
+  [   13.383857]  ? __pfx___driver_attach+0x10/0x10
+  [   13.383863]  bus_for_each_dev+0x106/0x180
+  [   13.383868]  ? __pfx__raw_spin_lock+0x10/0x10
+  [   13.383874]  ? __pfx_bus_for_each_dev+0x10/0x10
+  [   13.383880]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.383887]  bus_add_driver+0x29e/0x4d0
+  [   13.383895]  driver_register+0x1a5/0x360
+  [   13.383902]  ? __pfx_hid_gyro_3d_platform_driver_init+0x10/0x10 [hid_sensor_gyro_3d 63da36a143b775846ab2dbb86c343b401b5e3172]
+  [   13.383910]  do_one_initcall+0xa7/0x380
+  [   13.383919]  ? __pfx_do_one_initcall+0x10/0x10
+  [   13.383927]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.383933]  ? kasan_unpoison+0x44/0x70
+  [   13.383943]  do_init_module+0x238/0x750
+  [   13.383955]  load_module+0x5011/0x6af0
+  [   13.383962]  ? kasan_save_stack+0x30/0x50
+  [   13.383968]  ? kasan_save_track+0x14/0x30
+  [   13.383973]  ? kasan_save_free_info+0x3b/0x60
+  [   13.383980]  ? poison_slab_object+0x109/0x180
+  [   13.383993]  ? __pfx_load_module+0x10/0x10
+  [   13.384007]  ? poison_slab_object+0x109/0x180
+  [   13.384012]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384018]  ? init_module_from_file+0x13d/0x150
+  [   13.384025]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384032]  ? init_module_from_file+0xdf/0x150
+  [   13.384037]  init_module_from_file+0xdf/0x150
+  [   13.384044]  ? __pfx_init_module_from_file+0x10/0x10
+  [   13.384050]  ? kasan_save_track+0x14/0x30
+  [   13.384055]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384060]  ? kasan_save_free_info+0x3b/0x60
+  [   13.384066]  ? poison_slab_object+0x109/0x180
+  [   13.384071]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384080]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384085]  ? _raw_spin_lock+0x85/0xe0
+  [   13.384091]  ? __pfx__raw_spin_lock+0x10/0x10
+  [   13.384096]  ? __rseq_handle_notify_resume+0x1a6/0xad0
+  [   13.384106]  idempotent_init_module+0x23b/0x650
+  [   13.384114]  ? __pfx_idempotent_init_module+0x10/0x10
+  [   13.384120]  ? __pfx___seccomp_filter+0x10/0x10
+  [   13.384129]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384135]  ? __fget_light+0x57/0x420
+  [   13.384142]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384147]  ? security_capable+0x74/0xb0
+  [   13.384157]  __x64_sys_finit_module+0xbe/0x130
+  [   13.384164]  do_syscall_64+0x82/0x190
+  [   13.384174]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384179]  ? irqtime_account_irq+0x3d/0x1f0
+  [   13.384188]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384193]  ? __irq_exit_rcu+0x4e/0x130
+  [   13.384201]  ? srso_alias_return_thunk+0x5/0xfbef5
+  [   13.384206]  entry_SYSCALL_64_after_hwframe+0x76/0x7e
+  [   13.384212] RIP: 0033:0x7a21f96ade9d
+  [   13.384263] Code: ff c3 66 2e 0f 1f 84 00 00 00 00 00 90 f3 0f 1e fa 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 8b 0d 63 de 0c 00 f7 d8 64 89 01 48
+  [   13.384267] RSP: 002b:00007ffeae934e78 EFLAGS: 00000246 ORIG_RAX: 0000000000000139
+  [   13.384273] RAX: ffffffffffffffda RBX: 00005987276bfcf0 RCX: 00007a21f96ade9d
+  [   13.384277] RDX: 0000000000000004 RSI: 00007a21f8eda376 RDI: 000000000000001c
+  [   13.384280] RBP: 00007a21f8eda376 R08: 0000000000000001 R09: 00007ffeae934ec0
+  [   13.384284] R10: 0000000000000050 R11: 0000000000000246 R12: 0000000000020000
+  [   13.384288] R13: 00005987276c1250 R14: 0000000000000000 R15: 00005987276c4530
+  [   13.384297]  </TASK>
+  [   13.384299] Modules linked in: soundwire_amd(+) hid_sensor_gyro_3d(+) hid_sensor_magn_3d hid_sensor_accel_3d soundwire_generic_allocation amdxcp hid_sensor_trigger drm_exec industrialio_triggered_buffer soundwire_bus gpu_sched kvm_amd kfifo_buf qmi_helpers joydev drm_buddy hid_sensor_iio_common mousedev snd_soc_core industrialio i2c_algo_bit mac80211 snd_compress drm_suballoc_helper kvm snd_hda_intel drm_ttm_helper ac97_bus snd_pcm_dmaengine snd_intel_dspcfg ttm thinkpad_acpi(+) snd_intel_sdw_acpi hid_sensor_hub snd_rpl_pci_acp6x drm_display_helper snd_hda_codec hid_multitouch libarc4 snd_acp_pci platform_profile think_lmi(+) hid_generic firmware_attributes_class wmi_bmof cec snd_acp_legacy_common sparse_keymap rapl snd_hda_core psmouse cfg80211 pcspkr snd_pci_acp6x snd_hwdep video snd_pcm snd_pci_acp5x snd_timer snd_rn_pci_acp3x ucsi_acpi snd_acp_config snd sp5100_tco rfkill snd_soc_acpi typec_ucsi thunderbolt amd_sfh k10temp mhi soundcore i2c_piix4 snd_pci_acp3x typec i2c_hid_acpi roles i2c_hid wmi acpi_tad amd_pmc
+  [   13.384454]  mac_hid i2c_dev crypto_user loop nfnetlink zram ip_tables x_tables dm_crypt cbc encrypted_keys trusted asn1_encoder tee dm_mod crct10dif_pclmul crc32_pclmul polyval_clmulni polyval_generic gf128mul ghash_clmulni_intel serio_raw sha512_ssse3 atkbd sha256_ssse3 libps2 sha1_ssse3 vivaldi_fmap nvme aesni_intel crypto_simd nvme_core cryptd ccp xhci_pci i8042 nvme_auth xhci_pci_renesas serio vfat fat btrfs blake2b_generic libcrc32c crc32c_generic crc32c_intel xor raid6_pq
+  [   13.384552] ---[ end trace 0000000000000000 ]---
+
+KASAN reports a use-after-free of hid->driver_data in function
+amd_sfh_get_report(). The backtrace indicates that the function is called
+by amdtp_hid_request() which is one of the callbacks of hid device.
+The current make sure that driver_data is freed only once
+hid_destroy_device() returned.
+
+Note that I observed the crash both on v6.9.9 and v6.10.0. The
+code seems to be as it was from the early days of the driver.
+
+Signed-off-by: Olivier Sobrie <olivier@sobrie.be>
+Acked-by: Basavaraj Natikar <Basavaraj.Natikar@amd.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/amd-sfh-hid/amd_sfh_hid.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/hid/amd-sfh-hid/amd_sfh_hid.c b/drivers/hid/amd-sfh-hid/amd_sfh_hid.c
+index 705b52337068..81f3024b7b1b 100644
+--- a/drivers/hid/amd-sfh-hid/amd_sfh_hid.c
++++ b/drivers/hid/amd-sfh-hid/amd_sfh_hid.c
+@@ -171,11 +171,13 @@ int amdtp_hid_probe(u32 cur_hid_dev, struct amdtp_cl_data *cli_data)
+ void amdtp_hid_remove(struct amdtp_cl_data *cli_data)
+ {
+       int i;
++      struct amdtp_hid_data *hid_data;
+       for (i = 0; i < cli_data->num_hid_devices; ++i) {
+               if (cli_data->hid_sensor_hubs[i]) {
+-                      kfree(cli_data->hid_sensor_hubs[i]->driver_data);
++                      hid_data = cli_data->hid_sensor_hubs[i]->driver_data;
+                       hid_destroy_device(cli_data->hid_sensor_hubs[i]);
++                      kfree(hid_data);
+                       cli_data->hid_sensor_hubs[i] = NULL;
+               }
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/hid-cougar-fix-slab-out-of-bounds-read-in-cougar_rep.patch b/queue-6.6/hid-cougar-fix-slab-out-of-bounds-read-in-cougar_rep.patch
new file mode 100644 (file)
index 0000000..7218e17
--- /dev/null
@@ -0,0 +1,38 @@
+From 8dee114d1b8f322694577357d42702551ca0d1b9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jul 2024 19:42:43 -0400
+Subject: HID: cougar: fix slab-out-of-bounds Read in cougar_report_fixup
+
+From: Camila Alvarez <cam.alvarez.i@gmail.com>
+
+[ Upstream commit a6e9c391d45b5865b61e569146304cff72821a5d ]
+
+report_fixup for the Cougar 500k Gaming Keyboard was not verifying
+that the report descriptor size was correct before accessing it
+
+Reported-by: syzbot+24c0361074799d02c452@syzkaller.appspotmail.com
+Closes: https://syzkaller.appspot.com/bug?extid=24c0361074799d02c452
+Signed-off-by: Camila Alvarez <cam.alvarez.i@gmail.com>
+Reviewed-by: Silvan Jegen <s.jegen@gmail.com>
+Signed-off-by: Jiri Kosina <jkosina@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hid/hid-cougar.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/hid/hid-cougar.c b/drivers/hid/hid-cougar.c
+index cb8bd8aae15b..0fa785f52707 100644
+--- a/drivers/hid/hid-cougar.c
++++ b/drivers/hid/hid-cougar.c
+@@ -106,7 +106,7 @@ static void cougar_fix_g6_mapping(void)
+ static __u8 *cougar_report_fixup(struct hid_device *hdev, __u8 *rdesc,
+                                unsigned int *rsize)
+ {
+-      if (rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
++      if (*rsize >= 117 && rdesc[2] == 0x09 && rdesc[3] == 0x02 &&
+           (rdesc[115] | rdesc[116] << 8) >= HID_MAX_USAGES) {
+               hid_info(hdev,
+                       "usage count exceeds max: fixing up report descriptor\n");
+-- 
+2.43.0
+
diff --git a/queue-6.6/hwmon-adc128d818-fix-underflows-seen-when-writing-li.patch b/queue-6.6/hwmon-adc128d818-fix-underflows-seen-when-writing-li.patch
new file mode 100644 (file)
index 0000000..d748c3d
--- /dev/null
@@ -0,0 +1,44 @@
+From 8375b2cd88d64c54d6a0eae6119af3898590bd5f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 Jul 2024 23:43:04 -0700
+Subject: hwmon: (adc128d818) Fix underflows seen when writing limit attributes
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit 8cad724c8537fe3e0da8004646abc00290adae40 ]
+
+DIV_ROUND_CLOSEST() after kstrtol() results in an underflow if a large
+negative number such as -9223372036854775808 is provided by the user.
+Fix it by reordering clamp_val() and DIV_ROUND_CLOSEST() operations.
+
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/adc128d818.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hwmon/adc128d818.c b/drivers/hwmon/adc128d818.c
+index 46e3c8c50765..73fd96799847 100644
+--- a/drivers/hwmon/adc128d818.c
++++ b/drivers/hwmon/adc128d818.c
+@@ -176,7 +176,7 @@ static ssize_t adc128_in_store(struct device *dev,
+       mutex_lock(&data->update_lock);
+       /* 10 mV LSB on limit registers */
+-      regval = clamp_val(DIV_ROUND_CLOSEST(val, 10), 0, 255);
++      regval = DIV_ROUND_CLOSEST(clamp_val(val, 0, 2550), 10);
+       data->in[index][nr] = regval << 4;
+       reg = index == 1 ? ADC128_REG_IN_MIN(nr) : ADC128_REG_IN_MAX(nr);
+       i2c_smbus_write_byte_data(data->client, reg, regval);
+@@ -214,7 +214,7 @@ static ssize_t adc128_temp_store(struct device *dev,
+               return err;
+       mutex_lock(&data->update_lock);
+-      regval = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
++      regval = DIV_ROUND_CLOSEST(clamp_val(val, -128000, 127000), 1000);
+       data->temp[index] = regval << 1;
+       i2c_smbus_write_byte_data(data->client,
+                                 index == 1 ? ADC128_REG_TEMP_MAX
+-- 
+2.43.0
+
diff --git a/queue-6.6/hwmon-hp-wmi-sensors-check-if-wmi-event-data-exists.patch b/queue-6.6/hwmon-hp-wmi-sensors-check-if-wmi-event-data-exists.patch
new file mode 100644 (file)
index 0000000..a4d4a12
--- /dev/null
@@ -0,0 +1,44 @@
+From 6b1e103370e25c6aa1b4642749f953a8eacc1c2c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 1 Sep 2024 05:10:51 +0200
+Subject: hwmon: (hp-wmi-sensors) Check if WMI event data exists
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Armin Wolf <W_Armin@gmx.de>
+
+[ Upstream commit a54da9df75cd1b4b5028f6c60f9a211532680585 ]
+
+The BIOS can choose to return no event data in response to a
+WMI event, so the ACPI object passed to the WMI notify handler
+can be NULL.
+
+Check for such a situation and ignore the event in such a case.
+
+Fixes: 23902f98f8d4 ("hwmon: add HP WMI Sensors driver")
+Signed-off-by: Armin Wolf <W_Armin@gmx.de>
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Message-ID: <20240901031055.3030-2-W_Armin@gmx.de>
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/hp-wmi-sensors.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/hwmon/hp-wmi-sensors.c b/drivers/hwmon/hp-wmi-sensors.c
+index b5325d0e72b9..dfa1d6926dea 100644
+--- a/drivers/hwmon/hp-wmi-sensors.c
++++ b/drivers/hwmon/hp-wmi-sensors.c
+@@ -1637,6 +1637,8 @@ static void hp_wmi_notify(u32 value, void *context)
+               goto out_unlock;
+       wobj = out.pointer;
++      if (!wobj)
++              goto out_unlock;
+       err = populate_event_from_wobj(dev, &event, wobj);
+       if (err) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/hwmon-lm95234-fix-underflows-seen-when-writing-limit.patch b/queue-6.6/hwmon-lm95234-fix-underflows-seen-when-writing-limit.patch
new file mode 100644 (file)
index 0000000..fec57a4
--- /dev/null
@@ -0,0 +1,63 @@
+From c080903807a7c895624d9964d3583ad7bdd9302a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 Jul 2024 23:48:42 -0700
+Subject: hwmon: (lm95234) Fix underflows seen when writing limit attributes
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit af64e3e1537896337405f880c1e9ac1f8c0c6198 ]
+
+DIV_ROUND_CLOSEST() after kstrtol() results in an underflow if a large
+negative number such as -9223372036854775808 is provided by the user.
+Fix it by reordering clamp_val() and DIV_ROUND_CLOSEST() operations.
+
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/lm95234.c | 9 +++++----
+ 1 file changed, 5 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/hwmon/lm95234.c b/drivers/hwmon/lm95234.c
+index 67b9d7636ee4..37e8e9679aeb 100644
+--- a/drivers/hwmon/lm95234.c
++++ b/drivers/hwmon/lm95234.c
+@@ -301,7 +301,8 @@ static ssize_t tcrit2_store(struct device *dev, struct device_attribute *attr,
+       if (ret < 0)
+               return ret;
+-      val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, index ? 255 : 127);
++      val = DIV_ROUND_CLOSEST(clamp_val(val, 0, (index ? 255 : 127) * 1000),
++                              1000);
+       mutex_lock(&data->update_lock);
+       data->tcrit2[index] = val;
+@@ -350,7 +351,7 @@ static ssize_t tcrit1_store(struct device *dev, struct device_attribute *attr,
+       if (ret < 0)
+               return ret;
+-      val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 255);
++      val = DIV_ROUND_CLOSEST(clamp_val(val, 0, 255000), 1000);
+       mutex_lock(&data->update_lock);
+       data->tcrit1[index] = val;
+@@ -391,7 +392,7 @@ static ssize_t tcrit1_hyst_store(struct device *dev,
+       if (ret < 0)
+               return ret;
+-      val = DIV_ROUND_CLOSEST(val, 1000);
++      val = DIV_ROUND_CLOSEST(clamp_val(val, -255000, 255000), 1000);
+       val = clamp_val((int)data->tcrit1[index] - val, 0, 31);
+       mutex_lock(&data->update_lock);
+@@ -431,7 +432,7 @@ static ssize_t offset_store(struct device *dev, struct device_attribute *attr,
+               return ret;
+       /* Accuracy is 1/2 degrees C */
+-      val = clamp_val(DIV_ROUND_CLOSEST(val, 500), -128, 127);
++      val = DIV_ROUND_CLOSEST(clamp_val(val, -64000, 63500), 500);
+       mutex_lock(&data->update_lock);
+       data->toffset[index] = val;
+-- 
+2.43.0
+
diff --git a/queue-6.6/hwmon-nct6775-core-fix-underflows-seen-when-writing-.patch b/queue-6.6/hwmon-nct6775-core-fix-underflows-seen-when-writing-.patch
new file mode 100644 (file)
index 0000000..54ef64c
--- /dev/null
@@ -0,0 +1,36 @@
+From fe6ccb17be5c32b2bf463662ab56d16d1e99cd6a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 Jul 2024 23:50:08 -0700
+Subject: hwmon: (nct6775-core) Fix underflows seen when writing limit
+ attributes
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit 0403e10bf0824bf0ec2bb135d4cf1c0cc3bf4bf0 ]
+
+DIV_ROUND_CLOSEST() after kstrtol() results in an underflow if a large
+negative number such as -9223372036854775808 is provided by the user.
+Fix it by reordering clamp_val() and DIV_ROUND_CLOSEST() operations.
+
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/nct6775-core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/hwmon/nct6775-core.c b/drivers/hwmon/nct6775-core.c
+index f3bf2e4701c3..8da7aa1614d7 100644
+--- a/drivers/hwmon/nct6775-core.c
++++ b/drivers/hwmon/nct6775-core.c
+@@ -2262,7 +2262,7 @@ store_temp_offset(struct device *dev, struct device_attribute *attr,
+       if (err < 0)
+               return err;
+-      val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), -128, 127);
++      val = DIV_ROUND_CLOSEST(clamp_val(val, -128000, 127000), 1000);
+       mutex_lock(&data->update_lock);
+       data->temp_offset[nr] = val;
+-- 
+2.43.0
+
diff --git a/queue-6.6/hwmon-w83627ehf-fix-underflows-seen-when-writing-lim.patch b/queue-6.6/hwmon-w83627ehf-fix-underflows-seen-when-writing-lim.patch
new file mode 100644 (file)
index 0000000..bd9c2c1
--- /dev/null
@@ -0,0 +1,44 @@
+From d5a1e967f1d94d69661e9910b3d64359ad021db2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 6 Jul 2024 23:51:34 -0700
+Subject: hwmon: (w83627ehf) Fix underflows seen when writing limit attributes
+
+From: Guenter Roeck <linux@roeck-us.net>
+
+[ Upstream commit 5c1de37969b7bc0abcb20b86e91e70caebbd4f89 ]
+
+DIV_ROUND_CLOSEST() after kstrtol() results in an underflow if a large
+negative number such as -9223372036854775808 is provided by the user.
+Fix it by reordering clamp_val() and DIV_ROUND_CLOSEST() operations.
+
+Signed-off-by: Guenter Roeck <linux@roeck-us.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/hwmon/w83627ehf.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/hwmon/w83627ehf.c b/drivers/hwmon/w83627ehf.c
+index fe960c0a624f..7d7d70afde65 100644
+--- a/drivers/hwmon/w83627ehf.c
++++ b/drivers/hwmon/w83627ehf.c
+@@ -895,7 +895,7 @@ store_target_temp(struct device *dev, struct device_attribute *attr,
+       if (err < 0)
+               return err;
+-      val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 127);
++      val = DIV_ROUND_CLOSEST(clamp_val(val, 0, 127000), 1000);
+       mutex_lock(&data->update_lock);
+       data->target_temp[nr] = val;
+@@ -920,7 +920,7 @@ store_tolerance(struct device *dev, struct device_attribute *attr,
+               return err;
+       /* Limit the temp to 0C - 15C */
+-      val = clamp_val(DIV_ROUND_CLOSEST(val, 1000), 0, 15);
++      val = DIV_ROUND_CLOSEST(clamp_val(val, 0, 15000), 1000);
+       mutex_lock(&data->update_lock);
+       reg = w83627ehf_read_value(data, W83627EHF_REG_TOLERANCE[nr]);
+-- 
+2.43.0
+
diff --git a/queue-6.6/i3c-master-svc-resend-target-address-when-get-nack.patch b/queue-6.6/i3c-master-svc-resend-target-address-when-get-nack.patch
new file mode 100644 (file)
index 0000000..89a8cec
--- /dev/null
@@ -0,0 +1,122 @@
+From d6bfbdbc855a6e1c74bc3b3cdd612d69b8945850 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 3 Jun 2024 11:15:27 -0400
+Subject: i3c: master: svc: resend target address when get NACK
+
+From: Frank Li <Frank.Li@nxp.com>
+
+[ Upstream commit 9bc7501b0b90f4d0c34b97c14ff1f708ce7ad8f3 ]
+
+According to I3C Spec 1.1.1, 11-Jun-2021, section: 5.1.2.2.3:
+
+If the Controller chooses to start an I3C Message with an I3C Dynamic
+Address, then special provisions shall be made because that same I3C Target
+may be initiating an IBI or a Controller Role Request. So, one of three
+things may happen: (skip 1, 2)
+
+3. The Addresses match and the RnW bits also match, and so neither
+Controller nor Target will ACK since both are expecting the other side to
+provide ACK. As a result, each side might think it had "won" arbitration,
+but neither side would continue, as each would subsequently see that the
+other did not provide ACK.
+...
+For either value of RnW: Due to the NACK, the Controller shall defer the
+Private Write or Private Read, and should typically transmit the Target
+                                                   ^^^^^^^^^^^^^^^^^^^
+Address again after a Repeated START (i.e., the next one or any one prior
+^^^^^^^^^^^^^
+to a STOP in the Frame). Since the Address Header following a Repeated
+START is not arbitrated, the Controller will always win (see Section
+5.1.2.2.4).
+
+Resend target address again if address is not 7E and controller get NACK.
+
+Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com>
+Signed-off-by: Frank Li <Frank.Li@nxp.com>
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i3c/master/svc-i3c-master.c | 58 ++++++++++++++++++++++-------
+ 1 file changed, 44 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/i3c/master/svc-i3c-master.c b/drivers/i3c/master/svc-i3c-master.c
+index ccd0c4680be2..acc937275c18 100644
+--- a/drivers/i3c/master/svc-i3c-master.c
++++ b/drivers/i3c/master/svc-i3c-master.c
+@@ -1037,29 +1037,59 @@ static int svc_i3c_master_xfer(struct svc_i3c_master *master,
+                              u8 *in, const u8 *out, unsigned int xfer_len,
+                              unsigned int *actual_len, bool continued)
+ {
++      int retry = 2;
+       u32 reg;
+       int ret;
+       /* clean SVC_I3C_MINT_IBIWON w1c bits */
+       writel(SVC_I3C_MINT_IBIWON, master->regs + SVC_I3C_MSTATUS);
+-      writel(SVC_I3C_MCTRL_REQUEST_START_ADDR |
+-             xfer_type |
+-             SVC_I3C_MCTRL_IBIRESP_NACK |
+-             SVC_I3C_MCTRL_DIR(rnw) |
+-             SVC_I3C_MCTRL_ADDR(addr) |
+-             SVC_I3C_MCTRL_RDTERM(*actual_len),
+-             master->regs + SVC_I3C_MCTRL);
+-      ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
++      while (retry--) {
++              writel(SVC_I3C_MCTRL_REQUEST_START_ADDR |
++                     xfer_type |
++                     SVC_I3C_MCTRL_IBIRESP_NACK |
++                     SVC_I3C_MCTRL_DIR(rnw) |
++                     SVC_I3C_MCTRL_ADDR(addr) |
++                     SVC_I3C_MCTRL_RDTERM(*actual_len),
++                     master->regs + SVC_I3C_MCTRL);
++
++              ret = readl_poll_timeout(master->regs + SVC_I3C_MSTATUS, reg,
+                                SVC_I3C_MSTATUS_MCTRLDONE(reg), 0, 1000);
+-      if (ret)
+-              goto emit_stop;
++              if (ret)
++                      goto emit_stop;
+-      if (readl(master->regs + SVC_I3C_MERRWARN) & SVC_I3C_MERRWARN_NACK) {
+-              ret = -ENXIO;
+-              *actual_len = 0;
+-              goto emit_stop;
++              if (readl(master->regs + SVC_I3C_MERRWARN) & SVC_I3C_MERRWARN_NACK) {
++                      /*
++                       * According to I3C Spec 1.1.1, 11-Jun-2021, section: 5.1.2.2.3.
++                       * If the Controller chooses to start an I3C Message with an I3C Dynamic
++                       * Address, then special provisions shall be made because that same I3C
++                       * Target may be initiating an IBI or a Controller Role Request. So, one of
++                       * three things may happen: (skip 1, 2)
++                       *
++                       * 3. The Addresses match and the RnW bits also match, and so neither
++                       * Controller nor Target will ACK since both are expecting the other side to
++                       * provide ACK. As a result, each side might think it had "won" arbitration,
++                       * but neither side would continue, as each would subsequently see that the
++                       * other did not provide ACK.
++                       * ...
++                       * For either value of RnW: Due to the NACK, the Controller shall defer the
++                       * Private Write or Private Read, and should typically transmit the Target
++                       * Address again after a Repeated START (i.e., the next one or any one prior
++                       * to a STOP in the Frame). Since the Address Header following a Repeated
++                       * START is not arbitrated, the Controller will always win (see Section
++                       * 5.1.2.2.4).
++                       */
++                      if (retry && addr != 0x7e) {
++                              writel(SVC_I3C_MERRWARN_NACK, master->regs + SVC_I3C_MERRWARN);
++                      } else {
++                              ret = -ENXIO;
++                              *actual_len = 0;
++                              goto emit_stop;
++                      }
++              } else {
++                      break;
++              }
+       }
+       /*
+-- 
+2.43.0
+
diff --git a/queue-6.6/i3c-mipi-i3c-hci-error-out-instead-on-bug_on-in-ibi-.patch b/queue-6.6/i3c-mipi-i3c-hci-error-out-instead-on-bug_on-in-ibi-.patch
new file mode 100644 (file)
index 0000000..cd6eff3
--- /dev/null
@@ -0,0 +1,40 @@
+From 9f26b97ae01fe018eb024d9512881aeb5f6623cc Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jun 2024 16:15:58 +0300
+Subject: i3c: mipi-i3c-hci: Error out instead on BUG_ON() in IBI DMA setup
+
+From: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+
+[ Upstream commit 8a2be2f1db268ec735419e53ef04ca039fc027dc ]
+
+Definitely condition dma_get_cache_alignment * defined value > 256
+during driver initialization is not reason to BUG_ON(). Turn that to
+graceful error out with -EINVAL.
+
+Signed-off-by: Jarkko Nikula <jarkko.nikula@linux.intel.com>
+Link: https://lore.kernel.org/r/20240628131559.502822-3-jarkko.nikula@linux.intel.com
+Signed-off-by: Alexandre Belloni <alexandre.belloni@bootlin.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/i3c/master/mipi-i3c-hci/dma.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/i3c/master/mipi-i3c-hci/dma.c b/drivers/i3c/master/mipi-i3c-hci/dma.c
+index 337c95d43f3f..edc3a69bfe31 100644
+--- a/drivers/i3c/master/mipi-i3c-hci/dma.c
++++ b/drivers/i3c/master/mipi-i3c-hci/dma.c
+@@ -291,7 +291,10 @@ static int hci_dma_init(struct i3c_hci *hci)
+               rh->ibi_chunk_sz = dma_get_cache_alignment();
+               rh->ibi_chunk_sz *= IBI_CHUNK_CACHELINES;
+-              BUG_ON(rh->ibi_chunk_sz > 256);
++              if (rh->ibi_chunk_sz > 256) {
++                      ret = -EINVAL;
++                      goto err_out;
++              }
+               ibi_status_ring_sz = rh->ibi_status_sz * rh->ibi_status_entries;
+               ibi_data_ring_sz = rh->ibi_chunk_sz * rh->ibi_chunks_total;
+-- 
+2.43.0
+
diff --git a/queue-6.6/ice-add-netif_device_attach-detach-into-pf-reset-flo.patch b/queue-6.6/ice-add-netif_device_attach-detach-into-pf-reset-flo.patch
new file mode 100644 (file)
index 0000000..0fa9e98
--- /dev/null
@@ -0,0 +1,107 @@
+From e3f21fdb3c02d307c2656d45782c553278dba9c1 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 21 Aug 2024 18:06:40 +0200
+Subject: ice: Add netif_device_attach/detach into PF reset flow
+
+From: Dawid Osuchowski <dawid.osuchowski@linux.intel.com>
+
+[ Upstream commit d11a67634227f9f9da51938af085fb41a733848f ]
+
+Ethtool callbacks can be executed while reset is in progress and try to
+access deleted resources, e.g. getting coalesce settings can result in a
+NULL pointer dereference seen below.
+
+Reproduction steps:
+Once the driver is fully initialized, trigger reset:
+       # echo 1 > /sys/class/net/<interface>/device/reset
+when reset is in progress try to get coalesce settings using ethtool:
+       # ethtool -c <interface>
+
+BUG: kernel NULL pointer dereference, address: 0000000000000020
+PGD 0 P4D 0
+Oops: Oops: 0000 [#1] PREEMPT SMP PTI
+CPU: 11 PID: 19713 Comm: ethtool Tainted: G S                 6.10.0-rc7+ #7
+RIP: 0010:ice_get_q_coalesce+0x2e/0xa0 [ice]
+RSP: 0018:ffffbab1e9bcf6a8 EFLAGS: 00010206
+RAX: 000000000000000c RBX: ffff94512305b028 RCX: 0000000000000000
+RDX: 0000000000000000 RSI: ffff9451c3f2e588 RDI: ffff9451c3f2e588
+RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
+R10: ffff9451c3f2e580 R11: 000000000000001f R12: ffff945121fa9000
+R13: ffffbab1e9bcf760 R14: 0000000000000013 R15: ffffffff9e65dd40
+FS:  00007faee5fbe740(0000) GS:ffff94546fd80000(0000) knlGS:0000000000000000
+CS:  0010 DS: 0000 ES: 0000 CR0: 0000000080050033
+CR2: 0000000000000020 CR3: 0000000106c2e005 CR4: 00000000001706f0
+Call Trace:
+<TASK>
+ice_get_coalesce+0x17/0x30 [ice]
+coalesce_prepare_data+0x61/0x80
+ethnl_default_doit+0xde/0x340
+genl_family_rcv_msg_doit+0xf2/0x150
+genl_rcv_msg+0x1b3/0x2c0
+netlink_rcv_skb+0x5b/0x110
+genl_rcv+0x28/0x40
+netlink_unicast+0x19c/0x290
+netlink_sendmsg+0x222/0x490
+__sys_sendto+0x1df/0x1f0
+__x64_sys_sendto+0x24/0x30
+do_syscall_64+0x82/0x160
+entry_SYSCALL_64_after_hwframe+0x76/0x7e
+RIP: 0033:0x7faee60d8e27
+
+Calling netif_device_detach() before reset makes the net core not call
+the driver when ethtool command is issued, the attempt to execute an
+ethtool command during reset will result in the following message:
+
+    netlink error: No such device
+
+instead of NULL pointer dereference. Once reset is done and
+ice_rebuild() is executing, the netif_device_attach() is called to allow
+for ethtool operations to occur again in a safe manner.
+
+Fixes: fcea6f3da546 ("ice: Add stats and ethtool support")
+Suggested-by: Jakub Kicinski <kuba@kernel.org>
+Reviewed-by: Igor Bagnucki <igor.bagnucki@intel.com>
+Signed-off-by: Dawid Osuchowski <dawid.osuchowski@linux.intel.com>
+Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
+Reviewed-by: Michal Schmidt <mschmidt@redhat.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/ice/ice_main.c | 7 +++++++
+ 1 file changed, 7 insertions(+)
+
+diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
+index 3f254ce0d6db..ffe6e74b9fea 100644
+--- a/drivers/net/ethernet/intel/ice/ice_main.c
++++ b/drivers/net/ethernet/intel/ice/ice_main.c
+@@ -606,6 +606,9 @@ ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
+                       memset(&vsi->mqprio_qopt, 0, sizeof(vsi->mqprio_qopt));
+               }
+       }
++
++      if (vsi->netdev)
++              netif_device_detach(vsi->netdev);
+ skip:
+       /* clear SW filtering DB */
+@@ -7295,6 +7298,7 @@ static void ice_update_pf_netdev_link(struct ice_pf *pf)
+  */
+ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
+ {
++      struct ice_vsi *vsi = ice_get_main_vsi(pf);
+       struct device *dev = ice_pf_to_dev(pf);
+       struct ice_hw *hw = &pf->hw;
+       bool dvm;
+@@ -7447,6 +7451,9 @@ static void ice_rebuild(struct ice_pf *pf, enum ice_reset_req reset_type)
+               ice_rebuild_arfs(pf);
+       }
++      if (vsi && vsi->netdev)
++              netif_device_attach(vsi->netdev);
++
+       ice_update_pf_netdev_link(pf);
+       /* tell the firmware we are up */
+-- 
+2.43.0
+
diff --git a/queue-6.6/ice-check-all-ice_vsi_rebuild-errors-in-function.patch b/queue-6.6/ice-check-all-ice_vsi_rebuild-errors-in-function.patch
new file mode 100644 (file)
index 0000000..91adeda
--- /dev/null
@@ -0,0 +1,62 @@
+From 514bcf08652313d153fcfd041c275ebee470b50b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 14:46:25 +0200
+Subject: ice: Check all ice_vsi_rebuild() errors in function
+
+From: Eric Joyner <eric.joyner@intel.com>
+
+[ Upstream commit d47bf9a495cf424fad674321d943123dc12b926d ]
+
+Check the return value from ice_vsi_rebuild() and prevent the usage of
+incorrectly configured VSI.
+
+Reviewed-by: Michal Swiatkowski <michal.swiatkowski@linux.intel.com>
+Reviewed-by: Przemek Kitszel <przemyslaw.kitszel@intel.com>
+Signed-off-by: Eric Joyner <eric.joyner@intel.com>
+Signed-off-by: Karen Ostrowska <karen.ostrowska@intel.com>
+Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/ice/ice_main.c | 13 +++++++++++--
+ 1 file changed, 11 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
+index b168a37a5dff..3f254ce0d6db 100644
+--- a/drivers/net/ethernet/intel/ice/ice_main.c
++++ b/drivers/net/ethernet/intel/ice/ice_main.c
+@@ -3979,13 +3979,17 @@ int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx, bool locked)
+       /* set for the next time the netdev is started */
+       if (!netif_running(vsi->netdev)) {
+-              ice_vsi_rebuild(vsi, ICE_VSI_FLAG_NO_INIT);
++              err = ice_vsi_rebuild(vsi, ICE_VSI_FLAG_NO_INIT);
++              if (err)
++                      goto rebuild_err;
+               dev_dbg(ice_pf_to_dev(pf), "Link is down, queue count change happens when link is brought up\n");
+               goto done;
+       }
+       ice_vsi_close(vsi);
+-      ice_vsi_rebuild(vsi, ICE_VSI_FLAG_NO_INIT);
++      err = ice_vsi_rebuild(vsi, ICE_VSI_FLAG_NO_INIT);
++      if (err)
++              goto rebuild_err;
+       ice_for_each_traffic_class(i) {
+               if (vsi->tc_cfg.ena_tc & BIT(i))
+@@ -3996,6 +4000,11 @@ int ice_vsi_recfg_qs(struct ice_vsi *vsi, int new_rx, int new_tx, bool locked)
+       }
+       ice_pf_dcb_recfg(pf, locked);
+       ice_vsi_open(vsi);
++      goto done;
++
++rebuild_err:
++      dev_err(ice_pf_to_dev(pf), "Error during VSI rebuild: %d. Unload and reload the driver.\n",
++              err);
+ done:
+       clear_bit(ICE_CFG_BUSY, pf->state);
+       return err;
+-- 
+2.43.0
+
diff --git a/queue-6.6/ice-do-not-bring-the-vsi-up-if-it-was-down-before-th.patch b/queue-6.6/ice-do-not-bring-the-vsi-up-if-it-was-down-before-th.patch
new file mode 100644 (file)
index 0000000..1c98847
--- /dev/null
@@ -0,0 +1,57 @@
+From a0882b3d9d4783ed37587b49660cfe23b8f393af Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 23 Aug 2024 11:59:31 +0200
+Subject: ice: do not bring the VSI up, if it was down before the XDP setup
+
+From: Larysa Zaremba <larysa.zaremba@intel.com>
+
+[ Upstream commit 04c7e14e5b0b6227e7b00d7a96ca2f2426ab9171 ]
+
+After XDP configuration is completed, we bring the interface up
+unconditionally, regardless of its state before the call to .ndo_bpf().
+
+Preserve the information whether the interface had to be brought down and
+later bring it up only in such case.
+
+Fixes: efc2214b6047 ("ice: Add support for XDP")
+Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
+Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
+Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com>
+Acked-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
+Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/ice/ice_main.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
+index 3ee92b0e62ff..4d3a9fc79a6c 100644
+--- a/drivers/net/ethernet/intel/ice/ice_main.c
++++ b/drivers/net/ethernet/intel/ice/ice_main.c
+@@ -2931,8 +2931,8 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
+                  struct netlink_ext_ack *extack)
+ {
+       unsigned int frame_size = vsi->netdev->mtu + ICE_ETH_PKT_HDR_PAD;
+-      bool if_running = netif_running(vsi->netdev);
+       int ret = 0, xdp_ring_err = 0;
++      bool if_running;
+       if (prog && !prog->aux->xdp_has_frags) {
+               if (frame_size > ice_max_xdp_frame_size(vsi)) {
+@@ -2949,8 +2949,11 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
+               return 0;
+       }
++      if_running = netif_running(vsi->netdev) &&
++                   !test_and_set_bit(ICE_VSI_DOWN, vsi->state);
++
+       /* need to stop netdev while setting up the program for Rx rings */
+-      if (if_running && !test_and_set_bit(ICE_VSI_DOWN, vsi->state)) {
++      if (if_running) {
+               ret = ice_down(vsi);
+               if (ret) {
+                       NL_SET_ERR_MSG_MOD(extack, "Preparing device for XDP attach failed");
+-- 
+2.43.0
+
diff --git a/queue-6.6/ice-protect-xdp-configuration-with-a-mutex.patch b/queue-6.6/ice-protect-xdp-configuration-with-a-mutex.patch
new file mode 100644 (file)
index 0000000..4397cf1
--- /dev/null
@@ -0,0 +1,285 @@
+From a203c959f03d388a41c020549e47defd5acf7073 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 23 Aug 2024 11:59:27 +0200
+Subject: ice: protect XDP configuration with a mutex
+
+From: Larysa Zaremba <larysa.zaremba@intel.com>
+
+[ Upstream commit 2504b8405768a57a71e660dbfd5abd59f679a03f ]
+
+The main threat to data consistency in ice_xdp() is a possible asynchronous
+PF reset. It can be triggered by a user or by TX timeout handler.
+
+XDP setup and PF reset code access the same resources in the following
+sections:
+* ice_vsi_close() in ice_prepare_for_reset() - already rtnl-locked
+* ice_vsi_rebuild() for the PF VSI - not protected
+* ice_vsi_open() - already rtnl-locked
+
+With an unfortunate timing, such accesses can result in a crash such as the
+one below:
+
+[ +1.999878] ice 0000:b1:00.0: Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring 14
+[ +2.002992] ice 0000:b1:00.0: Registered XDP mem model MEM_TYPE_XSK_BUFF_POOL on Rx ring 18
+[Mar15 18:17] ice 0000:b1:00.0 ens801f0np0: NETDEV WATCHDOG: CPU: 38: transmit queue 14 timed out 80692736 ms
+[ +0.000093] ice 0000:b1:00.0 ens801f0np0: tx_timeout: VSI_num: 6, Q 14, NTC: 0x0, HW_HEAD: 0x0, NTU: 0x0, INT: 0x4000001
+[ +0.000012] ice 0000:b1:00.0 ens801f0np0: tx_timeout recovery level 1, txqueue 14
+[ +0.394718] ice 0000:b1:00.0: PTP reset successful
+[ +0.006184] BUG: kernel NULL pointer dereference, address: 0000000000000098
+[ +0.000045] #PF: supervisor read access in kernel mode
+[ +0.000023] #PF: error_code(0x0000) - not-present page
+[ +0.000023] PGD 0 P4D 0
+[ +0.000018] Oops: 0000 [#1] PREEMPT SMP NOPTI
+[ +0.000023] CPU: 38 PID: 7540 Comm: kworker/38:1 Not tainted 6.8.0-rc7 #1
+[ +0.000031] Hardware name: Intel Corporation S2600WFT/S2600WFT, BIOS SE5C620.86B.02.01.0014.082620210524 08/26/2021
+[ +0.000036] Workqueue: ice ice_service_task [ice]
+[ +0.000183] RIP: 0010:ice_clean_tx_ring+0xa/0xd0 [ice]
+[...]
+[ +0.000013] Call Trace:
+[ +0.000016] <TASK>
+[ +0.000014] ? __die+0x1f/0x70
+[ +0.000029] ? page_fault_oops+0x171/0x4f0
+[ +0.000029] ? schedule+0x3b/0xd0
+[ +0.000027] ? exc_page_fault+0x7b/0x180
+[ +0.000022] ? asm_exc_page_fault+0x22/0x30
+[ +0.000031] ? ice_clean_tx_ring+0xa/0xd0 [ice]
+[ +0.000194] ice_free_tx_ring+0xe/0x60 [ice]
+[ +0.000186] ice_destroy_xdp_rings+0x157/0x310 [ice]
+[ +0.000151] ice_vsi_decfg+0x53/0xe0 [ice]
+[ +0.000180] ice_vsi_rebuild+0x239/0x540 [ice]
+[ +0.000186] ice_vsi_rebuild_by_type+0x76/0x180 [ice]
+[ +0.000145] ice_rebuild+0x18c/0x840 [ice]
+[ +0.000145] ? delay_tsc+0x4a/0xc0
+[ +0.000022] ? delay_tsc+0x92/0xc0
+[ +0.000020] ice_do_reset+0x140/0x180 [ice]
+[ +0.000886] ice_service_task+0x404/0x1030 [ice]
+[ +0.000824] process_one_work+0x171/0x340
+[ +0.000685] worker_thread+0x277/0x3a0
+[ +0.000675] ? preempt_count_add+0x6a/0xa0
+[ +0.000677] ? _raw_spin_lock_irqsave+0x23/0x50
+[ +0.000679] ? __pfx_worker_thread+0x10/0x10
+[ +0.000653] kthread+0xf0/0x120
+[ +0.000635] ? __pfx_kthread+0x10/0x10
+[ +0.000616] ret_from_fork+0x2d/0x50
+[ +0.000612] ? __pfx_kthread+0x10/0x10
+[ +0.000604] ret_from_fork_asm+0x1b/0x30
+[ +0.000604] </TASK>
+
+The previous way of handling this through returning -EBUSY is not viable,
+particularly when destroying AF_XDP socket, because the kernel proceeds
+with removal anyway.
+
+There is plenty of code between those calls and there is no need to create
+a large critical section that covers all of them, same as there is no need
+to protect ice_vsi_rebuild() with rtnl_lock().
+
+Add xdp_state_lock mutex to protect ice_vsi_rebuild() and ice_xdp().
+
+Leaving unprotected sections in between would result in two states that
+have to be considered:
+1. when the VSI is closed, but not yet rebuild
+2. when VSI is already rebuild, but not yet open
+
+The latter case is actually already handled through !netif_running() case,
+we just need to adjust flag checking a little. The former one is not as
+trivial, because between ice_vsi_close() and ice_vsi_rebuild(), a lot of
+hardware interaction happens, this can make adding/deleting rings exit
+with an error. Luckily, VSI rebuild is pending and can apply new
+configuration for us in a managed fashion.
+
+Therefore, add an additional VSI state flag ICE_VSI_REBUILD_PENDING to
+indicate that ice_xdp() can just hot-swap the program.
+
+Also, as ice_vsi_rebuild() flow is touched in this patch, make it more
+consistent by deconfiguring VSI when coalesce allocation fails.
+
+Fixes: 2d4238f55697 ("ice: Add support for AF_XDP")
+Fixes: efc2214b6047 ("ice: Add support for XDP")
+Reviewed-by: Wojciech Drewek <wojciech.drewek@intel.com>
+Reviewed-by: Jacob Keller <jacob.e.keller@intel.com>
+Tested-by: Chandan Kumar Rout <chandanx.rout@intel.com>
+Signed-off-by: Larysa Zaremba <larysa.zaremba@intel.com>
+Reviewed-by: Maciej Fijalkowski <maciej.fijalkowski@intel.com>
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/ice/ice.h      |  2 ++
+ drivers/net/ethernet/intel/ice/ice_lib.c  | 34 ++++++++++++++---------
+ drivers/net/ethernet/intel/ice/ice_main.c | 19 +++++++++----
+ drivers/net/ethernet/intel/ice/ice_xsk.c  |  3 +-
+ 4 files changed, 39 insertions(+), 19 deletions(-)
+
+diff --git a/drivers/net/ethernet/intel/ice/ice.h b/drivers/net/ethernet/intel/ice/ice.h
+index c7962f322db2..7b3ce30ba38f 100644
+--- a/drivers/net/ethernet/intel/ice/ice.h
++++ b/drivers/net/ethernet/intel/ice/ice.h
+@@ -313,6 +313,7 @@ enum ice_vsi_state {
+       ICE_VSI_UMAC_FLTR_CHANGED,
+       ICE_VSI_MMAC_FLTR_CHANGED,
+       ICE_VSI_PROMISC_CHANGED,
++      ICE_VSI_REBUILD_PENDING,
+       ICE_VSI_STATE_NBITS             /* must be last */
+ };
+@@ -409,6 +410,7 @@ struct ice_vsi {
+       struct ice_tx_ring **xdp_rings;  /* XDP ring array */
+       u16 num_xdp_txq;                 /* Used XDP queues */
+       u8 xdp_mapping_mode;             /* ICE_MAP_MODE_[CONTIG|SCATTER] */
++      struct mutex xdp_state_lock;
+       struct net_device **target_netdevs;
+diff --git a/drivers/net/ethernet/intel/ice/ice_lib.c b/drivers/net/ethernet/intel/ice/ice_lib.c
+index 13ca3342a0ce..b3010a53f1b4 100644
+--- a/drivers/net/ethernet/intel/ice/ice_lib.c
++++ b/drivers/net/ethernet/intel/ice/ice_lib.c
+@@ -459,6 +459,7 @@ static void ice_vsi_free(struct ice_vsi *vsi)
+       ice_vsi_free_stats(vsi);
+       ice_vsi_free_arrays(vsi);
++      mutex_destroy(&vsi->xdp_state_lock);
+       mutex_unlock(&pf->sw_mutex);
+       devm_kfree(dev, vsi);
+ }
+@@ -660,6 +661,8 @@ static struct ice_vsi *ice_vsi_alloc(struct ice_pf *pf)
+       pf->next_vsi = ice_get_free_slot(pf->vsi, pf->num_alloc_vsi,
+                                        pf->next_vsi);
++      mutex_init(&vsi->xdp_state_lock);
++
+ unlock_pf:
+       mutex_unlock(&pf->sw_mutex);
+       return vsi;
+@@ -3164,19 +3167,23 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)
+       if (WARN_ON(vsi->type == ICE_VSI_VF && !vsi->vf))
+               return -EINVAL;
++      mutex_lock(&vsi->xdp_state_lock);
++
+       ret = ice_vsi_realloc_stat_arrays(vsi);
+       if (ret)
+-              goto err_vsi_cfg;
++              goto unlock;
+       ice_vsi_decfg(vsi);
+       ret = ice_vsi_cfg_def(vsi, &params);
+       if (ret)
+-              goto err_vsi_cfg;
++              goto unlock;
+       coalesce = kcalloc(vsi->num_q_vectors,
+                          sizeof(struct ice_coalesce_stored), GFP_KERNEL);
+-      if (!coalesce)
+-              return -ENOMEM;
++      if (!coalesce) {
++              ret = -ENOMEM;
++              goto decfg;
++      }
+       prev_num_q_vectors = ice_vsi_rebuild_get_coalesce(vsi, coalesce);
+@@ -3184,22 +3191,23 @@ int ice_vsi_rebuild(struct ice_vsi *vsi, u32 vsi_flags)
+       if (ret) {
+               if (vsi_flags & ICE_VSI_FLAG_INIT) {
+                       ret = -EIO;
+-                      goto err_vsi_cfg_tc_lan;
++                      goto free_coalesce;
+               }
+-              kfree(coalesce);
+-              return ice_schedule_reset(pf, ICE_RESET_PFR);
++              ret = ice_schedule_reset(pf, ICE_RESET_PFR);
++              goto free_coalesce;
+       }
+       ice_vsi_rebuild_set_coalesce(vsi, coalesce, prev_num_q_vectors);
+-      kfree(coalesce);
++      clear_bit(ICE_VSI_REBUILD_PENDING, vsi->state);
+-      return 0;
+-
+-err_vsi_cfg_tc_lan:
+-      ice_vsi_decfg(vsi);
++free_coalesce:
+       kfree(coalesce);
+-err_vsi_cfg:
++decfg:
++      if (ret)
++              ice_vsi_decfg(vsi);
++unlock:
++      mutex_unlock(&vsi->xdp_state_lock);
+       return ret;
+ }
+diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c
+index ffe6e74b9fea..3ee92b0e62ff 100644
+--- a/drivers/net/ethernet/intel/ice/ice_main.c
++++ b/drivers/net/ethernet/intel/ice/ice_main.c
+@@ -614,6 +614,7 @@ ice_prepare_for_reset(struct ice_pf *pf, enum ice_reset_req reset_type)
+       /* clear SW filtering DB */
+       ice_clear_hw_tbls(hw);
+       /* disable the VSIs and their queues that are not already DOWN */
++      set_bit(ICE_VSI_REBUILD_PENDING, ice_get_main_vsi(pf)->state);
+       ice_pf_dis_all_vsi(pf, false);
+       if (test_bit(ICE_FLAG_PTP_SUPPORTED, pf->flags))
+@@ -2942,7 +2943,8 @@ ice_xdp_setup_prog(struct ice_vsi *vsi, struct bpf_prog *prog,
+       }
+       /* hot swap progs and avoid toggling link */
+-      if (ice_is_xdp_ena_vsi(vsi) == !!prog) {
++      if (ice_is_xdp_ena_vsi(vsi) == !!prog ||
++          test_bit(ICE_VSI_REBUILD_PENDING, vsi->state)) {
+               ice_vsi_assign_bpf_prog(vsi, prog);
+               return 0;
+       }
+@@ -3014,21 +3016,28 @@ static int ice_xdp(struct net_device *dev, struct netdev_bpf *xdp)
+ {
+       struct ice_netdev_priv *np = netdev_priv(dev);
+       struct ice_vsi *vsi = np->vsi;
++      int ret;
+       if (vsi->type != ICE_VSI_PF) {
+               NL_SET_ERR_MSG_MOD(xdp->extack, "XDP can be loaded only on PF VSI");
+               return -EINVAL;
+       }
++      mutex_lock(&vsi->xdp_state_lock);
++
+       switch (xdp->command) {
+       case XDP_SETUP_PROG:
+-              return ice_xdp_setup_prog(vsi, xdp->prog, xdp->extack);
++              ret = ice_xdp_setup_prog(vsi, xdp->prog, xdp->extack);
++              break;
+       case XDP_SETUP_XSK_POOL:
+-              return ice_xsk_pool_setup(vsi, xdp->xsk.pool,
+-                                        xdp->xsk.queue_id);
++              ret = ice_xsk_pool_setup(vsi, xdp->xsk.pool, xdp->xsk.queue_id);
++              break;
+       default:
+-              return -EINVAL;
++              ret = -EINVAL;
+       }
++
++      mutex_unlock(&vsi->xdp_state_lock);
++      return ret;
+ }
+ /**
+diff --git a/drivers/net/ethernet/intel/ice/ice_xsk.c b/drivers/net/ethernet/intel/ice/ice_xsk.c
+index 67511153081a..9a9b8698881b 100644
+--- a/drivers/net/ethernet/intel/ice/ice_xsk.c
++++ b/drivers/net/ethernet/intel/ice/ice_xsk.c
+@@ -396,7 +396,8 @@ int ice_xsk_pool_setup(struct ice_vsi *vsi, struct xsk_buff_pool *pool, u16 qid)
+               goto failure;
+       }
+-      if_running = netif_running(vsi->netdev) && ice_is_xdp_ena_vsi(vsi);
++      if_running = !test_bit(ICE_VSI_DOWN, vsi->state) &&
++                   ice_is_xdp_ena_vsi(vsi);
+       if (if_running) {
+               struct ice_rx_ring *rx_ring = vsi->rx_rings[qid];
+-- 
+2.43.0
+
diff --git a/queue-6.6/igb-fix-not-clearing-timesync-interrupts-for-82580.patch b/queue-6.6/igb-fix-not-clearing-timesync-interrupts-for-82580.patch
new file mode 100644 (file)
index 0000000..087bb2f
--- /dev/null
@@ -0,0 +1,70 @@
+From 24d7dff49975709f412e8a681232f985ceaaf827 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 13 Aug 2024 21:55:53 -0700
+Subject: igb: Fix not clearing TimeSync interrupts for 82580
+
+From: Daiwei Li <daiweili@google.com>
+
+[ Upstream commit ba8cf80724dbc09825b52498e4efacb563935408 ]
+
+82580 NICs have a hardware bug that makes it
+necessary to write into the TSICR (TimeSync Interrupt Cause) register
+to clear it:
+https://lore.kernel.org/all/CDCB8BE0.1EC2C%25matthew.vick@intel.com/
+
+Add a conditional so only for 82580 we write into the TSICR register,
+so we don't risk losing events for other models.
+
+Without this change, when running ptp4l with an Intel 82580 card,
+I get the following output:
+
+> timed out while polling for tx timestamp increasing tx_timestamp_timeout or
+> increasing kworker priority may correct this issue, but a driver bug likely
+> causes it
+
+This goes away with this change.
+
+This (partially) reverts commit ee14cc9ea19b ("igb: Fix missing time sync events").
+
+Fixes: ee14cc9ea19b ("igb: Fix missing time sync events")
+Closes: https://lore.kernel.org/intel-wired-lan/CAN0jFd1kO0MMtOh8N2Ztxn6f7vvDKp2h507sMryobkBKe=xk=w@mail.gmail.com/
+Tested-by: Daiwei Li <daiweili@google.com>
+Suggested-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
+Signed-off-by: Daiwei Li <daiweili@google.com>
+Acked-by: Vinicius Costa Gomes <vinicius.gomes@intel.com>
+Reviewed-by: Kurt Kanzenbach <kurt@linutronix.de>
+Tested-by: Pucha Himasekhar Reddy <himasekharx.reddy.pucha@intel.com> (A Contingent worker at Intel)
+Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/igb/igb_main.c | 10 ++++++++++
+ 1 file changed, 10 insertions(+)
+
+diff --git a/drivers/net/ethernet/intel/igb/igb_main.c b/drivers/net/ethernet/intel/igb/igb_main.c
+index 8c8894ef3388..fa268d7bd1bc 100644
+--- a/drivers/net/ethernet/intel/igb/igb_main.c
++++ b/drivers/net/ethernet/intel/igb/igb_main.c
+@@ -6985,10 +6985,20 @@ static void igb_extts(struct igb_adapter *adapter, int tsintr_tt)
+ static void igb_tsync_interrupt(struct igb_adapter *adapter)
+ {
++      const u32 mask = (TSINTR_SYS_WRAP | E1000_TSICR_TXTS |
++                        TSINTR_TT0 | TSINTR_TT1 |
++                        TSINTR_AUTT0 | TSINTR_AUTT1);
+       struct e1000_hw *hw = &adapter->hw;
+       u32 tsicr = rd32(E1000_TSICR);
+       struct ptp_clock_event event;
++      if (hw->mac.type == e1000_82580) {
++              /* 82580 has a hardware bug that requires an explicit
++               * write to clear the TimeSync interrupt cause.
++               */
++              wr32(E1000_TSICR, tsicr & mask);
++      }
++
+       if (tsicr & TSINTR_SYS_WRAP) {
+               event.type = PTP_CLOCK_PPS;
+               if (adapter->ptp_caps.pps)
+-- 
+2.43.0
+
diff --git a/queue-6.6/igc-unlock-on-error-in-igc_io_resume.patch b/queue-6.6/igc-unlock-on-error-in-igc_io_resume.patch
new file mode 100644 (file)
index 0000000..cdb851c
--- /dev/null
@@ -0,0 +1,35 @@
+From 3ecc2a60e2470aa0b4395c57cfff3c00fb519bac Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 29 Aug 2024 22:22:45 +0300
+Subject: igc: Unlock on error in igc_io_resume()
+
+From: Dan Carpenter <dan.carpenter@linaro.org>
+
+[ Upstream commit ef4a99a0164e3972abb421cbb1b09ea6c61414df ]
+
+Call rtnl_unlock() on this error path, before returning.
+
+Fixes: bc23aa949aeb ("igc: Add pcie error handler support")
+Signed-off-by: Dan Carpenter <dan.carpenter@linaro.org>
+Reviewed-by: Gerhard Engleder <gerhard@engleder-embedded.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/ethernet/intel/igc/igc_main.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/ethernet/intel/igc/igc_main.c b/drivers/net/ethernet/intel/igc/igc_main.c
+index 21fb1a98ebca..da1018d83262 100644
+--- a/drivers/net/ethernet/intel/igc/igc_main.c
++++ b/drivers/net/ethernet/intel/igc/igc_main.c
+@@ -7288,6 +7288,7 @@ static void igc_io_resume(struct pci_dev *pdev)
+       rtnl_lock();
+       if (netif_running(netdev)) {
+               if (igc_open(netdev)) {
++                      rtnl_unlock();
+                       netdev_err(netdev, "igc_open failed after reset\n");
+                       return;
+               }
+-- 
+2.43.0
+
diff --git a/queue-6.6/input-ili210x-use-kvmalloc-to-allocate-buffer-for-fi.patch b/queue-6.6/input-ili210x-use-kvmalloc-to-allocate-buffer-for-fi.patch
new file mode 100644 (file)
index 0000000..3d113c5
--- /dev/null
@@ -0,0 +1,58 @@
+From 7e11972b6d03162c9e56c1496bf00902ccea5169 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 9 Jun 2024 16:47:53 -0700
+Subject: Input: ili210x - use kvmalloc() to allocate buffer for firmware
+ update
+
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+[ Upstream commit 17f5eebf6780eee50f887542e1833fda95f53e4d ]
+
+Allocating a contiguous buffer of 64K may fail if memory is sufficiently
+fragmented, and may cause OOM kill of an unrelated process. However we
+do not need to have contiguous memory. We also do not need to zero
+out the buffer since it will be overwritten with firmware data.
+
+Switch to using kvmalloc() instead of kzalloc().
+
+Link: https://lore.kernel.org/r/20240609234757.610273-1-dmitry.torokhov@gmail.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/touchscreen/ili210x.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/input/touchscreen/ili210x.c b/drivers/input/touchscreen/ili210x.c
+index ae7ba0c419f5..6a77babcf722 100644
+--- a/drivers/input/touchscreen/ili210x.c
++++ b/drivers/input/touchscreen/ili210x.c
+@@ -597,7 +597,7 @@ static int ili251x_firmware_to_buffer(const struct firmware *fw,
+        * once, copy them all into this buffer at the right locations, and then
+        * do all operations on this linear buffer.
+        */
+-      fw_buf = kzalloc(SZ_64K, GFP_KERNEL);
++      fw_buf = kvmalloc(SZ_64K, GFP_KERNEL);
+       if (!fw_buf)
+               return -ENOMEM;
+@@ -627,7 +627,7 @@ static int ili251x_firmware_to_buffer(const struct firmware *fw,
+       return 0;
+ err_big:
+-      kfree(fw_buf);
++      kvfree(fw_buf);
+       return error;
+ }
+@@ -870,7 +870,7 @@ static ssize_t ili210x_firmware_update_store(struct device *dev,
+       ili210x_hardware_reset(priv->reset_gpio);
+       dev_dbg(dev, "Firmware update ended, error=%i\n", error);
+       enable_irq(client->irq);
+-      kfree(fwbuf);
++      kvfree(fwbuf);
+       return error;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/input-uinput-reject-requests-with-unreasonable-numbe.patch b/queue-6.6/input-uinput-reject-requests-with-unreasonable-numbe.patch
new file mode 100644 (file)
index 0000000..05503b4
--- /dev/null
@@ -0,0 +1,59 @@
+From fc5c0f95ebdf01a8084d60bee86b105b960e543f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 4 Aug 2024 17:50:25 -0700
+Subject: Input: uinput - reject requests with unreasonable number of slots
+
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+[ Upstream commit 206f533a0a7c683982af473079c4111f4a0f9f5e ]
+
+From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+
+When exercising uinput interface syzkaller may try setting up device
+with a really large number of slots, which causes memory allocation
+failure in input_mt_init_slots(). While this allocation failure is
+handled properly and request is rejected, it results in syzkaller
+reports. Additionally, such request may put undue burden on the
+system which will try to free a lot of memory for a bogus request.
+
+Fix it by limiting allowed number of slots to 100. This can easily
+be extended if we see devices that can track more than 100 contacts.
+
+Reported-by: Tetsuo Handa <penguin-kernel@I-love.SAKURA.ne.jp>
+Reported-by: syzbot <syzbot+0122fa359a69694395d5@syzkaller.appspotmail.com>
+Closes: https://syzkaller.appspot.com/bug?extid=0122fa359a69694395d5
+Link: https://lore.kernel.org/r/Zqgi7NYEbpRsJfa2@google.com
+Signed-off-by: Dmitry Torokhov <dmitry.torokhov@gmail.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/input/misc/uinput.c | 14 ++++++++++++++
+ 1 file changed, 14 insertions(+)
+
+diff --git a/drivers/input/misc/uinput.c b/drivers/input/misc/uinput.c
+index d98212d55108..2c973f15cab7 100644
+--- a/drivers/input/misc/uinput.c
++++ b/drivers/input/misc/uinput.c
+@@ -417,6 +417,20 @@ static int uinput_validate_absinfo(struct input_dev *dev, unsigned int code,
+               return -EINVAL;
+       }
++      /*
++       * Limit number of contacts to a reasonable value (100). This
++       * ensures that we need less than 2 pages for struct input_mt
++       * (we are not using in-kernel slot assignment so not going to
++       * allocate memory for the "red" table), and we should have no
++       * trouble getting this much memory.
++       */
++      if (code == ABS_MT_SLOT && max > 99) {
++              printk(KERN_DEBUG
++                     "%s: unreasonably large number of slots requested: %d\n",
++                     UINPUT_NAME, max);
++              return -EINVAL;
++      }
++
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/iommu-sun50i-clear-bypass-register.patch b/queue-6.6/iommu-sun50i-clear-bypass-register.patch
new file mode 100644 (file)
index 0000000..3e25d1b
--- /dev/null
@@ -0,0 +1,43 @@
+From e76ca1b7590f636ca053a0af61ae1a8994aca3e2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 16 Jun 2024 23:40:52 +0100
+Subject: iommu: sun50i: clear bypass register
+
+From: Jernej Skrabec <jernej.skrabec@gmail.com>
+
+[ Upstream commit 927c70c93d929f4c2dcaf72f51b31bb7d118a51a ]
+
+The Allwinner H6 IOMMU has a bypass register, which allows to circumvent
+the page tables for each possible master. The reset value for this
+register is 0, which disables the bypass.
+The Allwinner H616 IOMMU resets this register to 0x7f, which activates
+the bypass for all masters, which is not what we want.
+
+Always clear this register to 0, to enforce the usage of page tables,
+and make this driver compatible with the H616 in this respect.
+
+Signed-off-by: Jernej Skrabec <jernej.skrabec@gmail.com>
+Signed-off-by: Andre Przywara <andre.przywara@arm.com>
+Reviewed-by: Chen-Yu Tsai <wens@csie.org>
+Link: https://lore.kernel.org/r/20240616224056.29159-2-andre.przywara@arm.com
+Signed-off-by: Joerg Roedel <jroedel@suse.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iommu/sun50i-iommu.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/iommu/sun50i-iommu.c b/drivers/iommu/sun50i-iommu.c
+index 74c5cb93e900..94bd7f25f6f2 100644
+--- a/drivers/iommu/sun50i-iommu.c
++++ b/drivers/iommu/sun50i-iommu.c
+@@ -449,6 +449,7 @@ static int sun50i_iommu_enable(struct sun50i_iommu *iommu)
+                   IOMMU_TLB_PREFETCH_MASTER_ENABLE(3) |
+                   IOMMU_TLB_PREFETCH_MASTER_ENABLE(4) |
+                   IOMMU_TLB_PREFETCH_MASTER_ENABLE(5));
++      iommu_write(iommu, IOMMU_BYPASS_REG, 0);
+       iommu_write(iommu, IOMMU_INT_ENABLE_REG, IOMMU_INT_MASK);
+       iommu_write(iommu, IOMMU_DM_AUT_CTRL_REG(SUN50I_IOMMU_ACI_NONE),
+                   IOMMU_DM_AUT_CTRL_RD_UNAVAIL(SUN50I_IOMMU_ACI_NONE, 0) |
+-- 
+2.43.0
+
diff --git a/queue-6.6/iommu-vt-d-handle-volatile-descriptor-status-read.patch b/queue-6.6/iommu-vt-d-handle-volatile-descriptor-status-read.patch
new file mode 100644 (file)
index 0000000..4e3d995
--- /dev/null
@@ -0,0 +1,56 @@
+From c7daa0de45ecd2725a69cf6097d528e822fb7356 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 2 Jul 2024 21:08:33 +0800
+Subject: iommu/vt-d: Handle volatile descriptor status read
+
+From: Jacob Pan <jacob.jun.pan@linux.intel.com>
+
+[ Upstream commit b5e86a95541cea737394a1da967df4cd4d8f7182 ]
+
+Queued invalidation wait descriptor status is volatile in that IOMMU
+hardware writes the data upon completion.
+
+Use READ_ONCE() to prevent compiler optimizations which ensures memory
+reads every time. As a side effect, READ_ONCE() also enforces strict
+types and may add an extra instruction. But it should not have negative
+performance impact since we use cpu_relax anyway and the extra time(by
+adding an instruction) may allow IOMMU HW request cacheline ownership
+easier.
+
+e.g. gcc 12.3
+BEFORE:
+       81 38 ad de 00 00       cmpl   $0x2,(%rax)
+
+AFTER (with READ_ONCE())
+    772f:       8b 00                   mov    (%rax),%eax
+    7731:       3d ad de 00 00          cmp    $0x2,%eax
+                                        //status data is 32 bit
+
+Signed-off-by: Jacob Pan <jacob.jun.pan@linux.intel.com>
+Reviewed-by: Kevin Tian <kevin.tian@intel.com>
+Reviewed-by: Yi Liu <yi.l.liu@intel.com>
+Link: https://lore.kernel.org/r/20240607173817.3914600-1-jacob.jun.pan@linux.intel.com
+Signed-off-by: Lu Baolu <baolu.lu@linux.intel.com>
+Link: https://lore.kernel.org/r/20240702130839.108139-2-baolu.lu@linux.intel.com
+Signed-off-by: Will Deacon <will@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/iommu/intel/dmar.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/iommu/intel/dmar.c b/drivers/iommu/intel/dmar.c
+index 23cb80d62a9a..84f0459e503c 100644
+--- a/drivers/iommu/intel/dmar.c
++++ b/drivers/iommu/intel/dmar.c
+@@ -1422,7 +1422,7 @@ int qi_submit_sync(struct intel_iommu *iommu, struct qi_desc *desc,
+        */
+       writel(qi->free_head << shift, iommu->reg + DMAR_IQT_REG);
+-      while (qi->desc_status[wait_index] != QI_DONE) {
++      while (READ_ONCE(qi->desc_status[wait_index]) != QI_DONE) {
+               /*
+                * We will leave the interrupts disabled, to prevent interrupt
+                * context to queue another cmd while a cmd is already submitted
+-- 
+2.43.0
+
diff --git a/queue-6.6/irqchip-armada-370-xp-do-not-allow-mapping-irq-0-and.patch b/queue-6.6/irqchip-armada-370-xp-do-not-allow-mapping-irq-0-and.patch
new file mode 100644 (file)
index 0000000..f0acfde
--- /dev/null
@@ -0,0 +1,46 @@
+From 134474f75c94c68c4b8b02c81aa2541a4063e79a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jun 2024 11:38:28 +0200
+Subject: irqchip/armada-370-xp: Do not allow mapping IRQ 0 and 1
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Pali Rohár <pali@kernel.org>
+
+[ Upstream commit 3cef738208e5c3cb7084e208caf9bbf684f24feb ]
+
+IRQs 0 (IPI) and 1 (MSI) are handled internally by this driver,
+generic_handle_domain_irq() is never called for these IRQs.
+
+Disallow mapping these IRQs.
+
+[ Marek: changed commit message ]
+
+Signed-off-by: Pali Rohár <pali@kernel.org>
+Signed-off-by: Marek Behún <kabel@kernel.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/irqchip/irq-armada-370-xp.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/drivers/irqchip/irq-armada-370-xp.c b/drivers/irqchip/irq-armada-370-xp.c
+index a55528469278..91a42e2d7a13 100644
+--- a/drivers/irqchip/irq-armada-370-xp.c
++++ b/drivers/irqchip/irq-armada-370-xp.c
+@@ -566,6 +566,10 @@ static struct irq_chip armada_370_xp_irq_chip = {
+ static int armada_370_xp_mpic_irq_map(struct irq_domain *h,
+                                     unsigned int virq, irq_hw_number_t hw)
+ {
++      /* IRQs 0 and 1 cannot be mapped, they are handled internally */
++      if (hw <= 1)
++              return -EINVAL;
++
+       armada_370_xp_irq_mask(irq_get_irq_data(virq));
+       if (!is_percpu_irq(hw))
+               writel(hw, per_cpu_int_base +
+-- 
+2.43.0
+
diff --git a/queue-6.6/irqchip-gic-v4-always-configure-affinity-on-vpe-acti.patch b/queue-6.6/irqchip-gic-v4-always-configure-affinity-on-vpe-acti.patch
new file mode 100644 (file)
index 0000000..7689431
--- /dev/null
@@ -0,0 +1,83 @@
+From b7b4c01a30352c370769a1966022a48d74d5d226 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jul 2024 10:31:53 +0100
+Subject: irqchip/gic-v4: Always configure affinity on VPE activation
+
+From: Marc Zyngier <maz@kernel.org>
+
+[ Upstream commit 7d2c2048a86477461f7bc75d064579ed349472bc ]
+
+There are currently two paths to set the initial affinity of a VPE:
+
+ - at activation time on GICv4 without the stupid VMOVP list, and
+   on GICv4.1
+
+ - at map time for GICv4 with VMOVP list
+
+The latter location may end-up modifying the affinity of VPE that is
+currently running, making the results unpredictible.
+
+Instead, unify the two paths, making sure to set the initial affinity only
+at activation time.
+
+Reported-by: Nianyao Tang <tangnianyao@huawei.com>
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Nianyao Tang <tangnianyao@huawei.com>
+Link: https://lore.kernel.org/r/20240705093155.871070-2-maz@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/irqchip/irq-gic-v3-its.c | 13 ++++---------
+ 1 file changed, 4 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
+index 350abbb36e04..e25dea0e50c7 100644
+--- a/drivers/irqchip/irq-gic-v3-its.c
++++ b/drivers/irqchip/irq-gic-v3-its.c
+@@ -1803,13 +1803,9 @@ static void its_map_vm(struct its_node *its, struct its_vm *vm)
+               for (i = 0; i < vm->nr_vpes; i++) {
+                       struct its_vpe *vpe = vm->vpes[i];
+-                      struct irq_data *d = irq_get_irq_data(vpe->irq);
+-                      /* Map the VPE to the first possible CPU */
+-                      vpe->col_idx = cpumask_first(cpu_online_mask);
+                       its_send_vmapp(its, vpe, true);
+                       its_send_vinvall(its, vpe);
+-                      irq_data_update_effective_affinity(d, cpumask_of(vpe->col_idx));
+               }
+       }
+@@ -4551,6 +4547,10 @@ static int its_vpe_irq_domain_activate(struct irq_domain *domain,
+       struct its_vpe *vpe = irq_data_get_irq_chip_data(d);
+       struct its_node *its;
++      /* Map the VPE to the first possible CPU */
++      vpe->col_idx = cpumask_first(cpu_online_mask);
++      irq_data_update_effective_affinity(d, cpumask_of(vpe->col_idx));
++
+       /*
+        * If we use the list map, we issue VMAPP on demand... Unless
+        * we're on a GICv4.1 and we eagerly map the VPE on all ITSs
+@@ -4559,9 +4559,6 @@ static int its_vpe_irq_domain_activate(struct irq_domain *domain,
+       if (!gic_requires_eager_mapping())
+               return 0;
+-      /* Map the VPE to the first possible CPU */
+-      vpe->col_idx = cpumask_first(cpu_online_mask);
+-
+       list_for_each_entry(its, &its_nodes, entry) {
+               if (!is_v4(its))
+                       continue;
+@@ -4570,8 +4567,6 @@ static int its_vpe_irq_domain_activate(struct irq_domain *domain,
+               its_send_vinvall(its, vpe);
+       }
+-      irq_data_update_effective_affinity(d, cpumask_of(vpe->col_idx));
+-
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/irqchip-gic-v4-make-sure-a-vpe-is-locked-when-vmapp-.patch b/queue-6.6/irqchip-gic-v4-make-sure-a-vpe-is-locked-when-vmapp-.patch
new file mode 100644 (file)
index 0000000..fd8b1db
--- /dev/null
@@ -0,0 +1,53 @@
+From 1a232324773145ff7ce59b6a1b52b3247223f9d4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 5 Jul 2024 10:31:55 +0100
+Subject: irqchip/gic-v4: Make sure a VPE is locked when VMAPP is issued
+
+From: Marc Zyngier <maz@kernel.org>
+
+[ Upstream commit a84a07fa3100d7ad46a3d6882af25a3df9c9e7e3 ]
+
+In order to make sure that vpe->col_idx is correctly sampled when a VMAPP
+command is issued, the vpe_lock must be held for the VPE. This is now
+possible since the introduction of the per-VM vmapp_lock, which can be
+taken before vpe_lock in the correct locking order.
+
+Signed-off-by: Marc Zyngier <maz@kernel.org>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Nianyao Tang <tangnianyao@huawei.com>
+Link: https://lore.kernel.org/r/20240705093155.871070-4-maz@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/irqchip/irq-gic-v3-its.c | 8 ++++++--
+ 1 file changed, 6 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/irqchip/irq-gic-v3-its.c b/drivers/irqchip/irq-gic-v3-its.c
+index e25dea0e50c7..1e0f0e1bf481 100644
+--- a/drivers/irqchip/irq-gic-v3-its.c
++++ b/drivers/irqchip/irq-gic-v3-its.c
+@@ -1804,7 +1804,9 @@ static void its_map_vm(struct its_node *its, struct its_vm *vm)
+               for (i = 0; i < vm->nr_vpes; i++) {
+                       struct its_vpe *vpe = vm->vpes[i];
+-                      its_send_vmapp(its, vpe, true);
++                      scoped_guard(raw_spinlock, &vpe->vpe_lock)
++                              its_send_vmapp(its, vpe, true);
++
+                       its_send_vinvall(its, vpe);
+               }
+       }
+@@ -1825,8 +1827,10 @@ static void its_unmap_vm(struct its_node *its, struct its_vm *vm)
+       if (!--vm->vlpi_count[its->list_nr]) {
+               int i;
+-              for (i = 0; i < vm->nr_vpes; i++)
++              for (i = 0; i < vm->nr_vpes; i++) {
++                      guard(raw_spinlock)(&vm->vpes[i]->vpe_lock);
+                       its_send_vmapp(its, vm->vpes[i], false);
++              }
+       }
+       raw_spin_unlock_irqrestore(&vmovp_lock, flags);
+-- 
+2.43.0
+
diff --git a/queue-6.6/jbd2-avoid-mount-failed-when-commit-block-is-partial.patch b/queue-6.6/jbd2-avoid-mount-failed-when-commit-block-is-partial.patch
new file mode 100644 (file)
index 0000000..60e0b1d
--- /dev/null
@@ -0,0 +1,94 @@
+From c47ac06855f97cb8eb4d94e198a56af1026f008c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jun 2024 15:24:05 +0800
+Subject: jbd2: avoid mount failed when commit block is partial submitted
+
+From: Ye Bin <yebin10@huawei.com>
+
+[ Upstream commit 0bab8db4152c4a2185a1367db09cc402bdc62d5e ]
+
+We encountered a problem that the file system could not be mounted in
+the power-off scenario. The analysis of the file system mirror shows that
+only part of the data is written to the last commit block.
+The valid data of the commit block is concentrated in the first sector.
+However, the data of the entire block is involved in the checksum calculation.
+For different hardware, the minimum atomic unit may be different.
+If the checksum of a committed block is incorrect, clear the data except the
+'commit_header' and then calculate the checksum. If the checkusm is correct,
+it is considered that the block is partially committed, Then continue to replay
+journal.
+
+Signed-off-by: Ye Bin <yebin10@huawei.com>
+Reviewed-by: Jan Kara <jack@suse.cz>
+Link: https://patch.msgid.link/20240620072405.3533701-1-yebin@huaweicloud.com
+Signed-off-by: Theodore Ts'o <tytso@mit.edu>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/jbd2/recovery.c | 30 ++++++++++++++++++++++++++++++
+ 1 file changed, 30 insertions(+)
+
+diff --git a/fs/jbd2/recovery.c b/fs/jbd2/recovery.c
+index 5b771a3d8d9a..421c0d360836 100644
+--- a/fs/jbd2/recovery.c
++++ b/fs/jbd2/recovery.c
+@@ -448,6 +448,27 @@ static int jbd2_commit_block_csum_verify(journal_t *j, void *buf)
+       return provided == cpu_to_be32(calculated);
+ }
++static bool jbd2_commit_block_csum_verify_partial(journal_t *j, void *buf)
++{
++      struct commit_header *h;
++      __be32 provided;
++      __u32 calculated;
++      void *tmpbuf;
++
++      tmpbuf = kzalloc(j->j_blocksize, GFP_KERNEL);
++      if (!tmpbuf)
++              return false;
++
++      memcpy(tmpbuf, buf, sizeof(struct commit_header));
++      h = tmpbuf;
++      provided = h->h_chksum[0];
++      h->h_chksum[0] = 0;
++      calculated = jbd2_chksum(j, j->j_csum_seed, tmpbuf, j->j_blocksize);
++      kfree(tmpbuf);
++
++      return provided == cpu_to_be32(calculated);
++}
++
+ static int jbd2_block_tag_csum_verify(journal_t *j, journal_block_tag_t *tag,
+                                     journal_block_tag3_t *tag3,
+                                     void *buf, __u32 sequence)
+@@ -814,6 +835,13 @@ static int do_one_pass(journal_t *journal,
+                       if (pass == PASS_SCAN &&
+                           !jbd2_commit_block_csum_verify(journal,
+                                                          bh->b_data)) {
++                              if (jbd2_commit_block_csum_verify_partial(
++                                                                journal,
++                                                                bh->b_data)) {
++                                      pr_notice("JBD2: Find incomplete commit block in transaction %u block %lu\n",
++                                                next_commit_ID, next_log_block);
++                                      goto chksum_ok;
++                              }
+                       chksum_error:
+                               if (commit_time < last_trans_commit_time)
+                                       goto ignore_crc_mismatch;
+@@ -828,6 +856,7 @@ static int do_one_pass(journal_t *journal,
+                               }
+                       }
+                       if (pass == PASS_SCAN) {
++                      chksum_ok:
+                               last_trans_commit_time = commit_time;
+                               head_block = next_log_block;
+                       }
+@@ -847,6 +876,7 @@ static int do_one_pass(journal_t *journal,
+                                         next_log_block);
+                               need_check_commit_time = true;
+                       }
++
+                       /* If we aren't in the REVOKE pass, then we can
+                        * just skip over this block. */
+                       if (pass != PASS_REVOKE) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/kselftests-dmabuf-heaps-ensure-the-driver-name-is-nu.patch b/queue-6.6/kselftests-dmabuf-heaps-ensure-the-driver-name-is-nu.patch
new file mode 100644 (file)
index 0000000..2bb2586
--- /dev/null
@@ -0,0 +1,55 @@
+From 06dd246e73ef89178f1cfbcc1857b006e4ac1d34 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jul 2024 10:46:04 +0800
+Subject: kselftests: dmabuf-heaps: Ensure the driver name is null-terminated
+
+From: Zenghui Yu <yuzenghui@huawei.com>
+
+[ Upstream commit 291e4baf70019f17a81b7b47aeb186b27d222159 ]
+
+Even if a vgem device is configured in, we will skip the import_vgem_fd()
+test almost every time.
+
+  TAP version 13
+  1..11
+  # Testing heap: system
+  # =======================================
+  # Testing allocation and importing:
+  ok 1 # SKIP Could not open vgem -1
+
+The problem is that we use the DRM_IOCTL_VERSION ioctl to query the driver
+version information but leave the name field a non-null-terminated string.
+Terminate it properly to actually test against the vgem device.
+
+While at it, let's check the length of the driver name is exactly 4 bytes
+and return early otherwise (in case there is a name like "vgemfoo" that
+gets converted to "vgem\0" unexpectedly).
+
+Signed-off-by: Zenghui Yu <yuzenghui@huawei.com>
+Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
+Link: https://patchwork.freedesktop.org/patch/msgid/20240729024604.2046-1-yuzenghui@huawei.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c b/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c
+index 890a8236a8ba..2809f9a25c43 100644
+--- a/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c
++++ b/tools/testing/selftests/dmabuf-heaps/dmabuf-heap.c
+@@ -28,9 +28,11 @@ static int check_vgem(int fd)
+       version.name = name;
+       ret = ioctl(fd, DRM_IOCTL_VERSION, &version);
+-      if (ret)
++      if (ret || version.name_len != 4)
+               return 0;
++      name[4] = '\0';
++
+       return !strcmp(name, "vgem");
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/leds-spi-byte-call-of_node_put-on-error-path.patch b/queue-6.6/leds-spi-byte-call-of_node_put-on-error-path.patch
new file mode 100644 (file)
index 0000000..ef0ff3c
--- /dev/null
@@ -0,0 +1,61 @@
+From 5921dee5641a56aab883d6f5a7c005ce2c373ae9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 20:29:18 +0300
+Subject: leds: spi-byte: Call of_node_put() on error path
+
+From: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+
+[ Upstream commit 7f9ab862e05c5bc755f65bf6db7edcffb3b49dfc ]
+
+Add a missing call to of_node_put(np) on error.
+
+Signed-off-by: Andy Shevchenko <andriy.shevchenko@linux.intel.com>
+Link: https://lore.kernel.org/r/20240606173037.3091598-2-andriy.shevchenko@linux.intel.com
+Signed-off-by: Lee Jones <lee@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/leds/leds-spi-byte.c | 6 +++++-
+ 1 file changed, 5 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/leds/leds-spi-byte.c b/drivers/leds/leds-spi-byte.c
+index 9d91f21842f2..afe9bff7c7c1 100644
+--- a/drivers/leds/leds-spi-byte.c
++++ b/drivers/leds/leds-spi-byte.c
+@@ -91,7 +91,6 @@ static int spi_byte_probe(struct spi_device *spi)
+               dev_err(dev, "Device must have exactly one LED sub-node.");
+               return -EINVAL;
+       }
+-      child = of_get_next_available_child(dev_of_node(dev), NULL);
+       led = devm_kzalloc(dev, sizeof(*led), GFP_KERNEL);
+       if (!led)
+@@ -107,11 +106,13 @@ static int spi_byte_probe(struct spi_device *spi)
+       led->ldev.max_brightness = led->cdef->max_value - led->cdef->off_value;
+       led->ldev.brightness_set_blocking = spi_byte_brightness_set_blocking;
++      child = of_get_next_available_child(dev_of_node(dev), NULL);
+       state = of_get_property(child, "default-state", NULL);
+       if (state) {
+               if (!strcmp(state, "on")) {
+                       led->ldev.brightness = led->ldev.max_brightness;
+               } else if (strcmp(state, "off")) {
++                      of_node_put(child);
+                       /* all other cases except "off" */
+                       dev_err(dev, "default-state can only be 'on' or 'off'");
+                       return -EINVAL;
+@@ -122,9 +123,12 @@ static int spi_byte_probe(struct spi_device *spi)
+       ret = devm_led_classdev_register(&spi->dev, &led->ldev);
+       if (ret) {
++              of_node_put(child);
+               mutex_destroy(&led->mutex);
+               return ret;
+       }
++
++      of_node_put(child);
+       spi_set_drvdata(spi, led);
+       return 0;
+-- 
+2.43.0
+
diff --git a/queue-6.6/lib-generic-radix-tree.c-fix-rare-race-in-__genradix.patch b/queue-6.6/lib-generic-radix-tree.c-fix-rare-race-in-__genradix.patch
new file mode 100644 (file)
index 0000000..d016a5c
--- /dev/null
@@ -0,0 +1,39 @@
+From e3d8282b07609393bdb33d3412c15567fd36646c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 10 Aug 2024 21:04:35 -0400
+Subject: lib/generic-radix-tree.c: Fix rare race in __genradix_ptr_alloc()
+
+From: Kent Overstreet <kent.overstreet@linux.dev>
+
+[ Upstream commit b2f11c6f3e1fc60742673b8675c95b78447f3dae ]
+
+If we need to increase the tree depth, allocate a new node, and then
+race with another thread that increased the tree depth before us, we'll
+still have a preallocated node that might be used later.
+
+If we then use that node for a new non-root node, it'll still have a
+pointer to the old root instead of being zeroed - fix this by zeroing it
+in the cmpxchg failure path.
+
+Signed-off-by: Kent Overstreet <kent.overstreet@linux.dev>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ lib/generic-radix-tree.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/lib/generic-radix-tree.c b/lib/generic-radix-tree.c
+index 7dfa88282b00..78f081d695d0 100644
+--- a/lib/generic-radix-tree.c
++++ b/lib/generic-radix-tree.c
+@@ -131,6 +131,8 @@ void *__genradix_ptr_alloc(struct __genradix *radix, size_t offset,
+               if ((v = cmpxchg_release(&radix->root, r, new_root)) == r) {
+                       v = new_root;
+                       new_node = NULL;
++              } else {
++                      new_node->children[0] = NULL;
+               }
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/libbpf-add-null-checks-to-bpf_object__-prev_map-next.patch b/queue-6.6/libbpf-add-null-checks-to-bpf_object__-prev_map-next.patch
new file mode 100644 (file)
index 0000000..b677ece
--- /dev/null
@@ -0,0 +1,59 @@
+From 3e678b113ec3381c458432884e60172c702a504c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jul 2024 10:34:36 +0200
+Subject: libbpf: Add NULL checks to bpf_object__{prev_map,next_map}
+
+From: Andreas Ziegler <ziegler.andreas@siemens.com>
+
+[ Upstream commit cedc12c5b57f7efa6dbebfb2b140e8675f5a2616 ]
+
+In the current state, an erroneous call to
+bpf_object__find_map_by_name(NULL, ...) leads to a segmentation
+fault through the following call chain:
+
+  bpf_object__find_map_by_name(obj = NULL, ...)
+  -> bpf_object__for_each_map(pos, obj = NULL)
+  -> bpf_object__next_map((obj = NULL), NULL)
+  -> return (obj = NULL)->maps
+
+While calling bpf_object__find_map_by_name with obj = NULL is
+obviously incorrect, this should not lead to a segmentation
+fault but rather be handled gracefully.
+
+As __bpf_map__iter already handles this situation correctly, we
+can delegate the check for the regular case there and only add
+a check in case the prev or next parameter is NULL.
+
+Signed-off-by: Andreas Ziegler <ziegler.andreas@siemens.com>
+Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
+Link: https://lore.kernel.org/bpf/20240703083436.505124-1-ziegler.andreas@siemens.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/lib/bpf/libbpf.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/tools/lib/bpf/libbpf.c b/tools/lib/bpf/libbpf.c
+index de35b9a21dad..ceed16a10285 100644
+--- a/tools/lib/bpf/libbpf.c
++++ b/tools/lib/bpf/libbpf.c
+@@ -9753,7 +9753,7 @@ __bpf_map__iter(const struct bpf_map *m, const struct bpf_object *obj, int i)
+ struct bpf_map *
+ bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *prev)
+ {
+-      if (prev == NULL)
++      if (prev == NULL && obj != NULL)
+               return obj->maps;
+       return __bpf_map__iter(prev, obj, 1);
+@@ -9762,7 +9762,7 @@ bpf_object__next_map(const struct bpf_object *obj, const struct bpf_map *prev)
+ struct bpf_map *
+ bpf_object__prev_map(const struct bpf_object *obj, const struct bpf_map *next)
+ {
+-      if (next == NULL) {
++      if (next == NULL && obj != NULL) {
+               if (!obj->nr_maps)
+                       return NULL;
+               return obj->maps + obj->nr_maps - 1;
+-- 
+2.43.0
+
diff --git a/queue-6.6/loongarch-use-correct-api-to-map-cmdline-in-relocate.patch b/queue-6.6/loongarch-use-correct-api-to-map-cmdline-in-relocate.patch
new file mode 100644 (file)
index 0000000..1864670
--- /dev/null
@@ -0,0 +1,53 @@
+From 62b8b2e1bf0f7139ba2cb07037f7d3291b514e5e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 20 Jul 2024 22:41:07 +0800
+Subject: LoongArch: Use correct API to map cmdline in relocate_kernel()
+
+From: Huacai Chen <chenhuacai@loongson.cn>
+
+[ Upstream commit 0124fbb4c6dba23dbdf80c829be68adbccde2722 ]
+
+fw_arg1 is in memory space rather than I/O space, so we should use
+early_memremap_ro() instead of early_ioremap() to map the cmdline.
+Moreover, we should unmap it after using.
+
+Suggested-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
+Reviewed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
+Signed-off-by: Huacai Chen <chenhuacai@loongson.cn>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/loongarch/kernel/relocate.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/arch/loongarch/kernel/relocate.c b/arch/loongarch/kernel/relocate.c
+index 1acfa704c8d0..0eddd4a66b87 100644
+--- a/arch/loongarch/kernel/relocate.c
++++ b/arch/loongarch/kernel/relocate.c
+@@ -13,6 +13,7 @@
+ #include <asm/bootinfo.h>
+ #include <asm/early_ioremap.h>
+ #include <asm/inst.h>
++#include <asm/io.h>
+ #include <asm/sections.h>
+ #include <asm/setup.h>
+@@ -170,7 +171,7 @@ unsigned long __init relocate_kernel(void)
+       unsigned long kernel_length;
+       unsigned long random_offset = 0;
+       void *location_new = _text; /* Default to original kernel start */
+-      char *cmdline = early_ioremap(fw_arg1, COMMAND_LINE_SIZE); /* Boot command line is passed in fw_arg1 */
++      char *cmdline = early_memremap_ro(fw_arg1, COMMAND_LINE_SIZE); /* Boot command line is passed in fw_arg1 */
+       strscpy(boot_command_line, cmdline, COMMAND_LINE_SIZE);
+@@ -182,6 +183,7 @@ unsigned long __init relocate_kernel(void)
+               random_offset = (unsigned long)location_new - (unsigned long)(_text);
+ #endif
+       reloc_offset = (unsigned long)_text - VMLINUX_LOAD_ADDRESS;
++      early_memunmap(cmdline, COMMAND_LINE_SIZE);
+       if (random_offset) {
+               kernel_length = (long)(_end) - (long)(_text);
+-- 
+2.43.0
+
diff --git a/queue-6.6/media-qcom-camss-add-check-for-v4l2_fwnode_endpoint_.patch b/queue-6.6/media-qcom-camss-add-check-for-v4l2_fwnode_endpoint_.patch
new file mode 100644 (file)
index 0000000..9bb0242
--- /dev/null
@@ -0,0 +1,39 @@
+From d739ab64755cbd5fcb01e630c9120eb015f4be61 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 21 Jun 2024 09:35:22 +0800
+Subject: media: qcom: camss: Add check for v4l2_fwnode_endpoint_parse
+
+From: Chen Ni <nichen@iscas.ac.cn>
+
+[ Upstream commit 4caf6d93d9f2c11d6441c64e1c549c445fa322ed ]
+
+Add check for the return value of v4l2_fwnode_endpoint_parse() and
+return the error if it fails in order to catch the error.
+
+Signed-off-by: Chen Ni <nichen@iscas.ac.cn>
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/platform/qcom/camss/camss.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/media/platform/qcom/camss/camss.c b/drivers/media/platform/qcom/camss/camss.c
+index c6df862c79e3..8fa6750b5b42 100644
+--- a/drivers/media/platform/qcom/camss/camss.c
++++ b/drivers/media/platform/qcom/camss/camss.c
+@@ -1038,8 +1038,11 @@ static int camss_of_parse_endpoint_node(struct device *dev,
+       struct v4l2_mbus_config_mipi_csi2 *mipi_csi2;
+       struct v4l2_fwnode_endpoint vep = { { 0 } };
+       unsigned int i;
++      int ret;
+-      v4l2_fwnode_endpoint_parse(of_fwnode_handle(node), &vep);
++      ret = v4l2_fwnode_endpoint_parse(of_fwnode_handle(node), &vep);
++      if (ret)
++              return ret;
+       csd->interface.csiphy_id = vep.base.port;
+-- 
+2.43.0
+
diff --git a/queue-6.6/media-vivid-don-t-set-hdmi-tx-controls-if-there-are-.patch b/queue-6.6/media-vivid-don-t-set-hdmi-tx-controls-if-there-are-.patch
new file mode 100644 (file)
index 0000000..6ddc7ae
--- /dev/null
@@ -0,0 +1,56 @@
+From e99545524130177b63b46f61992a21927333fdd4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 12:52:59 +0300
+Subject: media: vivid: don't set HDMI TX controls if there are no HDMI outputs
+
+From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+
+[ Upstream commit 17763960b1784578e8fe915304b330922f646209 ]
+
+When setting the EDID it would attempt to update two controls
+that are only present if there is an HDMI output configured.
+
+If there isn't any (e.g. when the vivid module is loaded with
+node_types=1), then calling VIDIOC_S_EDID would crash.
+
+Fix this by first checking if outputs are present.
+
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/test-drivers/vivid/vivid-vid-cap.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/media/test-drivers/vivid/vivid-vid-cap.c b/drivers/media/test-drivers/vivid/vivid-vid-cap.c
+index a81c17634daa..99325bfed643 100644
+--- a/drivers/media/test-drivers/vivid/vivid-vid-cap.c
++++ b/drivers/media/test-drivers/vivid/vivid-vid-cap.c
+@@ -1557,8 +1557,10 @@ int vidioc_s_edid(struct file *file, void *_fh,
+               return -EINVAL;
+       if (edid->blocks == 0) {
+               dev->edid_blocks = 0;
+-              v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, 0);
+-              v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, 0);
++              if (dev->num_outputs) {
++                      v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, 0);
++                      v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, 0);
++              }
+               phys_addr = CEC_PHYS_ADDR_INVALID;
+               goto set_phys_addr;
+       }
+@@ -1582,8 +1584,10 @@ int vidioc_s_edid(struct file *file, void *_fh,
+                       display_present |=
+                               dev->display_present[i] << j++;
+-      v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, display_present);
+-      v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, display_present);
++      if (dev->num_outputs) {
++              v4l2_ctrl_s_ctrl(dev->ctrl_tx_edid_present, display_present);
++              v4l2_ctrl_s_ctrl(dev->ctrl_tx_hotplug, display_present);
++      }
+ set_phys_addr:
+       /* TODO: a proper hotplug detect cycle should be emulated here */
+-- 
+2.43.0
+
diff --git a/queue-6.6/media-vivid-fix-wrong-sizeimage-value-for-mplane.patch b/queue-6.6/media-vivid-fix-wrong-sizeimage-value-for-mplane.patch
new file mode 100644 (file)
index 0000000..56ce8cf
--- /dev/null
@@ -0,0 +1,87 @@
+From 79dba129ce5314b51106ddd240c515614d2fdfdd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 26 Jun 2024 12:59:13 +0200
+Subject: media: vivid: fix wrong sizeimage value for mplane
+
+From: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+
+[ Upstream commit 0fd7c0c2c156270dceb8c15fad3120cdce03e539 ]
+
+In several places a division by fmt->vdownsampling[p] was
+missing in the sizeimage[p] calculation, causing incorrect
+behavior for multiplanar formats were some planes are smaller
+than the first plane.
+
+Found by new v4l2-compliance tests.
+
+Signed-off-by: Hans Verkuil <hverkuil-cisco@xs4all.nl>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/media/test-drivers/vivid/vivid-vid-cap.c |  5 +++--
+ drivers/media/test-drivers/vivid/vivid-vid-out.c | 16 +++++++++-------
+ 2 files changed, 12 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/media/test-drivers/vivid/vivid-vid-cap.c b/drivers/media/test-drivers/vivid/vivid-vid-cap.c
+index 3a06df35a2d7..a81c17634daa 100644
+--- a/drivers/media/test-drivers/vivid/vivid-vid-cap.c
++++ b/drivers/media/test-drivers/vivid/vivid-vid-cap.c
+@@ -106,8 +106,9 @@ static int vid_cap_queue_setup(struct vb2_queue *vq,
+               if (*nplanes != buffers)
+                       return -EINVAL;
+               for (p = 0; p < buffers; p++) {
+-                      if (sizes[p] < tpg_g_line_width(&dev->tpg, p) * h +
+-                                              dev->fmt_cap->data_offset[p])
++                      if (sizes[p] < tpg_g_line_width(&dev->tpg, p) * h /
++                                      dev->fmt_cap->vdownsampling[p] +
++                                      dev->fmt_cap->data_offset[p])
+                               return -EINVAL;
+               }
+       } else {
+diff --git a/drivers/media/test-drivers/vivid/vivid-vid-out.c b/drivers/media/test-drivers/vivid/vivid-vid-out.c
+index 184a6df2c29f..d05f547a587c 100644
+--- a/drivers/media/test-drivers/vivid/vivid-vid-out.c
++++ b/drivers/media/test-drivers/vivid/vivid-vid-out.c
+@@ -63,14 +63,16 @@ static int vid_out_queue_setup(struct vb2_queue *vq,
+               if (sizes[0] < size)
+                       return -EINVAL;
+               for (p = 1; p < planes; p++) {
+-                      if (sizes[p] < dev->bytesperline_out[p] * h +
+-                                     vfmt->data_offset[p])
++                      if (sizes[p] < dev->bytesperline_out[p] * h /
++                                      vfmt->vdownsampling[p] +
++                                      vfmt->data_offset[p])
+                               return -EINVAL;
+               }
+       } else {
+               for (p = 0; p < planes; p++)
+-                      sizes[p] = p ? dev->bytesperline_out[p] * h +
+-                                     vfmt->data_offset[p] : size;
++                      sizes[p] = p ? dev->bytesperline_out[p] * h /
++                                      vfmt->vdownsampling[p] +
++                                      vfmt->data_offset[p] : size;
+       }
+       if (vq->num_buffers + *nbuffers < 2)
+@@ -127,7 +129,7 @@ static int vid_out_buf_prepare(struct vb2_buffer *vb)
+       for (p = 0; p < planes; p++) {
+               if (p)
+-                      size = dev->bytesperline_out[p] * h;
++                      size = dev->bytesperline_out[p] * h / vfmt->vdownsampling[p];
+               size += vb->planes[p].data_offset;
+               if (vb2_get_plane_payload(vb, p) < size) {
+@@ -334,8 +336,8 @@ int vivid_g_fmt_vid_out(struct file *file, void *priv,
+       for (p = 0; p < mp->num_planes; p++) {
+               mp->plane_fmt[p].bytesperline = dev->bytesperline_out[p];
+               mp->plane_fmt[p].sizeimage =
+-                      mp->plane_fmt[p].bytesperline * mp->height +
+-                      fmt->data_offset[p];
++                      mp->plane_fmt[p].bytesperline * mp->height /
++                      fmt->vdownsampling[p] + fmt->data_offset[p];
+       }
+       for (p = fmt->buffers; p < fmt->planes; p++) {
+               unsigned stride = dev->bytesperline_out[p];
+-- 
+2.43.0
+
diff --git a/queue-6.6/mips-cevt-r4k-don-t-call-get_c0_compare_int-if-timer.patch b/queue-6.6/mips-cevt-r4k-don-t-call-get_c0_compare_int-if-timer.patch
new file mode 100644 (file)
index 0000000..bd84cf2
--- /dev/null
@@ -0,0 +1,78 @@
+From 4a3d8f32407311ecbf5bb2079c3aacfc8cda7f9f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 13 Aug 2024 10:59:08 +0100
+Subject: MIPS: cevt-r4k: Don't call get_c0_compare_int if timer irq is
+ installed
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Jiaxun Yang <jiaxun.yang@flygoat.com>
+
+[ Upstream commit 50f2b98dc83de7809a5c5bf0ccf9af2e75c37c13 ]
+
+This avoids warning:
+
+[    0.118053] BUG: sleeping function called from invalid context at kernel/locking/mutex.c:283
+
+Caused by get_c0_compare_int on secondary CPU.
+
+We also skipped saving IRQ number to struct clock_event_device *cd as
+it's never used by clockevent core, as per comments it's only meant
+for "non CPU local devices".
+
+Reported-by: Serge Semin <fancer.lancer@gmail.com>
+Closes: https://lore.kernel.org/linux-mips/6szkkqxpsw26zajwysdrwplpjvhl5abpnmxgu2xuj3dkzjnvsf@4daqrz4mf44k/
+Signed-off-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
+Reviewed-by: Philippe Mathieu-Daudé <philmd@linaro.org>
+Reviewed-by: Serge Semin <fancer.lancer@gmail.com>
+Tested-by: Serge Semin <fancer.lancer@gmail.com>
+Signed-off-by: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/mips/kernel/cevt-r4k.c | 15 +++++++--------
+ 1 file changed, 7 insertions(+), 8 deletions(-)
+
+diff --git a/arch/mips/kernel/cevt-r4k.c b/arch/mips/kernel/cevt-r4k.c
+index 368e8475870f..5f6e9e2ebbdb 100644
+--- a/arch/mips/kernel/cevt-r4k.c
++++ b/arch/mips/kernel/cevt-r4k.c
+@@ -303,13 +303,6 @@ int r4k_clockevent_init(void)
+       if (!c0_compare_int_usable())
+               return -ENXIO;
+-      /*
+-       * With vectored interrupts things are getting platform specific.
+-       * get_c0_compare_int is a hook to allow a platform to return the
+-       * interrupt number of its liking.
+-       */
+-      irq = get_c0_compare_int();
+-
+       cd = &per_cpu(mips_clockevent_device, cpu);
+       cd->name                = "MIPS";
+@@ -320,7 +313,6 @@ int r4k_clockevent_init(void)
+       min_delta               = calculate_min_delta();
+       cd->rating              = 300;
+-      cd->irq                 = irq;
+       cd->cpumask             = cpumask_of(cpu);
+       cd->set_next_event      = mips_next_event;
+       cd->event_handler       = mips_event_handler;
+@@ -332,6 +324,13 @@ int r4k_clockevent_init(void)
+       cp0_timer_irq_installed = 1;
++      /*
++       * With vectored interrupts things are getting platform specific.
++       * get_c0_compare_int is a hook to allow a platform to return the
++       * interrupt number of its liking.
++       */
++      irq = get_c0_compare_int();
++
+       if (request_irq(irq, c0_compare_interrupt, flags, "timer",
+                       c0_compare_interrupt))
+               pr_err("Failed to request irq %d (timer)\n", irq);
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-bridge-br_fdb_external_learn_add-always-set-ext_.patch b/queue-6.6/net-bridge-br_fdb_external_learn_add-always-set-ext_.patch
new file mode 100644 (file)
index 0000000..6a74745
--- /dev/null
@@ -0,0 +1,58 @@
+From 7c8b56598f4956617d6c1b3191ef1c9523d6e80a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Sep 2024 10:19:57 +0200
+Subject: net: bridge: br_fdb_external_learn_add(): always set EXT_LEARN
+
+From: Jonas Gorski <jonas.gorski@bisdn.de>
+
+[ Upstream commit bee2ef946d3184e99077be526567d791c473036f ]
+
+When userspace wants to take over a fdb entry by setting it as
+EXTERN_LEARNED, we set both flags BR_FDB_ADDED_BY_EXT_LEARN and
+BR_FDB_ADDED_BY_USER in br_fdb_external_learn_add().
+
+If the bridge updates the entry later because its port changed, we clear
+the BR_FDB_ADDED_BY_EXT_LEARN flag, but leave the BR_FDB_ADDED_BY_USER
+flag set.
+
+If userspace then wants to take over the entry again,
+br_fdb_external_learn_add() sees that BR_FDB_ADDED_BY_USER and skips
+setting the BR_FDB_ADDED_BY_EXT_LEARN flags, thus silently ignores the
+update.
+
+Fix this by always allowing to set BR_FDB_ADDED_BY_EXT_LEARN regardless
+if this was a user fdb entry or not.
+
+Fixes: 710ae7287737 ("net: bridge: Mark FDB entries that were added by user as such")
+Signed-off-by: Jonas Gorski <jonas.gorski@bisdn.de>
+Acked-by: Nikolay Aleksandrov <razor@blackwall.org>
+Reviewed-by: Ido Schimmel <idosch@nvidia.com>
+Link: https://patch.msgid.link/20240903081958.29951-1-jonas.gorski@bisdn.de
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/bridge/br_fdb.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/net/bridge/br_fdb.c b/net/bridge/br_fdb.c
+index e69a872bfc1d..a6d8cd9a5807 100644
+--- a/net/bridge/br_fdb.c
++++ b/net/bridge/br_fdb.c
+@@ -1425,12 +1425,10 @@ int br_fdb_external_learn_add(struct net_bridge *br, struct net_bridge_port *p,
+                       modified = true;
+               }
+-              if (test_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) {
++              if (test_and_set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags)) {
+                       /* Refresh entry */
+                       fdb->used = jiffies;
+-              } else if (!test_bit(BR_FDB_ADDED_BY_USER, &fdb->flags)) {
+-                      /* Take over SW learned entry */
+-                      set_bit(BR_FDB_ADDED_BY_EXT_LEARN, &fdb->flags);
++              } else {
+                       modified = true;
+               }
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-dpaa-avoid-on-stack-arrays-of-nr_cpus-elements.patch b/queue-6.6/net-dpaa-avoid-on-stack-arrays-of-nr_cpus-elements.patch
new file mode 100644 (file)
index 0000000..3b1f8b7
--- /dev/null
@@ -0,0 +1,132 @@
+From 0d0481511c5bb2eaeea4fc462a5e431c833e8764 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 14 Jul 2024 01:53:32 +0300
+Subject: net: dpaa: avoid on-stack arrays of NR_CPUS elements
+
+From: Vladimir Oltean <vladimir.oltean@nxp.com>
+
+[ Upstream commit 555a05d84ca2c587e2d4777006e2c2fb3dfbd91d ]
+
+The dpaa-eth driver is written for PowerPC and Arm SoCs which have 1-24
+CPUs. It depends on CONFIG_NR_CPUS having a reasonably small value in
+Kconfig. Otherwise, there are 2 functions which allocate on-stack arrays
+of NR_CPUS elements, and these can quickly explode in size, leading to
+warnings such as:
+
+  drivers/net/ethernet/freescale/dpaa/dpaa_eth.c:3280:12: warning:
+  stack frame size (16664) exceeds limit (2048) in 'dpaa_eth_probe' [-Wframe-larger-than]
+
+The problem is twofold:
+- Reducing the array size to the boot-time num_possible_cpus() (rather
+  than the compile-time NR_CPUS) creates a variable-length array,
+  which should be avoided in the Linux kernel.
+- Using NR_CPUS as an array size makes the driver blow up in stack
+  consumption with generic, as opposed to hand-crafted, .config files.
+
+A simple solution is to use dynamic allocation for num_possible_cpus()
+elements (aka a small number determined at runtime).
+
+Link: https://lore.kernel.org/all/202406261920.l5pzM1rj-lkp@intel.com/
+Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com>
+Reviewed-by: Breno Leitao <leitao@debian.org>
+Acked-by: Madalin Bucur <madalin.bucur@oss.nxp.com>
+Link: https://patch.msgid.link/20240713225336.1746343-2-vladimir.oltean@nxp.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ .../net/ethernet/freescale/dpaa/dpaa_eth.c    | 20 ++++++++++++++-----
+ .../ethernet/freescale/dpaa/dpaa_ethtool.c    | 10 +++++++++-
+ 2 files changed, 24 insertions(+), 6 deletions(-)
+
+diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+index dcbc598b11c6..c6a3eefd83bf 100644
+--- a/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
++++ b/drivers/net/ethernet/freescale/dpaa/dpaa_eth.c
+@@ -931,14 +931,18 @@ static inline void dpaa_setup_egress(const struct dpaa_priv *priv,
+       }
+ }
+-static void dpaa_fq_setup(struct dpaa_priv *priv,
+-                        const struct dpaa_fq_cbs *fq_cbs,
+-                        struct fman_port *tx_port)
++static int dpaa_fq_setup(struct dpaa_priv *priv,
++                       const struct dpaa_fq_cbs *fq_cbs,
++                       struct fman_port *tx_port)
+ {
+       int egress_cnt = 0, conf_cnt = 0, num_portals = 0, portal_cnt = 0, cpu;
+       const cpumask_t *affine_cpus = qman_affine_cpus();
+-      u16 channels[NR_CPUS];
+       struct dpaa_fq *fq;
++      u16 *channels;
++
++      channels = kcalloc(num_possible_cpus(), sizeof(u16), GFP_KERNEL);
++      if (!channels)
++              return -ENOMEM;
+       for_each_cpu_and(cpu, affine_cpus, cpu_online_mask)
+               channels[num_portals++] = qman_affine_channel(cpu);
+@@ -997,6 +1001,10 @@ static void dpaa_fq_setup(struct dpaa_priv *priv,
+                               break;
+               }
+       }
++
++      kfree(channels);
++
++      return 0;
+ }
+ static inline int dpaa_tx_fq_to_id(const struct dpaa_priv *priv,
+@@ -3416,7 +3424,9 @@ static int dpaa_eth_probe(struct platform_device *pdev)
+        */
+       dpaa_eth_add_channel(priv->channel, &pdev->dev);
+-      dpaa_fq_setup(priv, &dpaa_fq_cbs, priv->mac_dev->port[TX]);
++      err = dpaa_fq_setup(priv, &dpaa_fq_cbs, priv->mac_dev->port[TX]);
++      if (err)
++              goto free_dpaa_bps;
+       /* Create a congestion group for this netdev, with
+        * dynamically-allocated CGR ID.
+diff --git a/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c b/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c
+index 5bd0b36d1feb..3f8cd4a7d845 100644
+--- a/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c
++++ b/drivers/net/ethernet/freescale/dpaa/dpaa_ethtool.c
+@@ -457,12 +457,16 @@ static int dpaa_set_coalesce(struct net_device *dev,
+                            struct netlink_ext_ack *extack)
+ {
+       const cpumask_t *cpus = qman_affine_cpus();
+-      bool needs_revert[NR_CPUS] = {false};
+       struct qman_portal *portal;
+       u32 period, prev_period;
+       u8 thresh, prev_thresh;
++      bool *needs_revert;
+       int cpu, res;
++      needs_revert = kcalloc(num_possible_cpus(), sizeof(bool), GFP_KERNEL);
++      if (!needs_revert)
++              return -ENOMEM;
++
+       period = c->rx_coalesce_usecs;
+       thresh = c->rx_max_coalesced_frames;
+@@ -485,6 +489,8 @@ static int dpaa_set_coalesce(struct net_device *dev,
+               needs_revert[cpu] = true;
+       }
++      kfree(needs_revert);
++
+       return 0;
+ revert_values:
+@@ -498,6 +504,8 @@ static int dpaa_set_coalesce(struct net_device *dev,
+               qman_dqrr_set_ithresh(portal, prev_thresh);
+       }
++      kfree(needs_revert);
++
+       return res;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-dsa-vsc73xx-fix-possible-subblocks-range-of-capt.patch b/queue-6.6/net-dsa-vsc73xx-fix-possible-subblocks-range-of-capt.patch
new file mode 100644 (file)
index 0000000..99dd042
--- /dev/null
@@ -0,0 +1,62 @@
+From bc0fdce642b0d133ea8cc7ba527fe099f8c1497f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Sep 2024 22:33:41 +0200
+Subject: net: dsa: vsc73xx: fix possible subblocks range of CAPT block
+
+From: Pawel Dembicki <paweldembicki@gmail.com>
+
+[ Upstream commit 8e69c96df771ab469cec278edb47009351de4da6 ]
+
+CAPT block (CPU Capture Buffer) have 7 sublocks: 0-3, 4, 6, 7.
+Function 'vsc73xx_is_addr_valid' allows to use only block 0 at this
+moment.
+
+This patch fix it.
+
+Fixes: 05bd97fc559d ("net: dsa: Add Vitesse VSC73xx DSA router driver")
+Signed-off-by: Pawel Dembicki <paweldembicki@gmail.com>
+Reviewed-by: Florian Fainelli <florian.fainelli@broadcom.com>
+Link: https://patch.msgid.link/20240903203340.1518789-1-paweldembicki@gmail.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/dsa/vitesse-vsc73xx-core.c | 10 ++++++++--
+ 1 file changed, 8 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c
+index 23bd8b3f8993..a28bf5433ea7 100644
+--- a/drivers/net/dsa/vitesse-vsc73xx-core.c
++++ b/drivers/net/dsa/vitesse-vsc73xx-core.c
+@@ -34,7 +34,7 @@
+ #define VSC73XX_BLOCK_ANALYZER        0x2 /* Only subblock 0 */
+ #define VSC73XX_BLOCK_MII     0x3 /* Subblocks 0 and 1 */
+ #define VSC73XX_BLOCK_MEMINIT 0x3 /* Only subblock 2 */
+-#define VSC73XX_BLOCK_CAPTURE 0x4 /* Only subblock 2 */
++#define VSC73XX_BLOCK_CAPTURE 0x4 /* Subblocks 0-4, 6, 7 */
+ #define VSC73XX_BLOCK_ARBITER 0x5 /* Only subblock 0 */
+ #define VSC73XX_BLOCK_SYSTEM  0x7 /* Only subblock 0 */
+@@ -370,13 +370,19 @@ int vsc73xx_is_addr_valid(u8 block, u8 subblock)
+               break;
+       case VSC73XX_BLOCK_MII:
+-      case VSC73XX_BLOCK_CAPTURE:
+       case VSC73XX_BLOCK_ARBITER:
+               switch (subblock) {
+               case 0 ... 1:
+                       return 1;
+               }
+               break;
++      case VSC73XX_BLOCK_CAPTURE:
++              switch (subblock) {
++              case 0 ... 4:
++              case 6 ... 7:
++                      return 1;
++              }
++              break;
+       }
+       return 0;
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-phy-fix-missing-of_node_put-for-leds.patch b/queue-6.6/net-phy-fix-missing-of_node_put-for-leds.patch
new file mode 100644 (file)
index 0000000..217b5ad
--- /dev/null
@@ -0,0 +1,45 @@
+From 9ae8726a1ee5454c3ce5cb725cd0d1066f9df673 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 30 Aug 2024 10:20:25 +0800
+Subject: net: phy: Fix missing of_node_put() for leds
+
+From: Jinjie Ruan <ruanjinjie@huawei.com>
+
+[ Upstream commit 2560db6ede1aaf162a73b2df43e0b6c5ed8819f7 ]
+
+The call of of_get_child_by_name() will cause refcount incremented
+for leds, if it succeeds, it should call of_node_put() to decrease
+it, fix it.
+
+Fixes: 01e5b728e9e4 ("net: phy: Add a binding for PHY LEDs")
+Reviewed-by: Jonathan Cameron <Jonathan.Cameron@huawei.com>
+Signed-off-by: Jinjie Ruan <ruanjinjie@huawei.com>
+Reviewed-by: Andrew Lunn <andrew@lunn.ch>
+Link: https://patch.msgid.link/20240830022025.610844-1-ruanjinjie@huawei.com
+Signed-off-by: Paolo Abeni <pabeni@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/phy/phy_device.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
+index c895cd178e6a..2e4bff6055e2 100644
+--- a/drivers/net/phy/phy_device.c
++++ b/drivers/net/phy/phy_device.c
+@@ -3164,11 +3164,13 @@ static int of_phy_leds(struct phy_device *phydev)
+               err = of_phy_led(phydev, led);
+               if (err) {
+                       of_node_put(led);
++                      of_node_put(leds);
+                       phy_leds_unregister(phydev);
+                       return err;
+               }
+       }
++      of_node_put(leds);
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-socket-break-down-__sys_getsockopt.patch b/queue-6.6/net-socket-break-down-__sys_getsockopt.patch
new file mode 100644 (file)
index 0000000..0e5b637
--- /dev/null
@@ -0,0 +1,177 @@
+From 1bd8099b508f6ac73159922d67e7c3f37f6f0e6d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 16 Oct 2023 06:47:42 -0700
+Subject: net/socket: Break down __sys_getsockopt
+
+From: Breno Leitao <leitao@debian.org>
+
+[ Upstream commit 0b05b0cd78c92371fdde6333d006f39eaf9e0860 ]
+
+Split __sys_getsockopt() into two functions by removing the core
+logic into a sub-function (do_sock_getsockopt()). This will avoid
+code duplication when doing the same operation in other callers, for
+instance.
+
+do_sock_getsockopt() will be called by io_uring getsockopt() command
+operation in the following patch.
+
+The same was done for the setsockopt pair.
+
+Suggested-by: Martin KaFai Lau <martin.lau@linux.dev>
+Signed-off-by: Breno Leitao <leitao@debian.org>
+Acked-by: Jakub Kicinski <kuba@kernel.org>
+Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
+Link: https://lore.kernel.org/r/20231016134750.1381153-5-leitao@debian.org
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/bpf-cgroup.h |  2 +-
+ include/net/sock.h         |  4 +--
+ net/core/sock.c            |  8 -----
+ net/socket.c               | 64 ++++++++++++++++++++++++--------------
+ 4 files changed, 44 insertions(+), 34 deletions(-)
+
+diff --git a/include/linux/bpf-cgroup.h b/include/linux/bpf-cgroup.h
+index ebfd3c5a776a..2aa82b7aed89 100644
+--- a/include/linux/bpf-cgroup.h
++++ b/include/linux/bpf-cgroup.h
+@@ -379,7 +379,7 @@ static inline bool cgroup_bpf_sock_enabled(struct sock *sk,
+ ({                                                                           \
+       int __ret = 0;                                                         \
+       if (cgroup_bpf_enabled(CGROUP_GETSOCKOPT))                             \
+-              get_user(__ret, optlen);                                       \
++              copy_from_sockptr(&__ret, optlen, sizeof(int));                \
+       __ret;                                                                 \
+ })
+diff --git a/include/net/sock.h b/include/net/sock.h
+index bb010cc53b91..2a1aee503848 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -1877,11 +1877,11 @@ int sock_setsockopt(struct socket *sock, int level, int op,
+                   sockptr_t optval, unsigned int optlen);
+ int do_sock_setsockopt(struct socket *sock, bool compat, int level,
+                      int optname, sockptr_t optval, int optlen);
++int do_sock_getsockopt(struct socket *sock, bool compat, int level,
++                     int optname, sockptr_t optval, sockptr_t optlen);
+ int sk_getsockopt(struct sock *sk, int level, int optname,
+                 sockptr_t optval, sockptr_t optlen);
+-int sock_getsockopt(struct socket *sock, int level, int op,
+-                  char __user *optval, int __user *optlen);
+ int sock_gettstamp(struct socket *sock, void __user *userstamp,
+                  bool timeval, bool time32);
+ struct sk_buff *sock_alloc_send_pskb(struct sock *sk, unsigned long header_len,
+diff --git a/net/core/sock.c b/net/core/sock.c
+index 55d85d50b3e4..bc2a4e38dcea 100644
+--- a/net/core/sock.c
++++ b/net/core/sock.c
+@@ -2019,14 +2019,6 @@ int sk_getsockopt(struct sock *sk, int level, int optname,
+       return 0;
+ }
+-int sock_getsockopt(struct socket *sock, int level, int optname,
+-                  char __user *optval, int __user *optlen)
+-{
+-      return sk_getsockopt(sock->sk, level, optname,
+-                           USER_SOCKPTR(optval),
+-                           USER_SOCKPTR(optlen));
+-}
+-
+ /*
+  * Initialize an sk_lock.
+  *
+diff --git a/net/socket.c b/net/socket.c
+index aa563fc0cee4..d275f5f14882 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -2352,6 +2352,43 @@ SYSCALL_DEFINE5(setsockopt, int, fd, int, level, int, optname,
+ INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level,
+                                                        int optname));
++int do_sock_getsockopt(struct socket *sock, bool compat, int level,
++                     int optname, sockptr_t optval, sockptr_t optlen)
++{
++      int max_optlen __maybe_unused;
++      const struct proto_ops *ops;
++      int err;
++
++      err = security_socket_getsockopt(sock, level, optname);
++      if (err)
++              return err;
++
++      if (!compat)
++              max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen);
++
++      ops = READ_ONCE(sock->ops);
++      if (level == SOL_SOCKET) {
++              err = sk_getsockopt(sock->sk, level, optname, optval, optlen);
++      } else if (unlikely(!ops->getsockopt)) {
++              err = -EOPNOTSUPP;
++      } else {
++              if (WARN_ONCE(optval.is_kernel || optlen.is_kernel,
++                            "Invalid argument type"))
++                      return -EOPNOTSUPP;
++
++              err = ops->getsockopt(sock, level, optname, optval.user,
++                                    optlen.user);
++      }
++
++      if (!compat)
++              err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname,
++                                                   optval, optlen, max_optlen,
++                                                   err);
++
++      return err;
++}
++EXPORT_SYMBOL(do_sock_getsockopt);
++
+ /*
+  *    Get a socket option. Because we don't know the option lengths we have
+  *    to pass a user mode parameter for the protocols to sort out.
+@@ -2359,37 +2396,18 @@ INDIRECT_CALLABLE_DECLARE(bool tcp_bpf_bypass_getsockopt(int level,
+ int __sys_getsockopt(int fd, int level, int optname, char __user *optval,
+               int __user *optlen)
+ {
+-      int max_optlen __maybe_unused;
+-      const struct proto_ops *ops;
+       int err, fput_needed;
+       struct socket *sock;
++      bool compat;
+       sock = sockfd_lookup_light(fd, &err, &fput_needed);
+       if (!sock)
+               return err;
+-      err = security_socket_getsockopt(sock, level, optname);
+-      if (err)
+-              goto out_put;
++      compat = in_compat_syscall();
++      err = do_sock_getsockopt(sock, compat, level, optname,
++                               USER_SOCKPTR(optval), USER_SOCKPTR(optlen));
+-      if (!in_compat_syscall())
+-              max_optlen = BPF_CGROUP_GETSOCKOPT_MAX_OPTLEN(optlen);
+-
+-      ops = READ_ONCE(sock->ops);
+-      if (level == SOL_SOCKET)
+-              err = sock_getsockopt(sock, level, optname, optval, optlen);
+-      else if (unlikely(!ops->getsockopt))
+-              err = -EOPNOTSUPP;
+-      else
+-              err = ops->getsockopt(sock, level, optname, optval,
+-                                          optlen);
+-
+-      if (!in_compat_syscall())
+-              err = BPF_CGROUP_RUN_PROG_GETSOCKOPT(sock->sk, level, optname,
+-                                                   USER_SOCKPTR(optval),
+-                                                   USER_SOCKPTR(optlen),
+-                                                   max_optlen, err);
+-out_put:
+       fput_light(sock->file, fput_needed);
+       return err;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/net-socket-break-down-__sys_setsockopt.patch b/queue-6.6/net-socket-break-down-__sys_setsockopt.patch
new file mode 100644 (file)
index 0000000..032f0d0
--- /dev/null
@@ -0,0 +1,114 @@
+From e171533e1c23cbcea610ff19e599c40d94891a60 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 16 Oct 2023 06:47:41 -0700
+Subject: net/socket: Break down __sys_setsockopt
+
+From: Breno Leitao <leitao@debian.org>
+
+[ Upstream commit 1406245c29454ff84919736be83e14cdaba7fec1 ]
+
+Split __sys_setsockopt() into two functions by removing the core
+logic into a sub-function (do_sock_setsockopt()). This will avoid
+code duplication when doing the same operation in other callers, for
+instance.
+
+do_sock_setsockopt() will be called by io_uring setsockopt() command
+operation in the following patch.
+
+Signed-off-by: Breno Leitao <leitao@debian.org>
+Reviewed-by: Willem de Bruijn <willemb@google.com>
+Acked-by: Jakub Kicinski <kuba@kernel.org>
+Acked-by: Martin KaFai Lau <martin.lau@kernel.org>
+Link: https://lore.kernel.org/r/20231016134750.1381153-4-leitao@debian.org
+Signed-off-by: Jens Axboe <axboe@kernel.dk>
+Stable-dep-of: 33f339a1ba54 ("bpf, net: Fix a potential race in do_sock_getsockopt()")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/net/sock.h |  2 ++
+ net/socket.c       | 39 +++++++++++++++++++++++++--------------
+ 2 files changed, 27 insertions(+), 14 deletions(-)
+
+diff --git a/include/net/sock.h b/include/net/sock.h
+index 5942b5ff4c78..bb010cc53b91 100644
+--- a/include/net/sock.h
++++ b/include/net/sock.h
+@@ -1875,6 +1875,8 @@ int sk_setsockopt(struct sock *sk, int level, int optname,
+                 sockptr_t optval, unsigned int optlen);
+ int sock_setsockopt(struct socket *sock, int level, int op,
+                   sockptr_t optval, unsigned int optlen);
++int do_sock_setsockopt(struct socket *sock, bool compat, int level,
++                     int optname, sockptr_t optval, int optlen);
+ int sk_getsockopt(struct sock *sk, int level, int optname,
+                 sockptr_t optval, sockptr_t optlen);
+diff --git a/net/socket.c b/net/socket.c
+index f0f087004728..aa563fc0cee4 100644
+--- a/net/socket.c
++++ b/net/socket.c
+@@ -2281,31 +2281,21 @@ static bool sock_use_custom_sol_socket(const struct socket *sock)
+       return test_bit(SOCK_CUSTOM_SOCKOPT, &sock->flags);
+ }
+-/*
+- *    Set a socket option. Because we don't know the option lengths we have
+- *    to pass the user mode parameter for the protocols to sort out.
+- */
+-int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval,
+-              int optlen)
++int do_sock_setsockopt(struct socket *sock, bool compat, int level,
++                     int optname, sockptr_t optval, int optlen)
+ {
+-      sockptr_t optval = USER_SOCKPTR(user_optval);
+       const struct proto_ops *ops;
+       char *kernel_optval = NULL;
+-      int err, fput_needed;
+-      struct socket *sock;
++      int err;
+       if (optlen < 0)
+               return -EINVAL;
+-      sock = sockfd_lookup_light(fd, &err, &fput_needed);
+-      if (!sock)
+-              return err;
+-
+       err = security_socket_setsockopt(sock, level, optname);
+       if (err)
+               goto out_put;
+-      if (!in_compat_syscall())
++      if (!compat)
+               err = BPF_CGROUP_RUN_PROG_SETSOCKOPT(sock->sk, &level, &optname,
+                                                    optval, &optlen,
+                                                    &kernel_optval);
+@@ -2328,6 +2318,27 @@ int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval,
+                                           optlen);
+       kfree(kernel_optval);
+ out_put:
++      return err;
++}
++EXPORT_SYMBOL(do_sock_setsockopt);
++
++/* Set a socket option. Because we don't know the option lengths we have
++ * to pass the user mode parameter for the protocols to sort out.
++ */
++int __sys_setsockopt(int fd, int level, int optname, char __user *user_optval,
++                   int optlen)
++{
++      sockptr_t optval = USER_SOCKPTR(user_optval);
++      bool compat = in_compat_syscall();
++      int err, fput_needed;
++      struct socket *sock;
++
++      sock = sockfd_lookup_light(fd, &err, &fput_needed);
++      if (!sock)
++              return err;
++
++      err = do_sock_setsockopt(sock, compat, level, optname, optval, optlen);
++
+       fput_light(sock->file, fput_needed);
+       return err;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/netfilter-nf_conncount-fix-wrong-variable-type.patch b/queue-6.6/netfilter-nf_conncount-fix-wrong-variable-type.patch
new file mode 100644 (file)
index 0000000..41e0c60
--- /dev/null
@@ -0,0 +1,70 @@
+From 9fd01d3ed494ed636b0e081670672fd58fdd86b2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 31 May 2024 11:48:47 +0800
+Subject: netfilter: nf_conncount: fix wrong variable type
+
+From: Yunjian Wang <wangyunjian@huawei.com>
+
+[ Upstream commit 0b88d1654d556264bcd24a9cb6383f0888e30131 ]
+
+Now there is a issue is that code checks reports a warning: implicit
+narrowing conversion from type 'unsigned int' to small type 'u8' (the
+'keylen' variable). Fix it by removing the 'keylen' variable.
+
+Signed-off-by: Yunjian Wang <wangyunjian@huawei.com>
+Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/netfilter/nf_conncount.c | 8 +++-----
+ 1 file changed, 3 insertions(+), 5 deletions(-)
+
+diff --git a/net/netfilter/nf_conncount.c b/net/netfilter/nf_conncount.c
+index 5d8ed6c90b7e..5885810da412 100644
+--- a/net/netfilter/nf_conncount.c
++++ b/net/netfilter/nf_conncount.c
+@@ -321,7 +321,6 @@ insert_tree(struct net *net,
+       struct nf_conncount_rb *rbconn;
+       struct nf_conncount_tuple *conn;
+       unsigned int count = 0, gc_count = 0;
+-      u8 keylen = data->keylen;
+       bool do_gc = true;
+       spin_lock_bh(&nf_conncount_locks[hash]);
+@@ -333,7 +332,7 @@ insert_tree(struct net *net,
+               rbconn = rb_entry(*rbnode, struct nf_conncount_rb, node);
+               parent = *rbnode;
+-              diff = key_diff(key, rbconn->key, keylen);
++              diff = key_diff(key, rbconn->key, data->keylen);
+               if (diff < 0) {
+                       rbnode = &((*rbnode)->rb_left);
+               } else if (diff > 0) {
+@@ -378,7 +377,7 @@ insert_tree(struct net *net,
+       conn->tuple = *tuple;
+       conn->zone = *zone;
+-      memcpy(rbconn->key, key, sizeof(u32) * keylen);
++      memcpy(rbconn->key, key, sizeof(u32) * data->keylen);
+       nf_conncount_list_init(&rbconn->list);
+       list_add(&conn->node, &rbconn->list.head);
+@@ -403,7 +402,6 @@ count_tree(struct net *net,
+       struct rb_node *parent;
+       struct nf_conncount_rb *rbconn;
+       unsigned int hash;
+-      u8 keylen = data->keylen;
+       hash = jhash2(key, data->keylen, conncount_rnd) % CONNCOUNT_SLOTS;
+       root = &data->root[hash];
+@@ -414,7 +412,7 @@ count_tree(struct net *net,
+               rbconn = rb_entry(parent, struct nf_conncount_rb, node);
+-              diff = key_diff(key, rbconn->key, keylen);
++              diff = key_diff(key, rbconn->key, data->keylen);
+               if (diff < 0) {
+                       parent = rcu_dereference_raw(parent->rb_left);
+               } else if (diff > 0) {
+-- 
+2.43.0
+
diff --git a/queue-6.6/nfsv4-add-missing-rescheduling-points-in-nfs_client_.patch b/queue-6.6/nfsv4-add-missing-rescheduling-points-in-nfs_client_.patch
new file mode 100644 (file)
index 0000000..5e5f865
--- /dev/null
@@ -0,0 +1,44 @@
+From 57d379bdc89b9e7a22ca07b3ddb301b68e5b2de9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 21 Aug 2024 14:05:00 -0400
+Subject: NFSv4: Add missing rescheduling points in
+ nfs_client_return_marked_delegations
+
+From: Trond Myklebust <trond.myklebust@hammerspace.com>
+
+[ Upstream commit a017ad1313fc91bdf235097fd0a02f673fc7bb11 ]
+
+We're seeing reports of soft lockups when iterating through the loops,
+so let's add rescheduling points.
+
+Signed-off-by: Trond Myklebust <trond.myklebust@hammerspace.com>
+Reviewed-by: Jeff Layton <jlayton@kernel.org>
+Signed-off-by: Anna Schumaker <Anna.Schumaker@Netapp.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/nfs/super.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/fs/nfs/super.c b/fs/nfs/super.c
+index 0d6473cb00cb..f63513e477c5 100644
+--- a/fs/nfs/super.c
++++ b/fs/nfs/super.c
+@@ -47,6 +47,7 @@
+ #include <linux/vfs.h>
+ #include <linux/inet.h>
+ #include <linux/in6.h>
++#include <linux/sched.h>
+ #include <linux/slab.h>
+ #include <net/ipv6.h>
+ #include <linux/netdevice.h>
+@@ -223,6 +224,7 @@ static int __nfs_list_for_each_server(struct list_head *head,
+               ret = fn(server, data);
+               if (ret)
+                       goto out;
++              cond_resched();
+               rcu_read_lock();
+       }
+       rcu_read_unlock();
+-- 
+2.43.0
+
diff --git a/queue-6.6/of-irq-prevent-device-address-out-of-bounds-read-in-.patch b/queue-6.6/of-irq-prevent-device-address-out-of-bounds-read-in-.patch
new file mode 100644 (file)
index 0000000..59914e0
--- /dev/null
@@ -0,0 +1,131 @@
+From bcd530c518601af3be478f5bc3eba3e88b00efbb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 12 Aug 2024 12:06:51 +0200
+Subject: of/irq: Prevent device address out-of-bounds read in interrupt map
+ walk
+
+From: Stefan Wiehler <stefan.wiehler@nokia.com>
+
+[ Upstream commit b739dffa5d570b411d4bdf4bb9b8dfd6b7d72305 ]
+
+When of_irq_parse_raw() is invoked with a device address smaller than
+the interrupt parent node (from #address-cells property), KASAN detects
+the following out-of-bounds read when populating the initial match table
+(dyndbg="func of_irq_parse_* +p"):
+
+  OF: of_irq_parse_one: dev=/soc@0/picasso/watchdog, index=0
+  OF:  parent=/soc@0/pci@878000000000/gpio0@17,0, intsize=2
+  OF:  intspec=4
+  OF: of_irq_parse_raw: ipar=/soc@0/pci@878000000000/gpio0@17,0, size=2
+  OF:  -> addrsize=3
+  ==================================================================
+  BUG: KASAN: slab-out-of-bounds in of_irq_parse_raw+0x2b8/0x8d0
+  Read of size 4 at addr ffffff81beca5608 by task bash/764
+
+  CPU: 1 PID: 764 Comm: bash Tainted: G           O       6.1.67-484c613561-nokia_sm_arm64 #1
+  Hardware name: Unknown Unknown Product/Unknown Product, BIOS 2023.01-12.24.03-dirty 01/01/2023
+  Call trace:
+   dump_backtrace+0xdc/0x130
+   show_stack+0x1c/0x30
+   dump_stack_lvl+0x6c/0x84
+   print_report+0x150/0x448
+   kasan_report+0x98/0x140
+   __asan_load4+0x78/0xa0
+   of_irq_parse_raw+0x2b8/0x8d0
+   of_irq_parse_one+0x24c/0x270
+   parse_interrupts+0xc0/0x120
+   of_fwnode_add_links+0x100/0x2d0
+   fw_devlink_parse_fwtree+0x64/0xc0
+   device_add+0xb38/0xc30
+   of_device_add+0x64/0x90
+   of_platform_device_create_pdata+0xd0/0x170
+   of_platform_bus_create+0x244/0x600
+   of_platform_notify+0x1b0/0x254
+   blocking_notifier_call_chain+0x9c/0xd0
+   __of_changeset_entry_notify+0x1b8/0x230
+   __of_changeset_apply_notify+0x54/0xe4
+   of_overlay_fdt_apply+0xc04/0xd94
+   ...
+
+  The buggy address belongs to the object at ffffff81beca5600
+   which belongs to the cache kmalloc-128 of size 128
+  The buggy address is located 8 bytes inside of
+   128-byte region [ffffff81beca5600, ffffff81beca5680)
+
+  The buggy address belongs to the physical page:
+  page:00000000230d3d03 refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x1beca4
+  head:00000000230d3d03 order:1 compound_mapcount:0 compound_pincount:0
+  flags: 0x8000000000010200(slab|head|zone=2)
+  raw: 8000000000010200 0000000000000000 dead000000000122 ffffff810000c300
+  raw: 0000000000000000 0000000000200020 00000001ffffffff 0000000000000000
+  page dumped because: kasan: bad access detected
+
+  Memory state around the buggy address:
+   ffffff81beca5500: 04 fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+   ffffff81beca5580: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+  >ffffff81beca5600: 00 fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+                        ^
+   ffffff81beca5680: fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc fc
+   ffffff81beca5700: 00 00 00 00 00 00 fc fc fc fc fc fc fc fc fc fc
+  ==================================================================
+  OF:  -> got it !
+
+Prevent the out-of-bounds read by copying the device address into a
+buffer of sufficient size.
+
+Signed-off-by: Stefan Wiehler <stefan.wiehler@nokia.com>
+Link: https://lore.kernel.org/r/20240812100652.3800963-1-stefan.wiehler@nokia.com
+Signed-off-by: Rob Herring (Arm) <robh@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/of/irq.c | 15 +++++++++++----
+ 1 file changed, 11 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/of/irq.c b/drivers/of/irq.c
+index c94203ce65bb..8fd63100ba8f 100644
+--- a/drivers/of/irq.c
++++ b/drivers/of/irq.c
+@@ -344,7 +344,8 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar
+       struct device_node *p;
+       const __be32 *addr;
+       u32 intsize;
+-      int i, res;
++      int i, res, addr_len;
++      __be32 addr_buf[3] = { 0 };
+       pr_debug("of_irq_parse_one: dev=%pOF, index=%d\n", device, index);
+@@ -353,13 +354,19 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar
+               return of_irq_parse_oldworld(device, index, out_irq);
+       /* Get the reg property (if any) */
+-      addr = of_get_property(device, "reg", NULL);
++      addr = of_get_property(device, "reg", &addr_len);
++
++      /* Prevent out-of-bounds read in case of longer interrupt parent address size */
++      if (addr_len > (3 * sizeof(__be32)))
++              addr_len = 3 * sizeof(__be32);
++      if (addr)
++              memcpy(addr_buf, addr, addr_len);
+       /* Try the new-style interrupts-extended first */
+       res = of_parse_phandle_with_args(device, "interrupts-extended",
+                                       "#interrupt-cells", index, out_irq);
+       if (!res)
+-              return of_irq_parse_raw(addr, out_irq);
++              return of_irq_parse_raw(addr_buf, out_irq);
+       /* Look for the interrupt parent. */
+       p = of_irq_find_parent(device);
+@@ -389,7 +396,7 @@ int of_irq_parse_one(struct device_node *device, int index, struct of_phandle_ar
+       /* Check if there are any interrupt-map translations to process */
+-      res = of_irq_parse_raw(addr, out_irq);
++      res = of_irq_parse_raw(addr_buf, out_irq);
+  out:
+       of_node_put(p);
+       return res;
+-- 
+2.43.0
+
diff --git a/queue-6.6/pci-add-missing-bridge-lock-to-pci_bus_lock.patch b/queue-6.6/pci-add-missing-bridge-lock-to-pci_bus_lock.patch
new file mode 100644 (file)
index 0000000..9cadccf
--- /dev/null
@@ -0,0 +1,163 @@
+From ece3add38b396b2fc580904ac21a07a95b013b5e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 30 May 2024 18:04:35 -0700
+Subject: PCI: Add missing bridge lock to pci_bus_lock()
+
+From: Dan Williams <dan.j.williams@intel.com>
+
+[ Upstream commit a4e772898f8bf2e7e1cf661a12c60a5612c4afab ]
+
+One of the true positives that the cfg_access_lock lockdep effort
+identified is this sequence:
+
+  WARNING: CPU: 14 PID: 1 at drivers/pci/pci.c:4886 pci_bridge_secondary_bus_reset+0x5d/0x70
+  RIP: 0010:pci_bridge_secondary_bus_reset+0x5d/0x70
+  Call Trace:
+   <TASK>
+   ? __warn+0x8c/0x190
+   ? pci_bridge_secondary_bus_reset+0x5d/0x70
+   ? report_bug+0x1f8/0x200
+   ? handle_bug+0x3c/0x70
+   ? exc_invalid_op+0x18/0x70
+   ? asm_exc_invalid_op+0x1a/0x20
+   ? pci_bridge_secondary_bus_reset+0x5d/0x70
+   pci_reset_bus+0x1d8/0x270
+   vmd_probe+0x778/0xa10
+   pci_device_probe+0x95/0x120
+
+Where pci_reset_bus() users are triggering unlocked secondary bus resets.
+Ironically pci_bus_reset(), several calls down from pci_reset_bus(), uses
+pci_bus_lock() before issuing the reset which locks everything *but* the
+bridge itself.
+
+For the same motivation as adding:
+
+  bridge = pci_upstream_bridge(dev);
+  if (bridge)
+    pci_dev_lock(bridge);
+
+to pci_reset_function() for the "bus" and "cxl_bus" reset cases, add
+pci_dev_lock() for @bus->self to pci_bus_lock().
+
+Link: https://lore.kernel.org/r/171711747501.1628941.15217746952476635316.stgit@dwillia2-xfh.jf.intel.com
+Reported-by: Imre Deak <imre.deak@intel.com>
+Closes: http://lore.kernel.org/r/6657833b3b5ae_14984b29437@dwillia2-xfh.jf.intel.com.notmuch
+Signed-off-by: Dan Williams <dan.j.williams@intel.com>
+Signed-off-by: Keith Busch <kbusch@kernel.org>
+[bhelgaas: squash in recursive locking deadlock fix from Keith Busch:
+https://lore.kernel.org/r/20240711193650.701834-1-kbusch@meta.com]
+Signed-off-by: Bjorn Helgaas <bhelgaas@google.com>
+Tested-by: Hans de Goede <hdegoede@redhat.com>
+Tested-by: Kalle Valo <kvalo@kernel.org>
+Reviewed-by: Dave Jiang <dave.jiang@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/pci.c | 35 +++++++++++++++++++++--------------
+ 1 file changed, 21 insertions(+), 14 deletions(-)
+
+diff --git a/drivers/pci/pci.c b/drivers/pci/pci.c
+index a0f961a380fa..53e9e9788bd5 100644
+--- a/drivers/pci/pci.c
++++ b/drivers/pci/pci.c
+@@ -5718,10 +5718,12 @@ static void pci_bus_lock(struct pci_bus *bus)
+ {
+       struct pci_dev *dev;
++      pci_dev_lock(bus->self);
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+-              pci_dev_lock(dev);
+               if (dev->subordinate)
+                       pci_bus_lock(dev->subordinate);
++              else
++                      pci_dev_lock(dev);
+       }
+ }
+@@ -5733,8 +5735,10 @@ static void pci_bus_unlock(struct pci_bus *bus)
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+               if (dev->subordinate)
+                       pci_bus_unlock(dev->subordinate);
+-              pci_dev_unlock(dev);
++              else
++                      pci_dev_unlock(dev);
+       }
++      pci_dev_unlock(bus->self);
+ }
+ /* Return 1 on successful lock, 0 on contention */
+@@ -5742,15 +5746,15 @@ static int pci_bus_trylock(struct pci_bus *bus)
+ {
+       struct pci_dev *dev;
++      if (!pci_dev_trylock(bus->self))
++              return 0;
++
+       list_for_each_entry(dev, &bus->devices, bus_list) {
+-              if (!pci_dev_trylock(dev))
+-                      goto unlock;
+               if (dev->subordinate) {
+-                      if (!pci_bus_trylock(dev->subordinate)) {
+-                              pci_dev_unlock(dev);
++                      if (!pci_bus_trylock(dev->subordinate))
+                               goto unlock;
+-                      }
+-              }
++              } else if (!pci_dev_trylock(dev))
++                      goto unlock;
+       }
+       return 1;
+@@ -5758,8 +5762,10 @@ static int pci_bus_trylock(struct pci_bus *bus)
+       list_for_each_entry_continue_reverse(dev, &bus->devices, bus_list) {
+               if (dev->subordinate)
+                       pci_bus_unlock(dev->subordinate);
+-              pci_dev_unlock(dev);
++              else
++                      pci_dev_unlock(dev);
+       }
++      pci_dev_unlock(bus->self);
+       return 0;
+ }
+@@ -5791,9 +5797,10 @@ static void pci_slot_lock(struct pci_slot *slot)
+       list_for_each_entry(dev, &slot->bus->devices, bus_list) {
+               if (!dev->slot || dev->slot != slot)
+                       continue;
+-              pci_dev_lock(dev);
+               if (dev->subordinate)
+                       pci_bus_lock(dev->subordinate);
++              else
++                      pci_dev_lock(dev);
+       }
+ }
+@@ -5819,14 +5826,13 @@ static int pci_slot_trylock(struct pci_slot *slot)
+       list_for_each_entry(dev, &slot->bus->devices, bus_list) {
+               if (!dev->slot || dev->slot != slot)
+                       continue;
+-              if (!pci_dev_trylock(dev))
+-                      goto unlock;
+               if (dev->subordinate) {
+                       if (!pci_bus_trylock(dev->subordinate)) {
+                               pci_dev_unlock(dev);
+                               goto unlock;
+                       }
+-              }
++              } else if (!pci_dev_trylock(dev))
++                      goto unlock;
+       }
+       return 1;
+@@ -5837,7 +5843,8 @@ static int pci_slot_trylock(struct pci_slot *slot)
+                       continue;
+               if (dev->subordinate)
+                       pci_bus_unlock(dev->subordinate);
+-              pci_dev_unlock(dev);
++              else
++                      pci_dev_unlock(dev);
+       }
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/pci-hotplug-pnv_php-fix-hotplug-driver-crash-on-powe.patch b/queue-6.6/pci-hotplug-pnv_php-fix-hotplug-driver-crash-on-powe.patch
new file mode 100644 (file)
index 0000000..d37637e
--- /dev/null
@@ -0,0 +1,58 @@
+From 3be6737ae57c2d95cce132fe2ca1d3bd2e5b4d31 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 1 Jul 2024 13:15:06 +0530
+Subject: pci/hotplug/pnv_php: Fix hotplug driver crash on Powernv
+
+From: Krishna Kumar <krishnak@linux.ibm.com>
+
+[ Upstream commit 335e35b748527f0c06ded9eebb65387f60647fda ]
+
+The hotplug driver for powerpc (pci/hotplug/pnv_php.c) causes a kernel
+crash when we try to hot-unplug/disable the PCIe switch/bridge from
+the PHB.
+
+The crash occurs because although the MSI data structure has been
+released during disable/hot-unplug path and it has been assigned
+with NULL, still during unregistration the code was again trying to
+explicitly disable the MSI which causes the NULL pointer dereference and
+kernel crash.
+
+The patch fixes the check during unregistration path to prevent invoking
+pci_disable_msi/msix() since its data structure is already freed.
+
+Reported-by: Timothy Pearson <tpearson@raptorengineering.com>
+Closes: https://lore.kernel.org/all/1981605666.2142272.1703742465927.JavaMail.zimbra@raptorengineeringinc.com/
+Acked-by: Bjorn Helgaas <bhelgaas@google.com>
+Tested-by: Shawn Anastasio <sanastasio@raptorengineering.com>
+Signed-off-by: Krishna Kumar <krishnak@linux.ibm.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://msgid.link/20240701074513.94873-2-krishnak@linux.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/hotplug/pnv_php.c | 3 +--
+ 1 file changed, 1 insertion(+), 2 deletions(-)
+
+diff --git a/drivers/pci/hotplug/pnv_php.c b/drivers/pci/hotplug/pnv_php.c
+index 881d420637bf..092c9ac0d26d 100644
+--- a/drivers/pci/hotplug/pnv_php.c
++++ b/drivers/pci/hotplug/pnv_php.c
+@@ -39,7 +39,6 @@ static void pnv_php_disable_irq(struct pnv_php_slot *php_slot,
+                               bool disable_device)
+ {
+       struct pci_dev *pdev = php_slot->pdev;
+-      int irq = php_slot->irq;
+       u16 ctrl;
+       if (php_slot->irq > 0) {
+@@ -58,7 +57,7 @@ static void pnv_php_disable_irq(struct pnv_php_slot *php_slot,
+               php_slot->wq = NULL;
+       }
+-      if (disable_device || irq > 0) {
++      if (disable_device) {
+               if (pdev->msix_enabled)
+                       pci_disable_msix(pdev);
+               else if (pdev->msi_enabled)
+-- 
+2.43.0
+
diff --git a/queue-6.6/pci-keystone-add-workaround-for-errata-i2037-am65x-s.patch b/queue-6.6/pci-keystone-add-workaround-for-errata-i2037-am65x-s.patch
new file mode 100644 (file)
index 0000000..c606230
--- /dev/null
@@ -0,0 +1,129 @@
+From 3a85bd4e0c43ef85c5b96298544ec813f019d802 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jun 2024 13:45:29 +0200
+Subject: PCI: keystone: Add workaround for Errata #i2037 (AM65x SR 1.0)
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Kishon Vijay Abraham I <kishon@ti.com>
+
+[ Upstream commit 86f271f22bbb6391410a07e08d6ca3757fda01fa ]
+
+Errata #i2037 in AM65x/DRA80xM Processors Silicon Revision 1.0
+(SPRZ452D_July 2018_Revised December 2019 [1]) mentions when an
+inbound PCIe TLP spans more than two internal AXI 128-byte bursts,
+the bus may corrupt the packet payload and the corrupt data may
+cause associated applications or the processor to hang.
+
+The workaround for Errata #i2037 is to limit the maximum read
+request size and maximum payload size to 128 bytes. Add workaround
+for Errata #i2037 here.
+
+The errata and workaround is applicable only to AM65x SR 1.0 and
+later versions of the silicon will have this fixed.
+
+[1] -> https://www.ti.com/lit/er/sprz452i/sprz452i.pdf
+
+Link: https://lore.kernel.org/linux-pci/16e1fcae-1ea7-46be-b157-096e05661b15@siemens.com
+Signed-off-by: Kishon Vijay Abraham I <kishon@ti.com>
+Signed-off-by: Achal Verma <a-verma1@ti.com>
+Signed-off-by: Vignesh Raghavendra <vigneshr@ti.com>
+Signed-off-by: Jan Kiszka <jan.kiszka@siemens.com>
+Signed-off-by: Krzysztof Wilczyński <kwilczynski@kernel.org>
+Reviewed-by: Siddharth Vadapalli <s-vadapalli@ti.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pci/controller/dwc/pci-keystone.c | 44 ++++++++++++++++++++++-
+ 1 file changed, 43 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c
+index 54a3c7f29f78..c1dedc83759c 100644
+--- a/drivers/pci/controller/dwc/pci-keystone.c
++++ b/drivers/pci/controller/dwc/pci-keystone.c
+@@ -34,6 +34,11 @@
+ #define PCIE_DEVICEID_SHIFT   16
+ /* Application registers */
++#define PID                           0x000
++#define RTL                           GENMASK(15, 11)
++#define RTL_SHIFT                     11
++#define AM6_PCI_PG1_RTL_VER           0x15
++
+ #define CMD_STATUS                    0x004
+ #define LTSSM_EN_VAL                  BIT(0)
+ #define OB_XLAT_EN_VAL                        BIT(1)
+@@ -104,6 +109,8 @@
+ #define to_keystone_pcie(x)           dev_get_drvdata((x)->dev)
++#define PCI_DEVICE_ID_TI_AM654X               0xb00c
++
+ struct ks_pcie_of_data {
+       enum dw_pcie_device_mode mode;
+       const struct dw_pcie_host_ops *host_ops;
+@@ -518,7 +525,11 @@ static int ks_pcie_start_link(struct dw_pcie *pci)
+ static void ks_pcie_quirk(struct pci_dev *dev)
+ {
+       struct pci_bus *bus = dev->bus;
++      struct keystone_pcie *ks_pcie;
++      struct device *bridge_dev;
+       struct pci_dev *bridge;
++      u32 val;
++
+       static const struct pci_device_id rc_pci_devids[] = {
+               { PCI_DEVICE(PCI_VENDOR_ID_TI, PCIE_RC_K2HK),
+                .class = PCI_CLASS_BRIDGE_PCI_NORMAL, .class_mask = ~0, },
+@@ -530,6 +541,11 @@ static void ks_pcie_quirk(struct pci_dev *dev)
+                .class = PCI_CLASS_BRIDGE_PCI_NORMAL, .class_mask = ~0, },
+               { 0, },
+       };
++      static const struct pci_device_id am6_pci_devids[] = {
++              { PCI_DEVICE(PCI_VENDOR_ID_TI, PCI_DEVICE_ID_TI_AM654X),
++               .class = PCI_CLASS_BRIDGE_PCI << 8, .class_mask = ~0, },
++              { 0, },
++      };
+       if (pci_is_root_bus(bus))
+               bridge = dev;
+@@ -551,10 +567,36 @@ static void ks_pcie_quirk(struct pci_dev *dev)
+        */
+       if (pci_match_id(rc_pci_devids, bridge)) {
+               if (pcie_get_readrq(dev) > 256) {
+-                      dev_info(&dev->dev, "limiting MRRS to 256\n");
++                      dev_info(&dev->dev, "limiting MRRS to 256 bytes\n");
+                       pcie_set_readrq(dev, 256);
+               }
+       }
++
++      /*
++       * Memory transactions fail with PCI controller in AM654 PG1.0
++       * when MRRS is set to more than 128 bytes. Force the MRRS to
++       * 128 bytes in all downstream devices.
++       */
++      if (pci_match_id(am6_pci_devids, bridge)) {
++              bridge_dev = pci_get_host_bridge_device(dev);
++              if (!bridge_dev && !bridge_dev->parent)
++                      return;
++
++              ks_pcie = dev_get_drvdata(bridge_dev->parent);
++              if (!ks_pcie)
++                      return;
++
++              val = ks_pcie_app_readl(ks_pcie, PID);
++              val &= RTL;
++              val >>= RTL_SHIFT;
++              if (val != AM6_PCI_PG1_RTL_VER)
++                      return;
++
++              if (pcie_get_readrq(dev) > 128) {
++                      dev_info(&dev->dev, "limiting MRRS to 128 bytes\n");
++                      pcie_set_readrq(dev, 128);
++              }
++      }
+ }
+ DECLARE_PCI_FIXUP_ENABLE(PCI_ANY_ID, PCI_ANY_ID, ks_pcie_quirk);
+-- 
+2.43.0
+
diff --git a/queue-6.6/pcmcia-use-resource_size-function-on-resource-object.patch b/queue-6.6/pcmcia-use-resource_size-function-on-resource-object.patch
new file mode 100644 (file)
index 0000000..9f610a6
--- /dev/null
@@ -0,0 +1,46 @@
+From 3b6146fbb3c6c6ae3dee7f5df25f8613a4e72e56 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sun, 12 May 2024 23:31:21 +0100
+Subject: pcmcia: Use resource_size function on resource object
+
+From: Jules Irenge <jbi.octave@gmail.com>
+
+[ Upstream commit 24a025497e7e883bd2adef5d0ece1e9b9268009f ]
+
+Cocinnele reports a warning
+
+WARNING: Suspicious code. resource_size is maybe missing with root
+
+The root cause is the function resource_size is not used when needed
+
+Use resource_size() on variable "root" of type resource
+
+Signed-off-by: Jules Irenge <jbi.octave@gmail.com>
+Signed-off-by: Dominik Brodowski <linux@dominikbrodowski.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/pcmcia/yenta_socket.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/pcmcia/yenta_socket.c b/drivers/pcmcia/yenta_socket.c
+index 1365eaa20ff4..ff169124929c 100644
+--- a/drivers/pcmcia/yenta_socket.c
++++ b/drivers/pcmcia/yenta_socket.c
+@@ -638,11 +638,11 @@ static int yenta_search_one_res(struct resource *root, struct resource *res,
+               start = PCIBIOS_MIN_CARDBUS_IO;
+               end = ~0U;
+       } else {
+-              unsigned long avail = root->end - root->start;
++              unsigned long avail = resource_size(root);
+               int i;
+               size = BRIDGE_MEM_MAX;
+-              if (size > avail/8) {
+-                      size = (avail+1)/8;
++              if (size > (avail - 1) / 8) {
++                      size = avail / 8;
+                       /* round size down to next power of 2 */
+                       i = 0;
+                       while ((size /= 2) != 0)
+-- 
+2.43.0
+
diff --git a/queue-6.6/phy-zynqmp-take-the-phy-mutex-in-xlate.patch b/queue-6.6/phy-zynqmp-take-the-phy-mutex-in-xlate.patch
new file mode 100644 (file)
index 0000000..3243949
--- /dev/null
@@ -0,0 +1,39 @@
+From 054dfde990f6593a4b8a8421376deb9d3a77ebcd Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 28 Jun 2024 16:55:39 -0400
+Subject: phy: zynqmp: Take the phy mutex in xlate
+
+From: Sean Anderson <sean.anderson@linux.dev>
+
+[ Upstream commit d79c6840917097285e03a49f709321f5fb972750 ]
+
+Take the phy mutex in xlate to protect against concurrent
+modification/access to gtr_phy. This does not typically cause any
+issues, since in most systems the phys are only xlated once and
+thereafter accessed with the phy API (which takes the locks). However,
+we are about to allow userspace to access phys for debugging, so it's
+important to avoid any data races.
+
+Signed-off-by: Sean Anderson <sean.anderson@linux.dev>
+Link: https://lore.kernel.org/r/20240628205540.3098010-5-sean.anderson@linux.dev
+Signed-off-by: Vinod Koul <vkoul@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/phy/xilinx/phy-zynqmp.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/phy/xilinx/phy-zynqmp.c b/drivers/phy/xilinx/phy-zynqmp.c
+index 8c8b1ca31e4c..c72b52955a86 100644
+--- a/drivers/phy/xilinx/phy-zynqmp.c
++++ b/drivers/phy/xilinx/phy-zynqmp.c
+@@ -846,6 +846,7 @@ static struct phy *xpsgtr_xlate(struct device *dev,
+       phy_type = args->args[1];
+       phy_instance = args->args[2];
++      guard(mutex)(&gtr_phy->phy->mutex);
+       ret = xpsgtr_set_lane_type(gtr_phy, phy_type, phy_instance);
+       if (ret < 0) {
+               dev_err(gtr_dev->dev, "Invalid PHY type and/or instance\n");
+-- 
+2.43.0
+
diff --git a/queue-6.6/platform-x86-dell-smbios-fix-error-path-in-dell_smbi.patch b/queue-6.6/platform-x86-dell-smbios-fix-error-path-in-dell_smbi.patch
new file mode 100644 (file)
index 0000000..0e86987
--- /dev/null
@@ -0,0 +1,54 @@
+From 0228b1667c42eb9d7e2c9237d9ab71a9e9a028ea Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 30 Aug 2024 09:54:28 +0300
+Subject: platform/x86: dell-smbios: Fix error path in dell_smbios_init()
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Aleksandr Mishin <amishin@t-argos.ru>
+
+[ Upstream commit ffc17e1479e8e9459b7afa80e5d9d40d0dd78abb ]
+
+In case of error in build_tokens_sysfs(), all the memory that has been
+allocated is freed at end of this function. But then free_group() is
+called which performs memory deallocation again.
+
+Also, instead of free_group() call, there should be exit_dell_smbios_smm()
+and exit_dell_smbios_wmi() calls, since there is initialization, but there
+is no release of resources in case of an error.
+
+Fix these issues by replacing free_group() call with
+exit_dell_smbios_wmi() and exit_dell_smbios_smm().
+
+Found by Linux Verification Center (linuxtesting.org) with SVACE.
+
+Fixes: 33b9ca1e53b4 ("platform/x86: dell-smbios: Add a sysfs interface for SMBIOS tokens")
+Signed-off-by: Aleksandr Mishin <amishin@t-argos.ru>
+Link: https://lore.kernel.org/r/20240830065428.9544-1-amishin@t-argos.ru
+Reviewed-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Ilpo Järvinen <ilpo.jarvinen@linux.intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/platform/x86/dell/dell-smbios-base.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/platform/x86/dell/dell-smbios-base.c b/drivers/platform/x86/dell/dell-smbios-base.c
+index 86b95206cb1b..6fb538a13868 100644
+--- a/drivers/platform/x86/dell/dell-smbios-base.c
++++ b/drivers/platform/x86/dell/dell-smbios-base.c
+@@ -590,7 +590,10 @@ static int __init dell_smbios_init(void)
+       return 0;
+ fail_sysfs:
+-      free_group(platform_device);
++      if (!wmi)
++              exit_dell_smbios_wmi();
++      if (!smm)
++              exit_dell_smbios_smm();
+ fail_create_group:
+       platform_device_del(platform_device);
+-- 
+2.43.0
+
diff --git a/queue-6.6/r8152-fix-the-firmware-doesn-t-work.patch b/queue-6.6/r8152-fix-the-firmware-doesn-t-work.patch
new file mode 100644 (file)
index 0000000..f4c461b
--- /dev/null
@@ -0,0 +1,63 @@
+From 593a2ce3c4c1d6edc370935298e261c636be8496 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 3 Sep 2024 14:33:33 +0800
+Subject: r8152: fix the firmware doesn't work
+
+From: Hayes Wang <hayeswang@realtek.com>
+
+[ Upstream commit 8487b4af59d4d7feda4b119dc2d92c67ca25c27e ]
+
+generic_ocp_write() asks the parameter "size" must be 4 bytes align.
+Therefore, write the bp would fail, if the mac->bp_num is odd. Align the
+size to 4 for fixing it. The way may write an extra bp, but the
+rtl8152_is_fw_mac_ok() makes sure the value must be 0 for the bp whose
+index is more than mac->bp_num. That is, there is no influence for the
+firmware.
+
+Besides, I check the return value of generic_ocp_write() to make sure
+everything is correct.
+
+Fixes: e5c266a61186 ("r8152: set bp in bulk")
+Signed-off-by: Hayes Wang <hayeswang@realtek.com>
+Link: https://patch.msgid.link/20240903063333.4502-1-hayeswang@realtek.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/r8152.c | 17 +++++++++++++----
+ 1 file changed, 13 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/net/usb/r8152.c b/drivers/net/usb/r8152.c
+index 127b34dcc5b3..ce19ebd180f1 100644
+--- a/drivers/net/usb/r8152.c
++++ b/drivers/net/usb/r8152.c
+@@ -5143,14 +5143,23 @@ static void rtl8152_fw_mac_apply(struct r8152 *tp, struct fw_mac *mac)
+       data = (u8 *)mac;
+       data += __le16_to_cpu(mac->fw_offset);
+-      generic_ocp_write(tp, __le16_to_cpu(mac->fw_reg), 0xff, length, data,
+-                        type);
++      if (generic_ocp_write(tp, __le16_to_cpu(mac->fw_reg), 0xff, length,
++                            data, type) < 0) {
++              dev_err(&tp->intf->dev, "Write %s fw fail\n",
++                      type ? "PLA" : "USB");
++              return;
++      }
+       ocp_write_word(tp, type, __le16_to_cpu(mac->bp_ba_addr),
+                      __le16_to_cpu(mac->bp_ba_value));
+-      generic_ocp_write(tp, __le16_to_cpu(mac->bp_start), BYTE_EN_DWORD,
+-                        __le16_to_cpu(mac->bp_num) << 1, mac->bp, type);
++      if (generic_ocp_write(tp, __le16_to_cpu(mac->bp_start), BYTE_EN_DWORD,
++                            ALIGN(__le16_to_cpu(mac->bp_num) << 1, 4),
++                            mac->bp, type) < 0) {
++              dev_err(&tp->intf->dev, "Write %s bp fail\n",
++                      type ? "PLA" : "USB");
++              return;
++      }
+       bp_en_addr = __le16_to_cpu(mac->bp_en_addr);
+       if (bp_en_addr)
+-- 
+2.43.0
+
diff --git a/queue-6.6/regmap-maple-work-around-gcc-14.1-false-positive-war.patch b/queue-6.6/regmap-maple-work-around-gcc-14.1-false-positive-war.patch
new file mode 100644 (file)
index 0000000..7fc3a86
--- /dev/null
@@ -0,0 +1,55 @@
+From d094b75c149a97479a9925ce20f57bbca4d8b1a6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 19 Jul 2024 12:40:24 +0200
+Subject: regmap: maple: work around gcc-14.1 false-positive warning
+
+From: Arnd Bergmann <arnd@arndb.de>
+
+[ Upstream commit 542440fd7b30983cae23e32bd22f69a076ec7ef4 ]
+
+With gcc-14.1, there is a false-postive -Wuninitialized warning in
+regcache_maple_drop:
+
+drivers/base/regmap/regcache-maple.c: In function 'regcache_maple_drop':
+drivers/base/regmap/regcache-maple.c:113:23: error: 'lower_index' is used uninitialized [-Werror=uninitialized]
+  113 |         unsigned long lower_index, lower_last;
+      |                       ^~~~~~~~~~~
+drivers/base/regmap/regcache-maple.c:113:36: error: 'lower_last' is used uninitialized [-Werror=uninitialized]
+  113 |         unsigned long lower_index, lower_last;
+      |                                    ^~~~~~~~~~
+
+I've created a reduced test case to see if this needs to be reported
+as a gcc, but it appears that the gcc-14.x branch already has a change
+that turns this into a more sensible -Wmaybe-uninitialized warning, so
+I ended up not reporting it so far.
+
+The reduced test case also produces a warning for gcc-13 and gcc-12
+but I don't see that with the version in the kernel.
+
+Link: https://godbolt.org/z/oKbohKqd3
+Link: https://lore.kernel.org/all/CAMuHMdWj=FLmkazPbYKPevDrcym2_HDb_U7Mb9YE9ovrP0jJfA@mail.gmail.com/
+Signed-off-by: Arnd Bergmann <arnd@arndb.de>
+Link: https://patch.msgid.link/20240719104030.1382465-1-arnd@kernel.org
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/base/regmap/regcache-maple.c | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/base/regmap/regcache-maple.c b/drivers/base/regmap/regcache-maple.c
+index 55999a50ccc0..0b6c2277128b 100644
+--- a/drivers/base/regmap/regcache-maple.c
++++ b/drivers/base/regmap/regcache-maple.c
+@@ -110,7 +110,8 @@ static int regcache_maple_drop(struct regmap *map, unsigned int min,
+       struct maple_tree *mt = map->cache;
+       MA_STATE(mas, mt, min, max);
+       unsigned long *entry, *lower, *upper;
+-      unsigned long lower_index, lower_last;
++      /* initialized to work around false-positive -Wuninitialized warning */
++      unsigned long lower_index = 0, lower_last = 0;
+       unsigned long upper_index, upper_last;
+       int ret = 0;
+-- 
+2.43.0
+
diff --git a/queue-6.6/regulator-core-stub-devm_regulator_bulk_get_const-if.patch b/queue-6.6/regulator-core-stub-devm_regulator_bulk_get_const-if.patch
new file mode 100644 (file)
index 0000000..fde4e9a
--- /dev/null
@@ -0,0 +1,54 @@
+From 5119f050c5612f36cd8e23689dff74a70f645147 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 30 Aug 2024 07:35:12 -0700
+Subject: regulator: core: Stub devm_regulator_bulk_get_const() if
+ !CONFIG_REGULATOR
+
+From: Douglas Anderson <dianders@chromium.org>
+
+[ Upstream commit 1a5caec7f80ca2e659c03f45378ee26915f4eda2 ]
+
+When adding devm_regulator_bulk_get_const() I missed adding a stub for
+when CONFIG_REGULATOR is not enabled. Under certain conditions (like
+randconfig testing) this can cause the compiler to reports errors
+like:
+
+  error: implicit declaration of function 'devm_regulator_bulk_get_const';
+  did you mean 'devm_regulator_bulk_get_enable'?
+
+Add the stub.
+
+Fixes: 1de452a0edda ("regulator: core: Allow drivers to define their init data as const")
+Reported-by: kernel test robot <lkp@intel.com>
+Closes: https://lore.kernel.org/oe-kbuild-all/202408301813.TesFuSbh-lkp@intel.com/
+Cc: Neil Armstrong <neil.armstrong@linaro.org>
+Signed-off-by: Douglas Anderson <dianders@chromium.org>
+Link: https://patch.msgid.link/20240830073511.1.Ib733229a8a19fad8179213c05e1af01b51e42328@changeid
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/regulator/consumer.h | 8 ++++++++
+ 1 file changed, 8 insertions(+)
+
+diff --git a/include/linux/regulator/consumer.h b/include/linux/regulator/consumer.h
+index 2c526c8d10cc..25d0684d37b3 100644
+--- a/include/linux/regulator/consumer.h
++++ b/include/linux/regulator/consumer.h
+@@ -489,6 +489,14 @@ static inline int of_regulator_bulk_get_all(struct device *dev, struct device_no
+       return 0;
+ }
++static inline int devm_regulator_bulk_get_const(
++      struct device *dev, int num_consumers,
++      const struct regulator_bulk_data *in_consumers,
++      struct regulator_bulk_data **out_consumers)
++{
++      return 0;
++}
++
+ static inline int regulator_bulk_enable(int num_consumers,
+                                       struct regulator_bulk_data *consumers)
+ {
+-- 
+2.43.0
+
diff --git a/queue-6.6/riscv-kprobes-use-patch_text_nosync-for-insn-slots.patch b/queue-6.6/riscv-kprobes-use-patch_text_nosync-for-insn-slots.patch
new file mode 100644 (file)
index 0000000..c5c531d
--- /dev/null
@@ -0,0 +1,43 @@
+From b175a39ae1bfac4728251cde3d5a8299283abb6f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 27 Mar 2024 09:04:42 -0700
+Subject: riscv: kprobes: Use patch_text_nosync() for insn slots
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Samuel Holland <samuel.holland@sifive.com>
+
+[ Upstream commit b1756750a397f36ddc857989d31887c3f5081fb0 ]
+
+These instructions are not yet visible to the rest of the system,
+so there is no need to do the whole stop_machine() dance.
+
+Reviewed-by: Björn Töpel <bjorn@rivosinc.com>
+Signed-off-by: Samuel Holland <samuel.holland@sifive.com>
+Link: https://lore.kernel.org/r/20240327160520.791322-4-samuel.holland@sifive.com
+Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/riscv/kernel/probes/kprobes.c | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/arch/riscv/kernel/probes/kprobes.c b/arch/riscv/kernel/probes/kprobes.c
+index 2f08c14a933d..fecbbcf40ac3 100644
+--- a/arch/riscv/kernel/probes/kprobes.c
++++ b/arch/riscv/kernel/probes/kprobes.c
+@@ -28,9 +28,8 @@ static void __kprobes arch_prepare_ss_slot(struct kprobe *p)
+       p->ainsn.api.restore = (unsigned long)p->addr + offset;
+-      patch_text(p->ainsn.api.insn, &p->opcode, 1);
+-      patch_text((void *)((unsigned long)(p->ainsn.api.insn) + offset),
+-                 &insn, 1);
++      patch_text_nosync(p->ainsn.api.insn, &p->opcode, 1);
++      patch_text_nosync(p->ainsn.api.insn + offset, &insn, 1);
+ }
+ static void __kprobes arch_prepare_simulate(struct kprobe *p)
+-- 
+2.43.0
+
diff --git a/queue-6.6/riscv-set-trap-vector-earlier.patch b/queue-6.6/riscv-set-trap-vector-earlier.patch
new file mode 100644 (file)
index 0000000..69c2f25
--- /dev/null
@@ -0,0 +1,40 @@
+From 655d57c68b7b3fdd872ff40102e2a065eb5613d9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 8 May 2024 10:24:45 +0800
+Subject: riscv: set trap vector earlier
+
+From: yang.zhang <yang.zhang@hexintek.com>
+
+[ Upstream commit 6ad8735994b854b23c824dd6b1dd2126e893a3b4 ]
+
+The exception vector of the booting hart is not set before enabling
+the mmu and then still points to the value of the previous firmware,
+typically _start. That makes it hard to debug setup_vm() when bad
+things happen. So fix that by setting the exception vector earlier.
+
+Reviewed-by: Alexandre Ghiti <alexghiti@rivosinc.com>
+Signed-off-by: yang.zhang <yang.zhang@hexintek.com>
+Link: https://lore.kernel.org/r/20240508022445.6131-1-gaoshanliukou@163.com
+Signed-off-by: Palmer Dabbelt <palmer@rivosinc.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/riscv/kernel/head.S | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/arch/riscv/kernel/head.S b/arch/riscv/kernel/head.S
+index 0097c145385f..9691fa8f2faa 100644
+--- a/arch/riscv/kernel/head.S
++++ b/arch/riscv/kernel/head.S
+@@ -305,6 +305,9 @@ clear_bss_done:
+ #else
+       mv a0, a1
+ #endif /* CONFIG_BUILTIN_DTB */
++      /* Set trap vector to spin forever to help debug */
++      la a3, .Lsecondary_park
++      csrw CSR_TVEC, a3
+       call setup_vm
+ #ifdef CONFIG_MMU
+       la a0, early_pg_dir
+-- 
+2.43.0
+
diff --git a/queue-6.6/rust-kbuild-fix-export-of-bss-symbols.patch b/queue-6.6/rust-kbuild-fix-export-of-bss-symbols.patch
new file mode 100644 (file)
index 0000000..2abf832
--- /dev/null
@@ -0,0 +1,42 @@
+From 68f5ac6fb1bf8245a53afe5127dce6b2862418c2 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 15 Aug 2024 07:49:30 +0000
+Subject: rust: kbuild: fix export of bss symbols
+
+From: Andreas Hindborg <a.hindborg@samsung.com>
+
+[ Upstream commit b8673d56935c32a4e0a1a0b40951fdd313dbf340 ]
+
+Symbols in the bss segment are not currently exported. This is a problem
+for Rust modules that link against statics, that are resident in the kernel
+image. Thus export symbols in the bss segment.
+
+Fixes: 2f7ab1267dc9 ("Kbuild: add Rust support")
+Signed-off-by: Andreas Hindborg <a.hindborg@samsung.com>
+Reviewed-by: Alice Ryhl <aliceryhl@google.com>
+Tested-by: Alice Ryhl <aliceryhl@google.com>
+Reviewed-by: Gary Guo <gary@garyguo.net>
+Link: https://lore.kernel.org/r/20240815074519.2684107-2-nmi@metaspace.dk
+[ Reworded slightly. - Miguel ]
+Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ rust/Makefile | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/rust/Makefile b/rust/Makefile
+index 7e33ebe8a9f4..333b9a482473 100644
+--- a/rust/Makefile
++++ b/rust/Makefile
+@@ -363,7 +363,7 @@ $(obj)/bindings/bindings_helpers_generated.rs: $(src)/helpers.c FORCE
+ quiet_cmd_exports = EXPORTS $@
+       cmd_exports = \
+       $(NM) -p --defined-only $< \
+-              | awk '/ (T|R|D) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@
++              | awk '/ (T|R|D|B) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@
+ $(obj)/exports_core_generated.h: $(obj)/core.o FORCE
+       $(call if_changed,exports)
+-- 
+2.43.0
+
diff --git a/queue-6.6/rust-use-awk-instead-of-recent-xargs.patch b/queue-6.6/rust-use-awk-instead-of-recent-xargs.patch
new file mode 100644 (file)
index 0000000..eb78c02
--- /dev/null
@@ -0,0 +1,43 @@
+From 35c2b8d8402d6bc334dc5f9624a20605e133940a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 28 Sep 2023 20:49:25 +0000
+Subject: rust: Use awk instead of recent xargs
+
+From: Matthew Maurer <mmaurer@google.com>
+
+[ Upstream commit 45f97e6385cad6d0e48a27ddcd08793bb4d35851 ]
+
+`awk` is already required by the kernel build, and the `xargs` feature
+used in current Rust detection is not present in all `xargs` (notably,
+toybox based xargs, used in the Android kernel build).
+
+Signed-off-by: Matthew Maurer <mmaurer@google.com>
+Reviewed-by: Alice Ryhl <aliceryhl@google.com>
+Tested-by: Alice Ryhl <aliceryhl@google.com>
+Reviewed-by: Martin Rodriguez Reboredo <yakoyoku@gmail.com>
+Link: https://lore.kernel.org/r/20230928205045.2375899-1-mmaurer@google.com
+Signed-off-by: Miguel Ojeda <ojeda@kernel.org>
+Stable-dep-of: b8673d56935c ("rust: kbuild: fix export of bss symbols")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ rust/Makefile | 4 +---
+ 1 file changed, 1 insertion(+), 3 deletions(-)
+
+diff --git a/rust/Makefile b/rust/Makefile
+index e5619f25b55c..7e33ebe8a9f4 100644
+--- a/rust/Makefile
++++ b/rust/Makefile
+@@ -363,9 +363,7 @@ $(obj)/bindings/bindings_helpers_generated.rs: $(src)/helpers.c FORCE
+ quiet_cmd_exports = EXPORTS $@
+       cmd_exports = \
+       $(NM) -p --defined-only $< \
+-              | grep -E ' (T|R|D) ' | cut -d ' ' -f 3 \
+-              | xargs -Isymbol \
+-              echo 'EXPORT_SYMBOL_RUST_GPL(symbol);' > $@
++              | awk '/ (T|R|D) / {printf "EXPORT_SYMBOL_RUST_GPL(%s);\n",$$3}' > $@
+ $(obj)/exports_core_generated.h: $(obj)/core.o FORCE
+       $(call if_changed,exports)
+-- 
+2.43.0
+
diff --git a/queue-6.6/s390-vmlinux.lds.s-move-ro_after_init-section-behind.patch b/queue-6.6/s390-vmlinux.lds.s-move-ro_after_init-section-behind.patch
new file mode 100644 (file)
index 0000000..1a5919c
--- /dev/null
@@ -0,0 +1,75 @@
+From 7db7abb174af2e5fe512402785bca3c73b3b1d7a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 29 Jul 2024 13:06:43 +0200
+Subject: s390/vmlinux.lds.S: Move ro_after_init section behind rodata section
+
+From: Heiko Carstens <hca@linux.ibm.com>
+
+[ Upstream commit 75c10d5377d8821efafed32e4d72068d9c1f8ec0 ]
+
+The .data.rel.ro and .got section were added between the rodata and
+ro_after_init data section, which adds an RW mapping in between all RO
+mapping of the kernel image:
+
+---[ Kernel Image Start ]---
+0x000003ffe0000000-0x000003ffe0e00000        14M PMD RO X
+0x000003ffe0e00000-0x000003ffe0ec7000       796K PTE RO X
+0x000003ffe0ec7000-0x000003ffe0f00000       228K PTE RO NX
+0x000003ffe0f00000-0x000003ffe1300000         4M PMD RO NX
+0x000003ffe1300000-0x000003ffe1331000       196K PTE RO NX
+0x000003ffe1331000-0x000003ffe13b3000       520K PTE RW NX <---
+0x000003ffe13b3000-0x000003ffe13d5000       136K PTE RO NX
+0x000003ffe13d5000-0x000003ffe1400000       172K PTE RW NX
+0x000003ffe1400000-0x000003ffe1500000         1M PMD RW NX
+0x000003ffe1500000-0x000003ffe1700000         2M PTE RW NX
+0x000003ffe1700000-0x000003ffe1800000         1M PMD RW NX
+0x000003ffe1800000-0x000003ffe187e000       504K PTE RW NX
+---[ Kernel Image End ]---
+
+Move the ro_after_init data section again right behind the rodata
+section to prevent interleaving RO and RW mappings:
+
+---[ Kernel Image Start ]---
+0x000003ffe0000000-0x000003ffe0e00000        14M PMD RO X
+0x000003ffe0e00000-0x000003ffe0ec7000       796K PTE RO X
+0x000003ffe0ec7000-0x000003ffe0f00000       228K PTE RO NX
+0x000003ffe0f00000-0x000003ffe1300000         4M PMD RO NX
+0x000003ffe1300000-0x000003ffe1353000       332K PTE RO NX
+0x000003ffe1353000-0x000003ffe1400000       692K PTE RW NX
+0x000003ffe1400000-0x000003ffe1500000         1M PMD RW NX
+0x000003ffe1500000-0x000003ffe1700000         2M PTE RW NX
+0x000003ffe1700000-0x000003ffe1800000         1M PMD RW NX
+0x000003ffe1800000-0x000003ffe187e000       504K PTE RW NX
+---[ Kernel Image End ]---
+
+Reviewed-by: Alexander Gordeev <agordeev@linux.ibm.com>
+Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
+Signed-off-by: Vasily Gorbik <gor@linux.ibm.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/s390/kernel/vmlinux.lds.S | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/arch/s390/kernel/vmlinux.lds.S b/arch/s390/kernel/vmlinux.lds.S
+index 2ae201ebf90b..de5f9f623f5b 100644
+--- a/arch/s390/kernel/vmlinux.lds.S
++++ b/arch/s390/kernel/vmlinux.lds.S
+@@ -71,6 +71,15 @@ SECTIONS
+       . = ALIGN(PAGE_SIZE);
+       __end_ro_after_init = .;
++      .data.rel.ro : {
++              *(.data.rel.ro .data.rel.ro.*)
++      }
++      .got : {
++              __got_start = .;
++              *(.got)
++              __got_end = .;
++      }
++
+       RW_DATA(0x100, PAGE_SIZE, THREAD_SIZE)
+       BOOT_DATA_PRESERVED
+-- 
+2.43.0
+
diff --git a/queue-6.6/scsi-pm80xx-set-phy-enable_completion-only-when-we-w.patch b/queue-6.6/scsi-pm80xx-set-phy-enable_completion-only-when-we-w.patch
new file mode 100644 (file)
index 0000000..d026260
--- /dev/null
@@ -0,0 +1,66 @@
+From 48f5d81886dd65cb8805e11ba946bf45a4dca75f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jun 2024 15:59:23 +0000
+Subject: scsi: pm80xx: Set phy->enable_completion only when we wait for it
+
+From: Igor Pylypiv <ipylypiv@google.com>
+
+[ Upstream commit e4f949ef1516c0d74745ee54a0f4882c1f6c7aea ]
+
+pm8001_phy_control() populates the enable_completion pointer with a stack
+address, sends a PHY_LINK_RESET / PHY_HARD_RESET, waits 300 ms, and
+returns. The problem arises when a phy control response comes late.  After
+300 ms the pm8001_phy_control() function returns and the passed
+enable_completion stack address is no longer valid. Late phy control
+response invokes complete() on a dangling enable_completion pointer which
+leads to a kernel crash.
+
+Signed-off-by: Igor Pylypiv <ipylypiv@google.com>
+Signed-off-by: Terrence Adams <tadamsjr@google.com>
+Link: https://lore.kernel.org/r/20240627155924.2361370-2-tadamsjr@google.com
+Acked-by: Jack Wang <jinpu.wang@ionos.com>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/scsi/pm8001/pm8001_sas.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/scsi/pm8001/pm8001_sas.c b/drivers/scsi/pm8001/pm8001_sas.c
+index a5a31dfa4512..ee2da8e49d4c 100644
+--- a/drivers/scsi/pm8001/pm8001_sas.c
++++ b/drivers/scsi/pm8001/pm8001_sas.c
+@@ -166,7 +166,6 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
+       unsigned long flags;
+       pm8001_ha = sas_phy->ha->lldd_ha;
+       phy = &pm8001_ha->phy[phy_id];
+-      pm8001_ha->phy[phy_id].enable_completion = &completion;
+       if (PM8001_CHIP_DISP->fatal_errors(pm8001_ha)) {
+               /*
+@@ -190,6 +189,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
+                               rates->maximum_linkrate;
+               }
+               if (pm8001_ha->phy[phy_id].phy_state ==  PHY_LINK_DISABLE) {
++                      pm8001_ha->phy[phy_id].enable_completion = &completion;
+                       PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id);
+                       wait_for_completion(&completion);
+               }
+@@ -198,6 +198,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
+               break;
+       case PHY_FUNC_HARD_RESET:
+               if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) {
++                      pm8001_ha->phy[phy_id].enable_completion = &completion;
+                       PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id);
+                       wait_for_completion(&completion);
+               }
+@@ -206,6 +207,7 @@ int pm8001_phy_control(struct asd_sas_phy *sas_phy, enum phy_func func,
+               break;
+       case PHY_FUNC_LINK_RESET:
+               if (pm8001_ha->phy[phy_id].phy_state == PHY_LINK_DISABLE) {
++                      pm8001_ha->phy[phy_id].enable_completion = &completion;
+                       PM8001_CHIP_DISP->phy_start_req(pm8001_ha, phy_id);
+                       wait_for_completion(&completion);
+               }
+-- 
+2.43.0
+
diff --git a/queue-6.6/scsi-ufs-core-remove-scsi-host-only-if-added.patch b/queue-6.6/scsi-ufs-core-remove-scsi-host-only-if-added.patch
new file mode 100644 (file)
index 0000000..2c3a73f
--- /dev/null
@@ -0,0 +1,64 @@
+From fabeac981bb28fb45250ebd7ac211a8815cc2930 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 27 Jun 2024 17:51:04 +0900
+Subject: scsi: ufs: core: Remove SCSI host only if added
+
+From: Kyoungrul Kim <k831.kim@samsung.com>
+
+[ Upstream commit 7cbff570dbe8907e23bba06f6414899a0fbb2fcc ]
+
+If host tries to remove ufshcd driver from a UFS device it would cause a
+kernel panic if ufshcd_async_scan fails during ufshcd_probe_hba before
+adding a SCSI host with scsi_add_host and MCQ is enabled since SCSI host
+has been defered after MCQ configuration introduced by commit 0cab4023ec7b
+("scsi: ufs: core: Defer adding host to SCSI if MCQ is supported").
+
+To guarantee that SCSI host is removed only if it has been added, set the
+scsi_host_added flag to true after adding a SCSI host and check whether it
+is set or not before removing it.
+
+Signed-off-by: Kyoungrul Kim <k831.kim@samsung.com>
+Signed-off-by: Minwoo Im <minwoo.im@samsung.com>
+Link: https://lore.kernel.org/r/20240627085104epcms2p5897a3870ea5c6416aa44f94df6c543d7@epcms2p5
+Reviewed-by: Bart Van Assche <bvanassche@acm.org>
+Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/ufs/core/ufshcd.c | 7 +++++--
+ 1 file changed, 5 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/ufs/core/ufshcd.c b/drivers/ufs/core/ufshcd.c
+index ad0ef5b6b8cf..ed59d2367a4e 100644
+--- a/drivers/ufs/core/ufshcd.c
++++ b/drivers/ufs/core/ufshcd.c
+@@ -10130,7 +10130,8 @@ void ufshcd_remove(struct ufs_hba *hba)
+       blk_mq_destroy_queue(hba->tmf_queue);
+       blk_put_queue(hba->tmf_queue);
+       blk_mq_free_tag_set(&hba->tmf_tag_set);
+-      scsi_remove_host(hba->host);
++      if (hba->scsi_host_added)
++              scsi_remove_host(hba->host);
+       /* disable interrupts */
+       ufshcd_disable_intr(hba, hba->intr_mask);
+       ufshcd_hba_stop(hba);
+@@ -10408,6 +10409,7 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
+                       dev_err(hba->dev, "scsi_add_host failed\n");
+                       goto out_disable;
+               }
++              hba->scsi_host_added = true;
+       }
+       hba->tmf_tag_set = (struct blk_mq_tag_set) {
+@@ -10489,7 +10491,8 @@ int ufshcd_init(struct ufs_hba *hba, void __iomem *mmio_base, unsigned int irq)
+ free_tmf_tag_set:
+       blk_mq_free_tag_set(&hba->tmf_tag_set);
+ out_remove_scsi_host:
+-      scsi_remove_host(hba->host);
++      if (hba->scsi_host_added)
++              scsi_remove_host(hba->host);
+ out_disable:
+       hba->is_irq_enabled = false;
+       ufshcd_hba_exit(hba);
+-- 
+2.43.0
+
diff --git a/queue-6.6/selftests-net-enable-bind-tests.patch b/queue-6.6/selftests-net-enable-bind-tests.patch
new file mode 100644 (file)
index 0000000..5d8c716
--- /dev/null
@@ -0,0 +1,48 @@
+From 4ed3c3638c4460c43b59871fb650e879b51d4383 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 4 Sep 2024 16:12:26 +1000
+Subject: selftests: net: enable bind tests
+
+From: Jamie Bainbridge <jamie.bainbridge@gmail.com>
+
+[ Upstream commit e4af74a53b7aa865e7fcc104630ebb7a9129b71f ]
+
+bind_wildcard is compiled but not run, bind_timewait is not compiled.
+
+These two tests complete in a very short time, use the test harness
+properly, and seem reasonable to enable.
+
+The author of the tests confirmed via email that these were
+intended to be run.
+
+Enable these two tests.
+
+Fixes: 13715acf8ab5 ("selftest: Add test for bind() conflicts.")
+Fixes: 2c042e8e54ef ("tcp: Add selftest for bind() and TIME_WAIT.")
+Signed-off-by: Jamie Bainbridge <jamie.bainbridge@gmail.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Reviewed-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Link: https://patch.msgid.link/5a009b26cf5fb1ad1512d89c61b37e2fac702323.1725430322.git.jamie.bainbridge@gmail.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ tools/testing/selftests/net/Makefile | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/tools/testing/selftests/net/Makefile b/tools/testing/selftests/net/Makefile
+index d417de105123..91a48efb140b 100644
+--- a/tools/testing/selftests/net/Makefile
++++ b/tools/testing/selftests/net/Makefile
+@@ -85,7 +85,8 @@ TEST_GEN_FILES += csum
+ TEST_GEN_FILES += nat6to4.o
+ TEST_GEN_FILES += xdp_dummy.o
+ TEST_GEN_FILES += ip_local_port_range
+-TEST_GEN_FILES += bind_wildcard
++TEST_GEN_PROGS += bind_wildcard
++TEST_GEN_PROGS += bind_timewait
+ TEST_PROGS += test_vxlan_mdb.sh
+ TEST_PROGS += test_bridge_neigh_suppress.sh
+ TEST_PROGS += test_vxlan_nolocalbypass.sh
+-- 
+2.43.0
+
index 3164e8c5dd8d5f1a0ebff76ea0bdf5f2cff3547e..979a16753f6ffcfa4f99d9617439e375aa5795c0 100644 (file)
@@ -58,3 +58,141 @@ nilfs2-fix-missing-cleanup-on-rollforward-recovery-error.patch
 nilfs2-protect-references-to-superblock-parameters-exposed-in-sysfs.patch
 nilfs2-fix-state-management-in-error-path-of-log-writing-function.patch
 drm-i915-do-not-attempt-to-load-the-gsc-multiple-times.patch
+alsa-control-apply-sanity-check-of-input-values-for-.patch
+alsa-hda-add-input-value-sanity-checks-to-hdmi-chann.patch
+wifi-ath12k-fix-uninitialize-symbol-error-on-ath12k_.patch
+wifi-ath12k-fix-firmware-crash-due-to-invalid-peer-n.patch
+smack-unix-sockets-fix-accept-ed-socket-label.patch
+bpf-verifier-correct-tail_call_reachable-for-bpf-pro.patch
+elf-fix-kernel.randomize_va_space-double-read.patch
+accel-habanalabs-gaudi2-unsecure-edma-max-outstandin.patch
+irqchip-armada-370-xp-do-not-allow-mapping-irq-0-and.patch
+af_unix-remove-put_pid-put_cred-in-copy_peercred.patch
+x86-kmsan-fix-hook-for-unaligned-accesses.patch
+iommu-sun50i-clear-bypass-register.patch
+netfilter-nf_conncount-fix-wrong-variable-type.patch
+wifi-iwlwifi-mvm-use-iwl_fw_check-for-link-id-check.patch
+udf-avoid-excessive-partition-lengths.patch
+fs-ntfs3-one-more-reason-to-mark-inode-bad.patch
+riscv-kprobes-use-patch_text_nosync-for-insn-slots.patch
+media-vivid-fix-wrong-sizeimage-value-for-mplane.patch
+leds-spi-byte-call-of_node_put-on-error-path.patch
+wifi-brcmsmac-advertise-mfp_capable-to-enable-wpa3.patch
+usb-uas-set-host-status-byte-on-data-completion-erro.patch
+usb-gadget-aspeed_udc-validate-endpoint-index-for-as.patch
+drm-amd-display-run-dc_log_dc-after-checking-link-li.patch
+drm-amd-display-check-hdcp-returned-status.patch
+drm-amdgpu-fix-smatch-static-checker-warning.patch
+drm-amdgpu-clear-rb_overflow-bit-when-enabling-inter.patch
+media-vivid-don-t-set-hdmi-tx-controls-if-there-are-.patch
+vfio-spapr-always-clear-tces-before-unsetting-the-wi.patch
+ice-check-all-ice_vsi_rebuild-errors-in-function.patch
+pci-keystone-add-workaround-for-errata-i2037-am65x-s.patch
+input-ili210x-use-kvmalloc-to-allocate-buffer-for-fi.patch
+media-qcom-camss-add-check-for-v4l2_fwnode_endpoint_.patch
+pcmcia-use-resource_size-function-on-resource-object.patch
+drm-amd-display-check-denominator-pbn_div-before-use.patch
+drm-amdgpu-check-for-linear_aligned-correctly-in-che.patch
+can-bcm-remove-proc-entry-when-dev-is-unregistered.patch
+can-m_can-release-irq-on-error-in-m_can_open.patch
+can-mcp251xfd-fix-ring-configuration-when-switching-.patch
+rust-use-awk-instead-of-recent-xargs.patch
+rust-kbuild-fix-export-of-bss-symbols.patch
+cifs-fix-falloc_fl_zero_range-to-preflush-buffered-p.patch
+igb-fix-not-clearing-timesync-interrupts-for-82580.patch
+ice-add-netif_device_attach-detach-into-pf-reset-flo.patch
+platform-x86-dell-smbios-fix-error-path-in-dell_smbi.patch
+regulator-core-stub-devm_regulator_bulk_get_const-if.patch
+can-kvaser_pciefd-skip-redundant-null-pointer-check-.patch
+can-kvaser_pciefd-remove-unnecessary-comment.patch
+can-kvaser_pciefd-rename-board_irq-to-pci_irq.patch
+can-kvaser_pciefd-move-reset-of-dma-rx-buffers-to-th.patch
+can-kvaser_pciefd-use-a-single-write-when-releasing-.patch
+bluetooth-qca-if-memdump-doesn-t-work-re-enable-ibs.patch
+bluetooth-hci_event-use-hci-error-defines-instead-of.patch
+bluetooth-hci_conn-only-do-acl-connections-sequentia.patch
+bluetooth-remove-pending-acl-connection-attempts.patch
+bluetooth-hci_conn-fix-uaf-write-in-__hci_acl_create.patch
+bluetooth-hci_sync-add-helper-functions-to-manipulat.patch
+bluetooth-hci_sync-attempt-to-dequeue-connection-att.patch
+bluetooth-hci_sync-introduce-hci_cmd_sync_run-hci_cm.patch
+bluetooth-mgmt-fix-not-generating-command-complete-f.patch
+igc-unlock-on-error-in-igc_io_resume.patch
+hwmon-hp-wmi-sensors-check-if-wmi-event-data-exists.patch
+net-phy-fix-missing-of_node_put-for-leds.patch
+ice-protect-xdp-configuration-with-a-mutex.patch
+ice-do-not-bring-the-vsi-up-if-it-was-down-before-th.patch
+usbnet-modern-method-to-get-random-mac.patch
+bpf-add-sockptr-support-for-getsockopt.patch
+bpf-add-sockptr-support-for-setsockopt.patch
+net-socket-break-down-__sys_setsockopt.patch
+net-socket-break-down-__sys_getsockopt.patch
+bpf-net-fix-a-potential-race-in-do_sock_getsockopt.patch
+bareudp-fix-device-stats-updates.patch
+fou-fix-null-ptr-deref-in-gro.patch
+r8152-fix-the-firmware-doesn-t-work.patch
+net-bridge-br_fdb_external_learn_add-always-set-ext_.patch
+net-dsa-vsc73xx-fix-possible-subblocks-range-of-capt.patch
+selftests-net-enable-bind-tests.patch
+xen-privcmd-fix-possible-access-to-a-freed-kirqfd-in.patch
+firmware-cs_dsp-don-t-allow-writes-to-read-only-cont.patch
+phy-zynqmp-take-the-phy-mutex-in-xlate.patch
+asoc-topology-properly-initialize-soc_enum-values.patch
+dm-init-handle-minors-larger-than-255.patch
+iommu-vt-d-handle-volatile-descriptor-status-read.patch
+cgroup-protect-css-cgroup-write-under-css_set_lock.patch
+um-line-always-fill-error_out-in-setup_one_line.patch
+devres-initialize-an-uninitialized-struct-member.patch
+pci-hotplug-pnv_php-fix-hotplug-driver-crash-on-powe.patch
+virtio_ring-fix-kmsan-error-for-premapped-mode.patch
+wifi-rtw88-usb-schedule-rx-work-after-everything-is-.patch
+scsi-ufs-core-remove-scsi-host-only-if-added.patch
+scsi-pm80xx-set-phy-enable_completion-only-when-we-w.patch
+crypto-qat-fix-unintentional-re-enabling-of-error-in.patch
+hwmon-adc128d818-fix-underflows-seen-when-writing-li.patch
+hwmon-lm95234-fix-underflows-seen-when-writing-limit.patch
+hwmon-nct6775-core-fix-underflows-seen-when-writing-.patch
+hwmon-w83627ehf-fix-underflows-seen-when-writing-lim.patch
+asoc-tas2781-replace-bexx_to_cpup-with-get_unaligned.patch
+libbpf-add-null-checks-to-bpf_object__-prev_map-next.patch
+drm-amdgpu-set-no_hw_access-when-vf-request-full-gpu.patch
+ext4-fix-possible-tid_t-sequence-overflows.patch
+jbd2-avoid-mount-failed-when-commit-block-is-partial.patch
+dma-mapping-benchmark-don-t-starve-others-when-doing.patch
+wifi-mwifiex-do-not-return-unused-priv-in-mwifiex_ge.patch
+drm-amdgpu-reject-gang-submit-on-reserved-vmids.patch
+smp-add-missing-destroy_work_on_stack-call-in-smp_ca.patch
+fs-ntfs3-check-more-cases-when-directory-is-corrupte.patch
+btrfs-replace-bug_on-with-assert-in-walk_down_proc.patch
+btrfs-clean-up-our-handling-of-refs-0-in-snapshot-de.patch
+btrfs-replace-bug_on-with-error-handling-at-update_r.patch
+cxl-region-verify-target-positions-using-the-ordered.patch
+riscv-set-trap-vector-earlier.patch
+pci-add-missing-bridge-lock-to-pci_bus_lock.patch
+tcp-don-t-drop-syn-ack-for-simultaneous-connect.patch
+bluetooth-btnxpuart-fix-null-pointer-dereference-in-.patch
+net-dpaa-avoid-on-stack-arrays-of-nr_cpus-elements.patch
+irqchip-gic-v4-always-configure-affinity-on-vpe-acti.patch
+irqchip-gic-v4-make-sure-a-vpe-is-locked-when-vmapp-.patch
+loongarch-use-correct-api-to-map-cmdline-in-relocate.patch
+regmap-maple-work-around-gcc-14.1-false-positive-war.patch
+vfs-fix-potential-circular-locking-through-setxattr-.patch
+i3c-master-svc-resend-target-address-when-get-nack.patch
+i3c-mipi-i3c-hci-error-out-instead-on-bug_on-in-ibi-.patch
+kselftests-dmabuf-heaps-ensure-the-driver-name-is-nu.patch
+spi-hisi-kunpeng-add-verification-for-the-max_freque.patch
+btrfs-initialize-location-to-fix-wmaybe-uninitialize.patch
+s390-vmlinux.lds.s-move-ro_after_init-section-behind.patch
+hid-cougar-fix-slab-out-of-bounds-read-in-cougar_rep.patch
+hid-amd_sfh-free-driver_data-after-destroying-hid-de.patch
+input-uinput-reject-requests-with-unreasonable-numbe.patch
+usbnet-ipheth-race-between-ipheth_close-and-error-ha.patch
+wifi-mt76-mt7921-fix-null-pointer-access-in-mt7921_i.patch
+squashfs-sanity-check-symbolic-link-size.patch
+of-irq-prevent-device-address-out-of-bounds-read-in-.patch
+lib-generic-radix-tree.c-fix-rare-race-in-__genradix.patch
+mips-cevt-r4k-don-t-call-get_c0_compare_int-if-timer.patch
+spi-spi-fsl-lpspi-limit-prescale-bit-in-tcr-register.patch
+ata-pata_macio-use-warn-instead-of-bug.patch
+smb-server-fix-potential-null-ptr-deref-of-lease_ctx.patch
+nfsv4-add-missing-rescheduling-points-in-nfs_client_.patch
diff --git a/queue-6.6/smack-unix-sockets-fix-accept-ed-socket-label.patch b/queue-6.6/smack-unix-sockets-fix-accept-ed-socket-label.patch
new file mode 100644 (file)
index 0000000..9f6f8d8
--- /dev/null
@@ -0,0 +1,60 @@
+From 81e142905031acfbe41f8f93c8bc7e3804934acf Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 01:44:30 +0300
+Subject: smack: unix sockets: fix accept()ed socket label
+
+From: Konstantin Andreev <andreev@swemel.ru>
+
+[ Upstream commit e86cac0acdb1a74f608bacefe702f2034133a047 ]
+
+When a process accept()s connection from a unix socket
+(either stream or seqpacket)
+it gets the socket with the label of the connecting process.
+
+For example, if a connecting process has a label 'foo',
+the accept()ed socket will also have 'in' and 'out' labels 'foo',
+regardless of the label of the listener process.
+
+This is because kernel creates unix child sockets
+in the context of the connecting process.
+
+I do not see any obvious way for the listener to abuse
+alien labels coming with the new socket, but,
+to be on the safe side, it's better fix new socket labels.
+
+Signed-off-by: Konstantin Andreev <andreev@swemel.ru>
+Signed-off-by: Casey Schaufler <casey@schaufler-ca.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ security/smack/smack_lsm.c | 12 +++++++++---
+ 1 file changed, 9 insertions(+), 3 deletions(-)
+
+diff --git a/security/smack/smack_lsm.c b/security/smack/smack_lsm.c
+index 98c2bdbfcaed..4625674f0e95 100644
+--- a/security/smack/smack_lsm.c
++++ b/security/smack/smack_lsm.c
+@@ -3769,12 +3769,18 @@ static int smack_unix_stream_connect(struct sock *sock,
+               }
+       }
+-      /*
+-       * Cross reference the peer labels for SO_PEERSEC.
+-       */
+       if (rc == 0) {
++              /*
++               * Cross reference the peer labels for SO_PEERSEC.
++               */
+               nsp->smk_packet = ssp->smk_out;
+               ssp->smk_packet = osp->smk_out;
++
++              /*
++               * new/child/established socket must inherit listening socket labels
++               */
++              nsp->smk_out = osp->smk_out;
++              nsp->smk_in  = osp->smk_in;
+       }
+       return rc;
+-- 
+2.43.0
+
diff --git a/queue-6.6/smb-server-fix-potential-null-ptr-deref-of-lease_ctx.patch b/queue-6.6/smb-server-fix-potential-null-ptr-deref-of-lease_ctx.patch
new file mode 100644 (file)
index 0000000..31d76a3
--- /dev/null
@@ -0,0 +1,77 @@
+From 23525944994487478b08b738cd64219a05b36779 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 22 Aug 2024 08:20:51 +0000
+Subject: smb/server: fix potential null-ptr-deref of lease_ctx_info in
+ smb2_open()
+
+From: ChenXiaoSong <chenxiaosong@kylinos.cn>
+
+[ Upstream commit 4e8771a3666c8f216eefd6bd2fd50121c6c437db ]
+
+null-ptr-deref will occur when (req_op_level == SMB2_OPLOCK_LEVEL_LEASE)
+and parse_lease_state() return NULL.
+
+Fix this by check if 'lease_ctx_info' is NULL.
+
+Additionally, remove the redundant parentheses in
+parse_durable_handle_context().
+
+Signed-off-by: ChenXiaoSong <chenxiaosong@kylinos.cn>
+Signed-off-by: Steve French <stfrench@microsoft.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/smb/server/oplock.c  |  2 +-
+ fs/smb/server/smb2pdu.c | 10 +++++-----
+ 2 files changed, 6 insertions(+), 6 deletions(-)
+
+diff --git a/fs/smb/server/oplock.c b/fs/smb/server/oplock.c
+index a8f52c4ebbda..e546ffa57b55 100644
+--- a/fs/smb/server/oplock.c
++++ b/fs/smb/server/oplock.c
+@@ -1510,7 +1510,7 @@ void create_lease_buf(u8 *rbuf, struct lease *lease)
+  * parse_lease_state() - parse lease context containted in file open request
+  * @open_req: buffer containing smb2 file open(create) request
+  *
+- * Return:  oplock state, -ENOENT if create lease context not found
++ * Return: allocated lease context object on success, otherwise NULL
+  */
+ struct lease_ctx_info *parse_lease_state(void *open_req)
+ {
+diff --git a/fs/smb/server/smb2pdu.c b/fs/smb/server/smb2pdu.c
+index c55924f5164e..458cc736286a 100644
+--- a/fs/smb/server/smb2pdu.c
++++ b/fs/smb/server/smb2pdu.c
+@@ -2771,8 +2771,8 @@ static int parse_durable_handle_context(struct ksmbd_work *work,
+                               }
+                       }
+-                      if (((lc && (lc->req_state & SMB2_LEASE_HANDLE_CACHING_LE)) ||
+-                           req_op_level == SMB2_OPLOCK_LEVEL_BATCH)) {
++                      if ((lc && (lc->req_state & SMB2_LEASE_HANDLE_CACHING_LE)) ||
++                          req_op_level == SMB2_OPLOCK_LEVEL_BATCH) {
+                               dh_info->CreateGuid =
+                                       durable_v2_blob->CreateGuid;
+                               dh_info->persistent =
+@@ -2792,8 +2792,8 @@ static int parse_durable_handle_context(struct ksmbd_work *work,
+                               goto out;
+                       }
+-                      if (((lc && (lc->req_state & SMB2_LEASE_HANDLE_CACHING_LE)) ||
+-                           req_op_level == SMB2_OPLOCK_LEVEL_BATCH)) {
++                      if ((lc && (lc->req_state & SMB2_LEASE_HANDLE_CACHING_LE)) ||
++                          req_op_level == SMB2_OPLOCK_LEVEL_BATCH) {
+                               ksmbd_debug(SMB, "Request for durable open\n");
+                               dh_info->type = dh_idx;
+                       }
+@@ -3415,7 +3415,7 @@ int smb2_open(struct ksmbd_work *work)
+                       goto err_out1;
+               }
+       } else {
+-              if (req_op_level == SMB2_OPLOCK_LEVEL_LEASE) {
++              if (req_op_level == SMB2_OPLOCK_LEVEL_LEASE && lc) {
+                       if (S_ISDIR(file_inode(filp)->i_mode)) {
+                               lc->req_state &= ~SMB2_LEASE_WRITE_CACHING_LE;
+                               lc->is_dir = true;
+-- 
+2.43.0
+
diff --git a/queue-6.6/smp-add-missing-destroy_work_on_stack-call-in-smp_ca.patch b/queue-6.6/smp-add-missing-destroy_work_on_stack-call-in-smp_ca.patch
new file mode 100644 (file)
index 0000000..e1de646
--- /dev/null
@@ -0,0 +1,45 @@
+From 1a3b56afab970f0e4919a2cc58786fa5576cfbf7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 4 Jul 2024 14:52:13 +0800
+Subject: smp: Add missing destroy_work_on_stack() call in smp_call_on_cpu()
+
+From: Zqiang <qiang.zhang1211@gmail.com>
+
+[ Upstream commit 77aeb1b685f9db73d276bad4bb30d48505a6fd23 ]
+
+For CONFIG_DEBUG_OBJECTS_WORK=y kernels sscs.work defined by
+INIT_WORK_ONSTACK() is initialized by debug_object_init_on_stack() for
+the debug check in __init_work() to work correctly.
+
+But this lacks the counterpart to remove the tracked object from debug
+objects again, which will cause a debug object warning once the stack is
+freed.
+
+Add the missing destroy_work_on_stack() invocation to cure that.
+
+[ tglx: Massaged changelog ]
+
+Signed-off-by: Zqiang <qiang.zhang1211@gmail.com>
+Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
+Tested-by: Paul E. McKenney <paulmck@kernel.org>
+Link: https://lore.kernel.org/r/20240704065213.13559-1-qiang.zhang1211@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/smp.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/kernel/smp.c b/kernel/smp.c
+index 695eb13a276d..3eeffeaf5450 100644
+--- a/kernel/smp.c
++++ b/kernel/smp.c
+@@ -1119,6 +1119,7 @@ int smp_call_on_cpu(unsigned int cpu, int (*func)(void *), void *par, bool phys)
+       queue_work_on(cpu, system_wq, &sscs.work);
+       wait_for_completion(&sscs.done);
++      destroy_work_on_stack(&sscs.work);
+       return sscs.ret;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/spi-hisi-kunpeng-add-verification-for-the-max_freque.patch b/queue-6.6/spi-hisi-kunpeng-add-verification-for-the-max_freque.patch
new file mode 100644 (file)
index 0000000..94a4313
--- /dev/null
@@ -0,0 +1,44 @@
+From 3136aaee31485d3525d4c9a42acca56372e2abd3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 30 Jul 2024 11:20:40 +0800
+Subject: spi: hisi-kunpeng: Add verification for the max_frequency provided by
+ the firmware
+
+From: Devyn Liu <liudingyuan@huawei.com>
+
+[ Upstream commit 5127c42c77de18651aa9e8e0a3ced190103b449c ]
+
+If the value of max_speed_hz is 0, it may cause a division by zero
+error in hisi_calc_effective_speed().
+The value of max_speed_hz is provided by firmware.
+Firmware is generally considered as a trusted domain. However, as
+division by zero errors can cause system failure, for defense measure,
+the value of max_speed is validated here. So 0 is regarded as invalid
+and an error code is returned.
+
+Signed-off-by: Devyn Liu <liudingyuan@huawei.com>
+Reviewed-by: Jay Fang <f.fangjian@huawei.com>
+Link: https://patch.msgid.link/20240730032040.3156393-3-liudingyuan@huawei.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/spi/spi-hisi-kunpeng.c | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/spi/spi-hisi-kunpeng.c b/drivers/spi/spi-hisi-kunpeng.c
+index 6910b4d4c427..16054695bdb0 100644
+--- a/drivers/spi/spi-hisi-kunpeng.c
++++ b/drivers/spi/spi-hisi-kunpeng.c
+@@ -481,6 +481,9 @@ static int hisi_spi_probe(struct platform_device *pdev)
+               return -EINVAL;
+       }
++      if (host->max_speed_hz == 0)
++              return dev_err_probe(dev, -EINVAL, "spi-max-frequency can't be 0\n");
++
+       ret = device_property_read_u16(dev, "num-cs",
+                                       &host->num_chipselect);
+       if (ret)
+-- 
+2.43.0
+
diff --git a/queue-6.6/spi-spi-fsl-lpspi-limit-prescale-bit-in-tcr-register.patch b/queue-6.6/spi-spi-fsl-lpspi-limit-prescale-bit-in-tcr-register.patch
new file mode 100644 (file)
index 0000000..80ee2b2
--- /dev/null
@@ -0,0 +1,117 @@
+From af3d06cb0a9130fd5d07998ab60f25b17dccb609 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 20 Aug 2024 15:06:58 +0800
+Subject: spi: spi-fsl-lpspi: limit PRESCALE bit in TCR register
+
+From: Carlos Song <carlos.song@nxp.com>
+
+[ Upstream commit 783bf5d09f86b9736605f3e01a3472e55ef98ff8 ]
+
+Referring to the errata ERR051608 of I.MX93, LPSPI TCR[PRESCALE]
+can only be configured to be 0 or 1, other values are not valid
+and will cause LPSPI to not work.
+
+Add the prescale limitation for LPSPI in I.MX93. Other platforms
+are not affected.
+
+Signed-off-by: Carlos Song <carlos.song@nxp.com>
+Link: https://patch.msgid.link/20240820070658.672127-1-carlos.song@nxp.com
+Signed-off-by: Mark Brown <broonie@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/spi/spi-fsl-lpspi.c | 31 +++++++++++++++++++++++++++++--
+ 1 file changed, 29 insertions(+), 2 deletions(-)
+
+diff --git a/drivers/spi/spi-fsl-lpspi.c b/drivers/spi/spi-fsl-lpspi.c
+index 3c0f7dc9614d..f02b2f741681 100644
+--- a/drivers/spi/spi-fsl-lpspi.c
++++ b/drivers/spi/spi-fsl-lpspi.c
+@@ -82,6 +82,10 @@
+ #define TCR_RXMSK     BIT(19)
+ #define TCR_TXMSK     BIT(18)
++struct fsl_lpspi_devtype_data {
++      u8 prescale_max;
++};
++
+ struct lpspi_config {
+       u8 bpw;
+       u8 chip_select;
+@@ -119,10 +123,25 @@ struct fsl_lpspi_data {
+       bool usedma;
+       struct completion dma_rx_completion;
+       struct completion dma_tx_completion;
++
++      const struct fsl_lpspi_devtype_data *devtype_data;
++};
++
++/*
++ * ERR051608 fixed or not:
++ * https://www.nxp.com/docs/en/errata/i.MX93_1P87f.pdf
++ */
++static struct fsl_lpspi_devtype_data imx93_lpspi_devtype_data = {
++      .prescale_max = 1,
++};
++
++static struct fsl_lpspi_devtype_data imx7ulp_lpspi_devtype_data = {
++      .prescale_max = 8,
+ };
+ static const struct of_device_id fsl_lpspi_dt_ids[] = {
+-      { .compatible = "fsl,imx7ulp-spi", },
++      { .compatible = "fsl,imx7ulp-spi", .data = &imx7ulp_lpspi_devtype_data,},
++      { .compatible = "fsl,imx93-spi", .data = &imx93_lpspi_devtype_data,},
+       { /* sentinel */ }
+ };
+ MODULE_DEVICE_TABLE(of, fsl_lpspi_dt_ids);
+@@ -297,9 +316,11 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
+ {
+       struct lpspi_config config = fsl_lpspi->config;
+       unsigned int perclk_rate, scldiv, div;
++      u8 prescale_max;
+       u8 prescale;
+       perclk_rate = clk_get_rate(fsl_lpspi->clk_per);
++      prescale_max = fsl_lpspi->devtype_data->prescale_max;
+       if (!config.speed_hz) {
+               dev_err(fsl_lpspi->dev,
+@@ -315,7 +336,7 @@ static int fsl_lpspi_set_bitrate(struct fsl_lpspi_data *fsl_lpspi)
+       div = DIV_ROUND_UP(perclk_rate, config.speed_hz);
+-      for (prescale = 0; prescale < 8; prescale++) {
++      for (prescale = 0; prescale < prescale_max; prescale++) {
+               scldiv = div / (1 << prescale) - 2;
+               if (scldiv < 256) {
+                       fsl_lpspi->config.prescale = prescale;
+@@ -822,6 +843,7 @@ static int fsl_lpspi_init_rpm(struct fsl_lpspi_data *fsl_lpspi)
+ static int fsl_lpspi_probe(struct platform_device *pdev)
+ {
++      const struct fsl_lpspi_devtype_data *devtype_data;
+       struct fsl_lpspi_data *fsl_lpspi;
+       struct spi_controller *controller;
+       struct resource *res;
+@@ -830,6 +852,10 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
+       u32 temp;
+       bool is_target;
++      devtype_data = of_device_get_match_data(&pdev->dev);
++      if (!devtype_data)
++              return -ENODEV;
++
+       is_target = of_property_read_bool((&pdev->dev)->of_node, "spi-slave");
+       if (is_target)
+               controller = devm_spi_alloc_target(&pdev->dev,
+@@ -848,6 +874,7 @@ static int fsl_lpspi_probe(struct platform_device *pdev)
+       fsl_lpspi->is_target = is_target;
+       fsl_lpspi->is_only_cs1 = of_property_read_bool((&pdev->dev)->of_node,
+                                               "fsl,spi-only-use-cs1-sel");
++      fsl_lpspi->devtype_data = devtype_data;
+       init_completion(&fsl_lpspi->xfer_done);
+-- 
+2.43.0
+
diff --git a/queue-6.6/squashfs-sanity-check-symbolic-link-size.patch b/queue-6.6/squashfs-sanity-check-symbolic-link-size.patch
new file mode 100644 (file)
index 0000000..7afe2a5
--- /dev/null
@@ -0,0 +1,68 @@
+From da3ac1b4d44ec1d3f52385b370772602f140fe5b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 12 Aug 2024 00:28:21 +0100
+Subject: Squashfs: sanity check symbolic link size
+
+From: Phillip Lougher <phillip@squashfs.org.uk>
+
+[ Upstream commit 810ee43d9cd245d138a2733d87a24858a23f577d ]
+
+Syzkiller reports a "KMSAN: uninit-value in pick_link" bug.
+
+This is caused by an uninitialised page, which is ultimately caused
+by a corrupted symbolic link size read from disk.
+
+The reason why the corrupted symlink size causes an uninitialised
+page is due to the following sequence of events:
+
+1. squashfs_read_inode() is called to read the symbolic
+   link from disk.  This assigns the corrupted value
+   3875536935 to inode->i_size.
+
+2. Later squashfs_symlink_read_folio() is called, which assigns
+   this corrupted value to the length variable, which being a
+   signed int, overflows producing a negative number.
+
+3. The following loop that fills in the page contents checks that
+   the copied bytes is less than length, which being negative means
+   the loop is skipped, producing an uninitialised page.
+
+This patch adds a sanity check which checks that the symbolic
+link size is not larger than expected.
+
+--
+
+Signed-off-by: Phillip Lougher <phillip@squashfs.org.uk>
+Link: https://lore.kernel.org/r/20240811232821.13903-1-phillip@squashfs.org.uk
+Reported-by: Lizhi Xu <lizhi.xu@windriver.com>
+Reported-by: syzbot+24ac24ff58dc5b0d26b9@syzkaller.appspotmail.com
+Closes: https://lore.kernel.org/all/000000000000a90e8c061e86a76b@google.com/
+V2: fix spelling mistake.
+Signed-off-by: Christian Brauner <brauner@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/squashfs/inode.c | 7 ++++++-
+ 1 file changed, 6 insertions(+), 1 deletion(-)
+
+diff --git a/fs/squashfs/inode.c b/fs/squashfs/inode.c
+index 16bd693d0b3a..d5918eba27e3 100644
+--- a/fs/squashfs/inode.c
++++ b/fs/squashfs/inode.c
+@@ -279,8 +279,13 @@ int squashfs_read_inode(struct inode *inode, long long ino)
+               if (err < 0)
+                       goto failed_read;
+-              set_nlink(inode, le32_to_cpu(sqsh_ino->nlink));
+               inode->i_size = le32_to_cpu(sqsh_ino->symlink_size);
++              if (inode->i_size > PAGE_SIZE) {
++                      ERROR("Corrupted symlink\n");
++                      return -EINVAL;
++              }
++
++              set_nlink(inode, le32_to_cpu(sqsh_ino->nlink));
+               inode->i_op = &squashfs_symlink_inode_ops;
+               inode_nohighmem(inode);
+               inode->i_data.a_ops = &squashfs_symlink_aops;
+-- 
+2.43.0
+
diff --git a/queue-6.6/tcp-don-t-drop-syn-ack-for-simultaneous-connect.patch b/queue-6.6/tcp-don-t-drop-syn-ack-for-simultaneous-connect.patch
new file mode 100644 (file)
index 0000000..61600b4
--- /dev/null
@@ -0,0 +1,108 @@
+From 244427943b59ea033a823935bdf2afe677255b51 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 10 Jul 2024 10:12:45 -0700
+Subject: tcp: Don't drop SYN+ACK for simultaneous connect().
+
+From: Kuniyuki Iwashima <kuniyu@amazon.com>
+
+[ Upstream commit 23e89e8ee7be73e21200947885a6d3a109a2c58d ]
+
+RFC 9293 states that in the case of simultaneous connect(), the connection
+gets established when SYN+ACK is received. [0]
+
+      TCP Peer A                                       TCP Peer B
+
+  1.  CLOSED                                           CLOSED
+  2.  SYN-SENT     --> <SEQ=100><CTL=SYN>              ...
+  3.  SYN-RECEIVED <-- <SEQ=300><CTL=SYN>              <-- SYN-SENT
+  4.               ... <SEQ=100><CTL=SYN>              --> SYN-RECEIVED
+  5.  SYN-RECEIVED --> <SEQ=100><ACK=301><CTL=SYN,ACK> ...
+  6.  ESTABLISHED  <-- <SEQ=300><ACK=101><CTL=SYN,ACK> <-- SYN-RECEIVED
+  7.               ... <SEQ=100><ACK=301><CTL=SYN,ACK> --> ESTABLISHED
+
+However, since commit 0c24604b68fc ("tcp: implement RFC 5961 4.2"), such a
+SYN+ACK is dropped in tcp_validate_incoming() and responded with Challenge
+ACK.
+
+For example, the write() syscall in the following packetdrill script fails
+with -EAGAIN, and wrong SNMP stats get incremented.
+
+   0 socket(..., SOCK_STREAM|SOCK_NONBLOCK, IPPROTO_TCP) = 3
+  +0 connect(3, ..., ...) = -1 EINPROGRESS (Operation now in progress)
+
+  +0 > S  0:0(0) <mss 1460,sackOK,TS val 1000 ecr 0,nop,wscale 8>
+  +0 < S  0:0(0) win 1000 <mss 1000>
+  +0 > S. 0:0(0) ack 1 <mss 1460,sackOK,TS val 3308134035 ecr 0,nop,wscale 8>
+  +0 < S. 0:0(0) ack 1 win 1000
+
+  +0 write(3, ..., 100) = 100
+  +0 > P. 1:101(100) ack 1
+
+  --
+
+  # packetdrill cross-synack.pkt
+  cross-synack.pkt:13: runtime error in write call: Expected result 100 but got -1 with errno 11 (Resource temporarily unavailable)
+  # nstat
+  ...
+  TcpExtTCPChallengeACK           1                  0.0
+  TcpExtTCPSYNChallenge           1                  0.0
+
+The problem is that bpf_skops_established() is triggered by the Challenge
+ACK instead of SYN+ACK.  This causes the bpf prog to miss the chance to
+check if the peer supports a TCP option that is expected to be exchanged
+in SYN and SYN+ACK.
+
+Let's accept a bare SYN+ACK for active-open TCP_SYN_RECV sockets to avoid
+such a situation.
+
+Note that tcp_ack_snd_check() in tcp_rcv_state_process() is skipped not to
+send an unnecessary ACK, but this could be a bit risky for net.git, so this
+targets for net-next.
+
+Link: https://www.rfc-editor.org/rfc/rfc9293.html#section-3.5-7 [0]
+Signed-off-by: Kuniyuki Iwashima <kuniyu@amazon.com>
+Reviewed-by: Eric Dumazet <edumazet@google.com>
+Link: https://patch.msgid.link/20240710171246.87533-2-kuniyu@amazon.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ net/ipv4/tcp_input.c | 9 +++++++++
+ 1 file changed, 9 insertions(+)
+
+diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
+index 24c7c955dc95..336bc97e86d5 100644
+--- a/net/ipv4/tcp_input.c
++++ b/net/ipv4/tcp_input.c
+@@ -5880,6 +5880,11 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
+        * RFC 5961 4.2 : Send a challenge ack
+        */
+       if (th->syn) {
++              if (sk->sk_state == TCP_SYN_RECV && sk->sk_socket && th->ack &&
++                  TCP_SKB_CB(skb)->seq + 1 == TCP_SKB_CB(skb)->end_seq &&
++                  TCP_SKB_CB(skb)->seq + 1 == tp->rcv_nxt &&
++                  TCP_SKB_CB(skb)->ack_seq == tp->snd_nxt)
++                      goto pass;
+ syn_challenge:
+               if (syn_inerr)
+                       TCP_INC_STATS(sock_net(sk), TCP_MIB_INERRS);
+@@ -5889,6 +5894,7 @@ static bool tcp_validate_incoming(struct sock *sk, struct sk_buff *skb,
+               goto discard;
+       }
++pass:
+       bpf_skops_parse_hdr(sk, skb);
+       return true;
+@@ -6673,6 +6679,9 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
+               tcp_fast_path_on(tp);
+               if (sk->sk_shutdown & SEND_SHUTDOWN)
+                       tcp_shutdown(sk, SEND_SHUTDOWN);
++
++              if (sk->sk_socket)
++                      goto consume;
+               break;
+       case TCP_FIN_WAIT1: {
+-- 
+2.43.0
+
diff --git a/queue-6.6/udf-avoid-excessive-partition-lengths.patch b/queue-6.6/udf-avoid-excessive-partition-lengths.patch
new file mode 100644 (file)
index 0000000..0c60ee5
--- /dev/null
@@ -0,0 +1,63 @@
+From d6d9efc5cf8a1c4279e4b3cb8d85f089f83df99c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 20 Jun 2024 12:52:17 +0200
+Subject: udf: Avoid excessive partition lengths
+
+From: Jan Kara <jack@suse.cz>
+
+[ Upstream commit ebbe26fd54a9621994bc16b14f2ba8f84c089693 ]
+
+Avoid mounting filesystems where the partition would overflow the
+32-bits used for block number. Also refuse to mount filesystems where
+the partition length is so large we cannot safely index bits in a
+block bitmap.
+
+Link: https://patch.msgid.link/20240620130403.14731-1-jack@suse.cz
+Signed-off-by: Jan Kara <jack@suse.cz>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/udf/super.c | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/fs/udf/super.c b/fs/udf/super.c
+index e0080fda2526..3c78535f406b 100644
+--- a/fs/udf/super.c
++++ b/fs/udf/super.c
+@@ -1080,12 +1080,19 @@ static int udf_fill_partdesc_info(struct super_block *sb,
+       struct udf_part_map *map;
+       struct udf_sb_info *sbi = UDF_SB(sb);
+       struct partitionHeaderDesc *phd;
++      u32 sum;
+       int err;
+       map = &sbi->s_partmaps[p_index];
+       map->s_partition_len = le32_to_cpu(p->partitionLength); /* blocks */
+       map->s_partition_root = le32_to_cpu(p->partitionStartingLocation);
++      if (check_add_overflow(map->s_partition_root, map->s_partition_len,
++                             &sum)) {
++              udf_err(sb, "Partition %d has invalid location %u + %u\n",
++                      p_index, map->s_partition_root, map->s_partition_len);
++              return -EFSCORRUPTED;
++      }
+       if (p->accessType == cpu_to_le32(PD_ACCESS_TYPE_READ_ONLY))
+               map->s_partition_flags |= UDF_PART_FLAG_READ_ONLY;
+@@ -1141,6 +1148,14 @@ static int udf_fill_partdesc_info(struct super_block *sb,
+               bitmap->s_extPosition = le32_to_cpu(
+                               phd->unallocSpaceBitmap.extPosition);
+               map->s_partition_flags |= UDF_PART_FLAG_UNALLOC_BITMAP;
++              /* Check whether math over bitmap won't overflow. */
++              if (check_add_overflow(map->s_partition_len,
++                                     sizeof(struct spaceBitmapDesc) << 3,
++                                     &sum)) {
++                      udf_err(sb, "Partition %d is too long (%u)\n", p_index,
++                              map->s_partition_len);
++                      return -EFSCORRUPTED;
++              }
+               udf_debug("unallocSpaceBitmap (part %d) @ %u\n",
+                         p_index, bitmap->s_extPosition);
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/um-line-always-fill-error_out-in-setup_one_line.patch b/queue-6.6/um-line-always-fill-error_out-in-setup_one_line.patch
new file mode 100644 (file)
index 0000000..ec3c527
--- /dev/null
@@ -0,0 +1,44 @@
+From b8f12fcc3b2e4c68cd316af97b7ecc1b6eb5e855 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jul 2024 17:22:36 +0200
+Subject: um: line: always fill *error_out in setup_one_line()
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+[ Upstream commit 824ac4a5edd3f7494ab1996826c4f47f8ef0f63d ]
+
+The pointer isn't initialized by callers, but I have
+encountered cases where it's still printed; initialize
+it in all possible cases in setup_one_line().
+
+Link: https://patch.msgid.link/20240703172235.ad863568b55f.Iaa1eba4db8265d7715ba71d5f6bb8c7ff63d27e9@changeid
+Acked-By: Anton Ivanov <anton.ivanov@cambridgegreys.com>
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/um/drivers/line.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/arch/um/drivers/line.c b/arch/um/drivers/line.c
+index 375200e9aba9..2ba4e0d4e26b 100644
+--- a/arch/um/drivers/line.c
++++ b/arch/um/drivers/line.c
+@@ -383,6 +383,7 @@ int setup_one_line(struct line *lines, int n, char *init,
+                       parse_chan_pair(NULL, line, n, opts, error_out);
+                       err = 0;
+               }
++              *error_out = "configured as 'none'";
+       } else {
+               char *new = kstrdup(init, GFP_KERNEL);
+               if (!new) {
+@@ -406,6 +407,7 @@ int setup_one_line(struct line *lines, int n, char *init,
+                       }
+               }
+               if (err) {
++                      *error_out = "failed to parse channel pair";
+                       line->init_str = NULL;
+                       line->valid = 0;
+                       kfree(new);
+-- 
+2.43.0
+
diff --git a/queue-6.6/usb-gadget-aspeed_udc-validate-endpoint-index-for-as.patch b/queue-6.6/usb-gadget-aspeed_udc-validate-endpoint-index-for-as.patch
new file mode 100644 (file)
index 0000000..3771dd9
--- /dev/null
@@ -0,0 +1,40 @@
+From 64e49138203e7e0610d964bfd9ed087f674330b6 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jun 2024 10:23:06 +0800
+Subject: usb: gadget: aspeed_udc: validate endpoint index for ast udc
+
+From: Ma Ke <make24@iscas.ac.cn>
+
+[ Upstream commit ee0d382feb44ec0f445e2ad63786cd7f3f6a8199 ]
+
+We should verify the bound of the array to assure that host
+may not manipulate the index to point past endpoint array.
+
+Found by static analysis.
+
+Signed-off-by: Ma Ke <make24@iscas.ac.cn>
+Reviewed-by: Andrew Jeffery <andrew@codeconstruct.com.au>
+Acked-by: Andrew Jeffery <andrew@codeconstruct.com.au>
+Link: https://lore.kernel.org/r/20240625022306.2568122-1-make24@iscas.ac.cn
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/gadget/udc/aspeed_udc.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/drivers/usb/gadget/udc/aspeed_udc.c b/drivers/usb/gadget/udc/aspeed_udc.c
+index fc2ead0fe621..4868286574a1 100644
+--- a/drivers/usb/gadget/udc/aspeed_udc.c
++++ b/drivers/usb/gadget/udc/aspeed_udc.c
+@@ -1009,6 +1009,8 @@ static void ast_udc_getstatus(struct ast_udc_dev *udc)
+               break;
+       case USB_RECIP_ENDPOINT:
+               epnum = crq.wIndex & USB_ENDPOINT_NUMBER_MASK;
++              if (epnum >= AST_UDC_NUM_ENDPOINTS)
++                      goto stall;
+               status = udc->ep[epnum].stopped;
+               break;
+       default:
+-- 
+2.43.0
+
diff --git a/queue-6.6/usb-uas-set-host-status-byte-on-data-completion-erro.patch b/queue-6.6/usb-uas-set-host-status-byte-on-data-completion-erro.patch
new file mode 100644 (file)
index 0000000..67463c9
--- /dev/null
@@ -0,0 +1,41 @@
+From 5f379798bbd35616a90bb1593ed1c00c76032c8e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 23:32:57 -0400
+Subject: usb: uas: set host status byte on data completion error
+
+From: Shantanu Goel <sgoel01@yahoo.com>
+
+[ Upstream commit 9d32685a251a754f1823d287df233716aa23bcb9 ]
+
+Set the host status byte when a data completion error is encountered
+otherwise the upper layer may end up using the invalid zero'ed data.
+The following output was observed from scsi/sd.c prior to this fix.
+
+[   11.872824] sd 0:0:0:1: [sdf] tag#9 data cmplt err -75 uas-tag 1 inflight:
+[   11.872826] sd 0:0:0:1: [sdf] tag#9 CDB: Read capacity(16) 9e 10 00 00 00 00 00 00 00 00 00 00 00 20 00 00
+[   11.872830] sd 0:0:0:1: [sdf] Sector size 0 reported, assuming 512.
+
+Signed-off-by: Shantanu Goel <sgoel01@yahoo.com>
+Acked-by: Oliver Neukum <oneukum@suse.com>
+Link: https://lore.kernel.org/r/87msnx4ec6.fsf@yahoo.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/usb/storage/uas.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/usb/storage/uas.c b/drivers/usb/storage/uas.c
+index 451d9569163a..f794cb39cc31 100644
+--- a/drivers/usb/storage/uas.c
++++ b/drivers/usb/storage/uas.c
+@@ -422,6 +422,7 @@ static void uas_data_cmplt(struct urb *urb)
+                       uas_log_cmd_state(cmnd, "data cmplt err", status);
+               /* error: no data transfered */
+               scsi_set_resid(cmnd, sdb->length);
++              set_host_byte(cmnd, DID_ERROR);
+       } else {
+               scsi_set_resid(cmnd, sdb->length - urb->actual_length);
+       }
+-- 
+2.43.0
+
diff --git a/queue-6.6/usbnet-ipheth-race-between-ipheth_close-and-error-ha.patch b/queue-6.6/usbnet-ipheth-race-between-ipheth_close-and-error-ha.patch
new file mode 100644 (file)
index 0000000..dab199c
--- /dev/null
@@ -0,0 +1,44 @@
+From 501c7a8c027c90aa4a74fe43b908e2b9f4ca59b3 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 6 Aug 2024 19:28:05 +0200
+Subject: usbnet: ipheth: race between ipheth_close and error handling
+
+From: Oliver Neukum <oneukum@suse.com>
+
+[ Upstream commit e5876b088ba03a62124266fa20d00e65533c7269 ]
+
+ipheth_sndbulk_callback() can submit carrier_work
+as a part of its error handling. That means that
+the driver must make sure that the work is cancelled
+after it has made sure that no more URB can terminate
+with an error condition.
+
+Hence the order of actions in ipheth_close() needs
+to be inverted.
+
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Signed-off-by: Foster Snowhill <forst@pen.gy>
+Tested-by: Georgi Valkov <gvalkov@gmail.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/ipheth.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/usb/ipheth.c b/drivers/net/usb/ipheth.c
+index 687d70cfc556..6eeef10edada 100644
+--- a/drivers/net/usb/ipheth.c
++++ b/drivers/net/usb/ipheth.c
+@@ -475,8 +475,8 @@ static int ipheth_close(struct net_device *net)
+ {
+       struct ipheth_device *dev = netdev_priv(net);
+-      cancel_delayed_work_sync(&dev->carrier_work);
+       netif_stop_queue(net);
++      cancel_delayed_work_sync(&dev->carrier_work);
+       return 0;
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/usbnet-modern-method-to-get-random-mac.patch b/queue-6.6/usbnet-modern-method-to-get-random-mac.patch
new file mode 100644 (file)
index 0000000..b998c71
--- /dev/null
@@ -0,0 +1,75 @@
+From d7822db3f048461753f4d085116a3a9f1a46738a Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 29 Aug 2024 19:50:55 +0200
+Subject: usbnet: modern method to get random MAC
+
+From: Oliver Neukum <oneukum@suse.com>
+
+[ Upstream commit bab8eb0dd4cb995caa4a0529d5655531c2ec5e8e ]
+
+The driver generates a random MAC once on load
+and uses it over and over, including on two devices
+needing a random MAC at the same time.
+
+Jakub suggested revamping the driver to the modern
+API for setting a random MAC rather than fixing
+the old stuff.
+
+The bug is as old as the driver.
+
+Signed-off-by: Oliver Neukum <oneukum@suse.com>
+Reviewed-by: Simon Horman <horms@kernel.org>
+Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
+Link: https://patch.msgid.link/20240829175201.670718-1-oneukum@suse.com
+Signed-off-by: Jakub Kicinski <kuba@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/usb/usbnet.c | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c
+index 2d14b0d78541..6cc1b56ddde2 100644
+--- a/drivers/net/usb/usbnet.c
++++ b/drivers/net/usb/usbnet.c
+@@ -61,9 +61,6 @@
+ /*-------------------------------------------------------------------------*/
+-// randomly generated ethernet address
+-static u8     node_id [ETH_ALEN];
+-
+ /* use ethtool to change the level for any given device */
+ static int msg_level = -1;
+ module_param (msg_level, int, 0);
+@@ -1731,7 +1728,6 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
+       dev->net = net;
+       strscpy(net->name, "usb%d", sizeof(net->name));
+-      eth_hw_addr_set(net, node_id);
+       /* rx and tx sides can use different message sizes;
+        * bind() should set rx_urb_size in that case.
+@@ -1805,9 +1801,9 @@ usbnet_probe (struct usb_interface *udev, const struct usb_device_id *prod)
+               goto out4;
+       }
+-      /* let userspace know we have a random address */
+-      if (ether_addr_equal(net->dev_addr, node_id))
+-              net->addr_assign_type = NET_ADDR_RANDOM;
++      /* this flags the device for user space */
++      if (!is_valid_ether_addr(net->dev_addr))
++              eth_hw_addr_random(net);
+       if ((dev->driver_info->flags & FLAG_WLAN) != 0)
+               SET_NETDEV_DEVTYPE(net, &wlan_type);
+@@ -2217,7 +2213,6 @@ static int __init usbnet_init(void)
+       BUILD_BUG_ON(
+               sizeof_field(struct sk_buff, cb) < sizeof(struct skb_data));
+-      eth_random_addr(node_id);
+       return 0;
+ }
+ module_init(usbnet_init);
+-- 
+2.43.0
+
diff --git a/queue-6.6/vfio-spapr-always-clear-tces-before-unsetting-the-wi.patch b/queue-6.6/vfio-spapr-always-clear-tces-before-unsetting-the-wi.patch
new file mode 100644 (file)
index 0000000..5fa81ce
--- /dev/null
@@ -0,0 +1,75 @@
+From 61c454b55c7dabab19a37e8c7b787229ccffdc9b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 24 Jun 2024 12:38:58 +0000
+Subject: vfio/spapr: Always clear TCEs before unsetting the window
+
+From: Shivaprasad G Bhat <sbhat@linux.ibm.com>
+
+[ Upstream commit 4ba2fdff2eb174114786784926d0efb6903c88a6 ]
+
+The PAPR expects the TCE table to have no entries at the time of
+unset window(i.e. remove-pe). The TCE clear right now is done
+before freeing the iommu table. On pSeries, the unset window
+makes those entries inaccessible to the OS and the H_PUT/GET calls
+fail on them with H_CONSTRAINED.
+
+On PowerNV, this has no side effect as the TCE clear can be done
+before the DMA window removal as well.
+
+Signed-off-by: Shivaprasad G Bhat <sbhat@linux.ibm.com>
+Signed-off-by: Michael Ellerman <mpe@ellerman.id.au>
+Link: https://msgid.link/171923273535.1397.1236742071894414895.stgit@linux.ibm.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/vfio/vfio_iommu_spapr_tce.c | 13 +++++++++----
+ 1 file changed, 9 insertions(+), 4 deletions(-)
+
+diff --git a/drivers/vfio/vfio_iommu_spapr_tce.c b/drivers/vfio/vfio_iommu_spapr_tce.c
+index a94ec6225d31..5f9e7e477078 100644
+--- a/drivers/vfio/vfio_iommu_spapr_tce.c
++++ b/drivers/vfio/vfio_iommu_spapr_tce.c
+@@ -364,7 +364,6 @@ static void tce_iommu_release(void *iommu_data)
+               if (!tbl)
+                       continue;
+-              tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
+               tce_iommu_free_table(container, tbl);
+       }
+@@ -720,6 +719,8 @@ static long tce_iommu_remove_window(struct tce_container *container,
+       BUG_ON(!tbl->it_size);
++      tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
++
+       /* Detach groups from IOMMUs */
+       list_for_each_entry(tcegrp, &container->group_list, next) {
+               table_group = iommu_group_get_iommudata(tcegrp->grp);
+@@ -738,7 +739,6 @@ static long tce_iommu_remove_window(struct tce_container *container,
+       }
+       /* Free table */
+-      tce_iommu_clear(container, tbl, tbl->it_offset, tbl->it_size);
+       tce_iommu_free_table(container, tbl);
+       container->tables[num] = NULL;
+@@ -1197,9 +1197,14 @@ static void tce_iommu_release_ownership(struct tce_container *container,
+               return;
+       }
+-      for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i)
+-              if (container->tables[i])
++      for (i = 0; i < IOMMU_TABLE_GROUP_MAX_TABLES; ++i) {
++              if (container->tables[i]) {
++                      tce_iommu_clear(container, container->tables[i],
++                                      container->tables[i]->it_offset,
++                                      container->tables[i]->it_size);
+                       table_group->ops->unset_window(table_group, i);
++              }
++      }
+ }
+ static long tce_iommu_take_ownership(struct tce_container *container,
+-- 
+2.43.0
+
diff --git a/queue-6.6/vfs-fix-potential-circular-locking-through-setxattr-.patch b/queue-6.6/vfs-fix-potential-circular-locking-through-setxattr-.patch
new file mode 100644 (file)
index 0000000..6b924ec
--- /dev/null
@@ -0,0 +1,381 @@
+From 7114429fc9e82d8e526640abbd208b198bfdd87b Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 23 Jul 2024 09:59:54 +0100
+Subject: vfs: Fix potential circular locking through setxattr() and
+ removexattr()
+
+From: David Howells <dhowells@redhat.com>
+
+[ Upstream commit c3a5e3e872f3688ae0dc57bb78ca633921d96a91 ]
+
+When using cachefiles, lockdep may emit something similar to the circular
+locking dependency notice below.  The problem appears to stem from the
+following:
+
+ (1) Cachefiles manipulates xattrs on the files in its cache when called
+     from ->writepages().
+
+ (2) The setxattr() and removexattr() system call handlers get the name
+     (and value) from userspace after taking the sb_writers lock, putting
+     accesses of the vma->vm_lock and mm->mmap_lock inside of that.
+
+ (3) The afs filesystem uses a per-inode lock to prevent multiple
+     revalidation RPCs and in writeback vs truncate to prevent parallel
+     operations from deadlocking against the server on one side and local
+     page locks on the other.
+
+Fix this by moving the getting of the name and value in {get,remove}xattr()
+outside of the sb_writers lock.  This also has the minor benefits that we
+don't need to reget these in the event of a retry and we never try to take
+the sb_writers lock in the event we can't pull the name and value into the
+kernel.
+
+Alternative approaches that might fix this include moving the dispatch of a
+write to the cache off to a workqueue or trying to do without the
+validation lock in afs.  Note that this might also affect other filesystems
+that use netfslib and/or cachefiles.
+
+ ======================================================
+ WARNING: possible circular locking dependency detected
+ 6.10.0-build2+ #956 Not tainted
+ ------------------------------------------------------
+ fsstress/6050 is trying to acquire lock:
+ ffff888138fd82f0 (mapping.invalidate_lock#3){++++}-{3:3}, at: filemap_fault+0x26e/0x8b0
+
+ but task is already holding lock:
+ ffff888113f26d18 (&vma->vm_lock->lock){++++}-{3:3}, at: lock_vma_under_rcu+0x165/0x250
+
+ which lock already depends on the new lock.
+
+ the existing dependency chain (in reverse order) is:
+
+ -> #4 (&vma->vm_lock->lock){++++}-{3:3}:
+        __lock_acquire+0xaf0/0xd80
+        lock_acquire.part.0+0x103/0x280
+        down_write+0x3b/0x50
+        vma_start_write+0x6b/0xa0
+        vma_link+0xcc/0x140
+        insert_vm_struct+0xb7/0xf0
+        alloc_bprm+0x2c1/0x390
+        kernel_execve+0x65/0x1a0
+        call_usermodehelper_exec_async+0x14d/0x190
+        ret_from_fork+0x24/0x40
+        ret_from_fork_asm+0x1a/0x30
+
+ -> #3 (&mm->mmap_lock){++++}-{3:3}:
+        __lock_acquire+0xaf0/0xd80
+        lock_acquire.part.0+0x103/0x280
+        __might_fault+0x7c/0xb0
+        strncpy_from_user+0x25/0x160
+        removexattr+0x7f/0x100
+        __do_sys_fremovexattr+0x7e/0xb0
+        do_syscall_64+0x9f/0x100
+        entry_SYSCALL_64_after_hwframe+0x76/0x7e
+
+ -> #2 (sb_writers#14){.+.+}-{0:0}:
+        __lock_acquire+0xaf0/0xd80
+        lock_acquire.part.0+0x103/0x280
+        percpu_down_read+0x3c/0x90
+        vfs_iocb_iter_write+0xe9/0x1d0
+        __cachefiles_write+0x367/0x430
+        cachefiles_issue_write+0x299/0x2f0
+        netfs_advance_write+0x117/0x140
+        netfs_write_folio.isra.0+0x5ca/0x6e0
+        netfs_writepages+0x230/0x2f0
+        afs_writepages+0x4d/0x70
+        do_writepages+0x1e8/0x3e0
+        filemap_fdatawrite_wbc+0x84/0xa0
+        __filemap_fdatawrite_range+0xa8/0xf0
+        file_write_and_wait_range+0x59/0x90
+        afs_release+0x10f/0x270
+        __fput+0x25f/0x3d0
+        __do_sys_close+0x43/0x70
+        do_syscall_64+0x9f/0x100
+        entry_SYSCALL_64_after_hwframe+0x76/0x7e
+
+ -> #1 (&vnode->validate_lock){++++}-{3:3}:
+        __lock_acquire+0xaf0/0xd80
+        lock_acquire.part.0+0x103/0x280
+        down_read+0x95/0x200
+        afs_writepages+0x37/0x70
+        do_writepages+0x1e8/0x3e0
+        filemap_fdatawrite_wbc+0x84/0xa0
+        filemap_invalidate_inode+0x167/0x1e0
+        netfs_unbuffered_write_iter+0x1bd/0x2d0
+        vfs_write+0x22e/0x320
+        ksys_write+0xbc/0x130
+        do_syscall_64+0x9f/0x100
+        entry_SYSCALL_64_after_hwframe+0x76/0x7e
+
+ -> #0 (mapping.invalidate_lock#3){++++}-{3:3}:
+        check_noncircular+0x119/0x160
+        check_prev_add+0x195/0x430
+        __lock_acquire+0xaf0/0xd80
+        lock_acquire.part.0+0x103/0x280
+        down_read+0x95/0x200
+        filemap_fault+0x26e/0x8b0
+        __do_fault+0x57/0xd0
+        do_pte_missing+0x23b/0x320
+        __handle_mm_fault+0x2d4/0x320
+        handle_mm_fault+0x14f/0x260
+        do_user_addr_fault+0x2a2/0x500
+        exc_page_fault+0x71/0x90
+        asm_exc_page_fault+0x22/0x30
+
+ other info that might help us debug this:
+
+ Chain exists of:
+   mapping.invalidate_lock#3 --> &mm->mmap_lock --> &vma->vm_lock->lock
+
+  Possible unsafe locking scenario:
+
+        CPU0                    CPU1
+        ----                    ----
+   rlock(&vma->vm_lock->lock);
+                                lock(&mm->mmap_lock);
+                                lock(&vma->vm_lock->lock);
+   rlock(mapping.invalidate_lock#3);
+
+  *** DEADLOCK ***
+
+ 1 lock held by fsstress/6050:
+  #0: ffff888113f26d18 (&vma->vm_lock->lock){++++}-{3:3}, at: lock_vma_under_rcu+0x165/0x250
+
+ stack backtrace:
+ CPU: 0 PID: 6050 Comm: fsstress Not tainted 6.10.0-build2+ #956
+ Hardware name: ASUS All Series/H97-PLUS, BIOS 2306 10/09/2014
+ Call Trace:
+  <TASK>
+  dump_stack_lvl+0x57/0x80
+  check_noncircular+0x119/0x160
+  ? queued_spin_lock_slowpath+0x4be/0x510
+  ? __pfx_check_noncircular+0x10/0x10
+  ? __pfx_queued_spin_lock_slowpath+0x10/0x10
+  ? mark_lock+0x47/0x160
+  ? init_chain_block+0x9c/0xc0
+  ? add_chain_block+0x84/0xf0
+  check_prev_add+0x195/0x430
+  __lock_acquire+0xaf0/0xd80
+  ? __pfx___lock_acquire+0x10/0x10
+  ? __lock_release.isra.0+0x13b/0x230
+  lock_acquire.part.0+0x103/0x280
+  ? filemap_fault+0x26e/0x8b0
+  ? __pfx_lock_acquire.part.0+0x10/0x10
+  ? rcu_is_watching+0x34/0x60
+  ? lock_acquire+0xd7/0x120
+  down_read+0x95/0x200
+  ? filemap_fault+0x26e/0x8b0
+  ? __pfx_down_read+0x10/0x10
+  ? __filemap_get_folio+0x25/0x1a0
+  filemap_fault+0x26e/0x8b0
+  ? __pfx_filemap_fault+0x10/0x10
+  ? find_held_lock+0x7c/0x90
+  ? __pfx___lock_release.isra.0+0x10/0x10
+  ? __pte_offset_map+0x99/0x110
+  __do_fault+0x57/0xd0
+  do_pte_missing+0x23b/0x320
+  __handle_mm_fault+0x2d4/0x320
+  ? __pfx___handle_mm_fault+0x10/0x10
+  handle_mm_fault+0x14f/0x260
+  do_user_addr_fault+0x2a2/0x500
+  exc_page_fault+0x71/0x90
+  asm_exc_page_fault+0x22/0x30
+
+Signed-off-by: David Howells <dhowells@redhat.com>
+Link: https://lore.kernel.org/r/2136178.1721725194@warthog.procyon.org.uk
+cc: Alexander Viro <viro@zeniv.linux.org.uk>
+cc: Christian Brauner <brauner@kernel.org>
+cc: Jan Kara <jack@suse.cz>
+cc: Jeff Layton <jlayton@kernel.org>
+cc: Gao Xiang <xiang@kernel.org>
+cc: Matthew Wilcox <willy@infradead.org>
+cc: netfs@lists.linux.dev
+cc: linux-erofs@lists.ozlabs.org
+cc: linux-fsdevel@vger.kernel.org
+[brauner: fix minor issues]
+Signed-off-by: Christian Brauner <brauner@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ fs/xattr.c | 91 ++++++++++++++++++++++++++++--------------------------
+ 1 file changed, 48 insertions(+), 43 deletions(-)
+
+diff --git a/fs/xattr.c b/fs/xattr.c
+index efd4736bc94b..c20046548f21 100644
+--- a/fs/xattr.c
++++ b/fs/xattr.c
+@@ -631,10 +631,9 @@ int do_setxattr(struct mnt_idmap *idmap, struct dentry *dentry,
+                       ctx->kvalue, ctx->size, ctx->flags);
+ }
+-static long
+-setxattr(struct mnt_idmap *idmap, struct dentry *d,
+-      const char __user *name, const void __user *value, size_t size,
+-      int flags)
++static int path_setxattr(const char __user *pathname,
++                       const char __user *name, const void __user *value,
++                       size_t size, int flags, unsigned int lookup_flags)
+ {
+       struct xattr_name kname;
+       struct xattr_ctx ctx = {
+@@ -644,33 +643,20 @@ setxattr(struct mnt_idmap *idmap, struct dentry *d,
+               .kname    = &kname,
+               .flags    = flags,
+       };
++      struct path path;
+       int error;
+       error = setxattr_copy(name, &ctx);
+       if (error)
+               return error;
+-      error = do_setxattr(idmap, d, &ctx);
+-
+-      kvfree(ctx.kvalue);
+-      return error;
+-}
+-
+-static int path_setxattr(const char __user *pathname,
+-                       const char __user *name, const void __user *value,
+-                       size_t size, int flags, unsigned int lookup_flags)
+-{
+-      struct path path;
+-      int error;
+-
+ retry:
+       error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
+       if (error)
+-              return error;
++              goto out;
+       error = mnt_want_write(path.mnt);
+       if (!error) {
+-              error = setxattr(mnt_idmap(path.mnt), path.dentry, name,
+-                               value, size, flags);
++              error = do_setxattr(mnt_idmap(path.mnt), path.dentry, &ctx);
+               mnt_drop_write(path.mnt);
+       }
+       path_put(&path);
+@@ -678,6 +664,9 @@ static int path_setxattr(const char __user *pathname,
+               lookup_flags |= LOOKUP_REVAL;
+               goto retry;
+       }
++
++out:
++      kvfree(ctx.kvalue);
+       return error;
+ }
+@@ -698,20 +687,32 @@ SYSCALL_DEFINE5(lsetxattr, const char __user *, pathname,
+ SYSCALL_DEFINE5(fsetxattr, int, fd, const char __user *, name,
+               const void __user *,value, size_t, size, int, flags)
+ {
+-      struct fd f = fdget(fd);
+-      int error = -EBADF;
++      struct xattr_name kname;
++      struct xattr_ctx ctx = {
++              .cvalue   = value,
++              .kvalue   = NULL,
++              .size     = size,
++              .kname    = &kname,
++              .flags    = flags,
++      };
++      int error;
++      CLASS(fd, f)(fd);
+       if (!f.file)
+-              return error;
++              return -EBADF;
++
+       audit_file(f.file);
++      error = setxattr_copy(name, &ctx);
++      if (error)
++              return error;
++
+       error = mnt_want_write_file(f.file);
+       if (!error) {
+-              error = setxattr(file_mnt_idmap(f.file),
+-                               f.file->f_path.dentry, name,
+-                               value, size, flags);
++              error = do_setxattr(file_mnt_idmap(f.file),
++                                  f.file->f_path.dentry, &ctx);
+               mnt_drop_write_file(f.file);
+       }
+-      fdput(f);
++      kvfree(ctx.kvalue);
+       return error;
+ }
+@@ -900,9 +901,17 @@ SYSCALL_DEFINE3(flistxattr, int, fd, char __user *, list, size_t, size)
+  * Extended attribute REMOVE operations
+  */
+ static long
+-removexattr(struct mnt_idmap *idmap, struct dentry *d,
+-          const char __user *name)
++removexattr(struct mnt_idmap *idmap, struct dentry *d, const char *name)
+ {
++      if (is_posix_acl_xattr(name))
++              return vfs_remove_acl(idmap, d, name);
++      return vfs_removexattr(idmap, d, name);
++}
++
++static int path_removexattr(const char __user *pathname,
++                          const char __user *name, unsigned int lookup_flags)
++{
++      struct path path;
+       int error;
+       char kname[XATTR_NAME_MAX + 1];
+@@ -911,25 +920,13 @@ removexattr(struct mnt_idmap *idmap, struct dentry *d,
+               error = -ERANGE;
+       if (error < 0)
+               return error;
+-
+-      if (is_posix_acl_xattr(kname))
+-              return vfs_remove_acl(idmap, d, kname);
+-
+-      return vfs_removexattr(idmap, d, kname);
+-}
+-
+-static int path_removexattr(const char __user *pathname,
+-                          const char __user *name, unsigned int lookup_flags)
+-{
+-      struct path path;
+-      int error;
+ retry:
+       error = user_path_at(AT_FDCWD, pathname, lookup_flags, &path);
+       if (error)
+               return error;
+       error = mnt_want_write(path.mnt);
+       if (!error) {
+-              error = removexattr(mnt_idmap(path.mnt), path.dentry, name);
++              error = removexattr(mnt_idmap(path.mnt), path.dentry, kname);
+               mnt_drop_write(path.mnt);
+       }
+       path_put(&path);
+@@ -955,15 +952,23 @@ SYSCALL_DEFINE2(lremovexattr, const char __user *, pathname,
+ SYSCALL_DEFINE2(fremovexattr, int, fd, const char __user *, name)
+ {
+       struct fd f = fdget(fd);
++      char kname[XATTR_NAME_MAX + 1];
+       int error = -EBADF;
+       if (!f.file)
+               return error;
+       audit_file(f.file);
++
++      error = strncpy_from_user(kname, name, sizeof(kname));
++      if (error == 0 || error == sizeof(kname))
++              error = -ERANGE;
++      if (error < 0)
++              return error;
++
+       error = mnt_want_write_file(f.file);
+       if (!error) {
+               error = removexattr(file_mnt_idmap(f.file),
+-                                  f.file->f_path.dentry, name);
++                                  f.file->f_path.dentry, kname);
+               mnt_drop_write_file(f.file);
+       }
+       fdput(f);
+-- 
+2.43.0
+
diff --git a/queue-6.6/virtio_ring-fix-kmsan-error-for-premapped-mode.patch b/queue-6.6/virtio_ring-fix-kmsan-error-for-premapped-mode.patch
new file mode 100644 (file)
index 0000000..e7b7a24
--- /dev/null
@@ -0,0 +1,62 @@
+From 74e9e77d65272da18bbcbb3ac0e0cbeeee5021f4 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 6 Jun 2024 19:13:45 +0800
+Subject: virtio_ring: fix KMSAN error for premapped mode
+
+From: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
+
+[ Upstream commit 840b2d39a2dc1b96deb3f5c7fef76c9b24f08f51 ]
+
+Add kmsan for virtqueue_dma_map_single_attrs to fix:
+
+BUG: KMSAN: uninit-value in receive_buf+0x45ca/0x6990
+ receive_buf+0x45ca/0x6990
+ virtnet_poll+0x17e0/0x3130
+ net_rx_action+0x832/0x26e0
+ handle_softirqs+0x330/0x10f0
+ [...]
+
+Uninit was created at:
+ __alloc_pages_noprof+0x62a/0xe60
+ alloc_pages_noprof+0x392/0x830
+ skb_page_frag_refill+0x21a/0x5c0
+ virtnet_rq_alloc+0x50/0x1500
+ try_fill_recv+0x372/0x54c0
+ virtnet_open+0x210/0xbe0
+ __dev_open+0x56e/0x920
+ __dev_change_flags+0x39c/0x2000
+ dev_change_flags+0xaa/0x200
+ do_setlink+0x197a/0x7420
+ rtnl_setlink+0x77c/0x860
+ [...]
+
+Signed-off-by: Xuan Zhuo <xuanzhuo@linux.alibaba.com>
+Tested-by: Alexander Potapenko <glider@google.com>
+Message-Id: <20240606111345.93600-1-xuanzhuo@linux.alibaba.com>
+Signed-off-by: Michael S. Tsirkin <mst@redhat.com>
+Tested-by: Ilya Leoshkevich <iii@linux.ibm.com>  # s390x
+Acked-by: Jason Wang <jasowang@redhat.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/virtio/virtio_ring.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/virtio/virtio_ring.c b/drivers/virtio/virtio_ring.c
+index 6f7e5010a673..80669e05bf0e 100644
+--- a/drivers/virtio/virtio_ring.c
++++ b/drivers/virtio/virtio_ring.c
+@@ -3126,8 +3126,10 @@ dma_addr_t virtqueue_dma_map_single_attrs(struct virtqueue *_vq, void *ptr,
+ {
+       struct vring_virtqueue *vq = to_vvq(_vq);
+-      if (!vq->use_dma_api)
++      if (!vq->use_dma_api) {
++              kmsan_handle_dma(virt_to_page(ptr), offset_in_page(ptr), size, dir);
+               return (dma_addr_t)virt_to_phys(ptr);
++      }
+       return dma_map_single_attrs(vring_dma_dev(vq), ptr, size, dir, attrs);
+ }
+-- 
+2.43.0
+
diff --git a/queue-6.6/wifi-ath12k-fix-firmware-crash-due-to-invalid-peer-n.patch b/queue-6.6/wifi-ath12k-fix-firmware-crash-due-to-invalid-peer-n.patch
new file mode 100644 (file)
index 0000000..9a328ee
--- /dev/null
@@ -0,0 +1,57 @@
+From 85edfa8e48b75b5fe35ae25fb313d3863ccd0e54 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 13 Jun 2024 11:05:28 +0530
+Subject: wifi: ath12k: fix firmware crash due to invalid peer nss
+
+From: Ajith C <quic_ajithc@quicinc.com>
+
+[ Upstream commit db163a463bb93cd3e37e1e7b10b9726fb6f95857 ]
+
+Currently, if the access point receives an association
+request containing an Extended HE Capabilities Information
+Element with an invalid MCS-NSS, it triggers a firmware
+crash.
+
+This issue arises when EHT-PHY capabilities shows support
+for a bandwidth and MCS-NSS set for that particular
+bandwidth is filled by zeros and due to this, driver obtains
+peer_nss as 0 and sending this value to firmware causes
+crash.
+
+Address this issue by implementing a validation step for
+the peer_nss value before passing it to the firmware. If
+the value is greater than zero, proceed with forwarding
+it to the firmware. However, if the value is invalid,
+reject the association request to prevent potential
+firmware crashes.
+
+Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.0.1-00029-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Ajith C <quic_ajithc@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://patch.msgid.link/20240613053528.2541645-1-quic_ajithc@quicinc.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/ath/ath12k/mac.c | 5 +++++
+ 1 file changed, 5 insertions(+)
+
+diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
+index 618eeaf6e331..dd2a7c95517b 100644
+--- a/drivers/net/wireless/ath/ath12k/mac.c
++++ b/drivers/net/wireless/ath/ath12k/mac.c
+@@ -3357,6 +3357,11 @@ static int ath12k_station_assoc(struct ath12k *ar,
+       ath12k_peer_assoc_prepare(ar, vif, sta, &peer_arg, reassoc);
++      if (peer_arg.peer_nss < 1) {
++              ath12k_warn(ar->ab,
++                          "invalid peer NSS %d\n", peer_arg.peer_nss);
++              return -EINVAL;
++      }
+       ret = ath12k_wmi_send_peer_assoc_cmd(ar, &peer_arg);
+       if (ret) {
+               ath12k_warn(ar->ab, "failed to run peer assoc for STA %pM vdev %i: %d\n",
+-- 
+2.43.0
+
diff --git a/queue-6.6/wifi-ath12k-fix-uninitialize-symbol-error-on-ath12k_.patch b/queue-6.6/wifi-ath12k-fix-uninitialize-symbol-error-on-ath12k_.patch
new file mode 100644 (file)
index 0000000..ea59e9e
--- /dev/null
@@ -0,0 +1,55 @@
+From 65dcb92ab5a370fa8487013783d5fc9445eb541f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 11 Jun 2024 08:40:17 +0530
+Subject: wifi: ath12k: fix uninitialize symbol error on
+ ath12k_peer_assoc_h_he()
+
+From: Aaradhana Sahu <quic_aarasahu@quicinc.com>
+
+[ Upstream commit 19b77e7c656a3e125319cc3ef347b397cf042bf6 ]
+
+Smatch throws following errors
+
+drivers/net/wireless/ath/ath12k/mac.c:1922 ath12k_peer_assoc_h_he() error: uninitialized symbol 'rx_mcs_80'.
+drivers/net/wireless/ath/ath12k/mac.c:1922 ath12k_peer_assoc_h_he() error: uninitialized symbol 'rx_mcs_160'.
+drivers/net/wireless/ath/ath12k/mac.c:1924 ath12k_peer_assoc_h_he() error: uninitialized symbol 'rx_mcs_80'.
+
+In ath12k_peer_assoc_h_he() rx_mcs_80 and rx_mcs_160 variables
+remain uninitialized in the following conditions:
+1. Whenever the value of mcs_80 become equal to
+   IEEE80211_HE_MCS_NOT_SUPPORTED then rx_mcs_80 remains uninitialized.
+2. Whenever phy capability is not supported 160 channel width and
+   value of mcs_160 become equal to IEEE80211_HE_MCS_NOT_SUPPORTED
+   then rx_mcs_160 remains uninitialized.
+
+Initialize these variables during declaration.
+
+Tested-on: QCN9274 hw2.0 PCI WLAN.WBE.1.1.1-00188-QCAHKSWPL_SILICONZ-1
+
+Signed-off-by: Aaradhana Sahu <quic_aarasahu@quicinc.com>
+Acked-by: Jeff Johnson <quic_jjohnson@quicinc.com>
+Signed-off-by: Kalle Valo <quic_kvalo@quicinc.com>
+Link: https://patch.msgid.link/20240611031017.297927-3-quic_aarasahu@quicinc.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/ath/ath12k/mac.c | 4 +++-
+ 1 file changed, 3 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/ath/ath12k/mac.c b/drivers/net/wireless/ath/ath12k/mac.c
+index ba6fc27f4a1a..618eeaf6e331 100644
+--- a/drivers/net/wireless/ath/ath12k/mac.c
++++ b/drivers/net/wireless/ath/ath12k/mac.c
+@@ -1614,7 +1614,9 @@ static void ath12k_peer_assoc_h_he(struct ath12k *ar,
+ {
+       const struct ieee80211_sta_he_cap *he_cap = &sta->deflink.he_cap;
+       int i;
+-      u8 ampdu_factor, rx_mcs_80, rx_mcs_160, max_nss;
++      u8 ampdu_factor, max_nss;
++      u8 rx_mcs_80 = IEEE80211_HE_MCS_NOT_SUPPORTED;
++      u8 rx_mcs_160 = IEEE80211_HE_MCS_NOT_SUPPORTED;
+       u16 mcs_160_map, mcs_80_map;
+       bool support_160;
+       u16 v;
+-- 
+2.43.0
+
diff --git a/queue-6.6/wifi-brcmsmac-advertise-mfp_capable-to-enable-wpa3.patch b/queue-6.6/wifi-brcmsmac-advertise-mfp_capable-to-enable-wpa3.patch
new file mode 100644 (file)
index 0000000..939f479
--- /dev/null
@@ -0,0 +1,38 @@
+From 44d86602ad4f9ea0af6c6b9a703e1d83764a09b8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 17 Jun 2024 14:26:09 +0200
+Subject: wifi: brcmsmac: advertise MFP_CAPABLE to enable WPA3
+
+From: Arend van Spriel <arend.vanspriel@broadcom.com>
+
+[ Upstream commit dbb5265a5d7cca1cdba7736dba313ab7d07bc19d ]
+
+After being asked about support for WPA3 for BCM43224 chipset it
+was found that all it takes is setting the MFP_CAPABLE flag and
+mac80211 will take care of all that is needed [1].
+
+Link: https://lore.kernel.org/linux-wireless/20200526155909.5807-2-Larry.Finger@lwfinger.net/ [1]
+Signed-off-by: Arend van Spriel <arend.vanspriel@broadcom.com>
+Tested-by: Reijer Boekhoff <reijerboekhoff@protonmail.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://patch.msgid.link/20240617122609.349582-1-arend.vanspriel@broadcom.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
+index 543e93ec49d2..9ab669487de4 100644
+--- a/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
++++ b/drivers/net/wireless/broadcom/brcm80211/brcmsmac/mac80211_if.c
+@@ -1086,6 +1086,7 @@ static int ieee_hw_init(struct ieee80211_hw *hw)
+       ieee80211_hw_set(hw, AMPDU_AGGREGATION);
+       ieee80211_hw_set(hw, SIGNAL_DBM);
+       ieee80211_hw_set(hw, REPORTS_TX_ACK_STATUS);
++      ieee80211_hw_set(hw, MFP_CAPABLE);
+       hw->extra_tx_headroom = brcms_c_get_header_len();
+       hw->queues = N_TX_QUEUES;
+-- 
+2.43.0
+
diff --git a/queue-6.6/wifi-iwlwifi-mvm-use-iwl_fw_check-for-link-id-check.patch b/queue-6.6/wifi-iwlwifi-mvm-use-iwl_fw_check-for-link-id-check.patch
new file mode 100644 (file)
index 0000000..b387ea9
--- /dev/null
@@ -0,0 +1,39 @@
+From 8ea5e824446a131a6be3de38d75e4e9068b1bdb8 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 25 Jun 2024 19:51:09 +0300
+Subject: wifi: iwlwifi: mvm: use IWL_FW_CHECK for link ID check
+
+From: Johannes Berg <johannes.berg@intel.com>
+
+[ Upstream commit 9215152677d4b321801a92b06f6d5248b2b4465f ]
+
+The lookup function iwl_mvm_rcu_fw_link_id_to_link_conf() is
+normally called with input from the firmware, so it should use
+IWL_FW_CHECK() instead of WARN_ON().
+
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Miri Korenblit <miriam.rachel.korenblit@intel.com>
+Link: https://patch.msgid.link/20240625194805.4ea8fb7c47d4.I1c22af213f97f69bfc14674502511c1bc504adfb@changeid
+Signed-off-by: Johannes Berg <johannes.berg@intel.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/intel/iwlwifi/mvm/mvm.h | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+index c780e5ffcd59..bace9d01fd58 100644
+--- a/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
++++ b/drivers/net/wireless/intel/iwlwifi/mvm/mvm.h
+@@ -1318,7 +1318,8 @@ iwl_mvm_rcu_dereference_vif_id(struct iwl_mvm *mvm, u8 vif_id, bool rcu)
+ static inline struct ieee80211_bss_conf *
+ iwl_mvm_rcu_fw_link_id_to_link_conf(struct iwl_mvm *mvm, u8 link_id, bool rcu)
+ {
+-      if (WARN_ON(link_id >= ARRAY_SIZE(mvm->link_id_to_link_conf)))
++      if (IWL_FW_CHECK(mvm, link_id >= ARRAY_SIZE(mvm->link_id_to_link_conf),
++                       "erroneous FW link ID: %d\n", link_id))
+               return NULL;
+       if (rcu)
+-- 
+2.43.0
+
diff --git a/queue-6.6/wifi-mt76-mt7921-fix-null-pointer-access-in-mt7921_i.patch b/queue-6.6/wifi-mt76-mt7921-fix-null-pointer-access-in-mt7921_i.patch
new file mode 100644 (file)
index 0000000..0da9be9
--- /dev/null
@@ -0,0 +1,38 @@
+From 857d7854c40324bfc70a6d32c9eb0792bc7c0b56 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 12 Aug 2024 12:45:41 +0200
+Subject: wifi: mt76: mt7921: fix NULL pointer access in
+ mt7921_ipv6_addr_change
+
+From: Bert Karwatzki <spasswolf@web.de>
+
+[ Upstream commit 479ffee68d59c599f8aed8fa2dcc8e13e7bd13c3 ]
+
+When disabling wifi mt7921_ipv6_addr_change() is called as a notifier.
+At this point mvif->phy is already NULL so we cannot use it here.
+
+Signed-off-by: Bert Karwatzki <spasswolf@web.de>
+Signed-off-by: Felix Fietkau <nbd@nbd.name>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://patch.msgid.link/20240812104542.80760-1-spasswolf@web.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/mediatek/mt76/mt7921/main.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/net/wireless/mediatek/mt76/mt7921/main.c b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+index 6a5c2cae087d..6dec54431312 100644
+--- a/drivers/net/wireless/mediatek/mt76/mt7921/main.c
++++ b/drivers/net/wireless/mediatek/mt76/mt7921/main.c
+@@ -1095,7 +1095,7 @@ static void mt7921_ipv6_addr_change(struct ieee80211_hw *hw,
+                                   struct inet6_dev *idev)
+ {
+       struct mt792x_vif *mvif = (struct mt792x_vif *)vif->drv_priv;
+-      struct mt792x_dev *dev = mvif->phy->dev;
++      struct mt792x_dev *dev = mt792x_hw_dev(hw);
+       struct inet6_ifaddr *ifa;
+       struct in6_addr ns_addrs[IEEE80211_BSS_ARP_ADDR_LIST_LEN];
+       struct sk_buff *skb;
+-- 
+2.43.0
+
diff --git a/queue-6.6/wifi-mwifiex-do-not-return-unused-priv-in-mwifiex_ge.patch b/queue-6.6/wifi-mwifiex-do-not-return-unused-priv-in-mwifiex_ge.patch
new file mode 100644 (file)
index 0000000..ec3cc8f
--- /dev/null
@@ -0,0 +1,112 @@
+From 73a89bb8d959b882309388c1934bcd5d3dad2d9d Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Jul 2024 09:24:09 +0200
+Subject: wifi: mwifiex: Do not return unused priv in mwifiex_get_priv_by_id()
+
+From: Sascha Hauer <s.hauer@pengutronix.de>
+
+[ Upstream commit c145eea2f75ff7949392aebecf7ef0a81c1f6c14 ]
+
+mwifiex_get_priv_by_id() returns the priv pointer corresponding to
+the bss_num and bss_type, but without checking if the priv is actually
+currently in use.
+Unused priv pointers do not have a wiphy attached to them which can
+lead to NULL pointer dereferences further down the callstack.  Fix
+this by returning only used priv pointers which have priv->bss_mode
+set to something else than NL80211_IFTYPE_UNSPECIFIED.
+
+Said NULL pointer dereference happened when an Accesspoint was started
+with wpa_supplicant -i mlan0 with this config:
+
+network={
+        ssid="somessid"
+        mode=2
+        frequency=2412
+        key_mgmt=WPA-PSK WPA-PSK-SHA256
+        proto=RSN
+        group=CCMP
+        pairwise=CCMP
+        psk="12345678"
+}
+
+When waiting for the AP to be established, interrupting wpa_supplicant
+with <ctrl-c> and starting it again this happens:
+
+| Unable to handle kernel NULL pointer dereference at virtual address 0000000000000140
+| Mem abort info:
+|   ESR = 0x0000000096000004
+|   EC = 0x25: DABT (current EL), IL = 32 bits
+|   SET = 0, FnV = 0
+|   EA = 0, S1PTW = 0
+|   FSC = 0x04: level 0 translation fault
+| Data abort info:
+|   ISV = 0, ISS = 0x00000004, ISS2 = 0x00000000
+|   CM = 0, WnR = 0, TnD = 0, TagAccess = 0
+|   GCS = 0, Overlay = 0, DirtyBit = 0, Xs = 0
+| user pgtable: 4k pages, 48-bit VAs, pgdp=0000000046d96000
+| [0000000000000140] pgd=0000000000000000, p4d=0000000000000000
+| Internal error: Oops: 0000000096000004 [#1] PREEMPT SMP
+| Modules linked in: caam_jr caamhash_desc spidev caamalg_desc crypto_engine authenc libdes mwifiex_sdio
++mwifiex crct10dif_ce cdc_acm onboard_usb_hub fsl_imx8_ddr_perf imx8m_ddrc rtc_ds1307 lm75 rtc_snvs
++imx_sdma caam imx8mm_thermal spi_imx error imx_cpufreq_dt fuse ip_tables x_tables ipv6
+| CPU: 0 PID: 8 Comm: kworker/0:1 Not tainted 6.9.0-00007-g937242013fce-dirty #18
+| Hardware name: somemachine (DT)
+| Workqueue: events sdio_irq_work
+| pstate: 00000005 (nzcv daif -PAN -UAO -TCO -DIT -SSBS BTYPE=--)
+| pc : mwifiex_get_cfp+0xd8/0x15c [mwifiex]
+| lr : mwifiex_get_cfp+0x34/0x15c [mwifiex]
+| sp : ffff8000818b3a70
+| x29: ffff8000818b3a70 x28: ffff000006bfd8a5 x27: 0000000000000004
+| x26: 000000000000002c x25: 0000000000001511 x24: 0000000002e86bc9
+| x23: ffff000006bfd996 x22: 0000000000000004 x21: ffff000007bec000
+| x20: 000000000000002c x19: 0000000000000000 x18: 0000000000000000
+| x17: 000000040044ffff x16: 00500072b5503510 x15: ccc283740681e517
+| x14: 0201000101006d15 x13: 0000000002e8ff43 x12: 002c01000000ffb1
+| x11: 0100000000000000 x10: 02e8ff43002c0100 x9 : 0000ffb100100157
+| x8 : ffff000003d20000 x7 : 00000000000002f1 x6 : 00000000ffffe124
+| x5 : 0000000000000001 x4 : 0000000000000003 x3 : 0000000000000000
+| x2 : 0000000000000000 x1 : 0001000000011001 x0 : 0000000000000000
+| Call trace:
+|  mwifiex_get_cfp+0xd8/0x15c [mwifiex]
+|  mwifiex_parse_single_response_buf+0x1d0/0x504 [mwifiex]
+|  mwifiex_handle_event_ext_scan_report+0x19c/0x2f8 [mwifiex]
+|  mwifiex_process_sta_event+0x298/0xf0c [mwifiex]
+|  mwifiex_process_event+0x110/0x238 [mwifiex]
+|  mwifiex_main_process+0x428/0xa44 [mwifiex]
+|  mwifiex_sdio_interrupt+0x64/0x12c [mwifiex_sdio]
+|  process_sdio_pending_irqs+0x64/0x1b8
+|  sdio_irq_work+0x4c/0x7c
+|  process_one_work+0x148/0x2a0
+|  worker_thread+0x2fc/0x40c
+|  kthread+0x110/0x114
+|  ret_from_fork+0x10/0x20
+| Code: a94153f3 a8c37bfd d50323bf d65f03c0 (f940a000)
+| ---[ end trace 0000000000000000 ]---
+
+Signed-off-by: Sascha Hauer <s.hauer@pengutronix.de>
+Acked-by: Brian Norris <briannorris@chromium.org>
+Reviewed-by: Francesco Dolcini <francesco.dolcini@toradex.com>
+Signed-off-by: Kalle Valo <kvalo@kernel.org>
+Link: https://patch.msgid.link/20240703072409.556618-1-s.hauer@pengutronix.de
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/marvell/mwifiex/main.h | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/drivers/net/wireless/marvell/mwifiex/main.h b/drivers/net/wireless/marvell/mwifiex/main.h
+index 7bdec6c62248..dc6b4cf616be 100644
+--- a/drivers/net/wireless/marvell/mwifiex/main.h
++++ b/drivers/net/wireless/marvell/mwifiex/main.h
+@@ -1290,6 +1290,9 @@ mwifiex_get_priv_by_id(struct mwifiex_adapter *adapter,
+       for (i = 0; i < adapter->priv_num; i++) {
+               if (adapter->priv[i]) {
++                      if (adapter->priv[i]->bss_mode == NL80211_IFTYPE_UNSPECIFIED)
++                              continue;
++
+                       if ((adapter->priv[i]->bss_num == bss_num) &&
+                           (adapter->priv[i]->bss_type == bss_type))
+                               break;
+-- 
+2.43.0
+
diff --git a/queue-6.6/wifi-rtw88-usb-schedule-rx-work-after-everything-is-.patch b/queue-6.6/wifi-rtw88-usb-schedule-rx-work-after-everything-is-.patch
new file mode 100644 (file)
index 0000000..7a34b5f
--- /dev/null
@@ -0,0 +1,105 @@
+From fb05e937116020259a9346d6da17144709d51b08 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 28 May 2024 13:02:46 +0200
+Subject: wifi: rtw88: usb: schedule rx work after everything is set up
+MIME-Version: 1.0
+Content-Type: text/plain; charset=UTF-8
+Content-Transfer-Encoding: 8bit
+
+From: Marcin Ślusarz <mslusarz@renau.com>
+
+[ Upstream commit adc539784c98a7cc602cbf557debfc2e7b9be8b3 ]
+
+Right now it's possible to hit NULL pointer dereference in
+rtw_rx_fill_rx_status on hw object and/or its fields because
+initialization routine can start getting USB replies before
+rtw_dev is fully setup.
+
+The stack trace looks like this:
+
+rtw_rx_fill_rx_status
+rtw8821c_query_rx_desc
+rtw_usb_rx_handler
+...
+queue_work
+rtw_usb_read_port_complete
+...
+usb_submit_urb
+rtw_usb_rx_resubmit
+rtw_usb_init_rx
+rtw_usb_probe
+
+So while we do the async stuff rtw_usb_probe continues and calls
+rtw_register_hw, which does all kinds of initialization (e.g.
+via ieee80211_register_hw) that rtw_rx_fill_rx_status relies on.
+
+Fix this by moving the first usb_submit_urb after everything
+is set up.
+
+For me, this bug manifested as:
+[    8.893177] rtw_8821cu 1-1:1.2: band wrong, packet dropped
+[    8.910904] rtw_8821cu 1-1:1.2: hw->conf.chandef.chan NULL in rtw_rx_fill_rx_status
+because I'm using Larry's backport of rtw88 driver with the NULL
+checks in rtw_rx_fill_rx_status.
+
+Link: https://lore.kernel.org/linux-wireless/CA+shoWQ7P49jhQasofDcTdQhiuarPTjYEDa--NiVVx494WcuQw@mail.gmail.com/
+Signed-off-by: Marcin Ślusarz <mslusarz@renau.com>
+Cc: Tim K <tpkuester@gmail.com>
+Cc: Ping-Ke Shih <pkshih@realtek.com>
+Cc: Larry Finger <Larry.Finger@lwfinger.net>
+Cc: Kalle Valo <kvalo@kernel.org>
+Cc: linux-wireless@vger.kernel.org
+Cc: linux-kernel@vger.kernel.org
+Signed-off-by: Ping-Ke Shih <pkshih@realtek.com>
+Link: https://patch.msgid.link/20240528110246.477321-1-marcin.slusarz@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/net/wireless/realtek/rtw88/usb.c | 13 ++++++++++---
+ 1 file changed, 10 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/net/wireless/realtek/rtw88/usb.c b/drivers/net/wireless/realtek/rtw88/usb.c
+index efd0c2915a05..04a64afcbf8a 100644
+--- a/drivers/net/wireless/realtek/rtw88/usb.c
++++ b/drivers/net/wireless/realtek/rtw88/usb.c
+@@ -742,7 +742,6 @@ static struct rtw_hci_ops rtw_usb_ops = {
+ static int rtw_usb_init_rx(struct rtw_dev *rtwdev)
+ {
+       struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
+-      int i;
+       rtwusb->rxwq = create_singlethread_workqueue("rtw88_usb: rx wq");
+       if (!rtwusb->rxwq) {
+@@ -754,13 +753,19 @@ static int rtw_usb_init_rx(struct rtw_dev *rtwdev)
+       INIT_WORK(&rtwusb->rx_work, rtw_usb_rx_handler);
++      return 0;
++}
++
++static void rtw_usb_setup_rx(struct rtw_dev *rtwdev)
++{
++      struct rtw_usb *rtwusb = rtw_get_usb_priv(rtwdev);
++      int i;
++
+       for (i = 0; i < RTW_USB_RXCB_NUM; i++) {
+               struct rx_usb_ctrl_block *rxcb = &rtwusb->rx_cb[i];
+               rtw_usb_rx_resubmit(rtwusb, rxcb);
+       }
+-
+-      return 0;
+ }
+ static void rtw_usb_deinit_rx(struct rtw_dev *rtwdev)
+@@ -897,6 +902,8 @@ int rtw_usb_probe(struct usb_interface *intf, const struct usb_device_id *id)
+               goto err_destroy_rxwq;
+       }
++      rtw_usb_setup_rx(rtwdev);
++
+       return 0;
+ err_destroy_rxwq:
+-- 
+2.43.0
+
diff --git a/queue-6.6/x86-kmsan-fix-hook-for-unaligned-accesses.patch b/queue-6.6/x86-kmsan-fix-hook-for-unaligned-accesses.patch
new file mode 100644 (file)
index 0000000..6c9941f
--- /dev/null
@@ -0,0 +1,56 @@
+From 68d30d27b4f66ef79d5d9861bba086ed007c74ed Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 23 May 2024 23:50:29 +0200
+Subject: x86/kmsan: Fix hook for unaligned accesses
+
+From: Brian Johannesmeyer <bjohannesmeyer@gmail.com>
+
+[ Upstream commit bf6ab33d8487f5e2a0998ce75286eae65bb0a6d6 ]
+
+When called with a 'from' that is not 4-byte-aligned, string_memcpy_fromio()
+calls the movs() macro to copy the first few bytes, so that 'from' becomes
+4-byte-aligned before calling rep_movs(). This movs() macro modifies 'to', and
+the subsequent line modifies 'n'.
+
+As a result, on unaligned accesses, kmsan_unpoison_memory() uses the updated
+(aligned) values of 'to' and 'n'. Hence, it does not unpoison the entire
+region.
+
+Save the original values of 'to' and 'n', and pass those to
+kmsan_unpoison_memory(), so that the entire region is unpoisoned.
+
+Signed-off-by: Brian Johannesmeyer <bjohannesmeyer@gmail.com>
+Signed-off-by: Borislav Petkov (AMD) <bp@alien8.de>
+Reviewed-by: Alexander Potapenko <glider@google.com>
+Link: https://lore.kernel.org/r/20240523215029.4160518-1-bjohannesmeyer@gmail.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ arch/x86/lib/iomem.c | 5 ++++-
+ 1 file changed, 4 insertions(+), 1 deletion(-)
+
+diff --git a/arch/x86/lib/iomem.c b/arch/x86/lib/iomem.c
+index e0411a3774d4..5eecb45d05d5 100644
+--- a/arch/x86/lib/iomem.c
++++ b/arch/x86/lib/iomem.c
+@@ -25,6 +25,9 @@ static __always_inline void rep_movs(void *to, const void *from, size_t n)
+ static void string_memcpy_fromio(void *to, const volatile void __iomem *from, size_t n)
+ {
++      const void *orig_to = to;
++      const size_t orig_n = n;
++
+       if (unlikely(!n))
+               return;
+@@ -39,7 +42,7 @@ static void string_memcpy_fromio(void *to, const volatile void __iomem *from, si
+       }
+       rep_movs(to, (const void *)from, n);
+       /* KMSAN must treat values read from devices as initialized. */
+-      kmsan_unpoison_memory(to, n);
++      kmsan_unpoison_memory(orig_to, orig_n);
+ }
+ static void string_memcpy_toio(volatile void __iomem *to, const void *from, size_t n)
+-- 
+2.43.0
+
diff --git a/queue-6.6/xen-privcmd-fix-possible-access-to-a-freed-kirqfd-in.patch b/queue-6.6/xen-privcmd-fix-possible-access-to-a-freed-kirqfd-in.patch
new file mode 100644 (file)
index 0000000..2a70614
--- /dev/null
@@ -0,0 +1,91 @@
+From f2e56ed216a0c300a28ddc6ebf584d1b4e6cc4fb Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 18 Jun 2024 15:12:29 +0530
+Subject: xen: privcmd: Fix possible access to a freed kirqfd instance
+
+From: Viresh Kumar <viresh.kumar@linaro.org>
+
+[ Upstream commit 611ff1b1ae989a7bcce3e2a8e132ee30e968c557 ]
+
+Nothing prevents simultaneous ioctl calls to privcmd_irqfd_assign() and
+privcmd_irqfd_deassign(). If that happens, it is possible that a kirqfd
+created and added to the irqfds_list by privcmd_irqfd_assign() may get
+removed by another thread executing privcmd_irqfd_deassign(), while the
+former is still using it after dropping the locks.
+
+This can lead to a situation where an already freed kirqfd instance may
+be accessed and cause kernel oops.
+
+Use SRCU locking to prevent the same, as is done for the KVM
+implementation for irqfds.
+
+Reported-by: Al Viro <viro@zeniv.linux.org.uk>
+Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
+Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
+Reviewed-by: Juergen Gross <jgross@suse.com>
+Link: https://lore.kernel.org/r/9e884af1f1f842eacbb7afc5672c8feb4dea7f3f.1718703669.git.viresh.kumar@linaro.org
+Signed-off-by: Juergen Gross <jgross@suse.com>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/xen/privcmd.c | 10 +++++++++-
+ 1 file changed, 9 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/xen/privcmd.c b/drivers/xen/privcmd.c
+index 923f064c7e3e..61aaded483e1 100644
+--- a/drivers/xen/privcmd.c
++++ b/drivers/xen/privcmd.c
+@@ -17,6 +17,7 @@
+ #include <linux/poll.h>
+ #include <linux/sched.h>
+ #include <linux/slab.h>
++#include <linux/srcu.h>
+ #include <linux/string.h>
+ #include <linux/workqueue.h>
+ #include <linux/errno.h>
+@@ -842,6 +843,7 @@ static long privcmd_ioctl_mmap_resource(struct file *file,
+ /* Irqfd support */
+ static struct workqueue_struct *irqfd_cleanup_wq;
+ static DEFINE_SPINLOCK(irqfds_lock);
++DEFINE_STATIC_SRCU(irqfds_srcu);
+ static LIST_HEAD(irqfds_list);
+ struct privcmd_kernel_irqfd {
+@@ -869,6 +871,9 @@ static void irqfd_shutdown(struct work_struct *work)
+               container_of(work, struct privcmd_kernel_irqfd, shutdown);
+       u64 cnt;
++      /* Make sure irqfd has been initialized in assign path */
++      synchronize_srcu(&irqfds_srcu);
++
+       eventfd_ctx_remove_wait_queue(kirqfd->eventfd, &kirqfd->wait, &cnt);
+       eventfd_ctx_put(kirqfd->eventfd);
+       kfree(kirqfd);
+@@ -931,7 +936,7 @@ static int privcmd_irqfd_assign(struct privcmd_irqfd *irqfd)
+       __poll_t events;
+       struct fd f;
+       void *dm_op;
+-      int ret;
++      int ret, idx;
+       kirqfd = kzalloc(sizeof(*kirqfd) + irqfd->size, GFP_KERNEL);
+       if (!kirqfd)
+@@ -977,6 +982,7 @@ static int privcmd_irqfd_assign(struct privcmd_irqfd *irqfd)
+               }
+       }
++      idx = srcu_read_lock(&irqfds_srcu);
+       list_add_tail(&kirqfd->list, &irqfds_list);
+       spin_unlock_irqrestore(&irqfds_lock, flags);
+@@ -988,6 +994,8 @@ static int privcmd_irqfd_assign(struct privcmd_irqfd *irqfd)
+       if (events & EPOLLIN)
+               irqfd_inject(kirqfd);
++      srcu_read_unlock(&irqfds_srcu, idx);
++
+       /*
+        * Do not drop the file until the kirqfd is fully initialized, otherwise
+        * we might race against the EPOLLHUP.
+-- 
+2.43.0
+