aboutsummaryrefslogtreecommitdiffstats
path: root/queue-5.4
diff options
context:
space:
mode:
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-03-01 13:13:53 +0100
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-03-01 13:13:53 +0100
commit7c50bb886732b659dd5f4c7018e946a86f05d2d6 (patch)
treec9d8a3ac70a7753eca63f1a65047d86ba7279039 /queue-5.4
parentf1e6d68e07d42c844cab099cf1d4ef0506ce24a7 (diff)
downloadstable-queue-7c50bb886732b659dd5f4c7018e946a86f05d2d6.tar.gz
Linux 5.4.270v5.4.270
Diffstat (limited to 'queue-5.4')
-rw-r--r--queue-5.4/afs-increase-buffer-size-in-afs_update_volume_status.patch53
-rw-r--r--queue-5.4/ahci-add-43-bit-dma-address-quirk-for-asmedia-asm106.patch159
-rw-r--r--queue-5.4/ahci-asm1166-correct-count-of-reported-ports.patch52
-rw-r--r--queue-5.4/alsa-hda-realtek-enable-micmute-led-on-and-hp-system.patch43
-rw-r--r--queue-5.4/arm-ep93xx-add-terminator-to-gpiod_lookup_table.patch37
-rw-r--r--queue-5.4/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch42
-rw-r--r--queue-5.4/asoc-sunxi-sun4i-spdif-add-support-for-allwinner-h61.patch45
-rw-r--r--queue-5.4/bpf-scripts-correct-gpl-license-name.patch41
-rw-r--r--queue-5.4/dm-crypt-don-t-modify-the-data-when-using-authenticated-encryption.patch43
-rw-r--r--queue-5.4/dm-integrity-don-t-modify-bio-s-immutable-bio_vec-in.patch73
-rw-r--r--queue-5.4/dmaengine-fsl-qdma-increase-size-of-irq_name.patch48
-rw-r--r--queue-5.4/dmaengine-shdma-increase-size-of-dev_id.patch53
-rw-r--r--queue-5.4/drm-amdgpu-check-for-valid-number-of-registers-to-re.patch39
-rw-r--r--queue-5.4/drm-amdgpu-fix-type-of-second-parameter-in-trans_msg.patch66
-rw-r--r--queue-5.4/drm-syncobj-call-drm_syncobj_fence_add_wait-when-wai.patch75
-rw-r--r--queue-5.4/drm-syncobj-make-lockdep-complain-on-wait_for_submit.patch91
-rw-r--r--queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch65
-rw-r--r--queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch-1290254
-rw-r--r--queue-5.4/fbdev-savage-error-out-if-pixclock-equals-zero.patch45
-rw-r--r--queue-5.4/fbdev-sis-error-out-if-pixclock-equals-zero.patch43
-rw-r--r--queue-5.4/firewire-core-send-bus-reset-promptly-on-gap-count-e.patch129
-rw-r--r--queue-5.4/fs-aio-restrict-kiocb_set_cancel_fn-to-i-o-submitted-via-libaio.patch84
-rw-r--r--queue-5.4/gtp-fix-use-after-free-and-null-ptr-deref-in-gtp_genl_dump_pdp.patch97
-rw-r--r--queue-5.4/hwmon-coretemp-enlarge-per-package-core-count-limit.patch43
-rw-r--r--queue-5.4/ib-hfi1-fix-a-memleak-in-init_credit_return.patch51
-rw-r--r--queue-5.4/ib-hfi1-fix-sdma.h-tx-num_descs-off-by-one-error.patch100
-rw-r--r--queue-5.4/iomap-set-all-uptodate-bits-for-an-uptodate-page.patch55
-rw-r--r--queue-5.4/ipv4-properly-combine-dev_base_seq-and-ipv4.dev_addr.patch73
-rw-r--r--queue-5.4/ipv6-properly-combine-dev_base_seq-and-ipv6.dev_addr.patch75
-rw-r--r--queue-5.4/ipv6-sr-fix-possible-use-after-free-and-null-ptr-der.patch74
-rw-r--r--queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-its_sync_lpi_pending_table.patch36
-rw-r--r--queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-movall-handler.patch35
-rw-r--r--queue-5.4/l2tp-pass-correct-message-length-to-ip6_append_data.patch50
-rw-r--r--queue-5.4/memcg-add-refcnt-for-pcpu-stock-to-avoid-uaf-problem-in-drain_all_stock.patch135
-rw-r--r--queue-5.4/net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch41
-rw-r--r--queue-5.4/net-sched-retire-atm-qdisc.patch771
-rw-r--r--queue-5.4/net-sched-retire-cbq-qdisc.patch1883
-rw-r--r--queue-5.4/net-sched-retire-dsmark-qdisc.patch582
-rw-r--r--queue-5.4/netfilter-conntrack-check-sctp_cid_shutdown_ack-for-.patch71
-rw-r--r--queue-5.4/netfilter-nf_tables-set-dormant-flag-on-hook-registe.patch42
-rw-r--r--queue-5.4/nilfs2-replace-warn_ons-for-invalid-dat-metadata-block-requests.patch82
-rw-r--r--queue-5.4/nouveau-fix-function-cast-warnings.patch54
-rw-r--r--queue-5.4/nvmet-fc-abort-command-when-there-is-no-binding.patch51
-rw-r--r--queue-5.4/nvmet-tcp-fix-nvme-tcp-ida-memory-leak.patch36
-rw-r--r--queue-5.4/packet-move-from-strlcpy-with-unused-retval-to-strsc.patch48
-rw-r--r--queue-5.4/pci-msi-prevent-msi-hardware-interrupt-number-truncation.patch46
-rw-r--r--queue-5.4/pci-tegra-fix-of-node-reference-leak.patch63
-rw-r--r--queue-5.4/pci-tegra-fix-reporting-gpio-error-value.patch43
-rw-r--r--queue-5.4/pinctrl-pinctrl-rockchip-fix-a-bunch-of-kerneldoc-mi.patch154
-rw-r--r--queue-5.4/pinctrl-rockchip-fix-refcount-leak-in-rockchip_pinct.patch37
-rw-r--r--queue-5.4/pmdomain-renesas-r8a77980-sysc-cr7-must-be-always-on.patch47
-rw-r--r--queue-5.4/rdma-bnxt_re-return-error-for-srq-resize.patch53
-rw-r--r--queue-5.4/rdma-srpt-fix-function-pointer-cast-warnings.patch60
-rw-r--r--queue-5.4/rdma-srpt-make-debug-output-more-detailed.patch53
-rw-r--r--queue-5.4/regulator-pwm-regulator-add-validity-checks-in-conti.patch43
-rw-r--r--queue-5.4/revert-drm-sun4i-dsi-change-the-start-delay-calculat.patch48
-rw-r--r--queue-5.4/s390-qeth-fix-potential-loss-of-l3-ip-in-case-of-net.patch77
-rw-r--r--queue-5.4/s390-use-the-correct-count-for-__iowrite64_copy.patch39
-rw-r--r--queue-5.4/sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch94
-rw-r--r--queue-5.4/sched-rt-fix-sysctl_sched_rr_timeslice-intial-value.patch72
-rw-r--r--queue-5.4/sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch44
-rw-r--r--queue-5.4/scripts-bpf-fix-xdp_md-forward-declaration-typo.patch32
-rw-r--r--queue-5.4/scripts-bpf-teach-bpf_helpers_doc.py-to-dump-bpf-hel.patch201
-rw-r--r--queue-5.4/scsi-jazz_esp-only-build-if-scsi-core-is-builtin.patch54
-rw-r--r--queue-5.4/scsi-lpfc-use-unsigned-type-for-num_sge.patch80
-rw-r--r--queue-5.4/scsi-target-core-add-tmf-to-tmr_list-handling.patch88
-rw-r--r--queue-5.4/selftests-bpf-avoid-running-unprivileged-tests-with-.patch60
-rw-r--r--queue-5.4/series83
-rw-r--r--queue-5.4/spi-mt7621-fix-an-error-message-in-mt7621_spi_probe.patch48
-rw-r--r--queue-5.4/tcp-add-annotations-around-sk-sk_shutdown-accesses.patch158
-rw-r--r--queue-5.4/tcp-factor-out-__tcp_close-helper.patch67
-rw-r--r--queue-5.4/tcp-return-epollout-from-tcp_poll-only-when-notsent_.patch53
-rw-r--r--queue-5.4/tls-rx-drop-pointless-else-after-goto.patch39
-rw-r--r--queue-5.4/tls-rx-jump-to-a-more-appropriate-label.patch64
-rw-r--r--queue-5.4/tls-stop-recv-if-initial-process_rx_list-gave-us-non.patch44
-rw-r--r--queue-5.4/usb-cdns3-fix-memory-double-free-when-handle-zero-packet.patch62
-rw-r--r--queue-5.4/usb-cdns3-fixed-memory-use-after-free-at-cdns3_gadget_ep_disable.patch56
-rw-r--r--queue-5.4/usb-gadget-ncm-avoid-dropping-datagrams-of-properly-parsed-ntbs.patch88
-rw-r--r--queue-5.4/usb-roles-don-t-get-set_role-when-usb_role_switch-is-unregistered.patch76
-rw-r--r--queue-5.4/userfaultfd-fix-mmap_changing-checking-in-mfill_atomic_hugetlb.patch80
-rw-r--r--queue-5.4/virtio-blk-ensure-no-requests-in-virtqueues-before-d.patch64
-rw-r--r--queue-5.4/wifi-cfg80211-fix-missing-interfaces-when-dumping.patch71
-rw-r--r--queue-5.4/wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch53
-rw-r--r--queue-5.4/x86-alternatives-disable-kasan-in-apply_alternatives.patch81
84 files changed, 0 insertions, 8540 deletions
diff --git a/queue-5.4/afs-increase-buffer-size-in-afs_update_volume_status.patch b/queue-5.4/afs-increase-buffer-size-in-afs_update_volume_status.patch
deleted file mode 100644
index 19ec2a0656..0000000000
--- a/queue-5.4/afs-increase-buffer-size-in-afs_update_volume_status.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 535128158bbef07e3322a274054c670a384146c8 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 19 Feb 2024 14:39:03 +0000
-Subject: afs: Increase buffer size in afs_update_volume_status()
-
-From: Daniil Dulov <d.dulov@aladdin.ru>
-
-[ Upstream commit 6ea38e2aeb72349cad50e38899b0ba6fbcb2af3d ]
-
-The max length of volume->vid value is 20 characters.
-So increase idbuf[] size up to 24 to avoid overflow.
-
-Found by Linux Verification Center (linuxtesting.org) with SVACE.
-
-[DH: Actually, it's 20 + NUL, so increase it to 24 and use snprintf()]
-
-Fixes: d2ddc776a458 ("afs: Overhaul volume and server record caching and fileserver rotation")
-Signed-off-by: Daniil Dulov <d.dulov@aladdin.ru>
-Signed-off-by: David Howells <dhowells@redhat.com>
-Link: https://lore.kernel.org/r/20240211150442.3416-1-d.dulov@aladdin.ru/ # v1
-Link: https://lore.kernel.org/r/20240212083347.10742-1-d.dulov@aladdin.ru/ # v2
-Link: https://lore.kernel.org/r/20240219143906.138346-3-dhowells@redhat.com
-Signed-off-by: Christian Brauner <brauner@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/afs/volume.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/fs/afs/volume.c b/fs/afs/volume.c
-index 4310336b9bb8c..4225bc766d464 100644
---- a/fs/afs/volume.c
-+++ b/fs/afs/volume.c
-@@ -221,7 +221,7 @@ static int afs_update_volume_status(struct afs_volume *volume, struct key *key)
- {
- struct afs_server_list *new, *old, *discard;
- struct afs_vldb_entry *vldb;
-- char idbuf[16];
-+ char idbuf[24];
- int ret, idsz;
-
- _enter("");
-@@ -229,7 +229,7 @@ static int afs_update_volume_status(struct afs_volume *volume, struct key *key)
- /* We look up an ID by passing it as a decimal string in the
- * operation's name parameter.
- */
-- idsz = sprintf(idbuf, "%llu", volume->vid);
-+ idsz = snprintf(idbuf, sizeof(idbuf), "%llu", volume->vid);
-
- vldb = afs_vl_lookup_vldb(volume->cell, key, idbuf, idsz);
- if (IS_ERR(vldb)) {
---
-2.43.0
-
diff --git a/queue-5.4/ahci-add-43-bit-dma-address-quirk-for-asmedia-asm106.patch b/queue-5.4/ahci-add-43-bit-dma-address-quirk-for-asmedia-asm106.patch
deleted file mode 100644
index d0997814de..0000000000
--- a/queue-5.4/ahci-add-43-bit-dma-address-quirk-for-asmedia-asm106.patch
+++ /dev/null
@@ -1,159 +0,0 @@
-From be503a94981b1be384182c177484b54ac67641cb Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 25 Jan 2024 17:04:01 +0200
-Subject: ahci: add 43-bit DMA address quirk for ASMedia ASM1061 controllers
-
-From: Lennert Buytenhek <kernel@wantstofly.org>
-
-[ Upstream commit 20730e9b277873deeb6637339edcba64468f3da3 ]
-
-With one of the on-board ASM1061 AHCI controllers (1b21:0612) on an
-ASUSTeK Pro WS WRX80E-SAGE SE WIFI mainboard, a controller hang was
-observed that was immediately preceded by the following kernel
-messages:
-
-ahci 0000:28:00.0: Using 64-bit DMA addresses
-ahci 0000:28:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0035 address=0x7fffff00000 flags=0x0000]
-ahci 0000:28:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0035 address=0x7fffff00300 flags=0x0000]
-ahci 0000:28:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0035 address=0x7fffff00380 flags=0x0000]
-ahci 0000:28:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0035 address=0x7fffff00400 flags=0x0000]
-ahci 0000:28:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0035 address=0x7fffff00680 flags=0x0000]
-ahci 0000:28:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0035 address=0x7fffff00700 flags=0x0000]
-
-The first message is produced by code in drivers/iommu/dma-iommu.c
-which is accompanied by the following comment that seems to apply:
-
- /*
- * Try to use all the 32-bit PCI addresses first. The original SAC vs.
- * DAC reasoning loses relevance with PCIe, but enough hardware and
- * firmware bugs are still lurking out there that it's safest not to
- * venture into the 64-bit space until necessary.
- *
- * If your device goes wrong after seeing the notice then likely either
- * its driver is not setting DMA masks accurately, the hardware has
- * some inherent bug in handling >32-bit addresses, or not all the
- * expected address bits are wired up between the device and the IOMMU.
- */
-
-Asking the ASM1061 on a discrete PCIe card to DMA from I/O virtual
-address 0xffffffff00000000 produces the following I/O page faults:
-
-vfio-pci 0000:07:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0021 address=0x7ff00000000 flags=0x0010]
-vfio-pci 0000:07:00.0: AMD-Vi: Event logged [IO_PAGE_FAULT domain=0x0021 address=0x7ff00000500 flags=0x0010]
-
-Note that the upper 21 bits of the logged DMA address are zero. (When
-asking a different PCIe device in the same PCIe slot to DMA to the
-same I/O virtual address, we do see all the upper 32 bits of the DMA
-address as 1, so this is not an issue with the chipset or IOMMU
-configuration on the test system.)
-
-Also, hacking libahci to always set the upper 21 bits of all DMA
-addresses to 1 produces no discernible effect on the behavior of the
-ASM1061, and mkfs/mount/scrub/etc work as without this hack.
-
-This all strongly suggests that the ASM1061 has a 43 bit DMA address
-limit, and this commit therefore adds a quirk to deal with this limit.
-
-This issue probably applies to (some of) the other supported ASMedia
-parts as well, but we limit it to the PCI IDs known to refer to
-ASM1061 parts, as that's the only part we know for sure to be affected
-by this issue at this point.
-
-Link: https://lore.kernel.org/linux-ide/ZaZ2PIpEId-rl6jv@wantstofly.org/
-Signed-off-by: Lennert Buytenhek <kernel@wantstofly.org>
-[cassel: drop date from error messages in commit log]
-Signed-off-by: Niklas Cassel <cassel@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/ata/ahci.c | 29 +++++++++++++++++++++++------
- drivers/ata/ahci.h | 1 +
- 2 files changed, 24 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
-index 5db3dc45bdc4e..84c7519dddb19 100644
---- a/drivers/ata/ahci.c
-+++ b/drivers/ata/ahci.c
-@@ -48,6 +48,7 @@ enum {
- enum board_ids {
- /* board IDs by feature in alphabetical order */
- board_ahci,
-+ board_ahci_43bit_dma,
- board_ahci_ign_iferr,
- board_ahci_mobile,
- board_ahci_nomsi,
-@@ -126,6 +127,13 @@ static const struct ata_port_info ahci_port_info[] = {
- .udma_mask = ATA_UDMA6,
- .port_ops = &ahci_ops,
- },
-+ [board_ahci_43bit_dma] = {
-+ AHCI_HFLAGS (AHCI_HFLAG_43BIT_ONLY),
-+ .flags = AHCI_FLAG_COMMON,
-+ .pio_mask = ATA_PIO4,
-+ .udma_mask = ATA_UDMA6,
-+ .port_ops = &ahci_ops,
-+ },
- [board_ahci_ign_iferr] = {
- AHCI_HFLAGS (AHCI_HFLAG_IGN_IRQ_IF_ERR),
- .flags = AHCI_FLAG_COMMON,
-@@ -561,11 +569,11 @@ static const struct pci_device_id ahci_pci_tbl[] = {
- { PCI_VDEVICE(PROMISE, 0x3f20), board_ahci }, /* PDC42819 */
- { PCI_VDEVICE(PROMISE, 0x3781), board_ahci }, /* FastTrak TX8660 ahci-mode */
-
-- /* Asmedia */
-+ /* ASMedia */
- { PCI_VDEVICE(ASMEDIA, 0x0601), board_ahci }, /* ASM1060 */
- { PCI_VDEVICE(ASMEDIA, 0x0602), board_ahci }, /* ASM1060 */
-- { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci }, /* ASM1061 */
-- { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci }, /* ASM1062 */
-+ { PCI_VDEVICE(ASMEDIA, 0x0611), board_ahci_43bit_dma }, /* ASM1061 */
-+ { PCI_VDEVICE(ASMEDIA, 0x0612), board_ahci_43bit_dma }, /* ASM1061/1062 */
- { PCI_VDEVICE(ASMEDIA, 0x0621), board_ahci }, /* ASM1061R */
- { PCI_VDEVICE(ASMEDIA, 0x0622), board_ahci }, /* ASM1062R */
-
-@@ -916,11 +924,20 @@ static int ahci_pci_device_resume(struct device *dev)
-
- #endif /* CONFIG_PM */
-
--static int ahci_configure_dma_masks(struct pci_dev *pdev, int using_dac)
-+static int ahci_configure_dma_masks(struct pci_dev *pdev,
-+ struct ahci_host_priv *hpriv)
- {
-- const int dma_bits = using_dac ? 64 : 32;
-+ int dma_bits;
- int rc;
-
-+ if (hpriv->cap & HOST_CAP_64) {
-+ dma_bits = 64;
-+ if (hpriv->flags & AHCI_HFLAG_43BIT_ONLY)
-+ dma_bits = 43;
-+ } else {
-+ dma_bits = 32;
-+ }
-+
- /*
- * If the device fixup already set the dma_mask to some non-standard
- * value, don't extend it here. This happens on STA2X11, for example.
-@@ -1880,7 +1897,7 @@ static int ahci_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
- ahci_gtf_filter_workaround(host);
-
- /* initialize adapter */
-- rc = ahci_configure_dma_masks(pdev, hpriv->cap & HOST_CAP_64);
-+ rc = ahci_configure_dma_masks(pdev, hpriv);
- if (rc)
- return rc;
-
-diff --git a/drivers/ata/ahci.h b/drivers/ata/ahci.h
-index 36dac58b5c413..bb1e52212f644 100644
---- a/drivers/ata/ahci.h
-+++ b/drivers/ata/ahci.h
-@@ -244,6 +244,7 @@ enum {
- AHCI_HFLAG_IGN_NOTSUPP_POWER_ON = BIT(27), /* ignore -EOPNOTSUPP
- from phy_power_on() */
- AHCI_HFLAG_NO_SXS = BIT(28), /* SXS not supported */
-+ AHCI_HFLAG_43BIT_ONLY = BIT(29), /* 43bit DMA addr limit */
-
- /* ap->flags bits */
-
---
-2.43.0
-
diff --git a/queue-5.4/ahci-asm1166-correct-count-of-reported-ports.patch b/queue-5.4/ahci-asm1166-correct-count-of-reported-ports.patch
deleted file mode 100644
index 0bf4815feb..0000000000
--- a/queue-5.4/ahci-asm1166-correct-count-of-reported-ports.patch
+++ /dev/null
@@ -1,52 +0,0 @@
-From 3a981e303cacec9f5a6357a85144420a825d3fc9 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 23 Jan 2024 19:30:02 +0100
-Subject: ahci: asm1166: correct count of reported ports
-
-From: Conrad Kostecki <conikost@gentoo.org>
-
-[ Upstream commit 0077a504e1a4468669fd2e011108db49133db56e ]
-
-The ASM1166 SATA host controller always reports wrongly,
-that it has 32 ports. But in reality, it only has six ports.
-
-This seems to be a hardware issue, as all tested ASM1166
-SATA host controllers reports such high count of ports.
-
-Example output: ahci 0000:09:00.0: AHCI 0001.0301
-32 slots 32 ports 6 Gbps 0xffffff3f impl SATA mode.
-
-By adjusting the port_map, the count is limited to six ports.
-
-New output: ahci 0000:09:00.0: AHCI 0001.0301
-32 slots 32 ports 6 Gbps 0x3f impl SATA mode.
-
-Closes: https://bugzilla.kernel.org/show_bug.cgi?id=211873
-Closes: https://bugzilla.kernel.org/show_bug.cgi?id=218346
-Signed-off-by: Conrad Kostecki <conikost@gentoo.org>
-Reviewed-by: Hans de Goede <hdegoede@redhat.com>
-Signed-off-by: Niklas Cassel <cassel@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/ata/ahci.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/drivers/ata/ahci.c b/drivers/ata/ahci.c
-index aa35d1941d1fc..5db3dc45bdc4e 100644
---- a/drivers/ata/ahci.c
-+++ b/drivers/ata/ahci.c
-@@ -618,6 +618,11 @@ MODULE_PARM_DESC(mobile_lpm_policy, "Default LPM policy for mobile chipsets");
- static void ahci_pci_save_initial_config(struct pci_dev *pdev,
- struct ahci_host_priv *hpriv)
- {
-+ if (pdev->vendor == PCI_VENDOR_ID_ASMEDIA && pdev->device == 0x1166) {
-+ dev_info(&pdev->dev, "ASM1166 has only six ports\n");
-+ hpriv->saved_port_map = 0x3f;
-+ }
-+
- if (pdev->vendor == PCI_VENDOR_ID_JMICRON && pdev->device == 0x2361) {
- dev_info(&pdev->dev, "JMB361 has only one port\n");
- hpriv->force_port_map = 1;
---
-2.43.0
-
diff --git a/queue-5.4/alsa-hda-realtek-enable-micmute-led-on-and-hp-system.patch b/queue-5.4/alsa-hda-realtek-enable-micmute-led-on-and-hp-system.patch
deleted file mode 100644
index eb6bc4fddf..0000000000
--- a/queue-5.4/alsa-hda-realtek-enable-micmute-led-on-and-hp-system.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 9940c6ab39d054d15ece5a4d7fc0f605834613e9 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 30 Apr 2020 16:32:52 +0800
-Subject: ALSA: hda/realtek - Enable micmute LED on and HP system
-
-From: Kai-Heng Feng <kai.heng.feng@canonical.com>
-
-[ Upstream commit 3e0650ab26e2010ee312311612e40e076ed1feca ]
-
-Though the system uses DMIC, headset mic still uses the HDA, let's use
-GPIO 0x1 to control the micmute LED.
-
-The micmute LED GPIO has a different polarity to the mute LED GPIO, we
-can use the newly added micmute_led_polarity to indicate that.
-
-Signed-off-by: Kai-Heng Feng <kai.heng.feng@canonical.com>
-Link: https://lore.kernel.org/r/20200430083255.5093-2-kai.heng.feng@canonical.com
-Signed-off-by: Takashi Iwai <tiwai@suse.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- sound/pci/hda/patch_realtek.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/sound/pci/hda/patch_realtek.c b/sound/pci/hda/patch_realtek.c
-index d8ee1b1ee7e3d..893b9fde59ac0 100644
---- a/sound/pci/hda/patch_realtek.c
-+++ b/sound/pci/hda/patch_realtek.c
-@@ -4326,7 +4326,11 @@ static void alc269_fixup_hp_gpio_led(struct hda_codec *codec,
- static void alc285_fixup_hp_gpio_led(struct hda_codec *codec,
- const struct hda_fixup *fix, int action)
- {
-- alc_fixup_hp_gpio_led(codec, action, 0x04, 0x00);
-+ struct alc_spec *spec = codec->spec;
-+
-+ spec->micmute_led_polarity = 1;
-+
-+ alc_fixup_hp_gpio_led(codec, action, 0x04, 0x01);
- }
-
- static void alc286_fixup_hp_gpio_led(struct hda_codec *codec,
---
-2.43.0
-
diff --git a/queue-5.4/arm-ep93xx-add-terminator-to-gpiod_lookup_table.patch b/queue-5.4/arm-ep93xx-add-terminator-to-gpiod_lookup_table.patch
deleted file mode 100644
index 98e5ebe04c..0000000000
--- a/queue-5.4/arm-ep93xx-add-terminator-to-gpiod_lookup_table.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From fdf87a0dc26d0550c60edc911cda42f9afec3557 Mon Sep 17 00:00:00 2001
-From: Nikita Shubin <nikita.shubin@maquefel.me>
-Date: Mon, 5 Feb 2024 11:23:34 +0100
-Subject: ARM: ep93xx: Add terminator to gpiod_lookup_table
-
-From: Nikita Shubin <nikita.shubin@maquefel.me>
-
-commit fdf87a0dc26d0550c60edc911cda42f9afec3557 upstream.
-
-Without the terminator, if a con_id is passed to gpio_find() that
-does not exist in the lookup table the function will not stop looping
-correctly, and eventually cause an oops.
-
-Cc: stable@vger.kernel.org
-Fixes: b2e63555592f ("i2c: gpio: Convert to use descriptors")
-Reported-by: Andy Shevchenko <andriy.shevchenko@intel.com>
-Signed-off-by: Nikita Shubin <nikita.shubin@maquefel.me>
-Reviewed-by: Linus Walleij <linus.walleij@linaro.org>
-Acked-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
-Signed-off-by: Alexander Sverdlin <alexander.sverdlin@gmail.com>
-Link: https://lore.kernel.org/r/20240205102337.439002-1-alexander.sverdlin@gmail.com
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- arch/arm/mach-ep93xx/core.c | 1 +
- 1 file changed, 1 insertion(+)
-
---- a/arch/arm/mach-ep93xx/core.c
-+++ b/arch/arm/mach-ep93xx/core.c
-@@ -337,6 +337,7 @@ static struct gpiod_lookup_table ep93xx_
- GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
- GPIO_LOOKUP_IDX("G", 0, NULL, 1,
- GPIO_ACTIVE_HIGH | GPIO_OPEN_DRAIN),
-+ { }
- },
- };
-
diff --git a/queue-5.4/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch b/queue-5.4/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch
deleted file mode 100644
index d5f2e85e31..0000000000
--- a/queue-5.4/arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 3ae12c33c35246212e946e6ff32d012ca301203d Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 26 May 2022 19:47:40 +0530
-Subject: arm64: dts: qcom: msm8916: Fix typo in pronto remoteproc node
-
-From: Sireesh Kodali <sireeshkodali1@gmail.com>
-
-[ Upstream commit 5458d6f2827cd30218570f266b8d238417461f2f ]
-
-The smem-state properties for the pronto node were incorrectly labelled,
-reading `qcom,state*` rather than `qcom,smem-state*`. Fix that, allowing
-the stop state to be used.
-
-Fixes: 88106096cbf8 ("ARM: dts: msm8916: Add and enable wcnss node")
-Signed-off-by: Sireesh Kodali <sireeshkodali1@gmail.com>
-Reviewed-by: Krzysztof Kozlowski <krzysztof.kozlowski@linaro.org>
-Reviewed-by: Stephan Gerhold <stephan@gerhold.net>
-Signed-off-by: Bjorn Andersson <bjorn.andersson@linaro.org>
-Link: https://lore.kernel.org/r/20220526141740.15834-3-sireeshkodali1@gmail.com
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/arm64/boot/dts/qcom/msm8916.dtsi | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/arch/arm64/boot/dts/qcom/msm8916.dtsi b/arch/arm64/boot/dts/qcom/msm8916.dtsi
-index bf40500adef73..e1097ba6c9481 100644
---- a/arch/arm64/boot/dts/qcom/msm8916.dtsi
-+++ b/arch/arm64/boot/dts/qcom/msm8916.dtsi
-@@ -1097,8 +1097,8 @@
- vddmx-supply = <&pm8916_l3>;
- vddpx-supply = <&pm8916_l7>;
-
-- qcom,state = <&wcnss_smp2p_out 0>;
-- qcom,state-names = "stop";
-+ qcom,smem-states = <&wcnss_smp2p_out 0>;
-+ qcom,smem-state-names = "stop";
-
- pinctrl-names = "default";
- pinctrl-0 = <&wcnss_pin_a>;
---
-2.43.0
-
diff --git a/queue-5.4/asoc-sunxi-sun4i-spdif-add-support-for-allwinner-h61.patch b/queue-5.4/asoc-sunxi-sun4i-spdif-add-support-for-allwinner-h61.patch
deleted file mode 100644
index 4bdbbe26e3..0000000000
--- a/queue-5.4/asoc-sunxi-sun4i-spdif-add-support-for-allwinner-h61.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From b91cd6347ff73edf7e8ebec3231f331a68a2e557 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 28 Jan 2024 00:32:43 +0800
-Subject: ASoC: sunxi: sun4i-spdif: Add support for Allwinner H616
-
-From: Chen-Yu Tsai <wens@csie.org>
-
-[ Upstream commit 0adf963b8463faa44653e22e56ce55f747e68868 ]
-
-The SPDIF hardware block found in the H616 SoC has the same layout as
-the one found in the H6 SoC, except that it is missing the receiver
-side.
-
-Since the driver currently only supports the transmit function, support
-for the H616 is identical to what is currently done for the H6.
-
-Signed-off-by: Chen-Yu Tsai <wens@csie.org>
-Reviewed-by: Andre Przywara <andre.przywara@arm.com>
-Reviewed-by: Jernej Skrabec <jernej.skrabec@gmail.com>
-Link: https://msgid.link/r/20240127163247.384439-4-wens@kernel.org
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- sound/soc/sunxi/sun4i-spdif.c | 5 +++++
- 1 file changed, 5 insertions(+)
-
-diff --git a/sound/soc/sunxi/sun4i-spdif.c b/sound/soc/sunxi/sun4i-spdif.c
-index cbe598b0fb107..680d64e0d69f4 100644
---- a/sound/soc/sunxi/sun4i-spdif.c
-+++ b/sound/soc/sunxi/sun4i-spdif.c
-@@ -464,6 +464,11 @@ static const struct of_device_id sun4i_spdif_of_match[] = {
- .compatible = "allwinner,sun50i-h6-spdif",
- .data = &sun50i_h6_spdif_quirks,
- },
-+ {
-+ .compatible = "allwinner,sun50i-h616-spdif",
-+ /* Essentially the same as the H6, but without RX */
-+ .data = &sun50i_h6_spdif_quirks,
-+ },
- { /* sentinel */ }
- };
- MODULE_DEVICE_TABLE(of, sun4i_spdif_of_match);
---
-2.43.0
-
diff --git a/queue-5.4/bpf-scripts-correct-gpl-license-name.patch b/queue-5.4/bpf-scripts-correct-gpl-license-name.patch
deleted file mode 100644
index a97d2016e7..0000000000
--- a/queue-5.4/bpf-scripts-correct-gpl-license-name.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From c0f22ec08dac9a066e66d1d6b2bb51b9d8b794cf Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 13 Feb 2024 23:05:46 +0000
-Subject: bpf, scripts: Correct GPL license name
-
-From: Gianmarco Lusvardi <glusvardi@posteo.net>
-
-[ Upstream commit e37243b65d528a8a9f8b9a57a43885f8e8dfc15c ]
-
-The bpf_doc script refers to the GPL as the "GNU Privacy License".
-I strongly suspect that the author wanted to refer to the GNU General
-Public License, under which the Linux kernel is released, as, to the
-best of my knowledge, there is no license named "GNU Privacy License".
-This patch corrects the license name in the script accordingly.
-
-Fixes: 56a092c89505 ("bpf: add script and prepare bpf.h for new helpers documentation")
-Signed-off-by: Gianmarco Lusvardi <glusvardi@posteo.net>
-Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
-Reviewed-by: Quentin Monnet <quentin@isovalent.com>
-Link: https://lore.kernel.org/bpf/20240213230544.930018-3-glusvardi@posteo.net
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- scripts/bpf_helpers_doc.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/scripts/bpf_helpers_doc.py b/scripts/bpf_helpers_doc.py
-index 15d3d83d6297c..78b7194a05521 100755
---- a/scripts/bpf_helpers_doc.py
-+++ b/scripts/bpf_helpers_doc.py
-@@ -286,7 +286,7 @@ eBPF programs can have an associated license, passed along with the bytecode
- instructions to the kernel when the programs are loaded. The format for that
- string is identical to the one in use for kernel modules (Dual licenses, such
- as "Dual BSD/GPL", may be used). Some helper functions are only accessible to
--programs that are compatible with the GNU Privacy License (GPL).
-+programs that are compatible with the GNU General Public License (GNU GPL).
-
- In order to use such helpers, the eBPF program must be loaded with the correct
- license string passed (via **attr**) to the **bpf**\ () system call, and this
---
-2.43.0
-
diff --git a/queue-5.4/dm-crypt-don-t-modify-the-data-when-using-authenticated-encryption.patch b/queue-5.4/dm-crypt-don-t-modify-the-data-when-using-authenticated-encryption.patch
deleted file mode 100644
index d39fb49764..0000000000
--- a/queue-5.4/dm-crypt-don-t-modify-the-data-when-using-authenticated-encryption.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 50c70240097ce41fe6bce6478b80478281e4d0f7 Mon Sep 17 00:00:00 2001
-From: Mikulas Patocka <mpatocka@redhat.com>
-Date: Mon, 19 Feb 2024 21:30:10 +0100
-Subject: dm-crypt: don't modify the data when using authenticated encryption
-
-From: Mikulas Patocka <mpatocka@redhat.com>
-
-commit 50c70240097ce41fe6bce6478b80478281e4d0f7 upstream.
-
-It was said that authenticated encryption could produce invalid tag when
-the data that is being encrypted is modified [1]. So, fix this problem by
-copying the data into the clone bio first and then encrypt them inside the
-clone bio.
-
-This may reduce performance, but it is needed to prevent the user from
-corrupting the device by writing data with O_DIRECT and modifying them at
-the same time.
-
-[1] https://lore.kernel.org/all/20240207004723.GA35324@sol.localdomain/T/
-
-Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
-Cc: stable@vger.kernel.org
-Signed-off-by: Mike Snitzer <snitzer@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/md/dm-crypt.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/drivers/md/dm-crypt.c
-+++ b/drivers/md/dm-crypt.c
-@@ -1627,6 +1627,12 @@ static void kcryptd_crypt_write_convert(
- io->ctx.bio_out = clone;
- io->ctx.iter_out = clone->bi_iter;
-
-+ if (crypt_integrity_aead(cc)) {
-+ bio_copy_data(clone, io->base_bio);
-+ io->ctx.bio_in = clone;
-+ io->ctx.iter_in = clone->bi_iter;
-+ }
-+
- sector += bio_sectors(clone);
-
- crypt_inc_pending(io);
diff --git a/queue-5.4/dm-integrity-don-t-modify-bio-s-immutable-bio_vec-in.patch b/queue-5.4/dm-integrity-don-t-modify-bio-s-immutable-bio_vec-in.patch
deleted file mode 100644
index 48bf4fc5a0..0000000000
--- a/queue-5.4/dm-integrity-don-t-modify-bio-s-immutable-bio_vec-in.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From a786824d93478146b4fd965e4c4a3a05732e0cdd Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 5 Dec 2023 16:39:16 +0100
-Subject: dm-integrity: don't modify bio's immutable bio_vec in
- integrity_metadata()
-
-From: Mikulas Patocka <mpatocka@redhat.com>
-
-commit b86f4b790c998afdbc88fe1aa55cfe89c4068726 upstream.
-
-__bio_for_each_segment assumes that the first struct bio_vec argument
-doesn't change - it calls "bio_advance_iter_single((bio), &(iter),
-(bvl).bv_len)" to advance the iterator. Unfortunately, the dm-integrity
-code changes the bio_vec with "bv.bv_len -= pos". When this code path
-is taken, the iterator would be out of sync and dm-integrity would
-report errors. This happens if the machine is out of memory and
-"kmalloc" fails.
-
-Fix this bug by making a copy of "bv" and changing the copy instead.
-
-Fixes: 7eada909bfd7 ("dm: add integrity target")
-Cc: stable@vger.kernel.org # v4.12+
-Signed-off-by: Mikulas Patocka <mpatocka@redhat.com>
-Signed-off-by: Mike Snitzer <snitzer@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/md/dm-integrity.c | 11 ++++++-----
- 1 file changed, 6 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/md/dm-integrity.c b/drivers/md/dm-integrity.c
-index 81157801a3dc6..f3246f7407d61 100644
---- a/drivers/md/dm-integrity.c
-+++ b/drivers/md/dm-integrity.c
-@@ -1582,11 +1582,12 @@ static void integrity_metadata(struct work_struct *w)
- }
-
- __bio_for_each_segment(bv, bio, iter, dio->bio_details.bi_iter) {
-+ struct bio_vec bv_copy = bv;
- unsigned pos;
- char *mem, *checksums_ptr;
-
- again:
-- mem = (char *)kmap_atomic(bv.bv_page) + bv.bv_offset;
-+ mem = (char *)kmap_atomic(bv_copy.bv_page) + bv_copy.bv_offset;
- pos = 0;
- checksums_ptr = checksums;
- do {
-@@ -1595,7 +1596,7 @@ static void integrity_metadata(struct work_struct *w)
- sectors_to_process -= ic->sectors_per_block;
- pos += ic->sectors_per_block << SECTOR_SHIFT;
- sector += ic->sectors_per_block;
-- } while (pos < bv.bv_len && sectors_to_process && checksums != checksums_onstack);
-+ } while (pos < bv_copy.bv_len && sectors_to_process && checksums != checksums_onstack);
- kunmap_atomic(mem);
-
- r = dm_integrity_rw_tag(ic, checksums, &dio->metadata_block, &dio->metadata_offset,
-@@ -1615,9 +1616,9 @@ static void integrity_metadata(struct work_struct *w)
- if (!sectors_to_process)
- break;
-
-- if (unlikely(pos < bv.bv_len)) {
-- bv.bv_offset += pos;
-- bv.bv_len -= pos;
-+ if (unlikely(pos < bv_copy.bv_len)) {
-+ bv_copy.bv_offset += pos;
-+ bv_copy.bv_len -= pos;
- goto again;
- }
- }
---
-2.43.0
-
diff --git a/queue-5.4/dmaengine-fsl-qdma-increase-size-of-irq_name.patch b/queue-5.4/dmaengine-fsl-qdma-increase-size-of-irq_name.patch
deleted file mode 100644
index 0188cecf66..0000000000
--- a/queue-5.4/dmaengine-fsl-qdma-increase-size-of-irq_name.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 3ce45f80e2e5daf52cb786447caa8266b5cc8407 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 19 Jan 2024 18:10:44 +0530
-Subject: dmaengine: fsl-qdma: increase size of 'irq_name'
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Vinod Koul <vkoul@kernel.org>
-
-[ Upstream commit 6386f6c995b3ab91c72cfb76e4465553c555a8da ]
-
-We seem to have hit warnings of 'output may be truncated' which is fixed
-by increasing the size of 'irq_name'
-
-drivers/dma/fsl-qdma.c: In function ‘fsl_qdma_irq_init’:
-drivers/dma/fsl-qdma.c:824:46: error: ‘%d’ directive writing between 1 and 11 bytes into a region of size 10 [-Werror=format-overflow=]
- 824 | sprintf(irq_name, "qdma-queue%d", i);
- | ^~
-drivers/dma/fsl-qdma.c:824:35: note: directive argument in the range [-2147483641, 2147483646]
- 824 | sprintf(irq_name, "qdma-queue%d", i);
- | ^~~~~~~~~~~~~~
-drivers/dma/fsl-qdma.c:824:17: note: ‘sprintf’ output between 12 and 22 bytes into a destination of size 20
- 824 | sprintf(irq_name, "qdma-queue%d", i);
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/dma/fsl-qdma.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/dma/fsl-qdma.c b/drivers/dma/fsl-qdma.c
-index ad5818c0ce223..f2f10aeeea319 100644
---- a/drivers/dma/fsl-qdma.c
-+++ b/drivers/dma/fsl-qdma.c
-@@ -754,7 +754,7 @@ fsl_qdma_irq_init(struct platform_device *pdev,
- int i;
- int cpu;
- int ret;
-- char irq_name[20];
-+ char irq_name[32];
-
- fsl_qdma->error_irq =
- platform_get_irq_byname(pdev, "qdma-error");
---
-2.43.0
-
diff --git a/queue-5.4/dmaengine-shdma-increase-size-of-dev_id.patch b/queue-5.4/dmaengine-shdma-increase-size-of-dev_id.patch
deleted file mode 100644
index ca92df9301..0000000000
--- a/queue-5.4/dmaengine-shdma-increase-size-of-dev_id.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 4a6f927adbab2a6654568e5621fe79d6ca7ca297 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 19 Jan 2024 18:10:44 +0530
-Subject: dmaengine: shdma: increase size of 'dev_id'
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Vinod Koul <vkoul@kernel.org>
-
-[ Upstream commit 404290240827c3bb5c4e195174a8854eef2f89ac ]
-
-We seem to have hit warnings of 'output may be truncated' which is fixed
-by increasing the size of 'dev_id'
-
-drivers/dma/sh/shdmac.c: In function ‘sh_dmae_probe’:
-drivers/dma/sh/shdmac.c:541:34: error: ‘%d’ directive output may be truncated writing between 1 and 10 bytes into a region of size 9 [-Werror=format-truncation=]
- 541 | "sh-dmae%d.%d", pdev->id, id);
- | ^~
-In function ‘sh_dmae_chan_probe’,
- inlined from ‘sh_dmae_probe’ at drivers/dma/sh/shdmac.c:845:9:
-drivers/dma/sh/shdmac.c:541:26: note: directive argument in the range [0, 2147483647]
- 541 | "sh-dmae%d.%d", pdev->id, id);
- | ^~~~~~~~~~~~~~
-drivers/dma/sh/shdmac.c:541:26: note: directive argument in the range [0, 19]
-drivers/dma/sh/shdmac.c:540:17: note: ‘snprintf’ output between 11 and 21 bytes into a destination of size 16
- 540 | snprintf(sh_chan->dev_id, sizeof(sh_chan->dev_id),
- | ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- 541 | "sh-dmae%d.%d", pdev->id, id);
- | ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
-
-Signed-off-by: Vinod Koul <vkoul@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/dma/sh/shdma.h | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/dma/sh/shdma.h b/drivers/dma/sh/shdma.h
-index 9c121a4b33ad8..f97d80343aea4 100644
---- a/drivers/dma/sh/shdma.h
-+++ b/drivers/dma/sh/shdma.h
-@@ -25,7 +25,7 @@ struct sh_dmae_chan {
- const struct sh_dmae_slave_config *config; /* Slave DMA configuration */
- int xmit_shift; /* log_2(bytes_per_xfer) */
- void __iomem *base;
-- char dev_id[16]; /* unique name per DMAC of channel */
-+ char dev_id[32]; /* unique name per DMAC of channel */
- int pm_error;
- dma_addr_t slave_addr;
- };
---
-2.43.0
-
diff --git a/queue-5.4/drm-amdgpu-check-for-valid-number-of-registers-to-re.patch b/queue-5.4/drm-amdgpu-check-for-valid-number-of-registers-to-re.patch
deleted file mode 100644
index 9292d132ce..0000000000
--- a/queue-5.4/drm-amdgpu-check-for-valid-number-of-registers-to-re.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 372f39b1ccd3c61def56a711094e42342251b07e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 31 Aug 2019 21:25:36 +0200
-Subject: drm/amdgpu: Check for valid number of registers to read
-
-From: Trek <trek00@inbox.ru>
-
-[ Upstream commit 13238d4fa6764fa74dcf863d5f2227765b3753eb ]
-
-Do not try to allocate any amount of memory requested by the user.
-Instead limit it to 128 registers. Actually the longest series of
-consecutive allowed registers are 48, mmGB_TILE_MODE0-31 and
-mmGB_MACROTILE_MODE0-15 (0x2644-0x2673).
-
-Bug: https://bugs.freedesktop.org/show_bug.cgi?id=111273
-Signed-off-by: Trek <trek00@inbox.ru>
-Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-index 26a1173df9586..1f4acb4c3efb8 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_kms.c
-@@ -650,6 +650,9 @@ static int amdgpu_info_ioctl(struct drm_device *dev, void *data, struct drm_file
- if (info->read_mmr_reg.count > 128)
- return -EINVAL;
-
-+ if (info->read_mmr_reg.count > 128)
-+ return -EINVAL;
-+
- regs = kmalloc_array(info->read_mmr_reg.count, sizeof(*regs), GFP_KERNEL);
- if (!regs)
- return -ENOMEM;
---
-2.43.0
-
diff --git a/queue-5.4/drm-amdgpu-fix-type-of-second-parameter-in-trans_msg.patch b/queue-5.4/drm-amdgpu-fix-type-of-second-parameter-in-trans_msg.patch
deleted file mode 100644
index 9f92f256f3..0000000000
--- a/queue-5.4/drm-amdgpu-fix-type-of-second-parameter-in-trans_msg.patch
+++ /dev/null
@@ -1,66 +0,0 @@
-From a3cb15ec4efc273f2644ed27898abe7a76e8f270 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 2 Nov 2022 08:25:39 -0700
-Subject: drm/amdgpu: Fix type of second parameter in trans_msg() callback
-
-From: Nathan Chancellor <nathan@kernel.org>
-
-[ Upstream commit f0d0f1087333714ee683cc134a95afe331d7ddd9 ]
-
-With clang's kernel control flow integrity (kCFI, CONFIG_CFI_CLANG),
-indirect call targets are validated against the expected function
-pointer prototype to make sure the call target is valid to help mitigate
-ROP attacks. If they are not identical, there is a failure at run time,
-which manifests as either a kernel panic or thread getting killed. A
-proposed warning in clang aims to catch these at compile time, which
-reveals:
-
- drivers/gpu/drm/amd/amdgpu/mxgpu_ai.c:412:15: error: incompatible function pointer types initializing 'void (*)(struct amdgpu_device *, u32, u32, u32, u32)' (aka 'void (*)(struct amdgpu_device *, unsigned int, unsigned int, unsigned int, unsigned int)') with an expression of type 'void (struct amdgpu_device *, enum idh_request, u32, u32, u32)' (aka 'void (struct amdgpu_device *, enum idh_request, unsigned int, unsigned int, unsigned int)') [-Werror,-Wincompatible-function-pointer-types-strict]
- .trans_msg = xgpu_ai_mailbox_trans_msg,
- ^~~~~~~~~~~~~~~~~~~~~~~~~
- 1 error generated.
-
- drivers/gpu/drm/amd/amdgpu/mxgpu_nv.c:435:15: error: incompatible function pointer types initializing 'void (*)(struct amdgpu_device *, u32, u32, u32, u32)' (aka 'void (*)(struct amdgpu_device *, unsigned int, unsigned int, unsigned int, unsigned int)') with an expression of type 'void (struct amdgpu_device *, enum idh_request, u32, u32, u32)' (aka 'void (struct amdgpu_device *, enum idh_request, unsigned int, unsigned int, unsigned int)') [-Werror,-Wincompatible-function-pointer-types-strict]
- .trans_msg = xgpu_nv_mailbox_trans_msg,
- ^~~~~~~~~~~~~~~~~~~~~~~~~
- 1 error generated.
-
-The type of the second parameter in the prototype should be 'enum
-idh_request' instead of 'u32'. Update it to clear up the warnings.
-
-Link: https://github.com/ClangBuiltLinux/linux/issues/1750
-Reported-by: Sami Tolvanen <samitolvanen@google.com>
-Reviewed-by: Kees Cook <keescook@chromium.org>
-Signed-off-by: Nathan Chancellor <nathan@kernel.org>
-Signed-off-by: Alex Deucher <alexander.deucher@amd.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 5 ++++-
- 1 file changed, 4 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
-index b0b2bdc750df9..3e59b4e150237 100644
---- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
-+++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
-@@ -48,6 +48,8 @@ struct amdgpu_vf_error_buffer {
- uint64_t data[AMDGPU_VF_ERROR_ENTRY_SIZE];
- };
-
-+enum idh_request;
-+
- /**
- * struct amdgpu_virt_ops - amdgpu device virt operations
- */
-@@ -56,7 +58,8 @@ struct amdgpu_virt_ops {
- int (*rel_full_gpu)(struct amdgpu_device *adev, bool init);
- int (*reset_gpu)(struct amdgpu_device *adev);
- int (*wait_reset)(struct amdgpu_device *adev);
-- void (*trans_msg)(struct amdgpu_device *adev, u32 req, u32 data1, u32 data2, u32 data3);
-+ void (*trans_msg)(struct amdgpu_device *adev, enum idh_request req,
-+ u32 data1, u32 data2, u32 data3);
- int (*get_pp_clk)(struct amdgpu_device *adev, u32 type, char *buf);
- int (*force_dpm_level)(struct amdgpu_device *adev, u32 level);
- };
---
-2.43.0
-
diff --git a/queue-5.4/drm-syncobj-call-drm_syncobj_fence_add_wait-when-wai.patch b/queue-5.4/drm-syncobj-call-drm_syncobj_fence_add_wait-when-wai.patch
deleted file mode 100644
index aefd2d6b2c..0000000000
--- a/queue-5.4/drm-syncobj-call-drm_syncobj_fence_add_wait-when-wai.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 27e50dab93123b63f044d5cc5cd5cd615a12e82b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 19 Jan 2024 08:32:06 -0800
-Subject: drm/syncobj: call drm_syncobj_fence_add_wait when WAIT_AVAILABLE flag
- is set
-
-From: Erik Kurzinger <ekurzinger@nvidia.com>
-
-[ Upstream commit 3c43177ffb54ea5be97505eb8e2690e99ac96bc9 ]
-
-When waiting for a syncobj timeline point whose fence has not yet been
-submitted with the WAIT_FOR_SUBMIT flag, a callback is registered using
-drm_syncobj_fence_add_wait and the thread is put to sleep until the
-timeout expires. If the fence is submitted before then,
-drm_syncobj_add_point will wake up the sleeping thread immediately which
-will proceed to wait for the fence to be signaled.
-
-However, if the WAIT_AVAILABLE flag is used instead,
-drm_syncobj_fence_add_wait won't get called, meaning the waiting thread
-will always sleep for the full timeout duration, even if the fence gets
-submitted earlier. If it turns out that the fence *has* been submitted
-by the time it eventually wakes up, it will still indicate to userspace
-that the wait completed successfully (it won't return -ETIME), but it
-will have taken much longer than it should have.
-
-To fix this, we must call drm_syncobj_fence_add_wait if *either* the
-WAIT_FOR_SUBMIT flag or the WAIT_AVAILABLE flag is set. The only
-difference being that with WAIT_FOR_SUBMIT we will also wait for the
-fence to be signaled after it has been submitted while with
-WAIT_AVAILABLE we will return immediately.
-
-IGT test patch: https://lists.freedesktop.org/archives/igt-dev/2024-January/067537.html
-
-v1 -> v2: adjust lockdep_assert_none_held_once condition
-
-(cherry picked from commit 8c44ea81634a4a337df70a32621a5f3791be23df)
-
-Fixes: 01d6c3578379 ("drm/syncobj: add support for timeline point wait v8")
-Signed-off-by: Erik Kurzinger <ekurzinger@nvidia.com>
-Signed-off-by: Simon Ser <contact@emersion.fr>
-Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-Reviewed-by: Simon Ser <contact@emersion.fr>
-Link: https://patchwork.freedesktop.org/patch/msgid/20240119163208.3723457-1-ekurzinger@nvidia.com
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/gpu/drm/drm_syncobj.c | 6 ++++--
- 1 file changed, 4 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
-index a1d2a3dc00768..9baf95a4fc9ff 100644
---- a/drivers/gpu/drm/drm_syncobj.c
-+++ b/drivers/gpu/drm/drm_syncobj.c
-@@ -898,7 +898,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
- uint64_t *points;
- uint32_t signaled_count, i;
-
-- if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT)
-+ if (flags & (DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
-+ DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE))
- lockdep_assert_none_held_once();
-
- points = kmalloc_array(count, sizeof(*points), GFP_KERNEL);
-@@ -967,7 +968,8 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
- * fallthough and try a 0 timeout wait!
- */
-
-- if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {
-+ if (flags & (DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT |
-+ DRM_SYNCOBJ_WAIT_FLAGS_WAIT_AVAILABLE)) {
- for (i = 0; i < count; ++i)
- drm_syncobj_fence_add_wait(syncobjs[i], &entries[i]);
- }
---
-2.43.0
-
diff --git a/queue-5.4/drm-syncobj-make-lockdep-complain-on-wait_for_submit.patch b/queue-5.4/drm-syncobj-make-lockdep-complain-on-wait_for_submit.patch
deleted file mode 100644
index 9fb2e00669..0000000000
--- a/queue-5.4/drm-syncobj-make-lockdep-complain-on-wait_for_submit.patch
+++ /dev/null
@@ -1,91 +0,0 @@
-From 2bccb12dcf11d8630ee133110a88ae6c28ffba89 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 15 Jan 2021 14:32:39 +0100
-Subject: drm/syncobj: make lockdep complain on WAIT_FOR_SUBMIT v3
-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 7621350c6bb20fb6ab7eb988833ab96eac3dcbef ]
-
-DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT can't be used when we hold locks
-since we are basically waiting for userspace to do something.
-
-Holding a lock while doing so can trivial deadlock with page faults
-etc...
-
-So make lockdep complain when a driver tries to do this.
-
-v2: Add lockdep_assert_none_held() macro.
-v3: Add might_sleep() and also use lockdep_assert_none_held() in the
- IOCTL path.
-
-Signed-off-by: Christian König <christian.koenig@amd.com>
-Reviewed-by: Daniel Vetter <daniel.vetter@ffwll.ch>
-Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Link: https://patchwork.freedesktop.org/patch/414944/
-Stable-dep-of: 3c43177ffb54 ("drm/syncobj: call drm_syncobj_fence_add_wait when WAIT_AVAILABLE flag is set")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/gpu/drm/drm_syncobj.c | 12 ++++++++++++
- include/linux/lockdep.h | 5 +++++
- 2 files changed, 17 insertions(+)
-
-diff --git a/drivers/gpu/drm/drm_syncobj.c b/drivers/gpu/drm/drm_syncobj.c
-index 8b155e3377cfe..a1d2a3dc00768 100644
---- a/drivers/gpu/drm/drm_syncobj.c
-+++ b/drivers/gpu/drm/drm_syncobj.c
-@@ -325,6 +325,15 @@ int drm_syncobj_find_fence(struct drm_file *file_private,
- if (!syncobj)
- return -ENOENT;
-
-+ /* Waiting for userspace with locks help is illegal cause that can
-+ * trivial deadlock with page faults for example. Make lockdep complain
-+ * about it early on.
-+ */
-+ if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT) {
-+ might_sleep();
-+ lockdep_assert_none_held_once();
-+ }
-+
- *fence = drm_syncobj_fence_get(syncobj);
-
- if (*fence) {
-@@ -889,6 +898,9 @@ static signed long drm_syncobj_array_wait_timeout(struct drm_syncobj **syncobjs,
- uint64_t *points;
- uint32_t signaled_count, i;
-
-+ if (flags & DRM_SYNCOBJ_WAIT_FLAGS_WAIT_FOR_SUBMIT)
-+ lockdep_assert_none_held_once();
-+
- points = kmalloc_array(count, sizeof(*points), GFP_KERNEL);
- if (points == NULL)
- return -ENOMEM;
-diff --git a/include/linux/lockdep.h b/include/linux/lockdep.h
-index b8a835fd611b2..15d92abb3f2d8 100644
---- a/include/linux/lockdep.h
-+++ b/include/linux/lockdep.h
-@@ -403,6 +403,10 @@ extern void lock_unpin_lock(struct lockdep_map *lock, struct pin_cookie);
- WARN_ON_ONCE(debug_locks && !lockdep_is_held(l)); \
- } while (0)
-
-+#define lockdep_assert_none_held_once() do { \
-+ WARN_ON_ONCE(debug_locks && current->lockdep_depth); \
-+ } while (0)
-+
- #define lockdep_recursing(tsk) ((tsk)->lockdep_recursion)
-
- #define lockdep_pin_lock(l) lock_pin_lock(&(l)->dep_map)
-@@ -479,6 +483,7 @@ struct lockdep_map { };
- #define lockdep_assert_held_write(l) do { (void)(l); } while (0)
- #define lockdep_assert_held_read(l) do { (void)(l); } while (0)
- #define lockdep_assert_held_once(l) do { (void)(l); } while (0)
-+#define lockdep_assert_none_held_once() do { } while (0)
-
- #define lockdep_recursing(tsk) (0)
-
---
-2.43.0
-
diff --git a/queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch b/queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch
deleted file mode 100644
index 115dacab0c..0000000000
--- a/queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch
+++ /dev/null
@@ -1,65 +0,0 @@
-From f358d2831a4b6c45acec0c4f4cf1eef8cf2101eb Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 4 Jan 2024 22:20:38 +0800
-Subject: ext4: avoid allocating blocks from corrupted group in
- ext4_mb_try_best_found()
-
-From: Baokun Li <libaokun1@huawei.com>
-
-[ Upstream commit 4530b3660d396a646aad91a787b6ab37cf604b53 ]
-
-Determine if the group block bitmap is corrupted before using ac_b_ex in
-ext4_mb_try_best_found() to avoid allocating blocks from a group with a
-corrupted block bitmap in the following concurrency and making the
-situation worse.
-
-ext4_mb_regular_allocator
- ext4_lock_group(sb, group)
- ext4_mb_good_group
- // check if the group bbitmap is corrupted
- ext4_mb_complex_scan_group
- // Scan group gets ac_b_ex but doesn't use it
- ext4_unlock_group(sb, group)
- ext4_mark_group_bitmap_corrupted(group)
- // The block bitmap was corrupted during
- // the group unlock gap.
- ext4_mb_try_best_found
- ext4_lock_group(ac->ac_sb, group)
- ext4_mb_use_best_found
- mb_mark_used
- // Allocating blocks in block bitmap corrupted group
-
-Signed-off-by: Baokun Li <libaokun1@huawei.com>
-Reviewed-by: Jan Kara <jack@suse.cz>
-Link: https://lore.kernel.org/r/20240104142040.2835097-7-libaokun1@huawei.com
-Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/ext4/mballoc.c | 4 ++++
- 1 file changed, 4 insertions(+)
-
-diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
-index 0745330228cf0..1af9daaff8ba2 100644
---- a/fs/ext4/mballoc.c
-+++ b/fs/ext4/mballoc.c
-@@ -1802,6 +1802,9 @@ int ext4_mb_try_best_found(struct ext4_allocation_context *ac,
- return err;
-
- ext4_lock_group(ac->ac_sb, group);
-+ if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(e4b->bd_info)))
-+ goto out;
-+
- max = mb_find_extent(e4b, ex.fe_start, ex.fe_len, &ex);
-
- if (max > 0) {
-@@ -1809,6 +1812,7 @@ int ext4_mb_try_best_found(struct ext4_allocation_context *ac,
- ext4_mb_use_best_found(ac, e4b);
- }
-
-+out:
- ext4_unlock_group(ac->ac_sb, group);
- ext4_mb_unload_buddy(e4b);
-
---
-2.43.0
-
diff --git a/queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch-12902 b/queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch-12902
deleted file mode 100644
index c5641f970b..0000000000
--- a/queue-5.4/ext4-avoid-allocating-blocks-from-corrupted-group-in.patch-12902
+++ /dev/null
@@ -1,54 +0,0 @@
-From a6306d11237a11e7b9b11fbdfc8bfc98fde393ff Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 4 Jan 2024 22:20:39 +0800
-Subject: ext4: avoid allocating blocks from corrupted group in
- ext4_mb_find_by_goal()
-
-From: Baokun Li <libaokun1@huawei.com>
-
-[ Upstream commit 832698373a25950942c04a512daa652c18a9b513 ]
-
-Places the logic for checking if the group's block bitmap is corrupt under
-the protection of the group lock to avoid allocating blocks from the group
-with a corrupted block bitmap.
-
-Signed-off-by: Baokun Li <libaokun1@huawei.com>
-Reviewed-by: Jan Kara <jack@suse.cz>
-Link: https://lore.kernel.org/r/20240104142040.2835097-8-libaokun1@huawei.com
-Signed-off-by: Theodore Ts'o <tytso@mit.edu>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/ext4/mballoc.c | 9 ++++-----
- 1 file changed, 4 insertions(+), 5 deletions(-)
-
-diff --git a/fs/ext4/mballoc.c b/fs/ext4/mballoc.c
-index 1af9daaff8ba2..e823731110e3e 100644
---- a/fs/ext4/mballoc.c
-+++ b/fs/ext4/mballoc.c
-@@ -1839,12 +1839,10 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac,
- if (err)
- return err;
-
-- if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(e4b->bd_info))) {
-- ext4_mb_unload_buddy(e4b);
-- return 0;
-- }
--
- ext4_lock_group(ac->ac_sb, group);
-+ if (unlikely(EXT4_MB_GRP_BBITMAP_CORRUPT(e4b->bd_info)))
-+ goto out;
-+
- max = mb_find_extent(e4b, ac->ac_g_ex.fe_start,
- ac->ac_g_ex.fe_len, &ex);
- ex.fe_logical = 0xDEADFA11; /* debug value */
-@@ -1877,6 +1875,7 @@ int ext4_mb_find_by_goal(struct ext4_allocation_context *ac,
- ac->ac_b_ex = ex;
- ext4_mb_use_best_found(ac, e4b);
- }
-+out:
- ext4_unlock_group(ac->ac_sb, group);
- ext4_mb_unload_buddy(e4b);
-
---
-2.43.0
-
diff --git a/queue-5.4/fbdev-savage-error-out-if-pixclock-equals-zero.patch b/queue-5.4/fbdev-savage-error-out-if-pixclock-equals-zero.patch
deleted file mode 100644
index 7d3479a3a8..0000000000
--- a/queue-5.4/fbdev-savage-error-out-if-pixclock-equals-zero.patch
+++ /dev/null
@@ -1,45 +0,0 @@
-From 4035179ae69e5bbdb725946ce7828aa24484766e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 18 Jan 2024 11:49:40 +0800
-Subject: fbdev: savage: Error out if pixclock equals zero
-
-From: Fullway Wang <fullwaywang@outlook.com>
-
-[ Upstream commit 04e5eac8f3ab2ff52fa191c187a46d4fdbc1e288 ]
-
-The userspace program could pass any values to the driver through
-ioctl() interface. If the driver doesn't check the value of pixclock,
-it may cause divide-by-zero error.
-
-Although pixclock is checked in savagefb_decode_var(), but it is not
-checked properly in savagefb_probe(). Fix this by checking whether
-pixclock is zero in the function savagefb_check_var() before
-info->var.pixclock is used as the divisor.
-
-This is similar to CVE-2022-3061 in i740fb which was fixed by
-commit 15cf0b8.
-
-Signed-off-by: Fullway Wang <fullwaywang@outlook.com>
-Signed-off-by: Helge Deller <deller@gmx.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/video/fbdev/savage/savagefb_driver.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/video/fbdev/savage/savagefb_driver.c b/drivers/video/fbdev/savage/savagefb_driver.c
-index d5d22d9c0f562..368500c401402 100644
---- a/drivers/video/fbdev/savage/savagefb_driver.c
-+++ b/drivers/video/fbdev/savage/savagefb_driver.c
-@@ -869,6 +869,9 @@ static int savagefb_check_var(struct fb_var_screeninfo *var,
-
- DBG("savagefb_check_var");
-
-+ if (!var->pixclock)
-+ return -EINVAL;
-+
- var->transp.offset = 0;
- var->transp.length = 0;
- switch (var->bits_per_pixel) {
---
-2.43.0
-
diff --git a/queue-5.4/fbdev-sis-error-out-if-pixclock-equals-zero.patch b/queue-5.4/fbdev-sis-error-out-if-pixclock-equals-zero.patch
deleted file mode 100644
index d1cf5e3b11..0000000000
--- a/queue-5.4/fbdev-sis-error-out-if-pixclock-equals-zero.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 28cdbd877e4f8126afad16099cf482bc3b7d50d3 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 18 Jan 2024 14:24:43 +0800
-Subject: fbdev: sis: Error out if pixclock equals zero
-
-From: Fullway Wang <fullwaywang@outlook.com>
-
-[ Upstream commit e421946be7d9bf545147bea8419ef8239cb7ca52 ]
-
-The userspace program could pass any values to the driver through
-ioctl() interface. If the driver doesn't check the value of pixclock,
-it may cause divide-by-zero error.
-
-In sisfb_check_var(), var->pixclock is used as a divisor to caculate
-drate before it is checked against zero. Fix this by checking it
-at the beginning.
-
-This is similar to CVE-2022-3061 in i740fb which was fixed by
-commit 15cf0b8.
-
-Signed-off-by: Fullway Wang <fullwaywang@outlook.com>
-Signed-off-by: Helge Deller <deller@gmx.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/video/fbdev/sis/sis_main.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/drivers/video/fbdev/sis/sis_main.c b/drivers/video/fbdev/sis/sis_main.c
-index b443a8ed46003..2fdd02e51f5fc 100644
---- a/drivers/video/fbdev/sis/sis_main.c
-+++ b/drivers/video/fbdev/sis/sis_main.c
-@@ -1474,6 +1474,8 @@ sisfb_check_var(struct fb_var_screeninfo *var, struct fb_info *info)
-
- vtotal = var->upper_margin + var->lower_margin + var->vsync_len;
-
-+ if (!var->pixclock)
-+ return -EINVAL;
- pixclock = var->pixclock;
-
- if((var->vmode & FB_VMODE_MASK) == FB_VMODE_NONINTERLACED) {
---
-2.43.0
-
diff --git a/queue-5.4/firewire-core-send-bus-reset-promptly-on-gap-count-e.patch b/queue-5.4/firewire-core-send-bus-reset-promptly-on-gap-count-e.patch
deleted file mode 100644
index a21829ceb6..0000000000
--- a/queue-5.4/firewire-core-send-bus-reset-promptly-on-gap-count-e.patch
+++ /dev/null
@@ -1,129 +0,0 @@
-From 2331cbb16b42c14559c39fcaed550e2ba8d3244e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 7 Feb 2024 08:01:17 +0900
-Subject: firewire: core: send bus reset promptly on gap count error
-
-From: Takashi Sakamoto <o-takashi@sakamocchi.jp>
-
-[ Upstream commit 7ed4380009e96d9e9c605e12822e987b35b05648 ]
-
-If we are bus manager and the bus has inconsistent gap counts, send a
-bus reset immediately instead of trying to read the root node's config
-ROM first. Otherwise, we could spend a lot of time trying to read the
-config ROM but never succeeding.
-
-This eliminates a 50+ second delay before the FireWire bus is usable after
-a newly connected device is powered on in certain circumstances.
-
-The delay occurs if a gap count inconsistency occurs, we are not the root
-node, and we become bus manager. One scenario that causes this is with a TI
-XIO2213B OHCI, the first time a Sony DSR-25 is powered on after being
-connected to the FireWire cable. In this configuration, the Linux box will
-not receive the initial PHY configuration packet sent by the DSR-25 as IRM,
-resulting in the DSR-25 having a gap count of 44 while the Linux box has a
-gap count of 63.
-
-FireWire devices have a gap count parameter, which is set to 63 on power-up
-and can be changed with a PHY configuration packet. This determines the
-duration of the subaction and arbitration gaps. For reliable communication,
-all nodes on a FireWire bus must have the same gap count.
-
-A node may have zero or more of the following roles: root node, bus manager
-(BM), isochronous resource manager (IRM), and cycle master. Unless a root
-node was forced with a PHY configuration packet, any node might become root
-node after a bus reset. Only the root node can become cycle master. If the
-root node is not cycle master capable, the BM or IRM should force a change
-of root node.
-
-After a bus reset, each node sends a self-ID packet, which contains its
-current gap count. A single bus reset does not change the gap count, but
-two bus resets in a row will set the gap count to 63. Because a consistent
-gap count is required for reliable communication, IEEE 1394a-2000 requires
-that the bus manager generate a bus reset if it detects that the gap count
-is inconsistent.
-
-When the gap count is inconsistent, build_tree() will notice this after the
-self identification process. It will set card->gap_count to the invalid
-value 0. If we become bus master, this will force bm_work() to send a bus
-reset when it performs gap count optimization.
-
-After a bus reset, there is no bus manager. We will almost always try to
-become bus manager. Once we become bus manager, we will first determine
-whether the root node is cycle master capable. Then, we will determine if
-the gap count should be changed. If either the root node or the gap count
-should be changed, we will generate a bus reset.
-
-To determine if the root node is cycle master capable, we read its
-configuration ROM. bm_work() will wait until we have finished trying to
-read the configuration ROM.
-
-However, an inconsistent gap count can make this take a long time.
-read_config_rom() will read the first few quadlets from the config ROM. Due
-to the gap count inconsistency, eventually one of the reads will time out.
-When read_config_rom() fails, fw_device_init() calls it again until
-MAX_RETRIES is reached. This takes 50+ seconds.
-
-Once we give up trying to read the configuration ROM, bm_work() will wake
-up, assume that the root node is not cycle master capable, and do a bus
-reset. Hopefully, this will resolve the gap count inconsistency.
-
-This change makes bm_work() check for an inconsistent gap count before
-waiting for the root node's configuration ROM. If the gap count is
-inconsistent, bm_work() will immediately do a bus reset. This eliminates
-the 50+ second delay and rapidly brings the bus to a working state.
-
-I considered that if the gap count is inconsistent, a PHY configuration
-packet might not be successful, so it could be desirable to skip the PHY
-configuration packet before the bus reset in this case. However, IEEE
-1394a-2000 and IEEE 1394-2008 say that the bus manager may transmit a PHY
-configuration packet before a bus reset when correcting a gap count error.
-Since the standard endorses this, I decided it's safe to retain the PHY
-configuration packet transmission.
-
-Normally, after a topology change, we will reset the bus a maximum of 5
-times to change the root node and perform gap count optimization. However,
-if there is a gap count inconsistency, we must always generate a bus reset.
-Otherwise the gap count inconsistency will persist and communication will
-be unreliable. For that reason, if there is a gap count inconstency, we
-generate a bus reset even if we already reached the 5 reset limit.
-
-Signed-off-by: Adam Goldman <adamg@pobox.com>
-Reference: https://sourceforge.net/p/linux1394/mailman/message/58727806/
-Signed-off-by: Takashi Sakamoto <o-takashi@sakamocchi.jp>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/firewire/core-card.c | 18 +++++++++++++++++-
- 1 file changed, 17 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/firewire/core-card.c b/drivers/firewire/core-card.c
-index f3b3953cac834..be195ba834632 100644
---- a/drivers/firewire/core-card.c
-+++ b/drivers/firewire/core-card.c
-@@ -429,7 +429,23 @@ static void bm_work(struct work_struct *work)
- */
- card->bm_generation = generation;
-
-- if (root_device == NULL) {
-+ if (card->gap_count == 0) {
-+ /*
-+ * If self IDs have inconsistent gap counts, do a
-+ * bus reset ASAP. The config rom read might never
-+ * complete, so don't wait for it. However, still
-+ * send a PHY configuration packet prior to the
-+ * bus reset. The PHY configuration packet might
-+ * fail, but 1394-2008 8.4.5.2 explicitly permits
-+ * it in this case, so it should be safe to try.
-+ */
-+ new_root_id = local_id;
-+ /*
-+ * We must always send a bus reset if the gap count
-+ * is inconsistent, so bypass the 5-reset limit.
-+ */
-+ card->bm_retries = 0;
-+ } else if (root_device == NULL) {
- /*
- * Either link_on is false, or we failed to read the
- * config rom. In either case, pick another root.
---
-2.43.0
-
diff --git a/queue-5.4/fs-aio-restrict-kiocb_set_cancel_fn-to-i-o-submitted-via-libaio.patch b/queue-5.4/fs-aio-restrict-kiocb_set_cancel_fn-to-i-o-submitted-via-libaio.patch
deleted file mode 100644
index 631c6daaee..0000000000
--- a/queue-5.4/fs-aio-restrict-kiocb_set_cancel_fn-to-i-o-submitted-via-libaio.patch
+++ /dev/null
@@ -1,84 +0,0 @@
-From b820de741ae48ccf50dd95e297889c286ff4f760 Mon Sep 17 00:00:00 2001
-From: Bart Van Assche <bvanassche@acm.org>
-Date: Thu, 15 Feb 2024 12:47:38 -0800
-Subject: fs/aio: Restrict kiocb_set_cancel_fn() to I/O submitted via libaio
-
-From: Bart Van Assche <bvanassche@acm.org>
-
-commit b820de741ae48ccf50dd95e297889c286ff4f760 upstream.
-
-If kiocb_set_cancel_fn() is called for I/O submitted via io_uring, the
-following kernel warning appears:
-
-WARNING: CPU: 3 PID: 368 at fs/aio.c:598 kiocb_set_cancel_fn+0x9c/0xa8
-Call trace:
- kiocb_set_cancel_fn+0x9c/0xa8
- ffs_epfile_read_iter+0x144/0x1d0
- io_read+0x19c/0x498
- io_issue_sqe+0x118/0x27c
- io_submit_sqes+0x25c/0x5fc
- __arm64_sys_io_uring_enter+0x104/0xab0
- invoke_syscall+0x58/0x11c
- el0_svc_common+0xb4/0xf4
- do_el0_svc+0x2c/0xb0
- el0_svc+0x2c/0xa4
- el0t_64_sync_handler+0x68/0xb4
- el0t_64_sync+0x1a4/0x1a8
-
-Fix this by setting the IOCB_AIO_RW flag for read and write I/O that is
-submitted by libaio.
-
-Suggested-by: Jens Axboe <axboe@kernel.dk>
-Cc: Christoph Hellwig <hch@lst.de>
-Cc: Avi Kivity <avi@scylladb.com>
-Cc: Sandeep Dhavale <dhavale@google.com>
-Cc: Jens Axboe <axboe@kernel.dk>
-Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
-Cc: Kent Overstreet <kent.overstreet@linux.dev>
-Cc: stable@vger.kernel.org
-Signed-off-by: Bart Van Assche <bvanassche@acm.org>
-Link: https://lore.kernel.org/r/20240215204739.2677806-2-bvanassche@acm.org
-Signed-off-by: Christian Brauner <brauner@kernel.org>
-Signed-off-by: Bart Van Assche <bvanassche@acm.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- fs/aio.c | 9 ++++++++-
- include/linux/fs.h | 2 ++
- 2 files changed, 10 insertions(+), 1 deletion(-)
-
---- a/fs/aio.c
-+++ b/fs/aio.c
-@@ -570,6 +570,13 @@ void kiocb_set_cancel_fn(struct kiocb *i
- struct kioctx *ctx = req->ki_ctx;
- unsigned long flags;
-
-+ /*
-+ * kiocb didn't come from aio or is neither a read nor a write, hence
-+ * ignore it.
-+ */
-+ if (!(iocb->ki_flags & IOCB_AIO_RW))
-+ return;
-+
- if (WARN_ON_ONCE(!list_empty(&req->ki_list)))
- return;
-
-@@ -1455,7 +1462,7 @@ static int aio_prep_rw(struct kiocb *req
- req->ki_complete = aio_complete_rw;
- req->private = NULL;
- req->ki_pos = iocb->aio_offset;
-- req->ki_flags = iocb_flags(req->ki_filp);
-+ req->ki_flags = iocb_flags(req->ki_filp) | IOCB_AIO_RW;
- if (iocb->aio_flags & IOCB_FLAG_RESFD)
- req->ki_flags |= IOCB_EVENTFD;
- req->ki_hint = ki_hint_validate(file_write_hint(req->ki_filp));
---- a/include/linux/fs.h
-+++ b/include/linux/fs.h
-@@ -314,6 +314,8 @@ enum rw_hint {
- #define IOCB_SYNC (1 << 5)
- #define IOCB_WRITE (1 << 6)
- #define IOCB_NOWAIT (1 << 7)
-+/* kiocb is a read or write operation submitted by fs/aio.c. */
-+#define IOCB_AIO_RW (1 << 23)
-
- struct kiocb {
- struct file *ki_filp;
diff --git a/queue-5.4/gtp-fix-use-after-free-and-null-ptr-deref-in-gtp_genl_dump_pdp.patch b/queue-5.4/gtp-fix-use-after-free-and-null-ptr-deref-in-gtp_genl_dump_pdp.patch
deleted file mode 100644
index 186a22b81a..0000000000
--- a/queue-5.4/gtp-fix-use-after-free-and-null-ptr-deref-in-gtp_genl_dump_pdp.patch
+++ /dev/null
@@ -1,97 +0,0 @@
-From 136cfaca22567a03bbb3bf53a43d8cb5748b80ec Mon Sep 17 00:00:00 2001
-From: Vasiliy Kovalev <kovalev@altlinux.org>
-Date: Wed, 14 Feb 2024 19:27:33 +0300
-Subject: gtp: fix use-after-free and null-ptr-deref in gtp_genl_dump_pdp()
-
-From: Vasiliy Kovalev <kovalev@altlinux.org>
-
-commit 136cfaca22567a03bbb3bf53a43d8cb5748b80ec upstream.
-
-The gtp_net_ops pernet operations structure for the subsystem must be
-registered before registering the generic netlink family.
-
-Syzkaller hit 'general protection fault in gtp_genl_dump_pdp' bug:
-
-general protection fault, probably for non-canonical address
-0xdffffc0000000002: 0000 [#1] PREEMPT SMP KASAN NOPTI
-KASAN: null-ptr-deref in range [0x0000000000000010-0x0000000000000017]
-CPU: 1 PID: 5826 Comm: gtp Not tainted 6.8.0-rc3-std-def-alt1 #1
-Hardware name: QEMU Standard PC (Q35 + ICH9, 2009), BIOS 1.16.0-alt1 04/01/2014
-RIP: 0010:gtp_genl_dump_pdp+0x1be/0x800 [gtp]
-Code: c6 89 c6 e8 64 e9 86 df 58 45 85 f6 0f 85 4e 04 00 00 e8 c5 ee 86
- df 48 8b 54 24 18 48 b8 00 00 00 00 00 fc ff df 48 c1 ea 03 <80>
- 3c 02 00 0f 85 de 05 00 00 48 8b 44 24 18 4c 8b 30 4c 39 f0 74
-RSP: 0018:ffff888014107220 EFLAGS: 00010202
-RAX: dffffc0000000000 RBX: 0000000000000000 RCX: 0000000000000000
-RDX: 0000000000000002 RSI: 0000000000000000 RDI: 0000000000000000
-RBP: 0000000000000000 R08: 0000000000000000 R09: 0000000000000000
-R10: 0000000000000000 R11: 0000000000000000 R12: 0000000000000000
-R13: ffff88800fcda588 R14: 0000000000000001 R15: 0000000000000000
-FS: 00007f1be4eb05c0(0000) GS:ffff88806ce80000(0000) knlGS:0000000000000000
-CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
-CR2: 00007f1be4e766cf CR3: 000000000c33e000 CR4: 0000000000750ef0
-PKRU: 55555554
-Call Trace:
- <TASK>
- ? show_regs+0x90/0xa0
- ? die_addr+0x50/0xd0
- ? exc_general_protection+0x148/0x220
- ? asm_exc_general_protection+0x22/0x30
- ? gtp_genl_dump_pdp+0x1be/0x800 [gtp]
- ? __alloc_skb+0x1dd/0x350
- ? __pfx___alloc_skb+0x10/0x10
- genl_dumpit+0x11d/0x230
- netlink_dump+0x5b9/0xce0
- ? lockdep_hardirqs_on_prepare+0x253/0x430
- ? __pfx_netlink_dump+0x10/0x10
- ? kasan_save_track+0x10/0x40
- ? __kasan_kmalloc+0x9b/0xa0
- ? genl_start+0x675/0x970
- __netlink_dump_start+0x6fc/0x9f0
- genl_family_rcv_msg_dumpit+0x1bb/0x2d0
- ? __pfx_genl_family_rcv_msg_dumpit+0x10/0x10
- ? genl_op_from_small+0x2a/0x440
- ? cap_capable+0x1d0/0x240
- ? __pfx_genl_start+0x10/0x10
- ? __pfx_genl_dumpit+0x10/0x10
- ? __pfx_genl_done+0x10/0x10
- ? security_capable+0x9d/0xe0
-
-Cc: stable@vger.kernel.org
-Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
-Fixes: 459aa660eb1d ("gtp: add initial driver for datapath of GPRS Tunneling Protocol (GTP-U)")
-Link: https://lore.kernel.org/r/20240214162733.34214-1-kovalev@altlinux.org
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/net/gtp.c | 10 +++++-----
- 1 file changed, 5 insertions(+), 5 deletions(-)
-
---- a/drivers/net/gtp.c
-+++ b/drivers/net/gtp.c
-@@ -1381,20 +1381,20 @@ static int __init gtp_init(void)
- if (err < 0)
- goto error_out;
-
-- err = genl_register_family(&gtp_genl_family);
-+ err = register_pernet_subsys(&gtp_net_ops);
- if (err < 0)
- goto unreg_rtnl_link;
-
-- err = register_pernet_subsys(&gtp_net_ops);
-+ err = genl_register_family(&gtp_genl_family);
- if (err < 0)
-- goto unreg_genl_family;
-+ goto unreg_pernet_subsys;
-
- pr_info("GTP module loaded (pdp ctx size %zd bytes)\n",
- sizeof(struct pdp_ctx));
- return 0;
-
--unreg_genl_family:
-- genl_unregister_family(&gtp_genl_family);
-+unreg_pernet_subsys:
-+ unregister_pernet_subsys(&gtp_net_ops);
- unreg_rtnl_link:
- rtnl_link_unregister(&gtp_link_ops);
- error_out:
diff --git a/queue-5.4/hwmon-coretemp-enlarge-per-package-core-count-limit.patch b/queue-5.4/hwmon-coretemp-enlarge-per-package-core-count-limit.patch
deleted file mode 100644
index 7a40876f69..0000000000
--- a/queue-5.4/hwmon-coretemp-enlarge-per-package-core-count-limit.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From 289a10021e3bec5663159eb67139fb068d9d46d7 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 2 Feb 2024 17:21:36 +0800
-Subject: hwmon: (coretemp) Enlarge per package core count limit
-
-From: Zhang Rui <rui.zhang@intel.com>
-
-[ Upstream commit 34cf8c657cf0365791cdc658ddbca9cc907726ce ]
-
-Currently, coretemp driver supports only 128 cores per package.
-This loses some core temperature information on systems that have more
-than 128 cores per package.
- [ 58.685033] coretemp coretemp.0: Adding Core 128 failed
- [ 58.692009] coretemp coretemp.0: Adding Core 129 failed
- ...
-
-Enlarge the limitation to 512 because there are platforms with more than
-256 cores per package.
-
-Signed-off-by: Zhang Rui <rui.zhang@intel.com>
-Link: https://lore.kernel.org/r/20240202092144.71180-4-rui.zhang@intel.com
-Signed-off-by: Guenter Roeck <linux@roeck-us.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/hwmon/coretemp.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/hwmon/coretemp.c b/drivers/hwmon/coretemp.c
-index ecee12d0346b2..04acb8274fdf8 100644
---- a/drivers/hwmon/coretemp.c
-+++ b/drivers/hwmon/coretemp.c
-@@ -40,7 +40,7 @@ MODULE_PARM_DESC(tjmax, "TjMax value in degrees Celsius");
-
- #define PKG_SYSFS_ATTR_NO 1 /* Sysfs attribute for package temp */
- #define BASE_SYSFS_ATTR_NO 2 /* Sysfs Base attr no for coretemp */
--#define NUM_REAL_CORES 128 /* Number of Real cores per cpu */
-+#define NUM_REAL_CORES 512 /* Number of Real cores per cpu */
- #define CORETEMP_NAME_LENGTH 28 /* String Length of attrs */
- #define MAX_CORE_ATTRS 4 /* Maximum no of basic attrs */
- #define TOTAL_ATTRS (MAX_CORE_ATTRS + 1)
---
-2.43.0
-
diff --git a/queue-5.4/ib-hfi1-fix-a-memleak-in-init_credit_return.patch b/queue-5.4/ib-hfi1-fix-a-memleak-in-init_credit_return.patch
deleted file mode 100644
index 7d1e9ee6b0..0000000000
--- a/queue-5.4/ib-hfi1-fix-a-memleak-in-init_credit_return.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 095d487307322dc10f1754522afa38eefc6ed7d1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 12 Jan 2024 16:55:23 +0800
-Subject: IB/hfi1: Fix a memleak in init_credit_return
-
-From: Zhipeng Lu <alexious@zju.edu.cn>
-
-[ Upstream commit 809aa64ebff51eb170ee31a95f83b2d21efa32e2 ]
-
-When dma_alloc_coherent fails to allocate dd->cr_base[i].va,
-init_credit_return should deallocate dd->cr_base and
-dd->cr_base[i] that allocated before. Or those resources
-would be never freed and a memleak is triggered.
-
-Fixes: 7724105686e7 ("IB/hfi1: add driver files")
-Signed-off-by: Zhipeng Lu <alexious@zju.edu.cn>
-Link: https://lore.kernel.org/r/20240112085523.3731720-1-alexious@zju.edu.cn
-Acked-by: Dennis Dalessandro <dennis.dalessandro@cornelisnetworks.com>
-Signed-off-by: Leon Romanovsky <leon@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/infiniband/hw/hfi1/pio.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/infiniband/hw/hfi1/pio.c b/drivers/infiniband/hw/hfi1/pio.c
-index fa5de362010f2..8303c506733cc 100644
---- a/drivers/infiniband/hw/hfi1/pio.c
-+++ b/drivers/infiniband/hw/hfi1/pio.c
-@@ -2131,7 +2131,7 @@ int init_credit_return(struct hfi1_devdata *dd)
- "Unable to allocate credit return DMA range for NUMA %d\n",
- i);
- ret = -ENOMEM;
-- goto done;
-+ goto free_cr_base;
- }
- }
- set_dev_node(&dd->pcidev->dev, dd->node);
-@@ -2139,6 +2139,10 @@ int init_credit_return(struct hfi1_devdata *dd)
- ret = 0;
- done:
- return ret;
-+
-+free_cr_base:
-+ free_credit_return(dd);
-+ goto done;
- }
-
- void free_credit_return(struct hfi1_devdata *dd)
---
-2.43.0
-
diff --git a/queue-5.4/ib-hfi1-fix-sdma.h-tx-num_descs-off-by-one-error.patch b/queue-5.4/ib-hfi1-fix-sdma.h-tx-num_descs-off-by-one-error.patch
deleted file mode 100644
index 6b5e0f34d0..0000000000
--- a/queue-5.4/ib-hfi1-fix-sdma.h-tx-num_descs-off-by-one-error.patch
+++ /dev/null
@@ -1,100 +0,0 @@
-From e6f57c6881916df39db7d95981a8ad2b9c3458d6 Mon Sep 17 00:00:00 2001
-From: Daniel Vacek <neelx@redhat.com>
-Date: Thu, 1 Feb 2024 09:10:08 +0100
-Subject: IB/hfi1: Fix sdma.h tx->num_descs off-by-one error
-
-From: Daniel Vacek <neelx@redhat.com>
-
-commit e6f57c6881916df39db7d95981a8ad2b9c3458d6 upstream.
-
-Unfortunately the commit `fd8958efe877` introduced another error
-causing the `descs` array to overflow. This reults in further crashes
-easily reproducible by `sendmsg` system call.
-
-[ 1080.836473] general protection fault, probably for non-canonical address 0x400300015528b00a: 0000 [#1] PREEMPT SMP PTI
-[ 1080.869326] RIP: 0010:hfi1_ipoib_build_ib_tx_headers.constprop.0+0xe1/0x2b0 [hfi1]
---
-[ 1080.974535] Call Trace:
-[ 1080.976990] <TASK>
-[ 1081.021929] hfi1_ipoib_send_dma_common+0x7a/0x2e0 [hfi1]
-[ 1081.027364] hfi1_ipoib_send_dma_list+0x62/0x270 [hfi1]
-[ 1081.032633] hfi1_ipoib_send+0x112/0x300 [hfi1]
-[ 1081.042001] ipoib_start_xmit+0x2a9/0x2d0 [ib_ipoib]
-[ 1081.046978] dev_hard_start_xmit+0xc4/0x210
---
-[ 1081.148347] __sys_sendmsg+0x59/0xa0
-
-crash> ipoib_txreq 0xffff9cfeba229f00
-struct ipoib_txreq {
- txreq = {
- list = {
- next = 0xffff9cfeba229f00,
- prev = 0xffff9cfeba229f00
- },
- descp = 0xffff9cfeba229f40,
- coalesce_buf = 0x0,
- wait = 0xffff9cfea4e69a48,
- complete = 0xffffffffc0fe0760 <hfi1_ipoib_sdma_complete>,
- packet_len = 0x46d,
- tlen = 0x0,
- num_desc = 0x0,
- desc_limit = 0x6,
- next_descq_idx = 0x45c,
- coalesce_idx = 0x0,
- flags = 0x0,
- descs = {{
- qw = {0x8024000120dffb00, 0x4} # SDMA_DESC0_FIRST_DESC_FLAG (bit 63)
- }, {
- qw = { 0x3800014231b108, 0x4}
- }, {
- qw = { 0x310000e4ee0fcf0, 0x8}
- }, {
- qw = { 0x3000012e9f8000, 0x8}
- }, {
- qw = { 0x59000dfb9d0000, 0x8}
- }, {
- qw = { 0x78000e02e40000, 0x8}
- }}
- },
- sdma_hdr = 0x400300015528b000, <<< invalid pointer in the tx request structure
- sdma_status = 0x0, SDMA_DESC0_LAST_DESC_FLAG (bit 62)
- complete = 0x0,
- priv = 0x0,
- txq = 0xffff9cfea4e69880,
- skb = 0xffff9d099809f400
-}
-
-If an SDMA send consists of exactly 6 descriptors and requires dword
-padding (in the 7th descriptor), the sdma_txreq descriptor array is not
-properly expanded and the packet will overflow into the container
-structure. This results in a panic when the send completion runs. The
-exact panic varies depending on what elements of the container structure
-get corrupted. The fix is to use the correct expression in
-_pad_sdma_tx_descs() to test the need to expand the descriptor array.
-
-With this patch the crashes are no longer reproducible and the machine is
-stable.
-
-Fixes: fd8958efe877 ("IB/hfi1: Fix sdma.h tx->num_descs off-by-one errors")
-Cc: stable@vger.kernel.org
-Reported-by: Mats Kronberg <kronberg@nsc.liu.se>
-Tested-by: Mats Kronberg <kronberg@nsc.liu.se>
-Signed-off-by: Daniel Vacek <neelx@redhat.com>
-Link: https://lore.kernel.org/r/20240201081009.1109442-1-neelx@redhat.com
-Signed-off-by: Leon Romanovsky <leon@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/infiniband/hw/hfi1/sdma.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/infiniband/hw/hfi1/sdma.c
-+++ b/drivers/infiniband/hw/hfi1/sdma.c
-@@ -3203,7 +3203,7 @@ int _pad_sdma_tx_descs(struct hfi1_devda
- {
- int rval = 0;
-
-- if ((unlikely(tx->num_desc + 1 == tx->desc_limit))) {
-+ if ((unlikely(tx->num_desc == tx->desc_limit))) {
- rval = _extend_sdma_tx_descs(dd, tx);
- if (rval) {
- __sdma_txclean(dd, tx);
diff --git a/queue-5.4/iomap-set-all-uptodate-bits-for-an-uptodate-page.patch b/queue-5.4/iomap-set-all-uptodate-bits-for-an-uptodate-page.patch
deleted file mode 100644
index 04f627198a..0000000000
--- a/queue-5.4/iomap-set-all-uptodate-bits-for-an-uptodate-page.patch
+++ /dev/null
@@ -1,55 +0,0 @@
-From fbe35689c5acb3f4be7bcfe68e179efd4334a4aa Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 25 Sep 2020 11:16:53 -0700
-Subject: iomap: Set all uptodate bits for an Uptodate page
-
-From: Matthew Wilcox (Oracle) <willy@infradead.org>
-
-[ Upstream commit 4595a298d5563cf76c1d852970f162051fd1a7a6 ]
-
-For filesystems with block size < page size, we need to set all the
-per-block uptodate bits if the page was already uptodate at the time
-we create the per-block metadata. This can happen if the page is
-invalidated (eg by a write to drop_caches) but ultimately not removed
-from the page cache.
-
-This is a data corruption issue as page writeback skips blocks which
-are marked !uptodate.
-
-Fixes: 9dc55f1389f9 ("iomap: add support for sub-pagesize buffered I/O without buffer heads")
-Signed-off-by: Matthew Wilcox (Oracle) <willy@infradead.org>
-Reported-by: Qian Cai <cai@redhat.com>
-Cc: Brian Foster <bfoster@redhat.com>
-Reviewed-by: Gao Xiang <hsiangkao@redhat.com>
-Reviewed-by: Darrick J. Wong <darrick.wong@oracle.com>
-Signed-off-by: Darrick J. Wong <darrick.wong@oracle.com>
-Reviewed-by: Christoph Hellwig <hch@lst.de>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- fs/iomap/buffered-io.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/fs/iomap/buffered-io.c b/fs/iomap/buffered-io.c
-index 53cd7b2bb580b..c28ba474a25e7 100644
---- a/fs/iomap/buffered-io.c
-+++ b/fs/iomap/buffered-io.c
-@@ -23,6 +23,7 @@ static struct iomap_page *
- iomap_page_create(struct inode *inode, struct page *page)
- {
- struct iomap_page *iop = to_iomap_page(page);
-+ unsigned int nr_blocks = PAGE_SIZE / i_blocksize(inode);
-
- if (iop || i_blocksize(inode) == PAGE_SIZE)
- return iop;
-@@ -32,6 +33,8 @@ iomap_page_create(struct inode *inode, struct page *page)
- atomic_set(&iop->write_count, 0);
- spin_lock_init(&iop->uptodate_lock);
- bitmap_zero(iop->uptodate, PAGE_SIZE / SECTOR_SIZE);
-+ if (PageUptodate(page))
-+ bitmap_fill(iop->uptodate, nr_blocks);
-
- /*
- * migrate_page_move_mapping() assumes that pages with private data have
---
-2.43.0
-
diff --git a/queue-5.4/ipv4-properly-combine-dev_base_seq-and-ipv4.dev_addr.patch b/queue-5.4/ipv4-properly-combine-dev_base_seq-and-ipv4.dev_addr.patch
deleted file mode 100644
index 1100a2bc79..0000000000
--- a/queue-5.4/ipv4-properly-combine-dev_base_seq-and-ipv4.dev_addr.patch
+++ /dev/null
@@ -1,73 +0,0 @@
-From b0ed70e21c32a070603125f355487f65a1f97763 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 15 Feb 2024 17:21:06 +0000
-Subject: ipv4: properly combine dev_base_seq and ipv4.dev_addr_genid
-
-From: Eric Dumazet <edumazet@google.com>
-
-[ Upstream commit 081a0e3b0d4c061419d3f4679dec9f68725b17e4 ]
-
-net->dev_base_seq and ipv4.dev_addr_genid are monotonically increasing.
-
-If we XOR their values, we could miss to detect if both values
-were changed with the same amount.
-
-Fixes: 0465277f6b3f ("ipv4: provide addr and netconf dump consistency info")
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Cc: Nicolas Dichtel <nicolas.dichtel@6wind.com>
-Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/ipv4/devinet.c | 21 +++++++++++++++++----
- 1 file changed, 17 insertions(+), 4 deletions(-)
-
-diff --git a/net/ipv4/devinet.c b/net/ipv4/devinet.c
-index 4c013f8800f0c..ed00b233cee2e 100644
---- a/net/ipv4/devinet.c
-+++ b/net/ipv4/devinet.c
-@@ -1798,6 +1798,21 @@ static int in_dev_dump_addr(struct in_device *in_dev, struct sk_buff *skb,
- return err;
- }
-
-+/* Combine dev_addr_genid and dev_base_seq to detect changes.
-+ */
-+static u32 inet_base_seq(const struct net *net)
-+{
-+ u32 res = atomic_read(&net->ipv4.dev_addr_genid) +
-+ net->dev_base_seq;
-+
-+ /* Must not return 0 (see nl_dump_check_consistent()).
-+ * Chose a value far away from 0.
-+ */
-+ if (!res)
-+ res = 0x80000000;
-+ return res;
-+}
-+
- static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
- {
- const struct nlmsghdr *nlh = cb->nlh;
-@@ -1849,8 +1864,7 @@ static int inet_dump_ifaddr(struct sk_buff *skb, struct netlink_callback *cb)
- idx = 0;
- head = &tgt_net->dev_index_head[h];
- rcu_read_lock();
-- cb->seq = atomic_read(&tgt_net->ipv4.dev_addr_genid) ^
-- tgt_net->dev_base_seq;
-+ cb->seq = inet_base_seq(tgt_net);
- hlist_for_each_entry_rcu(dev, head, index_hlist) {
- if (idx < s_idx)
- goto cont;
-@@ -2249,8 +2263,7 @@ static int inet_netconf_dump_devconf(struct sk_buff *skb,
- idx = 0;
- head = &net->dev_index_head[h];
- rcu_read_lock();
-- cb->seq = atomic_read(&net->ipv4.dev_addr_genid) ^
-- net->dev_base_seq;
-+ cb->seq = inet_base_seq(net);
- hlist_for_each_entry_rcu(dev, head, index_hlist) {
- if (idx < s_idx)
- goto cont;
---
-2.43.0
-
diff --git a/queue-5.4/ipv6-properly-combine-dev_base_seq-and-ipv6.dev_addr.patch b/queue-5.4/ipv6-properly-combine-dev_base_seq-and-ipv6.dev_addr.patch
deleted file mode 100644
index 8900ba7772..0000000000
--- a/queue-5.4/ipv6-properly-combine-dev_base_seq-and-ipv6.dev_addr.patch
+++ /dev/null
@@ -1,75 +0,0 @@
-From 7c70e1a8d25bf36ecd3d0ebfdc64300a19128aea Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 15 Feb 2024 17:21:07 +0000
-Subject: ipv6: properly combine dev_base_seq and ipv6.dev_addr_genid
-
-From: Eric Dumazet <edumazet@google.com>
-
-[ Upstream commit e898e4cd1aab271ca414f9ac6e08e4c761f6913c ]
-
-net->dev_base_seq and ipv6.dev_addr_genid are monotonically increasing.
-
-If we XOR their values, we could miss to detect if both values
-were changed with the same amount.
-
-Fixes: 63998ac24f83 ("ipv6: provide addr and netconf dump consistency info")
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Cc: Nicolas Dichtel <nicolas.dichtel@6wind.com>
-
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Acked-by: Nicolas Dichtel <nicolas.dichtel@6wind.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/ipv6/addrconf.c | 21 ++++++++++++++++++---
- 1 file changed, 18 insertions(+), 3 deletions(-)
-
-diff --git a/net/ipv6/addrconf.c b/net/ipv6/addrconf.c
-index 4bec4c0617412..6fcbe8912b431 100644
---- a/net/ipv6/addrconf.c
-+++ b/net/ipv6/addrconf.c
-@@ -696,6 +696,22 @@ static int inet6_netconf_get_devconf(struct sk_buff *in_skb,
- return err;
- }
-
-+/* Combine dev_addr_genid and dev_base_seq to detect changes.
-+ */
-+static u32 inet6_base_seq(const struct net *net)
-+{
-+ u32 res = atomic_read(&net->ipv6.dev_addr_genid) +
-+ net->dev_base_seq;
-+
-+ /* Must not return 0 (see nl_dump_check_consistent()).
-+ * Chose a value far away from 0.
-+ */
-+ if (!res)
-+ res = 0x80000000;
-+ return res;
-+}
-+
-+
- static int inet6_netconf_dump_devconf(struct sk_buff *skb,
- struct netlink_callback *cb)
- {
-@@ -729,8 +745,7 @@ static int inet6_netconf_dump_devconf(struct sk_buff *skb,
- idx = 0;
- head = &net->dev_index_head[h];
- rcu_read_lock();
-- cb->seq = atomic_read(&net->ipv6.dev_addr_genid) ^
-- net->dev_base_seq;
-+ cb->seq = inet6_base_seq(net);
- hlist_for_each_entry_rcu(dev, head, index_hlist) {
- if (idx < s_idx)
- goto cont;
-@@ -5232,7 +5247,7 @@ static int inet6_dump_addr(struct sk_buff *skb, struct netlink_callback *cb,
- }
-
- rcu_read_lock();
-- cb->seq = atomic_read(&tgt_net->ipv6.dev_addr_genid) ^ tgt_net->dev_base_seq;
-+ cb->seq = inet6_base_seq(tgt_net);
- for (h = s_h; h < NETDEV_HASHENTRIES; h++, s_idx = 0) {
- idx = 0;
- head = &tgt_net->dev_index_head[h];
---
-2.43.0
-
diff --git a/queue-5.4/ipv6-sr-fix-possible-use-after-free-and-null-ptr-der.patch b/queue-5.4/ipv6-sr-fix-possible-use-after-free-and-null-ptr-der.patch
deleted file mode 100644
index 54c9d07c9c..0000000000
--- a/queue-5.4/ipv6-sr-fix-possible-use-after-free-and-null-ptr-der.patch
+++ /dev/null
@@ -1,74 +0,0 @@
-From 641284a9b6f46dde8ce8fb29c677e9a3b26c6d86 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 15 Feb 2024 23:27:17 +0300
-Subject: ipv6: sr: fix possible use-after-free and null-ptr-deref
-
-From: Vasiliy Kovalev <kovalev@altlinux.org>
-
-[ Upstream commit 5559cea2d5aa3018a5f00dd2aca3427ba09b386b ]
-
-The pernet operations structure for the subsystem must be registered
-before registering the generic netlink family.
-
-Fixes: 915d7e5e5930 ("ipv6: sr: add code base for control plane support of SR-IPv6")
-Signed-off-by: Vasiliy Kovalev <kovalev@altlinux.org>
-Link: https://lore.kernel.org/r/20240215202717.29815-1-kovalev@altlinux.org
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/ipv6/seg6.c | 20 +++++++++++---------
- 1 file changed, 11 insertions(+), 9 deletions(-)
-
-diff --git a/net/ipv6/seg6.c b/net/ipv6/seg6.c
-index f5c448c276fef..7094f8691ac68 100644
---- a/net/ipv6/seg6.c
-+++ b/net/ipv6/seg6.c
-@@ -441,22 +441,24 @@ int __init seg6_init(void)
- {
- int err = -ENOMEM;
-
-- err = genl_register_family(&seg6_genl_family);
-+ err = register_pernet_subsys(&ip6_segments_ops);
- if (err)
- goto out;
-
-- err = register_pernet_subsys(&ip6_segments_ops);
-+ err = genl_register_family(&seg6_genl_family);
- if (err)
-- goto out_unregister_genl;
-+ goto out_unregister_pernet;
-
- #ifdef CONFIG_IPV6_SEG6_LWTUNNEL
- err = seg6_iptunnel_init();
- if (err)
-- goto out_unregister_pernet;
-+ goto out_unregister_genl;
-
- err = seg6_local_init();
-- if (err)
-- goto out_unregister_pernet;
-+ if (err) {
-+ seg6_iptunnel_exit();
-+ goto out_unregister_genl;
-+ }
- #endif
-
- #ifdef CONFIG_IPV6_SEG6_HMAC
-@@ -477,11 +479,11 @@ int __init seg6_init(void)
- #endif
- #endif
- #ifdef CONFIG_IPV6_SEG6_LWTUNNEL
--out_unregister_pernet:
-- unregister_pernet_subsys(&ip6_segments_ops);
--#endif
- out_unregister_genl:
- genl_unregister_family(&seg6_genl_family);
-+#endif
-+out_unregister_pernet:
-+ unregister_pernet_subsys(&ip6_segments_ops);
- goto out;
- }
-
---
-2.43.0
-
diff --git a/queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-its_sync_lpi_pending_table.patch b/queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-its_sync_lpi_pending_table.patch
deleted file mode 100644
index b3e19e03b7..0000000000
--- a/queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-its_sync_lpi_pending_table.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 8d3a7dfb801d157ac423261d7cd62c33e95375f8 Mon Sep 17 00:00:00 2001
-From: Oliver Upton <oliver.upton@linux.dev>
-Date: Wed, 21 Feb 2024 09:27:31 +0000
-Subject: KVM: arm64: vgic-its: Test for valid IRQ in its_sync_lpi_pending_table()
-
-From: Oliver Upton <oliver.upton@linux.dev>
-
-commit 8d3a7dfb801d157ac423261d7cd62c33e95375f8 upstream.
-
-vgic_get_irq() may not return a valid descriptor if there is no ITS that
-holds a valid translation for the specified INTID. If that is the case,
-it is safe to silently ignore it and continue processing the LPI pending
-table.
-
-Cc: stable@vger.kernel.org
-Fixes: 33d3bc9556a7 ("KVM: arm64: vgic-its: Read initial LPI pending table")
-Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
-Link: https://lore.kernel.org/r/20240221092732.4126848-2-oliver.upton@linux.dev
-Signed-off-by: Marc Zyngier <maz@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- virt/kvm/arm/vgic/vgic-its.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/virt/kvm/arm/vgic/vgic-its.c
-+++ b/virt/kvm/arm/vgic/vgic-its.c
-@@ -459,6 +459,9 @@ static int its_sync_lpi_pending_table(st
- }
-
- irq = vgic_get_irq(vcpu->kvm, NULL, intids[i]);
-+ if (!irq)
-+ continue;
-+
- raw_spin_lock_irqsave(&irq->irq_lock, flags);
- irq->pending_latch = pendmask & (1U << bit_nr);
- vgic_queue_irq_unlock(vcpu->kvm, irq, flags);
diff --git a/queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-movall-handler.patch b/queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-movall-handler.patch
deleted file mode 100644
index afd29965b9..0000000000
--- a/queue-5.4/kvm-arm64-vgic-its-test-for-valid-irq-in-movall-handler.patch
+++ /dev/null
@@ -1,35 +0,0 @@
-From 85a71ee9a0700f6c18862ef3b0011ed9dad99aca Mon Sep 17 00:00:00 2001
-From: Oliver Upton <oliver.upton@linux.dev>
-Date: Wed, 21 Feb 2024 09:27:32 +0000
-Subject: KVM: arm64: vgic-its: Test for valid IRQ in MOVALL handler
-
-From: Oliver Upton <oliver.upton@linux.dev>
-
-commit 85a71ee9a0700f6c18862ef3b0011ed9dad99aca upstream.
-
-It is possible that an LPI mapped in a different ITS gets unmapped while
-handling the MOVALL command. If that is the case, there is no state that
-can be migrated to the destination. Silently ignore it and continue
-migrating other LPIs.
-
-Cc: stable@vger.kernel.org
-Fixes: ff9c114394aa ("KVM: arm/arm64: GICv4: Handle MOVALL applied to a vPE")
-Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
-Link: https://lore.kernel.org/r/20240221092732.4126848-3-oliver.upton@linux.dev
-Signed-off-by: Marc Zyngier <maz@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- virt/kvm/arm/vgic/vgic-its.c | 2 ++
- 1 file changed, 2 insertions(+)
-
---- a/virt/kvm/arm/vgic/vgic-its.c
-+++ b/virt/kvm/arm/vgic/vgic-its.c
-@@ -1376,6 +1376,8 @@ static int vgic_its_cmd_handle_movall(st
-
- for (i = 0; i < irq_count; i++) {
- irq = vgic_get_irq(kvm, NULL, intids[i]);
-+ if (!irq)
-+ continue;
-
- update_affinity(irq, vcpu2);
-
diff --git a/queue-5.4/l2tp-pass-correct-message-length-to-ip6_append_data.patch b/queue-5.4/l2tp-pass-correct-message-length-to-ip6_append_data.patch
deleted file mode 100644
index 660cd8c383..0000000000
--- a/queue-5.4/l2tp-pass-correct-message-length-to-ip6_append_data.patch
+++ /dev/null
@@ -1,50 +0,0 @@
-From 359e54a93ab43d32ee1bff3c2f9f10cb9f6b6e79 Mon Sep 17 00:00:00 2001
-From: Tom Parkin <tparkin@katalix.com>
-Date: Tue, 20 Feb 2024 12:21:56 +0000
-Subject: l2tp: pass correct message length to ip6_append_data
-
-From: Tom Parkin <tparkin@katalix.com>
-
-commit 359e54a93ab43d32ee1bff3c2f9f10cb9f6b6e79 upstream.
-
-l2tp_ip6_sendmsg needs to avoid accounting for the transport header
-twice when splicing more data into an already partially-occupied skbuff.
-
-To manage this, we check whether the skbuff contains data using
-skb_queue_empty when deciding how much data to append using
-ip6_append_data.
-
-However, the code which performed the calculation was incorrect:
-
- ulen = len + skb_queue_empty(&sk->sk_write_queue) ? transhdrlen : 0;
-
-...due to C operator precedence, this ends up setting ulen to
-transhdrlen for messages with a non-zero length, which results in
-corrupted packets on the wire.
-
-Add parentheses to correct the calculation in line with the original
-intent.
-
-Fixes: 9d4c75800f61 ("ipv4, ipv6: Fix handling of transhdrlen in __ip{,6}_append_data()")
-Cc: David Howells <dhowells@redhat.com>
-Cc: stable@vger.kernel.org
-Signed-off-by: Tom Parkin <tparkin@katalix.com>
-Reviewed-by: Simon Horman <horms@kernel.org>
-Link: https://lore.kernel.org/r/20240220122156.43131-1-tparkin@katalix.com
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/l2tp/l2tp_ip6.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/net/l2tp/l2tp_ip6.c
-+++ b/net/l2tp/l2tp_ip6.c
-@@ -644,7 +644,7 @@ static int l2tp_ip6_sendmsg(struct sock
-
- back_from_confirm:
- lock_sock(sk);
-- ulen = len + skb_queue_empty(&sk->sk_write_queue) ? transhdrlen : 0;
-+ ulen = len + (skb_queue_empty(&sk->sk_write_queue) ? transhdrlen : 0);
- err = ip6_append_data(sk, ip_generic_getfrag, msg,
- ulen, transhdrlen, &ipc6,
- &fl6, (struct rt6_info *)dst,
diff --git a/queue-5.4/memcg-add-refcnt-for-pcpu-stock-to-avoid-uaf-problem-in-drain_all_stock.patch b/queue-5.4/memcg-add-refcnt-for-pcpu-stock-to-avoid-uaf-problem-in-drain_all_stock.patch
deleted file mode 100644
index 6204a0a7c2..0000000000
--- a/queue-5.4/memcg-add-refcnt-for-pcpu-stock-to-avoid-uaf-problem-in-drain_all_stock.patch
+++ /dev/null
@@ -1,135 +0,0 @@
-From gongruiqi1@huawei.com Fri Feb 23 16:36:49 2024
-From: "GONG, Ruiqi" <gongruiqi1@huawei.com>
-Date: Thu, 22 Feb 2024 11:02:37 +0800
-Subject: memcg: add refcnt for pcpu stock to avoid UAF problem in drain_all_stock()
-To: <linux-kernel@vger.kernel.org>, <stable@vger.kernel.org>, Johannes Weiner <hannes@cmpxchg.org>, Michal Hocko <mhocko@kernel.org>, Roman Gushchin <roman.gushchin@linux.dev>, Shakeel Butt <shakeelb@google.com>, Muchun Song <muchun.song@linux.dev>
-Cc: <cgroups@vger.kernel.org>, <linux-mm@kvack.org>, Wang Weiyang <wangweiyang2@huawei.com>, Xiu Jianfeng <xiujianfeng@huawei.com>
-Message-ID: <20240222030237.82486-1-gongruiqi1@huawei.com>
-
-From: "GONG, Ruiqi" <gongruiqi1@huawei.com>
-
-commit 1a3e1f40962c445b997151a542314f3c6097f8c3 upstream.
-
-NOTE: This is a partial backport since we only need the refcnt between
-memcg and stock to fix the problem stated below, and in this way
-multiple versions use the same code and align with each other.
-
-There was a kernel panic happened on an in-house environment running
-3.10, and the same problem was reproduced on 4.19:
-
-general protection fault: 0000 [#1] SMP PTI
-CPU: 1 PID: 2085 Comm: bash Kdump: loaded Tainted: G L 4.19.90+ #7
-Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.15.0-0-g2dd4b9b3f840-prebuilt.qemu.org 04/01/2014
-RIP: 0010 drain_all_stock+0xad/0x140
-Code: 00 00 4d 85 ff 74 2c 45 85 c9 74 27 4d 39 fc 74 42 41 80 bc 24 28 04 00 00 00 74 17 49 8b 04 24 49 8b 17 48 8b 88 90 02 00 00 <48> 39 8a 90 02 00 00 74 02 eb 86 48 63 88 3c 01 00 00 39 8a 3c 01
-RSP: 0018:ffffa7efc5813d70 EFLAGS: 00010202
-RAX: ffff8cb185548800 RBX: ffff8cb89f420160 RCX: ffff8cb1867b6000
-RDX: babababababababa RSI: 0000000000000001 RDI: 0000000000231876
-RBP: 0000000000000000 R08: 0000000000000415 R09: 0000000000000002
-R10: 0000000000000000 R11: 0000000000000001 R12: ffff8cb186f89040
-R13: 0000000000020160 R14: 0000000000000001 R15: ffff8cb186b27040
-FS: 00007f4a308d3740(0000) GS:ffff8cb89f440000(0000) knlGS:0000000000000000
-CS: 0010 DS: 0000 ES: 0000 CR0: 0000000080050033
-CR2: 00007ffe4d634a68 CR3: 000000010b022000 CR4: 00000000000006e0
-DR0: 0000000000000000 DR1: 0000000000000000 DR2: 0000000000000000
-DR3: 0000000000000000 DR6: 00000000fffe0ff0 DR7: 0000000000000400
-Call Trace:
- mem_cgroup_force_empty_write+0x31/0xb0
- cgroup_file_write+0x60/0x140
- ? __check_object_size+0x136/0x147
- kernfs_fop_write+0x10e/0x190
- __vfs_write+0x37/0x1b0
- ? selinux_file_permission+0xe8/0x130
- ? security_file_permission+0x2e/0xb0
- vfs_write+0xb6/0x1a0
- ksys_write+0x57/0xd0
- do_syscall_64+0x63/0x250
- ? async_page_fault+0x8/0x30
- entry_SYSCALL_64_after_hwframe+0x5c/0xc1
-Modules linked in: ...
-
-It is found that in case of stock->nr_pages == 0, the memcg on
-stock->cached could be freed due to its refcnt decreased to 0, which
-made stock->cached become a dangling pointer. It could cause a UAF
-problem in drain_all_stock() in the following concurrent scenario. Note
-that drain_all_stock() doesn't disable irq but only preemption.
-
-CPU1 CPU2
-==============================================================================
-stock->cached = memcgA (freed)
- drain_all_stock(memcgB)
- rcu_read_lock()
- memcg = CPU1's stock->cached (memcgA)
- (interrupted)
-refill_stock(memcgC)
- drain_stock(memcgA)
- stock->cached = memcgC
- stock->nr_pages += xxx (> 0)
- stock->nr_pages > 0
- mem_cgroup_is_descendant(memcgA, memcgB) [UAF]
- rcu_read_unlock()
-
-This problem is, unintentionally, fixed at 5.9, where commit
-1a3e1f40962c ("mm: memcontrol: decouple reference counting from page
-accounting") adds memcg refcnt for stock. Therefore affected LTS
-versions include 4.19 and 5.4.
-
-For 4.19, memcg's css offline process doesn't call drain_all_stock(). so
-it's easier for the released memcg to be left on the stock. For 5.4,
-although mem_cgroup_css_offline() does call drain_all_stock(), but the
-flushing could be skipped when stock->nr_pages happens to be 0, and
-besides the async draining could be delayed and take place after the UAF
-problem has happened.
-
-Fix this problem by adding (and decreasing) memcg's refcnt when memcg is
-put onto (and removed from) stock, just like how commit 1a3e1f40962c
-("mm: memcontrol: decouple reference counting from page accounting")
-does. After all, "being on the stock" is a kind of reference with
-regards to memcg. As such, it's guaranteed that a css on stock would not
-be freed.
-
-It's good to mention that refill_stock() is executed in an irq-disabled
-context, so the drain_stock() patched with css_put() would not actually
-free memcgA until the end of refill_stock(), since css_put() is an RCU
-free and it's still in grace period. For CPU2, the access to CPU1's
-stock->cached is protected by rcu_read_lock(), so in this case it gets
-either NULL from stock->cached or a memcgA that is still good.
-
-Cc: stable@vger.kernel.org # 4.19 5.4
-Fixes: cdec2e4265df ("memcg: coalesce charging via percpu storage")
-Signed-off-by: GONG, Ruiqi <gongruiqi1@huawei.com>
-Acked-by: Michal Hocko <mhocko@suse.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- mm/memcontrol.c | 6 ++++++
- 1 file changed, 6 insertions(+)
-
---- a/mm/memcontrol.c
-+++ b/mm/memcontrol.c
-@@ -2214,6 +2214,9 @@ static void drain_stock(struct memcg_sto
- {
- struct mem_cgroup *old = stock->cached;
-
-+ if (!old)
-+ return;
-+
- if (stock->nr_pages) {
- page_counter_uncharge(&old->memory, stock->nr_pages);
- if (do_memsw_account())
-@@ -2221,6 +2224,8 @@ static void drain_stock(struct memcg_sto
- css_put_many(&old->css, stock->nr_pages);
- stock->nr_pages = 0;
- }
-+
-+ css_put(&old->css);
- stock->cached = NULL;
- }
-
-@@ -2256,6 +2261,7 @@ static void refill_stock(struct mem_cgro
- stock = this_cpu_ptr(&memcg_stock);
- if (stock->cached != memcg) { /* reset if necessary */
- drain_stock(stock);
-+ css_get(&memcg->css);
- stock->cached = memcg;
- }
- stock->nr_pages += nr_pages;
diff --git a/queue-5.4/net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch b/queue-5.4/net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch
deleted file mode 100644
index 8711c01c1f..0000000000
--- a/queue-5.4/net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch
+++ /dev/null
@@ -1,41 +0,0 @@
-From 1b7d453d70d48cbe94d4852b59f35f360480fe85 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 31 Jul 2020 19:26:16 +0300
-Subject: net: bridge: clear bridge's private skb space on xmit
-
-From: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
-
-[ Upstream commit fd65e5a95d08389444e8591a20538b3edece0e15 ]
-
-We need to clear all of the bridge private skb variables as they can be
-stale due to the packet being recirculated through the stack and then
-transmitted through the bridge device. Similar memset is already done on
-bridge's input. We've seen cases where proxyarp_replied was 1 on routed
-multicast packets transmitted through the bridge to ports with neigh
-suppress which were getting dropped. Same thing can in theory happen with
-the port isolation bit as well.
-
-Fixes: 821f1b21cabb ("bridge: add new BR_NEIGH_SUPPRESS port flag to suppress arp and nd flood")
-Signed-off-by: Nikolay Aleksandrov <nikolay@cumulusnetworks.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/bridge/br_device.c | 2 ++
- 1 file changed, 2 insertions(+)
-
-diff --git a/net/bridge/br_device.c b/net/bridge/br_device.c
-index f085b1648e66c..501f77f0f480a 100644
---- a/net/bridge/br_device.c
-+++ b/net/bridge/br_device.c
-@@ -35,6 +35,8 @@ netdev_tx_t br_dev_xmit(struct sk_buff *skb, struct net_device *dev)
- const unsigned char *dest;
- u16 vid = 0;
-
-+ memset(skb->cb, 0, sizeof(struct br_input_skb_cb));
-+
- rcu_read_lock();
- nf_ops = rcu_dereference(nf_br_ops);
- if (nf_ops && nf_ops->br_dev_xmit_hook(skb)) {
---
-2.43.0
-
diff --git a/queue-5.4/net-sched-retire-atm-qdisc.patch b/queue-5.4/net-sched-retire-atm-qdisc.patch
deleted file mode 100644
index 3afb3d83ce..0000000000
--- a/queue-5.4/net-sched-retire-atm-qdisc.patch
+++ /dev/null
@@ -1,771 +0,0 @@
-From fb38306ceb9e770adfb5ffa6e3c64047b55f7a07 Mon Sep 17 00:00:00 2001
-From: Jamal Hadi Salim <jhs@mojatatu.com>
-Date: Tue, 14 Feb 2023 08:49:12 -0500
-Subject: net/sched: Retire ATM qdisc
-
-From: Jamal Hadi Salim <jhs@mojatatu.com>
-
-commit fb38306ceb9e770adfb5ffa6e3c64047b55f7a07 upstream.
-
-The ATM qdisc has served us well over the years but has not been getting much
-TLC due to lack of known users. Most recently it has become a shooting target
-for syzkaller. For this reason, we are retiring it.
-
-Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
-Acked-by: Jiri Pirko <jiri@nvidia.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/sched/Kconfig | 14 -
- net/sched/Makefile | 1
- net/sched/sch_atm.c | 710 ----------------------------------------------------
- 3 files changed, 725 deletions(-)
- delete mode 100644 net/sched/sch_atm.c
- delete mode 100644 tools/testing/selftests/tc-testing/tc-tests/qdiscs/atm.json
-
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -68,20 +68,6 @@ config NET_SCH_HFSC
- To compile this code as a module, choose M here: the
- module will be called sch_hfsc.
-
--config NET_SCH_ATM
-- tristate "ATM Virtual Circuits (ATM)"
-- depends on ATM
-- ---help---
-- Say Y here if you want to use the ATM pseudo-scheduler. This
-- provides a framework for invoking classifiers, which in turn
-- select classes of this queuing discipline. Each class maps
-- the flow(s) it is handling to a given virtual circuit.
--
-- See the top of <file:net/sched/sch_atm.c> for more details.
--
-- To compile this code as a module, choose M here: the
-- module will be called sch_atm.
--
- config NET_SCH_PRIO
- tristate "Multi Band Priority Queueing (PRIO)"
- ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -43,7 +43,6 @@ obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o
- obj-$(CONFIG_NET_SCH_TEQL) += sch_teql.o
- obj-$(CONFIG_NET_SCH_PRIO) += sch_prio.o
- obj-$(CONFIG_NET_SCH_MULTIQ) += sch_multiq.o
--obj-$(CONFIG_NET_SCH_ATM) += sch_atm.o
- obj-$(CONFIG_NET_SCH_NETEM) += sch_netem.o
- obj-$(CONFIG_NET_SCH_DRR) += sch_drr.o
- obj-$(CONFIG_NET_SCH_PLUG) += sch_plug.o
---- a/net/sched/sch_atm.c
-+++ /dev/null
-@@ -1,710 +0,0 @@
--// SPDX-License-Identifier: GPL-2.0-only
--/* net/sched/sch_atm.c - ATM VC selection "queueing discipline" */
--
--/* Written 1998-2000 by Werner Almesberger, EPFL ICA */
--
--#include <linux/module.h>
--#include <linux/slab.h>
--#include <linux/init.h>
--#include <linux/interrupt.h>
--#include <linux/string.h>
--#include <linux/errno.h>
--#include <linux/skbuff.h>
--#include <linux/atmdev.h>
--#include <linux/atmclip.h>
--#include <linux/rtnetlink.h>
--#include <linux/file.h> /* for fput */
--#include <net/netlink.h>
--#include <net/pkt_sched.h>
--#include <net/pkt_cls.h>
--
--/*
-- * The ATM queuing discipline provides a framework for invoking classifiers
-- * (aka "filters"), which in turn select classes of this queuing discipline.
-- * Each class maps the flow(s) it is handling to a given VC. Multiple classes
-- * may share the same VC.
-- *
-- * When creating a class, VCs are specified by passing the number of the open
-- * socket descriptor by which the calling process references the VC. The kernel
-- * keeps the VC open at least until all classes using it are removed.
-- *
-- * In this file, most functions are named atm_tc_* to avoid confusion with all
-- * the atm_* in net/atm. This naming convention differs from what's used in the
-- * rest of net/sched.
-- *
-- * Known bugs:
-- * - sometimes messes up the IP stack
-- * - any manipulations besides the few operations described in the README, are
-- * untested and likely to crash the system
-- * - should lock the flow while there is data in the queue (?)
-- */
--
--#define VCC2FLOW(vcc) ((struct atm_flow_data *) ((vcc)->user_back))
--
--struct atm_flow_data {
-- struct Qdisc_class_common common;
-- struct Qdisc *q; /* FIFO, TBF, etc. */
-- struct tcf_proto __rcu *filter_list;
-- struct tcf_block *block;
-- struct atm_vcc *vcc; /* VCC; NULL if VCC is closed */
-- void (*old_pop)(struct atm_vcc *vcc,
-- struct sk_buff *skb); /* chaining */
-- struct atm_qdisc_data *parent; /* parent qdisc */
-- struct socket *sock; /* for closing */
-- int ref; /* reference count */
-- struct gnet_stats_basic_packed bstats;
-- struct gnet_stats_queue qstats;
-- struct list_head list;
-- struct atm_flow_data *excess; /* flow for excess traffic;
-- NULL to set CLP instead */
-- int hdr_len;
-- unsigned char hdr[0]; /* header data; MUST BE LAST */
--};
--
--struct atm_qdisc_data {
-- struct atm_flow_data link; /* unclassified skbs go here */
-- struct list_head flows; /* NB: "link" is also on this
-- list */
-- struct tasklet_struct task; /* dequeue tasklet */
--};
--
--/* ------------------------- Class/flow operations ------------------------- */
--
--static inline struct atm_flow_data *lookup_flow(struct Qdisc *sch, u32 classid)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow;
--
-- list_for_each_entry(flow, &p->flows, list) {
-- if (flow->common.classid == classid)
-- return flow;
-- }
-- return NULL;
--}
--
--static int atm_tc_graft(struct Qdisc *sch, unsigned long arg,
-- struct Qdisc *new, struct Qdisc **old,
-- struct netlink_ext_ack *extack)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow = (struct atm_flow_data *)arg;
--
-- pr_debug("atm_tc_graft(sch %p,[qdisc %p],flow %p,new %p,old %p)\n",
-- sch, p, flow, new, old);
-- if (list_empty(&flow->list))
-- return -EINVAL;
-- if (!new)
-- new = &noop_qdisc;
-- *old = flow->q;
-- flow->q = new;
-- if (*old)
-- qdisc_reset(*old);
-- return 0;
--}
--
--static struct Qdisc *atm_tc_leaf(struct Qdisc *sch, unsigned long cl)
--{
-- struct atm_flow_data *flow = (struct atm_flow_data *)cl;
--
-- pr_debug("atm_tc_leaf(sch %p,flow %p)\n", sch, flow);
-- return flow ? flow->q : NULL;
--}
--
--static unsigned long atm_tc_find(struct Qdisc *sch, u32 classid)
--{
-- struct atm_qdisc_data *p __maybe_unused = qdisc_priv(sch);
-- struct atm_flow_data *flow;
--
-- pr_debug("%s(sch %p,[qdisc %p],classid %x)\n", __func__, sch, p, classid);
-- flow = lookup_flow(sch, classid);
-- pr_debug("%s: flow %p\n", __func__, flow);
-- return (unsigned long)flow;
--}
--
--static unsigned long atm_tc_bind_filter(struct Qdisc *sch,
-- unsigned long parent, u32 classid)
--{
-- struct atm_qdisc_data *p __maybe_unused = qdisc_priv(sch);
-- struct atm_flow_data *flow;
--
-- pr_debug("%s(sch %p,[qdisc %p],classid %x)\n", __func__, sch, p, classid);
-- flow = lookup_flow(sch, classid);
-- if (flow)
-- flow->ref++;
-- pr_debug("%s: flow %p\n", __func__, flow);
-- return (unsigned long)flow;
--}
--
--/*
-- * atm_tc_put handles all destructions, including the ones that are explicitly
-- * requested (atm_tc_destroy, etc.). The assumption here is that we never drop
-- * anything that still seems to be in use.
-- */
--static void atm_tc_put(struct Qdisc *sch, unsigned long cl)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow = (struct atm_flow_data *)cl;
--
-- pr_debug("atm_tc_put(sch %p,[qdisc %p],flow %p)\n", sch, p, flow);
-- if (--flow->ref)
-- return;
-- pr_debug("atm_tc_put: destroying\n");
-- list_del_init(&flow->list);
-- pr_debug("atm_tc_put: qdisc %p\n", flow->q);
-- qdisc_put(flow->q);
-- tcf_block_put(flow->block);
-- if (flow->sock) {
-- pr_debug("atm_tc_put: f_count %ld\n",
-- file_count(flow->sock->file));
-- flow->vcc->pop = flow->old_pop;
-- sockfd_put(flow->sock);
-- }
-- if (flow->excess)
-- atm_tc_put(sch, (unsigned long)flow->excess);
-- if (flow != &p->link)
-- kfree(flow);
-- /*
-- * If flow == &p->link, the qdisc no longer works at this point and
-- * needs to be removed. (By the caller of atm_tc_put.)
-- */
--}
--
--static void sch_atm_pop(struct atm_vcc *vcc, struct sk_buff *skb)
--{
-- struct atm_qdisc_data *p = VCC2FLOW(vcc)->parent;
--
-- pr_debug("sch_atm_pop(vcc %p,skb %p,[qdisc %p])\n", vcc, skb, p);
-- VCC2FLOW(vcc)->old_pop(vcc, skb);
-- tasklet_schedule(&p->task);
--}
--
--static const u8 llc_oui_ip[] = {
-- 0xaa, /* DSAP: non-ISO */
-- 0xaa, /* SSAP: non-ISO */
-- 0x03, /* Ctrl: Unnumbered Information Command PDU */
-- 0x00, /* OUI: EtherType */
-- 0x00, 0x00,
-- 0x08, 0x00
--}; /* Ethertype IP (0800) */
--
--static const struct nla_policy atm_policy[TCA_ATM_MAX + 1] = {
-- [TCA_ATM_FD] = { .type = NLA_U32 },
-- [TCA_ATM_EXCESS] = { .type = NLA_U32 },
--};
--
--static int atm_tc_change(struct Qdisc *sch, u32 classid, u32 parent,
-- struct nlattr **tca, unsigned long *arg,
-- struct netlink_ext_ack *extack)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow = (struct atm_flow_data *)*arg;
-- struct atm_flow_data *excess = NULL;
-- struct nlattr *opt = tca[TCA_OPTIONS];
-- struct nlattr *tb[TCA_ATM_MAX + 1];
-- struct socket *sock;
-- int fd, error, hdr_len;
-- void *hdr;
--
-- pr_debug("atm_tc_change(sch %p,[qdisc %p],classid %x,parent %x,"
-- "flow %p,opt %p)\n", sch, p, classid, parent, flow, opt);
-- /*
-- * The concept of parents doesn't apply for this qdisc.
-- */
-- if (parent && parent != TC_H_ROOT && parent != sch->handle)
-- return -EINVAL;
-- /*
-- * ATM classes cannot be changed. In order to change properties of the
-- * ATM connection, that socket needs to be modified directly (via the
-- * native ATM API. In order to send a flow to a different VC, the old
-- * class needs to be removed and a new one added. (This may be changed
-- * later.)
-- */
-- if (flow)
-- return -EBUSY;
-- if (opt == NULL)
-- return -EINVAL;
--
-- error = nla_parse_nested_deprecated(tb, TCA_ATM_MAX, opt, atm_policy,
-- NULL);
-- if (error < 0)
-- return error;
--
-- if (!tb[TCA_ATM_FD])
-- return -EINVAL;
-- fd = nla_get_u32(tb[TCA_ATM_FD]);
-- pr_debug("atm_tc_change: fd %d\n", fd);
-- if (tb[TCA_ATM_HDR]) {
-- hdr_len = nla_len(tb[TCA_ATM_HDR]);
-- hdr = nla_data(tb[TCA_ATM_HDR]);
-- } else {
-- hdr_len = RFC1483LLC_LEN;
-- hdr = NULL; /* default LLC/SNAP for IP */
-- }
-- if (!tb[TCA_ATM_EXCESS])
-- excess = NULL;
-- else {
-- excess = (struct atm_flow_data *)
-- atm_tc_find(sch, nla_get_u32(tb[TCA_ATM_EXCESS]));
-- if (!excess)
-- return -ENOENT;
-- }
-- pr_debug("atm_tc_change: type %d, payload %d, hdr_len %d\n",
-- opt->nla_type, nla_len(opt), hdr_len);
-- sock = sockfd_lookup(fd, &error);
-- if (!sock)
-- return error; /* f_count++ */
-- pr_debug("atm_tc_change: f_count %ld\n", file_count(sock->file));
-- if (sock->ops->family != PF_ATMSVC && sock->ops->family != PF_ATMPVC) {
-- error = -EPROTOTYPE;
-- goto err_out;
-- }
-- /* @@@ should check if the socket is really operational or we'll crash
-- on vcc->send */
-- if (classid) {
-- if (TC_H_MAJ(classid ^ sch->handle)) {
-- pr_debug("atm_tc_change: classid mismatch\n");
-- error = -EINVAL;
-- goto err_out;
-- }
-- } else {
-- int i;
-- unsigned long cl;
--
-- for (i = 1; i < 0x8000; i++) {
-- classid = TC_H_MAKE(sch->handle, 0x8000 | i);
-- cl = atm_tc_find(sch, classid);
-- if (!cl)
-- break;
-- }
-- }
-- pr_debug("atm_tc_change: new id %x\n", classid);
-- flow = kzalloc(sizeof(struct atm_flow_data) + hdr_len, GFP_KERNEL);
-- pr_debug("atm_tc_change: flow %p\n", flow);
-- if (!flow) {
-- error = -ENOBUFS;
-- goto err_out;
-- }
--
-- error = tcf_block_get(&flow->block, &flow->filter_list, sch,
-- extack);
-- if (error) {
-- kfree(flow);
-- goto err_out;
-- }
--
-- flow->q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops, classid,
-- extack);
-- if (!flow->q)
-- flow->q = &noop_qdisc;
-- pr_debug("atm_tc_change: qdisc %p\n", flow->q);
-- flow->sock = sock;
-- flow->vcc = ATM_SD(sock); /* speedup */
-- flow->vcc->user_back = flow;
-- pr_debug("atm_tc_change: vcc %p\n", flow->vcc);
-- flow->old_pop = flow->vcc->pop;
-- flow->parent = p;
-- flow->vcc->pop = sch_atm_pop;
-- flow->common.classid = classid;
-- flow->ref = 1;
-- flow->excess = excess;
-- list_add(&flow->list, &p->link.list);
-- flow->hdr_len = hdr_len;
-- if (hdr)
-- memcpy(flow->hdr, hdr, hdr_len);
-- else
-- memcpy(flow->hdr, llc_oui_ip, sizeof(llc_oui_ip));
-- *arg = (unsigned long)flow;
-- return 0;
--err_out:
-- sockfd_put(sock);
-- return error;
--}
--
--static int atm_tc_delete(struct Qdisc *sch, unsigned long arg)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow = (struct atm_flow_data *)arg;
--
-- pr_debug("atm_tc_delete(sch %p,[qdisc %p],flow %p)\n", sch, p, flow);
-- if (list_empty(&flow->list))
-- return -EINVAL;
-- if (rcu_access_pointer(flow->filter_list) || flow == &p->link)
-- return -EBUSY;
-- /*
-- * Reference count must be 2: one for "keepalive" (set at class
-- * creation), and one for the reference held when calling delete.
-- */
-- if (flow->ref < 2) {
-- pr_err("atm_tc_delete: flow->ref == %d\n", flow->ref);
-- return -EINVAL;
-- }
-- if (flow->ref > 2)
-- return -EBUSY; /* catch references via excess, etc. */
-- atm_tc_put(sch, arg);
-- return 0;
--}
--
--static void atm_tc_walk(struct Qdisc *sch, struct qdisc_walker *walker)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow;
--
-- pr_debug("atm_tc_walk(sch %p,[qdisc %p],walker %p)\n", sch, p, walker);
-- if (walker->stop)
-- return;
-- list_for_each_entry(flow, &p->flows, list) {
-- if (walker->count >= walker->skip &&
-- walker->fn(sch, (unsigned long)flow, walker) < 0) {
-- walker->stop = 1;
-- break;
-- }
-- walker->count++;
-- }
--}
--
--static struct tcf_block *atm_tc_tcf_block(struct Qdisc *sch, unsigned long cl,
-- struct netlink_ext_ack *extack)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow = (struct atm_flow_data *)cl;
--
-- pr_debug("atm_tc_find_tcf(sch %p,[qdisc %p],flow %p)\n", sch, p, flow);
-- return flow ? flow->block : p->link.block;
--}
--
--/* --------------------------- Qdisc operations ---------------------------- */
--
--static int atm_tc_enqueue(struct sk_buff *skb, struct Qdisc *sch,
-- struct sk_buff **to_free)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow;
-- struct tcf_result res;
-- int result;
-- int ret = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
--
-- pr_debug("atm_tc_enqueue(skb %p,sch %p,[qdisc %p])\n", skb, sch, p);
-- result = TC_ACT_OK; /* be nice to gcc */
-- flow = NULL;
-- if (TC_H_MAJ(skb->priority) != sch->handle ||
-- !(flow = (struct atm_flow_data *)atm_tc_find(sch, skb->priority))) {
-- struct tcf_proto *fl;
--
-- list_for_each_entry(flow, &p->flows, list) {
-- fl = rcu_dereference_bh(flow->filter_list);
-- if (fl) {
-- result = tcf_classify(skb, fl, &res, true);
-- if (result < 0)
-- continue;
-- if (result == TC_ACT_SHOT)
-- goto done;
--
-- flow = (struct atm_flow_data *)res.class;
-- if (!flow)
-- flow = lookup_flow(sch, res.classid);
-- goto drop;
-- }
-- }
-- flow = NULL;
--done:
-- ;
-- }
-- if (!flow) {
-- flow = &p->link;
-- } else {
-- if (flow->vcc)
-- ATM_SKB(skb)->atm_options = flow->vcc->atm_options;
-- /*@@@ looks good ... but it's not supposed to work :-) */
--#ifdef CONFIG_NET_CLS_ACT
-- switch (result) {
-- case TC_ACT_QUEUED:
-- case TC_ACT_STOLEN:
-- case TC_ACT_TRAP:
-- __qdisc_drop(skb, to_free);
-- return NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
-- case TC_ACT_SHOT:
-- __qdisc_drop(skb, to_free);
-- goto drop;
-- case TC_ACT_RECLASSIFY:
-- if (flow->excess)
-- flow = flow->excess;
-- else
-- ATM_SKB(skb)->atm_options |= ATM_ATMOPT_CLP;
-- break;
-- }
--#endif
-- }
--
-- ret = qdisc_enqueue(skb, flow->q, to_free);
-- if (ret != NET_XMIT_SUCCESS) {
--drop: __maybe_unused
-- if (net_xmit_drop_count(ret)) {
-- qdisc_qstats_drop(sch);
-- if (flow)
-- flow->qstats.drops++;
-- }
-- return ret;
-- }
-- /*
-- * Okay, this may seem weird. We pretend we've dropped the packet if
-- * it goes via ATM. The reason for this is that the outer qdisc
-- * expects to be able to q->dequeue the packet later on if we return
-- * success at this place. Also, sch->q.qdisc needs to reflect whether
-- * there is a packet egligible for dequeuing or not. Note that the
-- * statistics of the outer qdisc are necessarily wrong because of all
-- * this. There's currently no correct solution for this.
-- */
-- if (flow == &p->link) {
-- sch->q.qlen++;
-- return NET_XMIT_SUCCESS;
-- }
-- tasklet_schedule(&p->task);
-- return NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
--}
--
--/*
-- * Dequeue packets and send them over ATM. Note that we quite deliberately
-- * avoid checking net_device's flow control here, simply because sch_atm
-- * uses its own channels, which have nothing to do with any CLIP/LANE/or
-- * non-ATM interfaces.
-- */
--
--static void sch_atm_dequeue(unsigned long data)
--{
-- struct Qdisc *sch = (struct Qdisc *)data;
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow;
-- struct sk_buff *skb;
--
-- pr_debug("sch_atm_dequeue(sch %p,[qdisc %p])\n", sch, p);
-- list_for_each_entry(flow, &p->flows, list) {
-- if (flow == &p->link)
-- continue;
-- /*
-- * If traffic is properly shaped, this won't generate nasty
-- * little bursts. Otherwise, it may ... (but that's okay)
-- */
-- while ((skb = flow->q->ops->peek(flow->q))) {
-- if (!atm_may_send(flow->vcc, skb->truesize))
-- break;
--
-- skb = qdisc_dequeue_peeked(flow->q);
-- if (unlikely(!skb))
-- break;
--
-- qdisc_bstats_update(sch, skb);
-- bstats_update(&flow->bstats, skb);
-- pr_debug("atm_tc_dequeue: sending on class %p\n", flow);
-- /* remove any LL header somebody else has attached */
-- skb_pull(skb, skb_network_offset(skb));
-- if (skb_headroom(skb) < flow->hdr_len) {
-- struct sk_buff *new;
--
-- new = skb_realloc_headroom(skb, flow->hdr_len);
-- dev_kfree_skb(skb);
-- if (!new)
-- continue;
-- skb = new;
-- }
-- pr_debug("sch_atm_dequeue: ip %p, data %p\n",
-- skb_network_header(skb), skb->data);
-- ATM_SKB(skb)->vcc = flow->vcc;
-- memcpy(skb_push(skb, flow->hdr_len), flow->hdr,
-- flow->hdr_len);
-- refcount_add(skb->truesize,
-- &sk_atm(flow->vcc)->sk_wmem_alloc);
-- /* atm.atm_options are already set by atm_tc_enqueue */
-- flow->vcc->send(flow->vcc, skb);
-- }
-- }
--}
--
--static struct sk_buff *atm_tc_dequeue(struct Qdisc *sch)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct sk_buff *skb;
--
-- pr_debug("atm_tc_dequeue(sch %p,[qdisc %p])\n", sch, p);
-- tasklet_schedule(&p->task);
-- skb = qdisc_dequeue_peeked(p->link.q);
-- if (skb)
-- sch->q.qlen--;
-- return skb;
--}
--
--static struct sk_buff *atm_tc_peek(struct Qdisc *sch)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
--
-- pr_debug("atm_tc_peek(sch %p,[qdisc %p])\n", sch, p);
--
-- return p->link.q->ops->peek(p->link.q);
--}
--
--static int atm_tc_init(struct Qdisc *sch, struct nlattr *opt,
-- struct netlink_ext_ack *extack)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- int err;
--
-- pr_debug("atm_tc_init(sch %p,[qdisc %p],opt %p)\n", sch, p, opt);
-- INIT_LIST_HEAD(&p->flows);
-- INIT_LIST_HEAD(&p->link.list);
-- list_add(&p->link.list, &p->flows);
-- p->link.q = qdisc_create_dflt(sch->dev_queue,
-- &pfifo_qdisc_ops, sch->handle, extack);
-- if (!p->link.q)
-- p->link.q = &noop_qdisc;
-- pr_debug("atm_tc_init: link (%p) qdisc %p\n", &p->link, p->link.q);
-- p->link.vcc = NULL;
-- p->link.sock = NULL;
-- p->link.common.classid = sch->handle;
-- p->link.ref = 1;
--
-- err = tcf_block_get(&p->link.block, &p->link.filter_list, sch,
-- extack);
-- if (err)
-- return err;
--
-- tasklet_init(&p->task, sch_atm_dequeue, (unsigned long)sch);
-- return 0;
--}
--
--static void atm_tc_reset(struct Qdisc *sch)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow;
--
-- pr_debug("atm_tc_reset(sch %p,[qdisc %p])\n", sch, p);
-- list_for_each_entry(flow, &p->flows, list)
-- qdisc_reset(flow->q);
-- sch->q.qlen = 0;
--}
--
--static void atm_tc_destroy(struct Qdisc *sch)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow, *tmp;
--
-- pr_debug("atm_tc_destroy(sch %p,[qdisc %p])\n", sch, p);
-- list_for_each_entry(flow, &p->flows, list) {
-- tcf_block_put(flow->block);
-- flow->block = NULL;
-- }
--
-- list_for_each_entry_safe(flow, tmp, &p->flows, list) {
-- if (flow->ref > 1)
-- pr_err("atm_destroy: %p->ref = %d\n", flow, flow->ref);
-- atm_tc_put(sch, (unsigned long)flow);
-- }
-- tasklet_kill(&p->task);
--}
--
--static int atm_tc_dump_class(struct Qdisc *sch, unsigned long cl,
-- struct sk_buff *skb, struct tcmsg *tcm)
--{
-- struct atm_qdisc_data *p = qdisc_priv(sch);
-- struct atm_flow_data *flow = (struct atm_flow_data *)cl;
-- struct nlattr *nest;
--
-- pr_debug("atm_tc_dump_class(sch %p,[qdisc %p],flow %p,skb %p,tcm %p)\n",
-- sch, p, flow, skb, tcm);
-- if (list_empty(&flow->list))
-- return -EINVAL;
-- tcm->tcm_handle = flow->common.classid;
-- tcm->tcm_info = flow->q->handle;
--
-- nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
-- if (nest == NULL)
-- goto nla_put_failure;
--
-- if (nla_put(skb, TCA_ATM_HDR, flow->hdr_len, flow->hdr))
-- goto nla_put_failure;
-- if (flow->vcc) {
-- struct sockaddr_atmpvc pvc;
-- int state;
--
-- memset(&pvc, 0, sizeof(pvc));
-- pvc.sap_family = AF_ATMPVC;
-- pvc.sap_addr.itf = flow->vcc->dev ? flow->vcc->dev->number : -1;
-- pvc.sap_addr.vpi = flow->vcc->vpi;
-- pvc.sap_addr.vci = flow->vcc->vci;
-- if (nla_put(skb, TCA_ATM_ADDR, sizeof(pvc), &pvc))
-- goto nla_put_failure;
-- state = ATM_VF2VS(flow->vcc->flags);
-- if (nla_put_u32(skb, TCA_ATM_STATE, state))
-- goto nla_put_failure;
-- }
-- if (flow->excess) {
-- if (nla_put_u32(skb, TCA_ATM_EXCESS, flow->common.classid))
-- goto nla_put_failure;
-- } else {
-- if (nla_put_u32(skb, TCA_ATM_EXCESS, 0))
-- goto nla_put_failure;
-- }
-- return nla_nest_end(skb, nest);
--
--nla_put_failure:
-- nla_nest_cancel(skb, nest);
-- return -1;
--}
--static int
--atm_tc_dump_class_stats(struct Qdisc *sch, unsigned long arg,
-- struct gnet_dump *d)
--{
-- struct atm_flow_data *flow = (struct atm_flow_data *)arg;
--
-- if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch),
-- d, NULL, &flow->bstats) < 0 ||
-- gnet_stats_copy_queue(d, NULL, &flow->qstats, flow->q->q.qlen) < 0)
-- return -1;
--
-- return 0;
--}
--
--static int atm_tc_dump(struct Qdisc *sch, struct sk_buff *skb)
--{
-- return 0;
--}
--
--static const struct Qdisc_class_ops atm_class_ops = {
-- .graft = atm_tc_graft,
-- .leaf = atm_tc_leaf,
-- .find = atm_tc_find,
-- .change = atm_tc_change,
-- .delete = atm_tc_delete,
-- .walk = atm_tc_walk,
-- .tcf_block = atm_tc_tcf_block,
-- .bind_tcf = atm_tc_bind_filter,
-- .unbind_tcf = atm_tc_put,
-- .dump = atm_tc_dump_class,
-- .dump_stats = atm_tc_dump_class_stats,
--};
--
--static struct Qdisc_ops atm_qdisc_ops __read_mostly = {
-- .cl_ops = &atm_class_ops,
-- .id = "atm",
-- .priv_size = sizeof(struct atm_qdisc_data),
-- .enqueue = atm_tc_enqueue,
-- .dequeue = atm_tc_dequeue,
-- .peek = atm_tc_peek,
-- .init = atm_tc_init,
-- .reset = atm_tc_reset,
-- .destroy = atm_tc_destroy,
-- .dump = atm_tc_dump,
-- .owner = THIS_MODULE,
--};
--
--static int __init atm_init(void)
--{
-- return register_qdisc(&atm_qdisc_ops);
--}
--
--static void __exit atm_exit(void)
--{
-- unregister_qdisc(&atm_qdisc_ops);
--}
--
--module_init(atm_init)
--module_exit(atm_exit)
--MODULE_LICENSE("GPL");
diff --git a/queue-5.4/net-sched-retire-cbq-qdisc.patch b/queue-5.4/net-sched-retire-cbq-qdisc.patch
deleted file mode 100644
index 75a681d09b..0000000000
--- a/queue-5.4/net-sched-retire-cbq-qdisc.patch
+++ /dev/null
@@ -1,1883 +0,0 @@
-From 051d442098421c28c7951625652f61b1e15c4bd5 Mon Sep 17 00:00:00 2001
-From: Jamal Hadi Salim <jhs@mojatatu.com>
-Date: Tue, 14 Feb 2023 08:49:11 -0500
-Subject: net/sched: Retire CBQ qdisc
-
-From: Jamal Hadi Salim <jhs@mojatatu.com>
-
-commit 051d442098421c28c7951625652f61b1e15c4bd5 upstream.
-
-While this amazing qdisc has served us well over the years it has not been
-getting any tender love and care and has bitrotted over time.
-It has become mostly a shooting target for syzkaller lately.
-For this reason, we are retiring it. Goodbye CBQ - we loved you.
-
-Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
-Acked-by: Jiri Pirko <jiri@nvidia.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/sched/Kconfig | 17
- net/sched/Makefile | 1
- net/sched/sch_cbq.c | 1818 ----------------------------------------------------
- 3 files changed, 1836 deletions(-)
- delete mode 100644 net/sched/sch_cbq.c
- delete mode 100644 tools/testing/selftests/tc-testing/tc-tests/qdiscs/cbq.json
-
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -45,23 +45,6 @@ if NET_SCHED
-
- comment "Queueing/Scheduling"
-
--config NET_SCH_CBQ
-- tristate "Class Based Queueing (CBQ)"
-- ---help---
-- Say Y here if you want to use the Class-Based Queueing (CBQ) packet
-- scheduling algorithm. This algorithm classifies the waiting packets
-- into a tree-like hierarchy of classes; the leaves of this tree are
-- in turn scheduled by separate algorithms.
--
-- See the top of <file:net/sched/sch_cbq.c> for more details.
--
-- CBQ is a commonly used scheduler, so if you're unsure, you should
-- say Y here. Then say Y to all the queueing algorithms below that you
-- want to use as leaf disciplines.
--
-- To compile this code as a module, choose M here: the
-- module will be called sch_cbq.
--
- config NET_SCH_HTB
- tristate "Hierarchical Token Bucket (HTB)"
- ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -31,7 +31,6 @@ obj-$(CONFIG_NET_IFE_SKBTCINDEX) += act_
- obj-$(CONFIG_NET_ACT_TUNNEL_KEY)+= act_tunnel_key.o
- obj-$(CONFIG_NET_ACT_CT) += act_ct.o
- obj-$(CONFIG_NET_SCH_FIFO) += sch_fifo.o
--obj-$(CONFIG_NET_SCH_CBQ) += sch_cbq.o
- obj-$(CONFIG_NET_SCH_HTB) += sch_htb.o
- obj-$(CONFIG_NET_SCH_HFSC) += sch_hfsc.o
- obj-$(CONFIG_NET_SCH_RED) += sch_red.o
---- a/net/sched/sch_cbq.c
-+++ /dev/null
-@@ -1,1818 +0,0 @@
--// SPDX-License-Identifier: GPL-2.0-or-later
--/*
-- * net/sched/sch_cbq.c Class-Based Queueing discipline.
-- *
-- * Authors: Alexey Kuznetsov, <kuznet@ms2.inr.ac.ru>
-- */
--
--#include <linux/module.h>
--#include <linux/slab.h>
--#include <linux/types.h>
--#include <linux/kernel.h>
--#include <linux/string.h>
--#include <linux/errno.h>
--#include <linux/skbuff.h>
--#include <net/netlink.h>
--#include <net/pkt_sched.h>
--#include <net/pkt_cls.h>
--
--
--/* Class-Based Queueing (CBQ) algorithm.
-- =======================================
--
-- Sources: [1] Sally Floyd and Van Jacobson, "Link-sharing and Resource
-- Management Models for Packet Networks",
-- IEEE/ACM Transactions on Networking, Vol.3, No.4, 1995
--
-- [2] Sally Floyd, "Notes on CBQ and Guaranteed Service", 1995
--
-- [3] Sally Floyd, "Notes on Class-Based Queueing: Setting
-- Parameters", 1996
--
-- [4] Sally Floyd and Michael Speer, "Experimental Results
-- for Class-Based Queueing", 1998, not published.
--
-- -----------------------------------------------------------------------
--
-- Algorithm skeleton was taken from NS simulator cbq.cc.
-- If someone wants to check this code against the LBL version,
-- he should take into account that ONLY the skeleton was borrowed,
-- the implementation is different. Particularly:
--
-- --- The WRR algorithm is different. Our version looks more
-- reasonable (I hope) and works when quanta are allowed to be
-- less than MTU, which is always the case when real time classes
-- have small rates. Note, that the statement of [3] is
-- incomplete, delay may actually be estimated even if class
-- per-round allotment is less than MTU. Namely, if per-round
-- allotment is W*r_i, and r_1+...+r_k = r < 1
--
-- delay_i <= ([MTU/(W*r_i)]*W*r + W*r + k*MTU)/B
--
-- In the worst case we have IntServ estimate with D = W*r+k*MTU
-- and C = MTU*r. The proof (if correct at all) is trivial.
--
--
-- --- It seems that cbq-2.0 is not very accurate. At least, I cannot
-- interpret some places, which look like wrong translations
-- from NS. Anyone is advised to find these differences
-- and explain to me, why I am wrong 8).
--
-- --- Linux has no EOI event, so that we cannot estimate true class
-- idle time. Workaround is to consider the next dequeue event
-- as sign that previous packet is finished. This is wrong because of
-- internal device queueing, but on a permanently loaded link it is true.
-- Moreover, combined with clock integrator, this scheme looks
-- very close to an ideal solution. */
--
--struct cbq_sched_data;
--
--
--struct cbq_class {
-- struct Qdisc_class_common common;
-- struct cbq_class *next_alive; /* next class with backlog in this priority band */
--
--/* Parameters */
-- unsigned char priority; /* class priority */
-- unsigned char priority2; /* priority to be used after overlimit */
-- unsigned char ewma_log; /* time constant for idle time calculation */
--
-- u32 defmap;
--
-- /* Link-sharing scheduler parameters */
-- long maxidle; /* Class parameters: see below. */
-- long offtime;
-- long minidle;
-- u32 avpkt;
-- struct qdisc_rate_table *R_tab;
--
-- /* General scheduler (WRR) parameters */
-- long allot;
-- long quantum; /* Allotment per WRR round */
-- long weight; /* Relative allotment: see below */
--
-- struct Qdisc *qdisc; /* Ptr to CBQ discipline */
-- struct cbq_class *split; /* Ptr to split node */
-- struct cbq_class *share; /* Ptr to LS parent in the class tree */
-- struct cbq_class *tparent; /* Ptr to tree parent in the class tree */
-- struct cbq_class *borrow; /* NULL if class is bandwidth limited;
-- parent otherwise */
-- struct cbq_class *sibling; /* Sibling chain */
-- struct cbq_class *children; /* Pointer to children chain */
--
-- struct Qdisc *q; /* Elementary queueing discipline */
--
--
--/* Variables */
-- unsigned char cpriority; /* Effective priority */
-- unsigned char delayed;
-- unsigned char level; /* level of the class in hierarchy:
-- 0 for leaf classes, and maximal
-- level of children + 1 for nodes.
-- */
--
-- psched_time_t last; /* Last end of service */
-- psched_time_t undertime;
-- long avgidle;
-- long deficit; /* Saved deficit for WRR */
-- psched_time_t penalized;
-- struct gnet_stats_basic_packed bstats;
-- struct gnet_stats_queue qstats;
-- struct net_rate_estimator __rcu *rate_est;
-- struct tc_cbq_xstats xstats;
--
-- struct tcf_proto __rcu *filter_list;
-- struct tcf_block *block;
--
-- int filters;
--
-- struct cbq_class *defaults[TC_PRIO_MAX + 1];
--};
--
--struct cbq_sched_data {
-- struct Qdisc_class_hash clhash; /* Hash table of all classes */
-- int nclasses[TC_CBQ_MAXPRIO + 1];
-- unsigned int quanta[TC_CBQ_MAXPRIO + 1];
--
-- struct cbq_class link;
--
-- unsigned int activemask;
-- struct cbq_class *active[TC_CBQ_MAXPRIO + 1]; /* List of all classes
-- with backlog */
--
--#ifdef CONFIG_NET_CLS_ACT
-- struct cbq_class *rx_class;
--#endif
-- struct cbq_class *tx_class;
-- struct cbq_class *tx_borrowed;
-- int tx_len;
-- psched_time_t now; /* Cached timestamp */
-- unsigned int pmask;
--
-- struct hrtimer delay_timer;
-- struct qdisc_watchdog watchdog; /* Watchdog timer,
-- started when CBQ has
-- backlog, but cannot
-- transmit just now */
-- psched_tdiff_t wd_expires;
-- int toplevel;
-- u32 hgenerator;
--};
--
--
--#define L2T(cl, len) qdisc_l2t((cl)->R_tab, len)
--
--static inline struct cbq_class *
--cbq_class_lookup(struct cbq_sched_data *q, u32 classid)
--{
-- struct Qdisc_class_common *clc;
--
-- clc = qdisc_class_find(&q->clhash, classid);
-- if (clc == NULL)
-- return NULL;
-- return container_of(clc, struct cbq_class, common);
--}
--
--#ifdef CONFIG_NET_CLS_ACT
--
--static struct cbq_class *
--cbq_reclassify(struct sk_buff *skb, struct cbq_class *this)
--{
-- struct cbq_class *cl;
--
-- for (cl = this->tparent; cl; cl = cl->tparent) {
-- struct cbq_class *new = cl->defaults[TC_PRIO_BESTEFFORT];
--
-- if (new != NULL && new != this)
-- return new;
-- }
-- return NULL;
--}
--
--#endif
--
--/* Classify packet. The procedure is pretty complicated, but
-- * it allows us to combine link sharing and priority scheduling
-- * transparently.
-- *
-- * Namely, you can put link sharing rules (f.e. route based) at root of CBQ,
-- * so that it resolves to split nodes. Then packets are classified
-- * by logical priority, or a more specific classifier may be attached
-- * to the split node.
-- */
--
--static struct cbq_class *
--cbq_classify(struct sk_buff *skb, struct Qdisc *sch, int *qerr)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *head = &q->link;
-- struct cbq_class **defmap;
-- struct cbq_class *cl = NULL;
-- u32 prio = skb->priority;
-- struct tcf_proto *fl;
-- struct tcf_result res;
--
-- /*
-- * Step 1. If skb->priority points to one of our classes, use it.
-- */
-- if (TC_H_MAJ(prio ^ sch->handle) == 0 &&
-- (cl = cbq_class_lookup(q, prio)) != NULL)
-- return cl;
--
-- *qerr = NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
-- for (;;) {
-- int result = 0;
-- defmap = head->defaults;
--
-- fl = rcu_dereference_bh(head->filter_list);
-- /*
-- * Step 2+n. Apply classifier.
-- */
-- result = tcf_classify(skb, fl, &res, true);
-- if (!fl || result < 0)
-- goto fallback;
-- if (result == TC_ACT_SHOT)
-- return NULL;
--
-- cl = (void *)res.class;
-- if (!cl) {
-- if (TC_H_MAJ(res.classid))
-- cl = cbq_class_lookup(q, res.classid);
-- else if ((cl = defmap[res.classid & TC_PRIO_MAX]) == NULL)
-- cl = defmap[TC_PRIO_BESTEFFORT];
--
-- if (cl == NULL)
-- goto fallback;
-- }
-- if (cl->level >= head->level)
-- goto fallback;
--#ifdef CONFIG_NET_CLS_ACT
-- switch (result) {
-- case TC_ACT_QUEUED:
-- case TC_ACT_STOLEN:
-- case TC_ACT_TRAP:
-- *qerr = NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
-- /* fall through */
-- fallthrough;
-- case TC_ACT_RECLASSIFY:
-- return cbq_reclassify(skb, cl);
-- }
--#endif
-- if (cl->level == 0)
-- return cl;
--
-- /*
-- * Step 3+n. If classifier selected a link sharing class,
-- * apply agency specific classifier.
-- * Repeat this procdure until we hit a leaf node.
-- */
-- head = cl;
-- }
--
--fallback:
-- cl = head;
--
-- /*
-- * Step 4. No success...
-- */
-- if (TC_H_MAJ(prio) == 0 &&
-- !(cl = head->defaults[prio & TC_PRIO_MAX]) &&
-- !(cl = head->defaults[TC_PRIO_BESTEFFORT]))
-- return head;
--
-- return cl;
--}
--
--/*
-- * A packet has just been enqueued on the empty class.
-- * cbq_activate_class adds it to the tail of active class list
-- * of its priority band.
-- */
--
--static inline void cbq_activate_class(struct cbq_class *cl)
--{
-- struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
-- int prio = cl->cpriority;
-- struct cbq_class *cl_tail;
--
-- cl_tail = q->active[prio];
-- q->active[prio] = cl;
--
-- if (cl_tail != NULL) {
-- cl->next_alive = cl_tail->next_alive;
-- cl_tail->next_alive = cl;
-- } else {
-- cl->next_alive = cl;
-- q->activemask |= (1<<prio);
-- }
--}
--
--/*
-- * Unlink class from active chain.
-- * Note that this same procedure is done directly in cbq_dequeue*
-- * during round-robin procedure.
-- */
--
--static void cbq_deactivate_class(struct cbq_class *this)
--{
-- struct cbq_sched_data *q = qdisc_priv(this->qdisc);
-- int prio = this->cpriority;
-- struct cbq_class *cl;
-- struct cbq_class *cl_prev = q->active[prio];
--
-- do {
-- cl = cl_prev->next_alive;
-- if (cl == this) {
-- cl_prev->next_alive = cl->next_alive;
-- cl->next_alive = NULL;
--
-- if (cl == q->active[prio]) {
-- q->active[prio] = cl_prev;
-- if (cl == q->active[prio]) {
-- q->active[prio] = NULL;
-- q->activemask &= ~(1<<prio);
-- return;
-- }
-- }
-- return;
-- }
-- } while ((cl_prev = cl) != q->active[prio]);
--}
--
--static void
--cbq_mark_toplevel(struct cbq_sched_data *q, struct cbq_class *cl)
--{
-- int toplevel = q->toplevel;
--
-- if (toplevel > cl->level) {
-- psched_time_t now = psched_get_time();
--
-- do {
-- if (cl->undertime < now) {
-- q->toplevel = cl->level;
-- return;
-- }
-- } while ((cl = cl->borrow) != NULL && toplevel > cl->level);
-- }
--}
--
--static int
--cbq_enqueue(struct sk_buff *skb, struct Qdisc *sch,
-- struct sk_buff **to_free)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- int ret;
-- struct cbq_class *cl = cbq_classify(skb, sch, &ret);
--
--#ifdef CONFIG_NET_CLS_ACT
-- q->rx_class = cl;
--#endif
-- if (cl == NULL) {
-- if (ret & __NET_XMIT_BYPASS)
-- qdisc_qstats_drop(sch);
-- __qdisc_drop(skb, to_free);
-- return ret;
-- }
--
-- ret = qdisc_enqueue(skb, cl->q, to_free);
-- if (ret == NET_XMIT_SUCCESS) {
-- sch->q.qlen++;
-- cbq_mark_toplevel(q, cl);
-- if (!cl->next_alive)
-- cbq_activate_class(cl);
-- return ret;
-- }
--
-- if (net_xmit_drop_count(ret)) {
-- qdisc_qstats_drop(sch);
-- cbq_mark_toplevel(q, cl);
-- cl->qstats.drops++;
-- }
-- return ret;
--}
--
--/* Overlimit action: penalize leaf class by adding offtime */
--static void cbq_overlimit(struct cbq_class *cl)
--{
-- struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
-- psched_tdiff_t delay = cl->undertime - q->now;
--
-- if (!cl->delayed) {
-- delay += cl->offtime;
--
-- /*
-- * Class goes to sleep, so that it will have no
-- * chance to work avgidle. Let's forgive it 8)
-- *
-- * BTW cbq-2.0 has a crap in this
-- * place, apparently they forgot to shift it by cl->ewma_log.
-- */
-- if (cl->avgidle < 0)
-- delay -= (-cl->avgidle) - ((-cl->avgidle) >> cl->ewma_log);
-- if (cl->avgidle < cl->minidle)
-- cl->avgidle = cl->minidle;
-- if (delay <= 0)
-- delay = 1;
-- cl->undertime = q->now + delay;
--
-- cl->xstats.overactions++;
-- cl->delayed = 1;
-- }
-- if (q->wd_expires == 0 || q->wd_expires > delay)
-- q->wd_expires = delay;
--
-- /* Dirty work! We must schedule wakeups based on
-- * real available rate, rather than leaf rate,
-- * which may be tiny (even zero).
-- */
-- if (q->toplevel == TC_CBQ_MAXLEVEL) {
-- struct cbq_class *b;
-- psched_tdiff_t base_delay = q->wd_expires;
--
-- for (b = cl->borrow; b; b = b->borrow) {
-- delay = b->undertime - q->now;
-- if (delay < base_delay) {
-- if (delay <= 0)
-- delay = 1;
-- base_delay = delay;
-- }
-- }
--
-- q->wd_expires = base_delay;
-- }
--}
--
--static psched_tdiff_t cbq_undelay_prio(struct cbq_sched_data *q, int prio,
-- psched_time_t now)
--{
-- struct cbq_class *cl;
-- struct cbq_class *cl_prev = q->active[prio];
-- psched_time_t sched = now;
--
-- if (cl_prev == NULL)
-- return 0;
--
-- do {
-- cl = cl_prev->next_alive;
-- if (now - cl->penalized > 0) {
-- cl_prev->next_alive = cl->next_alive;
-- cl->next_alive = NULL;
-- cl->cpriority = cl->priority;
-- cl->delayed = 0;
-- cbq_activate_class(cl);
--
-- if (cl == q->active[prio]) {
-- q->active[prio] = cl_prev;
-- if (cl == q->active[prio]) {
-- q->active[prio] = NULL;
-- return 0;
-- }
-- }
--
-- cl = cl_prev->next_alive;
-- } else if (sched - cl->penalized > 0)
-- sched = cl->penalized;
-- } while ((cl_prev = cl) != q->active[prio]);
--
-- return sched - now;
--}
--
--static enum hrtimer_restart cbq_undelay(struct hrtimer *timer)
--{
-- struct cbq_sched_data *q = container_of(timer, struct cbq_sched_data,
-- delay_timer);
-- struct Qdisc *sch = q->watchdog.qdisc;
-- psched_time_t now;
-- psched_tdiff_t delay = 0;
-- unsigned int pmask;
--
-- now = psched_get_time();
--
-- pmask = q->pmask;
-- q->pmask = 0;
--
-- while (pmask) {
-- int prio = ffz(~pmask);
-- psched_tdiff_t tmp;
--
-- pmask &= ~(1<<prio);
--
-- tmp = cbq_undelay_prio(q, prio, now);
-- if (tmp > 0) {
-- q->pmask |= 1<<prio;
-- if (tmp < delay || delay == 0)
-- delay = tmp;
-- }
-- }
--
-- if (delay) {
-- ktime_t time;
--
-- time = 0;
-- time = ktime_add_ns(time, PSCHED_TICKS2NS(now + delay));
-- hrtimer_start(&q->delay_timer, time, HRTIMER_MODE_ABS_PINNED);
-- }
--
-- __netif_schedule(qdisc_root(sch));
-- return HRTIMER_NORESTART;
--}
--
--/*
-- * It is mission critical procedure.
-- *
-- * We "regenerate" toplevel cutoff, if transmitting class
-- * has backlog and it is not regulated. It is not part of
-- * original CBQ description, but looks more reasonable.
-- * Probably, it is wrong. This question needs further investigation.
-- */
--
--static inline void
--cbq_update_toplevel(struct cbq_sched_data *q, struct cbq_class *cl,
-- struct cbq_class *borrowed)
--{
-- if (cl && q->toplevel >= borrowed->level) {
-- if (cl->q->q.qlen > 1) {
-- do {
-- if (borrowed->undertime == PSCHED_PASTPERFECT) {
-- q->toplevel = borrowed->level;
-- return;
-- }
-- } while ((borrowed = borrowed->borrow) != NULL);
-- }
--#if 0
-- /* It is not necessary now. Uncommenting it
-- will save CPU cycles, but decrease fairness.
-- */
-- q->toplevel = TC_CBQ_MAXLEVEL;
--#endif
-- }
--}
--
--static void
--cbq_update(struct cbq_sched_data *q)
--{
-- struct cbq_class *this = q->tx_class;
-- struct cbq_class *cl = this;
-- int len = q->tx_len;
-- psched_time_t now;
--
-- q->tx_class = NULL;
-- /* Time integrator. We calculate EOS time
-- * by adding expected packet transmission time.
-- */
-- now = q->now + L2T(&q->link, len);
--
-- for ( ; cl; cl = cl->share) {
-- long avgidle = cl->avgidle;
-- long idle;
--
-- cl->bstats.packets++;
-- cl->bstats.bytes += len;
--
-- /*
-- * (now - last) is total time between packet right edges.
-- * (last_pktlen/rate) is "virtual" busy time, so that
-- *
-- * idle = (now - last) - last_pktlen/rate
-- */
--
-- idle = now - cl->last;
-- if ((unsigned long)idle > 128*1024*1024) {
-- avgidle = cl->maxidle;
-- } else {
-- idle -= L2T(cl, len);
--
-- /* true_avgidle := (1-W)*true_avgidle + W*idle,
-- * where W=2^{-ewma_log}. But cl->avgidle is scaled:
-- * cl->avgidle == true_avgidle/W,
-- * hence:
-- */
-- avgidle += idle - (avgidle>>cl->ewma_log);
-- }
--
-- if (avgidle <= 0) {
-- /* Overlimit or at-limit */
--
-- if (avgidle < cl->minidle)
-- avgidle = cl->minidle;
--
-- cl->avgidle = avgidle;
--
-- /* Calculate expected time, when this class
-- * will be allowed to send.
-- * It will occur, when:
-- * (1-W)*true_avgidle + W*delay = 0, i.e.
-- * idle = (1/W - 1)*(-true_avgidle)
-- * or
-- * idle = (1 - W)*(-cl->avgidle);
-- */
-- idle = (-avgidle) - ((-avgidle) >> cl->ewma_log);
--
-- /*
-- * That is not all.
-- * To maintain the rate allocated to the class,
-- * we add to undertime virtual clock,
-- * necessary to complete transmitted packet.
-- * (len/phys_bandwidth has been already passed
-- * to the moment of cbq_update)
-- */
--
-- idle -= L2T(&q->link, len);
-- idle += L2T(cl, len);
--
-- cl->undertime = now + idle;
-- } else {
-- /* Underlimit */
--
-- cl->undertime = PSCHED_PASTPERFECT;
-- if (avgidle > cl->maxidle)
-- cl->avgidle = cl->maxidle;
-- else
-- cl->avgidle = avgidle;
-- }
-- if ((s64)(now - cl->last) > 0)
-- cl->last = now;
-- }
--
-- cbq_update_toplevel(q, this, q->tx_borrowed);
--}
--
--static inline struct cbq_class *
--cbq_under_limit(struct cbq_class *cl)
--{
-- struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
-- struct cbq_class *this_cl = cl;
--
-- if (cl->tparent == NULL)
-- return cl;
--
-- if (cl->undertime == PSCHED_PASTPERFECT || q->now >= cl->undertime) {
-- cl->delayed = 0;
-- return cl;
-- }
--
-- do {
-- /* It is very suspicious place. Now overlimit
-- * action is generated for not bounded classes
-- * only if link is completely congested.
-- * Though it is in agree with ancestor-only paradigm,
-- * it looks very stupid. Particularly,
-- * it means that this chunk of code will either
-- * never be called or result in strong amplification
-- * of burstiness. Dangerous, silly, and, however,
-- * no another solution exists.
-- */
-- cl = cl->borrow;
-- if (!cl) {
-- this_cl->qstats.overlimits++;
-- cbq_overlimit(this_cl);
-- return NULL;
-- }
-- if (cl->level > q->toplevel)
-- return NULL;
-- } while (cl->undertime != PSCHED_PASTPERFECT && q->now < cl->undertime);
--
-- cl->delayed = 0;
-- return cl;
--}
--
--static inline struct sk_buff *
--cbq_dequeue_prio(struct Qdisc *sch, int prio)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *cl_tail, *cl_prev, *cl;
-- struct sk_buff *skb;
-- int deficit;
--
-- cl_tail = cl_prev = q->active[prio];
-- cl = cl_prev->next_alive;
--
-- do {
-- deficit = 0;
--
-- /* Start round */
-- do {
-- struct cbq_class *borrow = cl;
--
-- if (cl->q->q.qlen &&
-- (borrow = cbq_under_limit(cl)) == NULL)
-- goto skip_class;
--
-- if (cl->deficit <= 0) {
-- /* Class exhausted its allotment per
-- * this round. Switch to the next one.
-- */
-- deficit = 1;
-- cl->deficit += cl->quantum;
-- goto next_class;
-- }
--
-- skb = cl->q->dequeue(cl->q);
--
-- /* Class did not give us any skb :-(
-- * It could occur even if cl->q->q.qlen != 0
-- * f.e. if cl->q == "tbf"
-- */
-- if (skb == NULL)
-- goto skip_class;
--
-- cl->deficit -= qdisc_pkt_len(skb);
-- q->tx_class = cl;
-- q->tx_borrowed = borrow;
-- if (borrow != cl) {
--#ifndef CBQ_XSTATS_BORROWS_BYTES
-- borrow->xstats.borrows++;
-- cl->xstats.borrows++;
--#else
-- borrow->xstats.borrows += qdisc_pkt_len(skb);
-- cl->xstats.borrows += qdisc_pkt_len(skb);
--#endif
-- }
-- q->tx_len = qdisc_pkt_len(skb);
--
-- if (cl->deficit <= 0) {
-- q->active[prio] = cl;
-- cl = cl->next_alive;
-- cl->deficit += cl->quantum;
-- }
-- return skb;
--
--skip_class:
-- if (cl->q->q.qlen == 0 || prio != cl->cpriority) {
-- /* Class is empty or penalized.
-- * Unlink it from active chain.
-- */
-- cl_prev->next_alive = cl->next_alive;
-- cl->next_alive = NULL;
--
-- /* Did cl_tail point to it? */
-- if (cl == cl_tail) {
-- /* Repair it! */
-- cl_tail = cl_prev;
--
-- /* Was it the last class in this band? */
-- if (cl == cl_tail) {
-- /* Kill the band! */
-- q->active[prio] = NULL;
-- q->activemask &= ~(1<<prio);
-- if (cl->q->q.qlen)
-- cbq_activate_class(cl);
-- return NULL;
-- }
--
-- q->active[prio] = cl_tail;
-- }
-- if (cl->q->q.qlen)
-- cbq_activate_class(cl);
--
-- cl = cl_prev;
-- }
--
--next_class:
-- cl_prev = cl;
-- cl = cl->next_alive;
-- } while (cl_prev != cl_tail);
-- } while (deficit);
--
-- q->active[prio] = cl_prev;
--
-- return NULL;
--}
--
--static inline struct sk_buff *
--cbq_dequeue_1(struct Qdisc *sch)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct sk_buff *skb;
-- unsigned int activemask;
--
-- activemask = q->activemask & 0xFF;
-- while (activemask) {
-- int prio = ffz(~activemask);
-- activemask &= ~(1<<prio);
-- skb = cbq_dequeue_prio(sch, prio);
-- if (skb)
-- return skb;
-- }
-- return NULL;
--}
--
--static struct sk_buff *
--cbq_dequeue(struct Qdisc *sch)
--{
-- struct sk_buff *skb;
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- psched_time_t now;
--
-- now = psched_get_time();
--
-- if (q->tx_class)
-- cbq_update(q);
--
-- q->now = now;
--
-- for (;;) {
-- q->wd_expires = 0;
--
-- skb = cbq_dequeue_1(sch);
-- if (skb) {
-- qdisc_bstats_update(sch, skb);
-- sch->q.qlen--;
-- return skb;
-- }
--
-- /* All the classes are overlimit.
-- *
-- * It is possible, if:
-- *
-- * 1. Scheduler is empty.
-- * 2. Toplevel cutoff inhibited borrowing.
-- * 3. Root class is overlimit.
-- *
-- * Reset 2d and 3d conditions and retry.
-- *
-- * Note, that NS and cbq-2.0 are buggy, peeking
-- * an arbitrary class is appropriate for ancestor-only
-- * sharing, but not for toplevel algorithm.
-- *
-- * Our version is better, but slower, because it requires
-- * two passes, but it is unavoidable with top-level sharing.
-- */
--
-- if (q->toplevel == TC_CBQ_MAXLEVEL &&
-- q->link.undertime == PSCHED_PASTPERFECT)
-- break;
--
-- q->toplevel = TC_CBQ_MAXLEVEL;
-- q->link.undertime = PSCHED_PASTPERFECT;
-- }
--
-- /* No packets in scheduler or nobody wants to give them to us :-(
-- * Sigh... start watchdog timer in the last case.
-- */
--
-- if (sch->q.qlen) {
-- qdisc_qstats_overlimit(sch);
-- if (q->wd_expires)
-- qdisc_watchdog_schedule(&q->watchdog,
-- now + q->wd_expires);
-- }
-- return NULL;
--}
--
--/* CBQ class maintanance routines */
--
--static void cbq_adjust_levels(struct cbq_class *this)
--{
-- if (this == NULL)
-- return;
--
-- do {
-- int level = 0;
-- struct cbq_class *cl;
--
-- cl = this->children;
-- if (cl) {
-- do {
-- if (cl->level > level)
-- level = cl->level;
-- } while ((cl = cl->sibling) != this->children);
-- }
-- this->level = level + 1;
-- } while ((this = this->tparent) != NULL);
--}
--
--static void cbq_normalize_quanta(struct cbq_sched_data *q, int prio)
--{
-- struct cbq_class *cl;
-- unsigned int h;
--
-- if (q->quanta[prio] == 0)
-- return;
--
-- for (h = 0; h < q->clhash.hashsize; h++) {
-- hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
-- /* BUGGGG... Beware! This expression suffer of
-- * arithmetic overflows!
-- */
-- if (cl->priority == prio) {
-- cl->quantum = (cl->weight*cl->allot*q->nclasses[prio])/
-- q->quanta[prio];
-- }
-- if (cl->quantum <= 0 ||
-- cl->quantum > 32*qdisc_dev(cl->qdisc)->mtu) {
-- pr_warn("CBQ: class %08x has bad quantum==%ld, repaired.\n",
-- cl->common.classid, cl->quantum);
-- cl->quantum = qdisc_dev(cl->qdisc)->mtu/2 + 1;
-- }
-- }
-- }
--}
--
--static void cbq_sync_defmap(struct cbq_class *cl)
--{
-- struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
-- struct cbq_class *split = cl->split;
-- unsigned int h;
-- int i;
--
-- if (split == NULL)
-- return;
--
-- for (i = 0; i <= TC_PRIO_MAX; i++) {
-- if (split->defaults[i] == cl && !(cl->defmap & (1<<i)))
-- split->defaults[i] = NULL;
-- }
--
-- for (i = 0; i <= TC_PRIO_MAX; i++) {
-- int level = split->level;
--
-- if (split->defaults[i])
-- continue;
--
-- for (h = 0; h < q->clhash.hashsize; h++) {
-- struct cbq_class *c;
--
-- hlist_for_each_entry(c, &q->clhash.hash[h],
-- common.hnode) {
-- if (c->split == split && c->level < level &&
-- c->defmap & (1<<i)) {
-- split->defaults[i] = c;
-- level = c->level;
-- }
-- }
-- }
-- }
--}
--
--static void cbq_change_defmap(struct cbq_class *cl, u32 splitid, u32 def, u32 mask)
--{
-- struct cbq_class *split = NULL;
--
-- if (splitid == 0) {
-- split = cl->split;
-- if (!split)
-- return;
-- splitid = split->common.classid;
-- }
--
-- if (split == NULL || split->common.classid != splitid) {
-- for (split = cl->tparent; split; split = split->tparent)
-- if (split->common.classid == splitid)
-- break;
-- }
--
-- if (split == NULL)
-- return;
--
-- if (cl->split != split) {
-- cl->defmap = 0;
-- cbq_sync_defmap(cl);
-- cl->split = split;
-- cl->defmap = def & mask;
-- } else
-- cl->defmap = (cl->defmap & ~mask) | (def & mask);
--
-- cbq_sync_defmap(cl);
--}
--
--static void cbq_unlink_class(struct cbq_class *this)
--{
-- struct cbq_class *cl, **clp;
-- struct cbq_sched_data *q = qdisc_priv(this->qdisc);
--
-- qdisc_class_hash_remove(&q->clhash, &this->common);
--
-- if (this->tparent) {
-- clp = &this->sibling;
-- cl = *clp;
-- do {
-- if (cl == this) {
-- *clp = cl->sibling;
-- break;
-- }
-- clp = &cl->sibling;
-- } while ((cl = *clp) != this->sibling);
--
-- if (this->tparent->children == this) {
-- this->tparent->children = this->sibling;
-- if (this->sibling == this)
-- this->tparent->children = NULL;
-- }
-- } else {
-- WARN_ON(this->sibling != this);
-- }
--}
--
--static void cbq_link_class(struct cbq_class *this)
--{
-- struct cbq_sched_data *q = qdisc_priv(this->qdisc);
-- struct cbq_class *parent = this->tparent;
--
-- this->sibling = this;
-- qdisc_class_hash_insert(&q->clhash, &this->common);
--
-- if (parent == NULL)
-- return;
--
-- if (parent->children == NULL) {
-- parent->children = this;
-- } else {
-- this->sibling = parent->children->sibling;
-- parent->children->sibling = this;
-- }
--}
--
--static void
--cbq_reset(struct Qdisc *sch)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *cl;
-- int prio;
-- unsigned int h;
--
-- q->activemask = 0;
-- q->pmask = 0;
-- q->tx_class = NULL;
-- q->tx_borrowed = NULL;
-- qdisc_watchdog_cancel(&q->watchdog);
-- hrtimer_cancel(&q->delay_timer);
-- q->toplevel = TC_CBQ_MAXLEVEL;
-- q->now = psched_get_time();
--
-- for (prio = 0; prio <= TC_CBQ_MAXPRIO; prio++)
-- q->active[prio] = NULL;
--
-- for (h = 0; h < q->clhash.hashsize; h++) {
-- hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
-- qdisc_reset(cl->q);
--
-- cl->next_alive = NULL;
-- cl->undertime = PSCHED_PASTPERFECT;
-- cl->avgidle = cl->maxidle;
-- cl->deficit = cl->quantum;
-- cl->cpriority = cl->priority;
-- }
-- }
-- sch->q.qlen = 0;
--}
--
--
--static int cbq_set_lss(struct cbq_class *cl, struct tc_cbq_lssopt *lss)
--{
-- if (lss->change & TCF_CBQ_LSS_FLAGS) {
-- cl->share = (lss->flags & TCF_CBQ_LSS_ISOLATED) ? NULL : cl->tparent;
-- cl->borrow = (lss->flags & TCF_CBQ_LSS_BOUNDED) ? NULL : cl->tparent;
-- }
-- if (lss->change & TCF_CBQ_LSS_EWMA)
-- cl->ewma_log = lss->ewma_log;
-- if (lss->change & TCF_CBQ_LSS_AVPKT)
-- cl->avpkt = lss->avpkt;
-- if (lss->change & TCF_CBQ_LSS_MINIDLE)
-- cl->minidle = -(long)lss->minidle;
-- if (lss->change & TCF_CBQ_LSS_MAXIDLE) {
-- cl->maxidle = lss->maxidle;
-- cl->avgidle = lss->maxidle;
-- }
-- if (lss->change & TCF_CBQ_LSS_OFFTIME)
-- cl->offtime = lss->offtime;
-- return 0;
--}
--
--static void cbq_rmprio(struct cbq_sched_data *q, struct cbq_class *cl)
--{
-- q->nclasses[cl->priority]--;
-- q->quanta[cl->priority] -= cl->weight;
-- cbq_normalize_quanta(q, cl->priority);
--}
--
--static void cbq_addprio(struct cbq_sched_data *q, struct cbq_class *cl)
--{
-- q->nclasses[cl->priority]++;
-- q->quanta[cl->priority] += cl->weight;
-- cbq_normalize_quanta(q, cl->priority);
--}
--
--static int cbq_set_wrr(struct cbq_class *cl, struct tc_cbq_wrropt *wrr)
--{
-- struct cbq_sched_data *q = qdisc_priv(cl->qdisc);
--
-- if (wrr->allot)
-- cl->allot = wrr->allot;
-- if (wrr->weight)
-- cl->weight = wrr->weight;
-- if (wrr->priority) {
-- cl->priority = wrr->priority - 1;
-- cl->cpriority = cl->priority;
-- if (cl->priority >= cl->priority2)
-- cl->priority2 = TC_CBQ_MAXPRIO - 1;
-- }
--
-- cbq_addprio(q, cl);
-- return 0;
--}
--
--static int cbq_set_fopt(struct cbq_class *cl, struct tc_cbq_fopt *fopt)
--{
-- cbq_change_defmap(cl, fopt->split, fopt->defmap, fopt->defchange);
-- return 0;
--}
--
--static const struct nla_policy cbq_policy[TCA_CBQ_MAX + 1] = {
-- [TCA_CBQ_LSSOPT] = { .len = sizeof(struct tc_cbq_lssopt) },
-- [TCA_CBQ_WRROPT] = { .len = sizeof(struct tc_cbq_wrropt) },
-- [TCA_CBQ_FOPT] = { .len = sizeof(struct tc_cbq_fopt) },
-- [TCA_CBQ_OVL_STRATEGY] = { .len = sizeof(struct tc_cbq_ovl) },
-- [TCA_CBQ_RATE] = { .len = sizeof(struct tc_ratespec) },
-- [TCA_CBQ_RTAB] = { .type = NLA_BINARY, .len = TC_RTAB_SIZE },
-- [TCA_CBQ_POLICE] = { .len = sizeof(struct tc_cbq_police) },
--};
--
--static int cbq_opt_parse(struct nlattr *tb[TCA_CBQ_MAX + 1],
-- struct nlattr *opt,
-- struct netlink_ext_ack *extack)
--{
-- int err;
--
-- if (!opt) {
-- NL_SET_ERR_MSG(extack, "CBQ options are required for this operation");
-- return -EINVAL;
-- }
--
-- err = nla_parse_nested_deprecated(tb, TCA_CBQ_MAX, opt,
-- cbq_policy, extack);
-- if (err < 0)
-- return err;
--
-- if (tb[TCA_CBQ_WRROPT]) {
-- const struct tc_cbq_wrropt *wrr = nla_data(tb[TCA_CBQ_WRROPT]);
--
-- if (wrr->priority > TC_CBQ_MAXPRIO) {
-- NL_SET_ERR_MSG(extack, "priority is bigger than TC_CBQ_MAXPRIO");
-- err = -EINVAL;
-- }
-- }
-- return err;
--}
--
--static int cbq_init(struct Qdisc *sch, struct nlattr *opt,
-- struct netlink_ext_ack *extack)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct nlattr *tb[TCA_CBQ_MAX + 1];
-- struct tc_ratespec *r;
-- int err;
--
-- qdisc_watchdog_init(&q->watchdog, sch);
-- hrtimer_init(&q->delay_timer, CLOCK_MONOTONIC, HRTIMER_MODE_ABS_PINNED);
-- q->delay_timer.function = cbq_undelay;
--
-- err = cbq_opt_parse(tb, opt, extack);
-- if (err < 0)
-- return err;
--
-- if (!tb[TCA_CBQ_RTAB] || !tb[TCA_CBQ_RATE]) {
-- NL_SET_ERR_MSG(extack, "Rate specification missing or incomplete");
-- return -EINVAL;
-- }
--
-- r = nla_data(tb[TCA_CBQ_RATE]);
--
-- q->link.R_tab = qdisc_get_rtab(r, tb[TCA_CBQ_RTAB], extack);
-- if (!q->link.R_tab)
-- return -EINVAL;
--
-- err = tcf_block_get(&q->link.block, &q->link.filter_list, sch, extack);
-- if (err)
-- goto put_rtab;
--
-- err = qdisc_class_hash_init(&q->clhash);
-- if (err < 0)
-- goto put_block;
--
-- q->link.sibling = &q->link;
-- q->link.common.classid = sch->handle;
-- q->link.qdisc = sch;
-- q->link.q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
-- sch->handle, NULL);
-- if (!q->link.q)
-- q->link.q = &noop_qdisc;
-- else
-- qdisc_hash_add(q->link.q, true);
--
-- q->link.priority = TC_CBQ_MAXPRIO - 1;
-- q->link.priority2 = TC_CBQ_MAXPRIO - 1;
-- q->link.cpriority = TC_CBQ_MAXPRIO - 1;
-- q->link.allot = psched_mtu(qdisc_dev(sch));
-- q->link.quantum = q->link.allot;
-- q->link.weight = q->link.R_tab->rate.rate;
--
-- q->link.ewma_log = TC_CBQ_DEF_EWMA;
-- q->link.avpkt = q->link.allot/2;
-- q->link.minidle = -0x7FFFFFFF;
--
-- q->toplevel = TC_CBQ_MAXLEVEL;
-- q->now = psched_get_time();
--
-- cbq_link_class(&q->link);
--
-- if (tb[TCA_CBQ_LSSOPT])
-- cbq_set_lss(&q->link, nla_data(tb[TCA_CBQ_LSSOPT]));
--
-- cbq_addprio(q, &q->link);
-- return 0;
--
--put_block:
-- tcf_block_put(q->link.block);
--
--put_rtab:
-- qdisc_put_rtab(q->link.R_tab);
-- return err;
--}
--
--static int cbq_dump_rate(struct sk_buff *skb, struct cbq_class *cl)
--{
-- unsigned char *b = skb_tail_pointer(skb);
--
-- if (nla_put(skb, TCA_CBQ_RATE, sizeof(cl->R_tab->rate), &cl->R_tab->rate))
-- goto nla_put_failure;
-- return skb->len;
--
--nla_put_failure:
-- nlmsg_trim(skb, b);
-- return -1;
--}
--
--static int cbq_dump_lss(struct sk_buff *skb, struct cbq_class *cl)
--{
-- unsigned char *b = skb_tail_pointer(skb);
-- struct tc_cbq_lssopt opt;
--
-- opt.flags = 0;
-- if (cl->borrow == NULL)
-- opt.flags |= TCF_CBQ_LSS_BOUNDED;
-- if (cl->share == NULL)
-- opt.flags |= TCF_CBQ_LSS_ISOLATED;
-- opt.ewma_log = cl->ewma_log;
-- opt.level = cl->level;
-- opt.avpkt = cl->avpkt;
-- opt.maxidle = cl->maxidle;
-- opt.minidle = (u32)(-cl->minidle);
-- opt.offtime = cl->offtime;
-- opt.change = ~0;
-- if (nla_put(skb, TCA_CBQ_LSSOPT, sizeof(opt), &opt))
-- goto nla_put_failure;
-- return skb->len;
--
--nla_put_failure:
-- nlmsg_trim(skb, b);
-- return -1;
--}
--
--static int cbq_dump_wrr(struct sk_buff *skb, struct cbq_class *cl)
--{
-- unsigned char *b = skb_tail_pointer(skb);
-- struct tc_cbq_wrropt opt;
--
-- memset(&opt, 0, sizeof(opt));
-- opt.flags = 0;
-- opt.allot = cl->allot;
-- opt.priority = cl->priority + 1;
-- opt.cpriority = cl->cpriority + 1;
-- opt.weight = cl->weight;
-- if (nla_put(skb, TCA_CBQ_WRROPT, sizeof(opt), &opt))
-- goto nla_put_failure;
-- return skb->len;
--
--nla_put_failure:
-- nlmsg_trim(skb, b);
-- return -1;
--}
--
--static int cbq_dump_fopt(struct sk_buff *skb, struct cbq_class *cl)
--{
-- unsigned char *b = skb_tail_pointer(skb);
-- struct tc_cbq_fopt opt;
--
-- if (cl->split || cl->defmap) {
-- opt.split = cl->split ? cl->split->common.classid : 0;
-- opt.defmap = cl->defmap;
-- opt.defchange = ~0;
-- if (nla_put(skb, TCA_CBQ_FOPT, sizeof(opt), &opt))
-- goto nla_put_failure;
-- }
-- return skb->len;
--
--nla_put_failure:
-- nlmsg_trim(skb, b);
-- return -1;
--}
--
--static int cbq_dump_attr(struct sk_buff *skb, struct cbq_class *cl)
--{
-- if (cbq_dump_lss(skb, cl) < 0 ||
-- cbq_dump_rate(skb, cl) < 0 ||
-- cbq_dump_wrr(skb, cl) < 0 ||
-- cbq_dump_fopt(skb, cl) < 0)
-- return -1;
-- return 0;
--}
--
--static int cbq_dump(struct Qdisc *sch, struct sk_buff *skb)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct nlattr *nest;
--
-- nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
-- if (nest == NULL)
-- goto nla_put_failure;
-- if (cbq_dump_attr(skb, &q->link) < 0)
-- goto nla_put_failure;
-- return nla_nest_end(skb, nest);
--
--nla_put_failure:
-- nla_nest_cancel(skb, nest);
-- return -1;
--}
--
--static int
--cbq_dump_stats(struct Qdisc *sch, struct gnet_dump *d)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
--
-- q->link.xstats.avgidle = q->link.avgidle;
-- return gnet_stats_copy_app(d, &q->link.xstats, sizeof(q->link.xstats));
--}
--
--static int
--cbq_dump_class(struct Qdisc *sch, unsigned long arg,
-- struct sk_buff *skb, struct tcmsg *tcm)
--{
-- struct cbq_class *cl = (struct cbq_class *)arg;
-- struct nlattr *nest;
--
-- if (cl->tparent)
-- tcm->tcm_parent = cl->tparent->common.classid;
-- else
-- tcm->tcm_parent = TC_H_ROOT;
-- tcm->tcm_handle = cl->common.classid;
-- tcm->tcm_info = cl->q->handle;
--
-- nest = nla_nest_start_noflag(skb, TCA_OPTIONS);
-- if (nest == NULL)
-- goto nla_put_failure;
-- if (cbq_dump_attr(skb, cl) < 0)
-- goto nla_put_failure;
-- return nla_nest_end(skb, nest);
--
--nla_put_failure:
-- nla_nest_cancel(skb, nest);
-- return -1;
--}
--
--static int
--cbq_dump_class_stats(struct Qdisc *sch, unsigned long arg,
-- struct gnet_dump *d)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *cl = (struct cbq_class *)arg;
-- __u32 qlen;
--
-- cl->xstats.avgidle = cl->avgidle;
-- cl->xstats.undertime = 0;
-- qdisc_qstats_qlen_backlog(cl->q, &qlen, &cl->qstats.backlog);
--
-- if (cl->undertime != PSCHED_PASTPERFECT)
-- cl->xstats.undertime = cl->undertime - q->now;
--
-- if (gnet_stats_copy_basic(qdisc_root_sleeping_running(sch),
-- d, NULL, &cl->bstats) < 0 ||
-- gnet_stats_copy_rate_est(d, &cl->rate_est) < 0 ||
-- gnet_stats_copy_queue(d, NULL, &cl->qstats, qlen) < 0)
-- return -1;
--
-- return gnet_stats_copy_app(d, &cl->xstats, sizeof(cl->xstats));
--}
--
--static int cbq_graft(struct Qdisc *sch, unsigned long arg, struct Qdisc *new,
-- struct Qdisc **old, struct netlink_ext_ack *extack)
--{
-- struct cbq_class *cl = (struct cbq_class *)arg;
--
-- if (new == NULL) {
-- new = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
-- cl->common.classid, extack);
-- if (new == NULL)
-- return -ENOBUFS;
-- }
--
-- *old = qdisc_replace(sch, new, &cl->q);
-- return 0;
--}
--
--static struct Qdisc *cbq_leaf(struct Qdisc *sch, unsigned long arg)
--{
-- struct cbq_class *cl = (struct cbq_class *)arg;
--
-- return cl->q;
--}
--
--static void cbq_qlen_notify(struct Qdisc *sch, unsigned long arg)
--{
-- struct cbq_class *cl = (struct cbq_class *)arg;
--
-- cbq_deactivate_class(cl);
--}
--
--static unsigned long cbq_find(struct Qdisc *sch, u32 classid)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
--
-- return (unsigned long)cbq_class_lookup(q, classid);
--}
--
--static void cbq_destroy_class(struct Qdisc *sch, struct cbq_class *cl)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
--
-- WARN_ON(cl->filters);
--
-- tcf_block_put(cl->block);
-- qdisc_put(cl->q);
-- qdisc_put_rtab(cl->R_tab);
-- gen_kill_estimator(&cl->rate_est);
-- if (cl != &q->link)
-- kfree(cl);
--}
--
--static void cbq_destroy(struct Qdisc *sch)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct hlist_node *next;
-- struct cbq_class *cl;
-- unsigned int h;
--
--#ifdef CONFIG_NET_CLS_ACT
-- q->rx_class = NULL;
--#endif
-- /*
-- * Filters must be destroyed first because we don't destroy the
-- * classes from root to leafs which means that filters can still
-- * be bound to classes which have been destroyed already. --TGR '04
-- */
-- for (h = 0; h < q->clhash.hashsize; h++) {
-- hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
-- tcf_block_put(cl->block);
-- cl->block = NULL;
-- }
-- }
-- for (h = 0; h < q->clhash.hashsize; h++) {
-- hlist_for_each_entry_safe(cl, next, &q->clhash.hash[h],
-- common.hnode)
-- cbq_destroy_class(sch, cl);
-- }
-- qdisc_class_hash_destroy(&q->clhash);
--}
--
--static int
--cbq_change_class(struct Qdisc *sch, u32 classid, u32 parentid, struct nlattr **tca,
-- unsigned long *arg, struct netlink_ext_ack *extack)
--{
-- int err;
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *cl = (struct cbq_class *)*arg;
-- struct nlattr *opt = tca[TCA_OPTIONS];
-- struct nlattr *tb[TCA_CBQ_MAX + 1];
-- struct cbq_class *parent;
-- struct qdisc_rate_table *rtab = NULL;
--
-- err = cbq_opt_parse(tb, opt, extack);
-- if (err < 0)
-- return err;
--
-- if (tb[TCA_CBQ_OVL_STRATEGY] || tb[TCA_CBQ_POLICE]) {
-- NL_SET_ERR_MSG(extack, "Neither overlimit strategy nor policing attributes can be used for changing class params");
-- return -EOPNOTSUPP;
-- }
--
-- if (cl) {
-- /* Check parent */
-- if (parentid) {
-- if (cl->tparent &&
-- cl->tparent->common.classid != parentid) {
-- NL_SET_ERR_MSG(extack, "Invalid parent id");
-- return -EINVAL;
-- }
-- if (!cl->tparent && parentid != TC_H_ROOT) {
-- NL_SET_ERR_MSG(extack, "Parent must be root");
-- return -EINVAL;
-- }
-- }
--
-- if (tb[TCA_CBQ_RATE]) {
-- rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]),
-- tb[TCA_CBQ_RTAB], extack);
-- if (rtab == NULL)
-- return -EINVAL;
-- }
--
-- if (tca[TCA_RATE]) {
-- err = gen_replace_estimator(&cl->bstats, NULL,
-- &cl->rate_est,
-- NULL,
-- qdisc_root_sleeping_running(sch),
-- tca[TCA_RATE]);
-- if (err) {
-- NL_SET_ERR_MSG(extack, "Failed to replace specified rate estimator");
-- qdisc_put_rtab(rtab);
-- return err;
-- }
-- }
--
-- /* Change class parameters */
-- sch_tree_lock(sch);
--
-- if (cl->next_alive != NULL)
-- cbq_deactivate_class(cl);
--
-- if (rtab) {
-- qdisc_put_rtab(cl->R_tab);
-- cl->R_tab = rtab;
-- }
--
-- if (tb[TCA_CBQ_LSSOPT])
-- cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
--
-- if (tb[TCA_CBQ_WRROPT]) {
-- cbq_rmprio(q, cl);
-- cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
-- }
--
-- if (tb[TCA_CBQ_FOPT])
-- cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
--
-- if (cl->q->q.qlen)
-- cbq_activate_class(cl);
--
-- sch_tree_unlock(sch);
--
-- return 0;
-- }
--
-- if (parentid == TC_H_ROOT)
-- return -EINVAL;
--
-- if (!tb[TCA_CBQ_WRROPT] || !tb[TCA_CBQ_RATE] || !tb[TCA_CBQ_LSSOPT]) {
-- NL_SET_ERR_MSG(extack, "One of the following attributes MUST be specified: WRR, rate or link sharing");
-- return -EINVAL;
-- }
--
-- rtab = qdisc_get_rtab(nla_data(tb[TCA_CBQ_RATE]), tb[TCA_CBQ_RTAB],
-- extack);
-- if (rtab == NULL)
-- return -EINVAL;
--
-- if (classid) {
-- err = -EINVAL;
-- if (TC_H_MAJ(classid ^ sch->handle) ||
-- cbq_class_lookup(q, classid)) {
-- NL_SET_ERR_MSG(extack, "Specified class not found");
-- goto failure;
-- }
-- } else {
-- int i;
-- classid = TC_H_MAKE(sch->handle, 0x8000);
--
-- for (i = 0; i < 0x8000; i++) {
-- if (++q->hgenerator >= 0x8000)
-- q->hgenerator = 1;
-- if (cbq_class_lookup(q, classid|q->hgenerator) == NULL)
-- break;
-- }
-- err = -ENOSR;
-- if (i >= 0x8000) {
-- NL_SET_ERR_MSG(extack, "Unable to generate classid");
-- goto failure;
-- }
-- classid = classid|q->hgenerator;
-- }
--
-- parent = &q->link;
-- if (parentid) {
-- parent = cbq_class_lookup(q, parentid);
-- err = -EINVAL;
-- if (!parent) {
-- NL_SET_ERR_MSG(extack, "Failed to find parentid");
-- goto failure;
-- }
-- }
--
-- err = -ENOBUFS;
-- cl = kzalloc(sizeof(*cl), GFP_KERNEL);
-- if (cl == NULL)
-- goto failure;
--
-- err = tcf_block_get(&cl->block, &cl->filter_list, sch, extack);
-- if (err) {
-- kfree(cl);
-- goto failure;
-- }
--
-- if (tca[TCA_RATE]) {
-- err = gen_new_estimator(&cl->bstats, NULL, &cl->rate_est,
-- NULL,
-- qdisc_root_sleeping_running(sch),
-- tca[TCA_RATE]);
-- if (err) {
-- NL_SET_ERR_MSG(extack, "Couldn't create new estimator");
-- tcf_block_put(cl->block);
-- kfree(cl);
-- goto failure;
-- }
-- }
--
-- cl->R_tab = rtab;
-- rtab = NULL;
-- cl->q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops, classid,
-- NULL);
-- if (!cl->q)
-- cl->q = &noop_qdisc;
-- else
-- qdisc_hash_add(cl->q, true);
--
-- cl->common.classid = classid;
-- cl->tparent = parent;
-- cl->qdisc = sch;
-- cl->allot = parent->allot;
-- cl->quantum = cl->allot;
-- cl->weight = cl->R_tab->rate.rate;
--
-- sch_tree_lock(sch);
-- cbq_link_class(cl);
-- cl->borrow = cl->tparent;
-- if (cl->tparent != &q->link)
-- cl->share = cl->tparent;
-- cbq_adjust_levels(parent);
-- cl->minidle = -0x7FFFFFFF;
-- cbq_set_lss(cl, nla_data(tb[TCA_CBQ_LSSOPT]));
-- cbq_set_wrr(cl, nla_data(tb[TCA_CBQ_WRROPT]));
-- if (cl->ewma_log == 0)
-- cl->ewma_log = q->link.ewma_log;
-- if (cl->maxidle == 0)
-- cl->maxidle = q->link.maxidle;
-- if (cl->avpkt == 0)
-- cl->avpkt = q->link.avpkt;
-- if (tb[TCA_CBQ_FOPT])
-- cbq_set_fopt(cl, nla_data(tb[TCA_CBQ_FOPT]));
-- sch_tree_unlock(sch);
--
-- qdisc_class_hash_grow(sch, &q->clhash);
--
-- *arg = (unsigned long)cl;
-- return 0;
--
--failure:
-- qdisc_put_rtab(rtab);
-- return err;
--}
--
--static int cbq_delete(struct Qdisc *sch, unsigned long arg)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *cl = (struct cbq_class *)arg;
--
-- if (cl->filters || cl->children || cl == &q->link)
-- return -EBUSY;
--
-- sch_tree_lock(sch);
--
-- qdisc_purge_queue(cl->q);
--
-- if (cl->next_alive)
-- cbq_deactivate_class(cl);
--
-- if (q->tx_borrowed == cl)
-- q->tx_borrowed = q->tx_class;
-- if (q->tx_class == cl) {
-- q->tx_class = NULL;
-- q->tx_borrowed = NULL;
-- }
--#ifdef CONFIG_NET_CLS_ACT
-- if (q->rx_class == cl)
-- q->rx_class = NULL;
--#endif
--
-- cbq_unlink_class(cl);
-- cbq_adjust_levels(cl->tparent);
-- cl->defmap = 0;
-- cbq_sync_defmap(cl);
--
-- cbq_rmprio(q, cl);
-- sch_tree_unlock(sch);
--
-- cbq_destroy_class(sch, cl);
-- return 0;
--}
--
--static struct tcf_block *cbq_tcf_block(struct Qdisc *sch, unsigned long arg,
-- struct netlink_ext_ack *extack)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *cl = (struct cbq_class *)arg;
--
-- if (cl == NULL)
-- cl = &q->link;
--
-- return cl->block;
--}
--
--static unsigned long cbq_bind_filter(struct Qdisc *sch, unsigned long parent,
-- u32 classid)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *p = (struct cbq_class *)parent;
-- struct cbq_class *cl = cbq_class_lookup(q, classid);
--
-- if (cl) {
-- if (p && p->level <= cl->level)
-- return 0;
-- cl->filters++;
-- return (unsigned long)cl;
-- }
-- return 0;
--}
--
--static void cbq_unbind_filter(struct Qdisc *sch, unsigned long arg)
--{
-- struct cbq_class *cl = (struct cbq_class *)arg;
--
-- cl->filters--;
--}
--
--static void cbq_walk(struct Qdisc *sch, struct qdisc_walker *arg)
--{
-- struct cbq_sched_data *q = qdisc_priv(sch);
-- struct cbq_class *cl;
-- unsigned int h;
--
-- if (arg->stop)
-- return;
--
-- for (h = 0; h < q->clhash.hashsize; h++) {
-- hlist_for_each_entry(cl, &q->clhash.hash[h], common.hnode) {
-- if (arg->count < arg->skip) {
-- arg->count++;
-- continue;
-- }
-- if (arg->fn(sch, (unsigned long)cl, arg) < 0) {
-- arg->stop = 1;
-- return;
-- }
-- arg->count++;
-- }
-- }
--}
--
--static const struct Qdisc_class_ops cbq_class_ops = {
-- .graft = cbq_graft,
-- .leaf = cbq_leaf,
-- .qlen_notify = cbq_qlen_notify,
-- .find = cbq_find,
-- .change = cbq_change_class,
-- .delete = cbq_delete,
-- .walk = cbq_walk,
-- .tcf_block = cbq_tcf_block,
-- .bind_tcf = cbq_bind_filter,
-- .unbind_tcf = cbq_unbind_filter,
-- .dump = cbq_dump_class,
-- .dump_stats = cbq_dump_class_stats,
--};
--
--static struct Qdisc_ops cbq_qdisc_ops __read_mostly = {
-- .next = NULL,
-- .cl_ops = &cbq_class_ops,
-- .id = "cbq",
-- .priv_size = sizeof(struct cbq_sched_data),
-- .enqueue = cbq_enqueue,
-- .dequeue = cbq_dequeue,
-- .peek = qdisc_peek_dequeued,
-- .init = cbq_init,
-- .reset = cbq_reset,
-- .destroy = cbq_destroy,
-- .change = NULL,
-- .dump = cbq_dump,
-- .dump_stats = cbq_dump_stats,
-- .owner = THIS_MODULE,
--};
--
--static int __init cbq_module_init(void)
--{
-- return register_qdisc(&cbq_qdisc_ops);
--}
--static void __exit cbq_module_exit(void)
--{
-- unregister_qdisc(&cbq_qdisc_ops);
--}
--module_init(cbq_module_init)
--module_exit(cbq_module_exit)
--MODULE_LICENSE("GPL");
diff --git a/queue-5.4/net-sched-retire-dsmark-qdisc.patch b/queue-5.4/net-sched-retire-dsmark-qdisc.patch
deleted file mode 100644
index 72b722c822..0000000000
--- a/queue-5.4/net-sched-retire-dsmark-qdisc.patch
+++ /dev/null
@@ -1,582 +0,0 @@
-From bbe77c14ee6185a61ba6d5e435c1cbb489d2a9ed Mon Sep 17 00:00:00 2001
-From: Jamal Hadi Salim <jhs@mojatatu.com>
-Date: Tue, 14 Feb 2023 08:49:13 -0500
-Subject: net/sched: Retire dsmark qdisc
-
-From: Jamal Hadi Salim <jhs@mojatatu.com>
-
-commit bbe77c14ee6185a61ba6d5e435c1cbb489d2a9ed upstream.
-
-The dsmark qdisc has served us well over the years for diffserv but has not
-been getting much attention due to other more popular approaches to do diffserv
-services. Most recently it has become a shooting target for syzkaller. For this
-reason, we are retiring it.
-
-Signed-off-by: Jamal Hadi Salim <jhs@mojatatu.com>
-Acked-by: Jiri Pirko <jiri@nvidia.com>
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- net/sched/Kconfig | 11 -
- net/sched/Makefile | 1
- net/sched/sch_dsmark.c | 523 -------------------------------------------------
- 3 files changed, 535 deletions(-)
- delete mode 100644 net/sched/sch_dsmark.c
- delete mode 100644 tools/testing/selftests/tc-testing/tc-tests/qdiscs/dsmark.json
-
---- a/net/sched/Kconfig
-+++ b/net/sched/Kconfig
-@@ -186,17 +186,6 @@ config NET_SCH_GRED
- To compile this code as a module, choose M here: the
- module will be called sch_gred.
-
--config NET_SCH_DSMARK
-- tristate "Differentiated Services marker (DSMARK)"
-- ---help---
-- Say Y if you want to schedule packets according to the
-- Differentiated Services architecture proposed in RFC 2475.
-- Technical information on this method, with pointers to associated
-- RFCs, is available at <http://www.gta.ufrj.br/diffserv/>.
--
-- To compile this code as a module, choose M here: the
-- module will be called sch_dsmark.
--
- config NET_SCH_NETEM
- tristate "Network emulator (NETEM)"
- ---help---
---- a/net/sched/Makefile
-+++ b/net/sched/Makefile
-@@ -36,7 +36,6 @@ obj-$(CONFIG_NET_SCH_HFSC) += sch_hfsc.o
- obj-$(CONFIG_NET_SCH_RED) += sch_red.o
- obj-$(CONFIG_NET_SCH_GRED) += sch_gred.o
- obj-$(CONFIG_NET_SCH_INGRESS) += sch_ingress.o
--obj-$(CONFIG_NET_SCH_DSMARK) += sch_dsmark.o
- obj-$(CONFIG_NET_SCH_SFB) += sch_sfb.o
- obj-$(CONFIG_NET_SCH_SFQ) += sch_sfq.o
- obj-$(CONFIG_NET_SCH_TBF) += sch_tbf.o
---- a/net/sched/sch_dsmark.c
-+++ /dev/null
-@@ -1,523 +0,0 @@
--// SPDX-License-Identifier: GPL-2.0-only
--/* net/sched/sch_dsmark.c - Differentiated Services field marker */
--
--/* Written 1998-2000 by Werner Almesberger, EPFL ICA */
--
--
--#include <linux/module.h>
--#include <linux/init.h>
--#include <linux/slab.h>
--#include <linux/types.h>
--#include <linux/string.h>
--#include <linux/errno.h>
--#include <linux/skbuff.h>
--#include <linux/rtnetlink.h>
--#include <linux/bitops.h>
--#include <net/pkt_sched.h>
--#include <net/pkt_cls.h>
--#include <net/dsfield.h>
--#include <net/inet_ecn.h>
--#include <asm/byteorder.h>
--
--/*
-- * classid class marking
-- * ------- ----- -------
-- * n/a 0 n/a
-- * x:0 1 use entry [0]
-- * ... ... ...
-- * x:y y>0 y+1 use entry [y]
-- * ... ... ...
-- * x:indices-1 indices use entry [indices-1]
-- * ... ... ...
-- * x:y y+1 use entry [y & (indices-1)]
-- * ... ... ...
-- * 0xffff 0x10000 use entry [indices-1]
-- */
--
--
--#define NO_DEFAULT_INDEX (1 << 16)
--
--struct mask_value {
-- u8 mask;
-- u8 value;
--};
--
--struct dsmark_qdisc_data {
-- struct Qdisc *q;
-- struct tcf_proto __rcu *filter_list;
-- struct tcf_block *block;
-- struct mask_value *mv;
-- u16 indices;
-- u8 set_tc_index;
-- u32 default_index; /* index range is 0...0xffff */
--#define DSMARK_EMBEDDED_SZ 16
-- struct mask_value embedded[DSMARK_EMBEDDED_SZ];
--};
--
--static inline int dsmark_valid_index(struct dsmark_qdisc_data *p, u16 index)
--{
-- return index <= p->indices && index > 0;
--}
--
--/* ------------------------- Class/flow operations ------------------------- */
--
--static int dsmark_graft(struct Qdisc *sch, unsigned long arg,
-- struct Qdisc *new, struct Qdisc **old,
-- struct netlink_ext_ack *extack)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
--
-- pr_debug("%s(sch %p,[qdisc %p],new %p,old %p)\n",
-- __func__, sch, p, new, old);
--
-- if (new == NULL) {
-- new = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops,
-- sch->handle, NULL);
-- if (new == NULL)
-- new = &noop_qdisc;
-- }
--
-- *old = qdisc_replace(sch, new, &p->q);
-- return 0;
--}
--
--static struct Qdisc *dsmark_leaf(struct Qdisc *sch, unsigned long arg)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- return p->q;
--}
--
--static unsigned long dsmark_find(struct Qdisc *sch, u32 classid)
--{
-- return TC_H_MIN(classid) + 1;
--}
--
--static unsigned long dsmark_bind_filter(struct Qdisc *sch,
-- unsigned long parent, u32 classid)
--{
-- pr_debug("%s(sch %p,[qdisc %p],classid %x)\n",
-- __func__, sch, qdisc_priv(sch), classid);
--
-- return dsmark_find(sch, classid);
--}
--
--static void dsmark_unbind_filter(struct Qdisc *sch, unsigned long cl)
--{
--}
--
--static const struct nla_policy dsmark_policy[TCA_DSMARK_MAX + 1] = {
-- [TCA_DSMARK_INDICES] = { .type = NLA_U16 },
-- [TCA_DSMARK_DEFAULT_INDEX] = { .type = NLA_U16 },
-- [TCA_DSMARK_SET_TC_INDEX] = { .type = NLA_FLAG },
-- [TCA_DSMARK_MASK] = { .type = NLA_U8 },
-- [TCA_DSMARK_VALUE] = { .type = NLA_U8 },
--};
--
--static int dsmark_change(struct Qdisc *sch, u32 classid, u32 parent,
-- struct nlattr **tca, unsigned long *arg,
-- struct netlink_ext_ack *extack)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- struct nlattr *opt = tca[TCA_OPTIONS];
-- struct nlattr *tb[TCA_DSMARK_MAX + 1];
-- int err = -EINVAL;
--
-- pr_debug("%s(sch %p,[qdisc %p],classid %x,parent %x), arg 0x%lx\n",
-- __func__, sch, p, classid, parent, *arg);
--
-- if (!dsmark_valid_index(p, *arg)) {
-- err = -ENOENT;
-- goto errout;
-- }
--
-- if (!opt)
-- goto errout;
--
-- err = nla_parse_nested_deprecated(tb, TCA_DSMARK_MAX, opt,
-- dsmark_policy, NULL);
-- if (err < 0)
-- goto errout;
--
-- if (tb[TCA_DSMARK_VALUE])
-- p->mv[*arg - 1].value = nla_get_u8(tb[TCA_DSMARK_VALUE]);
--
-- if (tb[TCA_DSMARK_MASK])
-- p->mv[*arg - 1].mask = nla_get_u8(tb[TCA_DSMARK_MASK]);
--
-- err = 0;
--
--errout:
-- return err;
--}
--
--static int dsmark_delete(struct Qdisc *sch, unsigned long arg)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
--
-- if (!dsmark_valid_index(p, arg))
-- return -EINVAL;
--
-- p->mv[arg - 1].mask = 0xff;
-- p->mv[arg - 1].value = 0;
--
-- return 0;
--}
--
--static void dsmark_walk(struct Qdisc *sch, struct qdisc_walker *walker)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- int i;
--
-- pr_debug("%s(sch %p,[qdisc %p],walker %p)\n",
-- __func__, sch, p, walker);
--
-- if (walker->stop)
-- return;
--
-- for (i = 0; i < p->indices; i++) {
-- if (p->mv[i].mask == 0xff && !p->mv[i].value)
-- goto ignore;
-- if (walker->count >= walker->skip) {
-- if (walker->fn(sch, i + 1, walker) < 0) {
-- walker->stop = 1;
-- break;
-- }
-- }
--ignore:
-- walker->count++;
-- }
--}
--
--static struct tcf_block *dsmark_tcf_block(struct Qdisc *sch, unsigned long cl,
-- struct netlink_ext_ack *extack)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
--
-- return p->block;
--}
--
--/* --------------------------- Qdisc operations ---------------------------- */
--
--static int dsmark_enqueue(struct sk_buff *skb, struct Qdisc *sch,
-- struct sk_buff **to_free)
--{
-- unsigned int len = qdisc_pkt_len(skb);
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- int err;
--
-- pr_debug("%s(skb %p,sch %p,[qdisc %p])\n", __func__, skb, sch, p);
--
-- if (p->set_tc_index) {
-- int wlen = skb_network_offset(skb);
--
-- switch (skb_protocol(skb, true)) {
-- case htons(ETH_P_IP):
-- wlen += sizeof(struct iphdr);
-- if (!pskb_may_pull(skb, wlen) ||
-- skb_try_make_writable(skb, wlen))
-- goto drop;
--
-- skb->tc_index = ipv4_get_dsfield(ip_hdr(skb))
-- & ~INET_ECN_MASK;
-- break;
--
-- case htons(ETH_P_IPV6):
-- wlen += sizeof(struct ipv6hdr);
-- if (!pskb_may_pull(skb, wlen) ||
-- skb_try_make_writable(skb, wlen))
-- goto drop;
--
-- skb->tc_index = ipv6_get_dsfield(ipv6_hdr(skb))
-- & ~INET_ECN_MASK;
-- break;
-- default:
-- skb->tc_index = 0;
-- break;
-- }
-- }
--
-- if (TC_H_MAJ(skb->priority) == sch->handle)
-- skb->tc_index = TC_H_MIN(skb->priority);
-- else {
-- struct tcf_result res;
-- struct tcf_proto *fl = rcu_dereference_bh(p->filter_list);
-- int result = tcf_classify(skb, fl, &res, false);
--
-- pr_debug("result %d class 0x%04x\n", result, res.classid);
--
-- switch (result) {
--#ifdef CONFIG_NET_CLS_ACT
-- case TC_ACT_QUEUED:
-- case TC_ACT_STOLEN:
-- case TC_ACT_TRAP:
-- __qdisc_drop(skb, to_free);
-- return NET_XMIT_SUCCESS | __NET_XMIT_STOLEN;
--
-- case TC_ACT_SHOT:
-- goto drop;
--#endif
-- case TC_ACT_OK:
-- skb->tc_index = TC_H_MIN(res.classid);
-- break;
--
-- default:
-- if (p->default_index != NO_DEFAULT_INDEX)
-- skb->tc_index = p->default_index;
-- break;
-- }
-- }
--
-- err = qdisc_enqueue(skb, p->q, to_free);
-- if (err != NET_XMIT_SUCCESS) {
-- if (net_xmit_drop_count(err))
-- qdisc_qstats_drop(sch);
-- return err;
-- }
--
-- sch->qstats.backlog += len;
-- sch->q.qlen++;
--
-- return NET_XMIT_SUCCESS;
--
--drop:
-- qdisc_drop(skb, sch, to_free);
-- return NET_XMIT_SUCCESS | __NET_XMIT_BYPASS;
--}
--
--static struct sk_buff *dsmark_dequeue(struct Qdisc *sch)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- struct sk_buff *skb;
-- u32 index;
--
-- pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p);
--
-- skb = qdisc_dequeue_peeked(p->q);
-- if (skb == NULL)
-- return NULL;
--
-- qdisc_bstats_update(sch, skb);
-- qdisc_qstats_backlog_dec(sch, skb);
-- sch->q.qlen--;
--
-- index = skb->tc_index & (p->indices - 1);
-- pr_debug("index %d->%d\n", skb->tc_index, index);
--
-- switch (skb_protocol(skb, true)) {
-- case htons(ETH_P_IP):
-- ipv4_change_dsfield(ip_hdr(skb), p->mv[index].mask,
-- p->mv[index].value);
-- break;
-- case htons(ETH_P_IPV6):
-- ipv6_change_dsfield(ipv6_hdr(skb), p->mv[index].mask,
-- p->mv[index].value);
-- break;
-- default:
-- /*
-- * Only complain if a change was actually attempted.
-- * This way, we can send non-IP traffic through dsmark
-- * and don't need yet another qdisc as a bypass.
-- */
-- if (p->mv[index].mask != 0xff || p->mv[index].value)
-- pr_warn("%s: unsupported protocol %d\n",
-- __func__, ntohs(skb_protocol(skb, true)));
-- break;
-- }
--
-- return skb;
--}
--
--static struct sk_buff *dsmark_peek(struct Qdisc *sch)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
--
-- pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p);
--
-- return p->q->ops->peek(p->q);
--}
--
--static int dsmark_init(struct Qdisc *sch, struct nlattr *opt,
-- struct netlink_ext_ack *extack)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- struct nlattr *tb[TCA_DSMARK_MAX + 1];
-- int err = -EINVAL;
-- u32 default_index = NO_DEFAULT_INDEX;
-- u16 indices;
-- int i;
--
-- pr_debug("%s(sch %p,[qdisc %p],opt %p)\n", __func__, sch, p, opt);
--
-- if (!opt)
-- goto errout;
--
-- err = tcf_block_get(&p->block, &p->filter_list, sch, extack);
-- if (err)
-- return err;
--
-- err = nla_parse_nested_deprecated(tb, TCA_DSMARK_MAX, opt,
-- dsmark_policy, NULL);
-- if (err < 0)
-- goto errout;
--
-- err = -EINVAL;
-- if (!tb[TCA_DSMARK_INDICES])
-- goto errout;
-- indices = nla_get_u16(tb[TCA_DSMARK_INDICES]);
--
-- if (hweight32(indices) != 1)
-- goto errout;
--
-- if (tb[TCA_DSMARK_DEFAULT_INDEX])
-- default_index = nla_get_u16(tb[TCA_DSMARK_DEFAULT_INDEX]);
--
-- if (indices <= DSMARK_EMBEDDED_SZ)
-- p->mv = p->embedded;
-- else
-- p->mv = kmalloc_array(indices, sizeof(*p->mv), GFP_KERNEL);
-- if (!p->mv) {
-- err = -ENOMEM;
-- goto errout;
-- }
-- for (i = 0; i < indices; i++) {
-- p->mv[i].mask = 0xff;
-- p->mv[i].value = 0;
-- }
-- p->indices = indices;
-- p->default_index = default_index;
-- p->set_tc_index = nla_get_flag(tb[TCA_DSMARK_SET_TC_INDEX]);
--
-- p->q = qdisc_create_dflt(sch->dev_queue, &pfifo_qdisc_ops, sch->handle,
-- NULL);
-- if (p->q == NULL)
-- p->q = &noop_qdisc;
-- else
-- qdisc_hash_add(p->q, true);
--
-- pr_debug("%s: qdisc %p\n", __func__, p->q);
--
-- err = 0;
--errout:
-- return err;
--}
--
--static void dsmark_reset(struct Qdisc *sch)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
--
-- pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p);
-- if (p->q)
-- qdisc_reset(p->q);
-- sch->qstats.backlog = 0;
-- sch->q.qlen = 0;
--}
--
--static void dsmark_destroy(struct Qdisc *sch)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
--
-- pr_debug("%s(sch %p,[qdisc %p])\n", __func__, sch, p);
--
-- tcf_block_put(p->block);
-- qdisc_put(p->q);
-- if (p->mv != p->embedded)
-- kfree(p->mv);
--}
--
--static int dsmark_dump_class(struct Qdisc *sch, unsigned long cl,
-- struct sk_buff *skb, struct tcmsg *tcm)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- struct nlattr *opts = NULL;
--
-- pr_debug("%s(sch %p,[qdisc %p],class %ld\n", __func__, sch, p, cl);
--
-- if (!dsmark_valid_index(p, cl))
-- return -EINVAL;
--
-- tcm->tcm_handle = TC_H_MAKE(TC_H_MAJ(sch->handle), cl - 1);
-- tcm->tcm_info = p->q->handle;
--
-- opts = nla_nest_start_noflag(skb, TCA_OPTIONS);
-- if (opts == NULL)
-- goto nla_put_failure;
-- if (nla_put_u8(skb, TCA_DSMARK_MASK, p->mv[cl - 1].mask) ||
-- nla_put_u8(skb, TCA_DSMARK_VALUE, p->mv[cl - 1].value))
-- goto nla_put_failure;
--
-- return nla_nest_end(skb, opts);
--
--nla_put_failure:
-- nla_nest_cancel(skb, opts);
-- return -EMSGSIZE;
--}
--
--static int dsmark_dump(struct Qdisc *sch, struct sk_buff *skb)
--{
-- struct dsmark_qdisc_data *p = qdisc_priv(sch);
-- struct nlattr *opts = NULL;
--
-- opts = nla_nest_start_noflag(skb, TCA_OPTIONS);
-- if (opts == NULL)
-- goto nla_put_failure;
-- if (nla_put_u16(skb, TCA_DSMARK_INDICES, p->indices))
-- goto nla_put_failure;
--
-- if (p->default_index != NO_DEFAULT_INDEX &&
-- nla_put_u16(skb, TCA_DSMARK_DEFAULT_INDEX, p->default_index))
-- goto nla_put_failure;
--
-- if (p->set_tc_index &&
-- nla_put_flag(skb, TCA_DSMARK_SET_TC_INDEX))
-- goto nla_put_failure;
--
-- return nla_nest_end(skb, opts);
--
--nla_put_failure:
-- nla_nest_cancel(skb, opts);
-- return -EMSGSIZE;
--}
--
--static const struct Qdisc_class_ops dsmark_class_ops = {
-- .graft = dsmark_graft,
-- .leaf = dsmark_leaf,
-- .find = dsmark_find,
-- .change = dsmark_change,
-- .delete = dsmark_delete,
-- .walk = dsmark_walk,
-- .tcf_block = dsmark_tcf_block,
-- .bind_tcf = dsmark_bind_filter,
-- .unbind_tcf = dsmark_unbind_filter,
-- .dump = dsmark_dump_class,
--};
--
--static struct Qdisc_ops dsmark_qdisc_ops __read_mostly = {
-- .next = NULL,
-- .cl_ops = &dsmark_class_ops,
-- .id = "dsmark",
-- .priv_size = sizeof(struct dsmark_qdisc_data),
-- .enqueue = dsmark_enqueue,
-- .dequeue = dsmark_dequeue,
-- .peek = dsmark_peek,
-- .init = dsmark_init,
-- .reset = dsmark_reset,
-- .destroy = dsmark_destroy,
-- .change = NULL,
-- .dump = dsmark_dump,
-- .owner = THIS_MODULE,
--};
--
--static int __init dsmark_module_init(void)
--{
-- return register_qdisc(&dsmark_qdisc_ops);
--}
--
--static void __exit dsmark_module_exit(void)
--{
-- unregister_qdisc(&dsmark_qdisc_ops);
--}
--
--module_init(dsmark_module_init)
--module_exit(dsmark_module_exit)
--
--MODULE_LICENSE("GPL");
diff --git a/queue-5.4/netfilter-conntrack-check-sctp_cid_shutdown_ack-for-.patch b/queue-5.4/netfilter-conntrack-check-sctp_cid_shutdown_ack-for-.patch
deleted file mode 100644
index e07fd0f6ba..0000000000
--- a/queue-5.4/netfilter-conntrack-check-sctp_cid_shutdown_ack-for-.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From 12dd7733313d6c0a36715023a80a16a2d83fc3df Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 25 Jan 2024 17:29:46 -0500
-Subject: netfilter: conntrack: check SCTP_CID_SHUTDOWN_ACK for vtag setting in
- sctp_new
-
-From: Xin Long <lucien.xin@gmail.com>
-
-[ Upstream commit 6e348067ee4bc5905e35faa3a8fafa91c9124bc7 ]
-
-The annotation says in sctp_new(): "If it is a shutdown ack OOTB packet, we
-expect a return shutdown complete, otherwise an ABORT Sec 8.4 (5) and (8)".
-However, it does not check SCTP_CID_SHUTDOWN_ACK before setting vtag[REPLY]
-in the conntrack entry(ct).
-
-Because of that, if the ct in Router disappears for some reason in [1]
-with the packet sequence like below:
-
- Client > Server: sctp (1) [INIT] [init tag: 3201533963]
- Server > Client: sctp (1) [INIT ACK] [init tag: 972498433]
- Client > Server: sctp (1) [COOKIE ECHO]
- Server > Client: sctp (1) [COOKIE ACK]
- Client > Server: sctp (1) [DATA] (B)(E) [TSN: 3075057809]
- Server > Client: sctp (1) [SACK] [cum ack 3075057809]
- Server > Client: sctp (1) [HB REQ]
- (the ct in Router disappears somehow) <-------- [1]
- Client > Server: sctp (1) [HB ACK]
- Client > Server: sctp (1) [DATA] (B)(E) [TSN: 3075057810]
- Client > Server: sctp (1) [DATA] (B)(E) [TSN: 3075057810]
- Client > Server: sctp (1) [HB REQ]
- Client > Server: sctp (1) [DATA] (B)(E) [TSN: 3075057810]
- Client > Server: sctp (1) [HB REQ]
- Client > Server: sctp (1) [ABORT]
-
-when processing HB ACK packet in Router it calls sctp_new() to initialize
-the new ct with vtag[REPLY] set to HB_ACK packet's vtag.
-
-Later when sending DATA from Client, all the SACKs from Server will get
-dropped in Router, as the SACK packet's vtag does not match vtag[REPLY]
-in the ct. The worst thing is the vtag in this ct will never get fixed
-by the upcoming packets from Server.
-
-This patch fixes it by checking SCTP_CID_SHUTDOWN_ACK before setting
-vtag[REPLY] in the ct in sctp_new() as the annotation says. With this
-fix, it will leave vtag[REPLY] in ct to 0 in the case above, and the
-next HB REQ/ACK from Server is able to fix the vtag as its value is 0
-in nf_conntrack_sctp_packet().
-
-Signed-off-by: Xin Long <lucien.xin@gmail.com>
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netfilter/nf_conntrack_proto_sctp.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/netfilter/nf_conntrack_proto_sctp.c b/net/netfilter/nf_conntrack_proto_sctp.c
-index e7545bcca805e..6b2a215b27862 100644
---- a/net/netfilter/nf_conntrack_proto_sctp.c
-+++ b/net/netfilter/nf_conntrack_proto_sctp.c
-@@ -299,7 +299,7 @@ sctp_new(struct nf_conn *ct, const struct sk_buff *skb,
- pr_debug("Setting vtag %x for secondary conntrack\n",
- sh->vtag);
- ct->proto.sctp.vtag[IP_CT_DIR_ORIGINAL] = sh->vtag;
-- } else {
-+ } else if (sch->type == SCTP_CID_SHUTDOWN_ACK) {
- /* If it is a shutdown ack OOTB packet, we expect a return
- shutdown complete, otherwise an ABORT Sec 8.4 (5) and (8) */
- pr_debug("Setting vtag %x for new conn OOTB\n",
---
-2.43.0
-
diff --git a/queue-5.4/netfilter-nf_tables-set-dormant-flag-on-hook-registe.patch b/queue-5.4/netfilter-nf_tables-set-dormant-flag-on-hook-registe.patch
deleted file mode 100644
index 118e29571c..0000000000
--- a/queue-5.4/netfilter-nf_tables-set-dormant-flag-on-hook-registe.patch
+++ /dev/null
@@ -1,42 +0,0 @@
-From 8c4fb0854a2c3807a25adf02eb262c56f0ed429b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 19 Feb 2024 16:58:04 +0100
-Subject: netfilter: nf_tables: set dormant flag on hook register failure
-
-From: Florian Westphal <fw@strlen.de>
-
-[ Upstream commit bccebf64701735533c8db37773eeacc6566cc8ec ]
-
-We need to set the dormant flag again if we fail to register
-the hooks.
-
-During memory pressure hook registration can fail and we end up
-with a table marked as active but no registered hooks.
-
-On table/base chain deletion, nf_tables will attempt to unregister
-the hook again which yields a warn splat from the nftables core.
-
-Reported-and-tested-by: syzbot+de4025c006ec68ac56fc@syzkaller.appspotmail.com
-Fixes: 179d9ba5559a ("netfilter: nf_tables: fix table flag updates")
-Signed-off-by: Florian Westphal <fw@strlen.de>
-Signed-off-by: Pablo Neira Ayuso <pablo@netfilter.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/netfilter/nf_tables_api.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c
-index 6c83d3e169c9c..c5dbb950822fd 100644
---- a/net/netfilter/nf_tables_api.c
-+++ b/net/netfilter/nf_tables_api.c
-@@ -951,6 +951,7 @@ static int nf_tables_updtable(struct nft_ctx *ctx)
- return 0;
-
- err_register_hooks:
-+ ctx->table->flags |= NFT_TABLE_F_DORMANT;
- nft_trans_destroy(trans);
- return ret;
- }
---
-2.43.0
-
diff --git a/queue-5.4/nilfs2-replace-warn_ons-for-invalid-dat-metadata-block-requests.patch b/queue-5.4/nilfs2-replace-warn_ons-for-invalid-dat-metadata-block-requests.patch
deleted file mode 100644
index 08024dce18..0000000000
--- a/queue-5.4/nilfs2-replace-warn_ons-for-invalid-dat-metadata-block-requests.patch
+++ /dev/null
@@ -1,82 +0,0 @@
-From 5124a0a549857c4b87173280e192eea24dea72ad Mon Sep 17 00:00:00 2001
-From: Ryusuke Konishi <konishi.ryusuke@gmail.com>
-Date: Fri, 27 Jan 2023 01:41:14 +0900
-Subject: nilfs2: replace WARN_ONs for invalid DAT metadata block requests
-
-From: Ryusuke Konishi <konishi.ryusuke@gmail.com>
-
-commit 5124a0a549857c4b87173280e192eea24dea72ad upstream.
-
-If DAT metadata file block access fails due to corruption of the DAT file
-or abnormal virtual block numbers held by b-trees or inodes, a kernel
-warning is generated.
-
-This replaces the WARN_ONs by error output, so that a kernel, booted with
-panic_on_warn, does not panic. This patch also replaces the detected
-return code -ENOENT with another internal code -EINVAL to notify the bmap
-layer of metadata corruption. When the bmap layer sees -EINVAL, it
-handles the abnormal situation with nilfs_bmap_convert_error() and finally
-returns code -EIO as it should.
-
-Link: https://lkml.kernel.org/r/0000000000005cc3d205ea23ddcf@google.com
-Link: https://lkml.kernel.org/r/20230126164114.6911-1-konishi.ryusuke@gmail.com
-Signed-off-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
-Reported-by: <syzbot+5d5d25f90f195a3cfcb4@syzkaller.appspotmail.com>
-Tested-by: Ryusuke Konishi <konishi.ryusuke@gmail.com>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- fs/nilfs2/dat.c | 27 +++++++++++++++++----------
- 1 file changed, 17 insertions(+), 10 deletions(-)
-
---- a/fs/nilfs2/dat.c
-+++ b/fs/nilfs2/dat.c
-@@ -40,8 +40,21 @@ static inline struct nilfs_dat_info *NIL
- static int nilfs_dat_prepare_entry(struct inode *dat,
- struct nilfs_palloc_req *req, int create)
- {
-- return nilfs_palloc_get_entry_block(dat, req->pr_entry_nr,
-- create, &req->pr_entry_bh);
-+ int ret;
-+
-+ ret = nilfs_palloc_get_entry_block(dat, req->pr_entry_nr,
-+ create, &req->pr_entry_bh);
-+ if (unlikely(ret == -ENOENT)) {
-+ nilfs_msg(dat->i_sb, KERN_ERR,
-+ "DAT doesn't have a block to manage vblocknr = %llu",
-+ (unsigned long long)req->pr_entry_nr);
-+ /*
-+ * Return internal code -EINVAL to notify bmap layer of
-+ * metadata corruption.
-+ */
-+ ret = -EINVAL;
-+ }
-+ return ret;
- }
-
- static void nilfs_dat_commit_entry(struct inode *dat,
-@@ -123,11 +136,7 @@ static void nilfs_dat_commit_free(struct
-
- int nilfs_dat_prepare_start(struct inode *dat, struct nilfs_palloc_req *req)
- {
-- int ret;
--
-- ret = nilfs_dat_prepare_entry(dat, req, 0);
-- WARN_ON(ret == -ENOENT);
-- return ret;
-+ return nilfs_dat_prepare_entry(dat, req, 0);
- }
-
- void nilfs_dat_commit_start(struct inode *dat, struct nilfs_palloc_req *req,
-@@ -154,10 +163,8 @@ int nilfs_dat_prepare_end(struct inode *
- int ret;
-
- ret = nilfs_dat_prepare_entry(dat, req, 0);
-- if (ret < 0) {
-- WARN_ON(ret == -ENOENT);
-+ if (ret < 0)
- return ret;
-- }
-
- kaddr = kmap_atomic(req->pr_entry_bh->b_page);
- entry = nilfs_palloc_block_get_entry(dat, req->pr_entry_nr,
diff --git a/queue-5.4/nouveau-fix-function-cast-warnings.patch b/queue-5.4/nouveau-fix-function-cast-warnings.patch
deleted file mode 100644
index 4abc1af49a..0000000000
--- a/queue-5.4/nouveau-fix-function-cast-warnings.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From 66ad66ace65e4e4da1191fa62d1501936386b7d4 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 13 Feb 2024 10:57:37 +0100
-Subject: nouveau: fix function cast warnings
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit 0affdba22aca5573f9d989bcb1d71d32a6a03efe ]
-
-clang-16 warns about casting between incompatible function types:
-
-drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c:161:10: error: cast from 'void (*)(const struct firmware *)' to 'void (*)(void *)' converts to incompatible function type [-Werror,-Wcast-function-type-strict]
- 161 | .fini = (void(*)(void *))release_firmware,
-
-This one was done to use the generic shadow_fw_release() function as a
-callback for struct nvbios_source. Change it to use the same prototype
-as the other five instances, with a trivial helper function that actually
-calls release_firmware.
-
-Fixes: 70c0f263cc2e ("drm/nouveau/bios: pull in basic vbios subdev, more to come later")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Signed-off-by: Danilo Krummrich <dakr@redhat.com>
-Link: https://patchwork.freedesktop.org/patch/msgid/20240213095753.455062-1-arnd@kernel.org
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c | 8 +++++++-
- 1 file changed, 7 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c
-index 4b571cc6bc70f..6597def18627e 100644
---- a/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c
-+++ b/drivers/gpu/drm/nouveau/nvkm/subdev/bios/shadow.c
-@@ -154,11 +154,17 @@ shadow_fw_init(struct nvkm_bios *bios, const char *name)
- return (void *)fw;
- }
-
-+static void
-+shadow_fw_release(void *fw)
-+{
-+ release_firmware(fw);
-+}
-+
- static const struct nvbios_source
- shadow_fw = {
- .name = "firmware",
- .init = shadow_fw_init,
-- .fini = (void(*)(void *))release_firmware,
-+ .fini = shadow_fw_release,
- .read = shadow_fw_read,
- .rw = false,
- };
---
-2.43.0
-
diff --git a/queue-5.4/nvmet-fc-abort-command-when-there-is-no-binding.patch b/queue-5.4/nvmet-fc-abort-command-when-there-is-no-binding.patch
deleted file mode 100644
index f1ebc40d1c..0000000000
--- a/queue-5.4/nvmet-fc-abort-command-when-there-is-no-binding.patch
+++ /dev/null
@@ -1,51 +0,0 @@
-From 55e86da8c7c649ad6395e678196d5d3e0b34418c Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 31 Jan 2024 09:51:09 +0100
-Subject: nvmet-fc: abort command when there is no binding
-
-From: Daniel Wagner <dwagner@suse.de>
-
-[ Upstream commit 3146345c2e9c2f661527054e402b0cfad80105a4 ]
-
-When the target port has not active port binding, there is no point in
-trying to process the command as it has to fail anyway. Instead adding
-checks to all commands abort the command early.
-
-Reviewed-by: Hannes Reinecke <hare@suse.de>
-Reviewed-by: Christoph Hellwig <hch@lst.de>
-Signed-off-by: Daniel Wagner <dwagner@suse.de>
-Signed-off-by: Keith Busch <kbusch@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/nvme/target/fc.c | 8 ++++++--
- 1 file changed, 6 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/nvme/target/fc.c b/drivers/nvme/target/fc.c
-index f74fc6481731d..2dd39299fba07 100644
---- a/drivers/nvme/target/fc.c
-+++ b/drivers/nvme/target/fc.c
-@@ -796,6 +796,9 @@ nvmet_fc_alloc_target_assoc(struct nvmet_fc_tgtport *tgtport)
- int idx;
- bool needrandom = true;
-
-+ if (!tgtport->pe)
-+ return NULL;
-+
- assoc = kzalloc(sizeof(*assoc), GFP_KERNEL);
- if (!assoc)
- return NULL;
-@@ -2180,8 +2183,9 @@ nvmet_fc_handle_fcp_rqst(struct nvmet_fc_tgtport *tgtport,
-
- fod->req.cmd = &fod->cmdiubuf.sqe;
- fod->req.cqe = &fod->rspiubuf.cqe;
-- if (tgtport->pe)
-- fod->req.port = tgtport->pe->port;
-+ if (!tgtport->pe)
-+ goto transport_error;
-+ fod->req.port = tgtport->pe->port;
-
- /* clear any response payload */
- memset(&fod->rspiubuf, 0, sizeof(fod->rspiubuf));
---
-2.43.0
-
diff --git a/queue-5.4/nvmet-tcp-fix-nvme-tcp-ida-memory-leak.patch b/queue-5.4/nvmet-tcp-fix-nvme-tcp-ida-memory-leak.patch
deleted file mode 100644
index a1a2f79d00..0000000000
--- a/queue-5.4/nvmet-tcp-fix-nvme-tcp-ida-memory-leak.patch
+++ /dev/null
@@ -1,36 +0,0 @@
-From 582d0ecda00c570a4f6832f4411fb49f8a62b498 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 26 Jan 2024 16:26:43 +0800
-Subject: nvmet-tcp: fix nvme tcp ida memory leak
-
-From: Guixin Liu <kanie@linux.alibaba.com>
-
-[ Upstream commit 47c5dd66c1840524572dcdd956f4af2bdb6fbdff ]
-
-The nvmet_tcp_queue_ida should be destroy when the nvmet-tcp module
-exit.
-
-Signed-off-by: Guixin Liu <kanie@linux.alibaba.com>
-Reviewed-by: Christoph Hellwig <hch@lst.de>
-Reviewed-by: Chaitanya Kulkarni <kch@nvidia.com>
-Signed-off-by: Keith Busch <kbusch@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/nvme/target/tcp.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c
-index be9e976575578..d40bd57537ba1 100644
---- a/drivers/nvme/target/tcp.c
-+++ b/drivers/nvme/target/tcp.c
-@@ -1817,6 +1817,7 @@ static void __exit nvmet_tcp_exit(void)
- flush_scheduled_work();
-
- destroy_workqueue(nvmet_tcp_wq);
-+ ida_destroy(&nvmet_tcp_queue_ida);
- }
-
- module_init(nvmet_tcp_init);
---
-2.43.0
-
diff --git a/queue-5.4/packet-move-from-strlcpy-with-unused-retval-to-strsc.patch b/queue-5.4/packet-move-from-strlcpy-with-unused-retval-to-strsc.patch
deleted file mode 100644
index 7e2ea197d6..0000000000
--- a/queue-5.4/packet-move-from-strlcpy-with-unused-retval-to-strsc.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From 66789dfe4fc040c7a0a222734292fa2389d9b9da Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 18 Aug 2022 23:02:27 +0200
-Subject: packet: move from strlcpy with unused retval to strscpy
-
-From: Wolfram Sang <wsa+renesas@sang-engineering.com>
-
-[ Upstream commit 8fc9d51ea2d32a05f7d7cf86a25cc86ecc57eb45 ]
-
-Follow the advice of the below link and prefer 'strscpy' in this
-subsystem. Conversion is 1:1 because the return value is not used.
-Generated by a coccinelle script.
-
-Link: https://lore.kernel.org/r/CAHk-=wgfRnXz0W3D37d01q3JFkr_i_uTL=V6A6G1oUZcprmknw@mail.gmail.com/
-Signed-off-by: Wolfram Sang <wsa+renesas@sang-engineering.com>
-Link: https://lore.kernel.org/r/20220818210227.8611-1-wsa+renesas@sang-engineering.com
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Stable-dep-of: a7d6027790ac ("arp: Prevent overflow in arp_req_get().")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/packet/af_packet.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/net/packet/af_packet.c b/net/packet/af_packet.c
-index 600a84a5c582a..451f9c43b34b8 100644
---- a/net/packet/af_packet.c
-+++ b/net/packet/af_packet.c
-@@ -1850,7 +1850,7 @@ static int packet_rcv_spkt(struct sk_buff *skb, struct net_device *dev,
- */
-
- spkt->spkt_family = dev->type;
-- strlcpy(spkt->spkt_device, dev->name, sizeof(spkt->spkt_device));
-+ strscpy(spkt->spkt_device, dev->name, sizeof(spkt->spkt_device));
- spkt->spkt_protocol = skb->protocol;
-
- /*
-@@ -3511,7 +3511,7 @@ static int packet_getname_spkt(struct socket *sock, struct sockaddr *uaddr,
- rcu_read_lock();
- dev = dev_get_by_index_rcu(sock_net(sk), READ_ONCE(pkt_sk(sk)->ifindex));
- if (dev)
-- strlcpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data));
-+ strscpy(uaddr->sa_data, dev->name, sizeof(uaddr->sa_data));
- rcu_read_unlock();
-
- return sizeof(*uaddr);
---
-2.43.0
-
diff --git a/queue-5.4/pci-msi-prevent-msi-hardware-interrupt-number-truncation.patch b/queue-5.4/pci-msi-prevent-msi-hardware-interrupt-number-truncation.patch
deleted file mode 100644
index dec26e9905..0000000000
--- a/queue-5.4/pci-msi-prevent-msi-hardware-interrupt-number-truncation.patch
+++ /dev/null
@@ -1,46 +0,0 @@
-From db744ddd59be798c2627efbfc71f707f5a935a40 Mon Sep 17 00:00:00 2001
-From: Vidya Sagar <vidyas@nvidia.com>
-Date: Mon, 15 Jan 2024 19:26:49 +0530
-Subject: PCI/MSI: Prevent MSI hardware interrupt number truncation
-
-From: Vidya Sagar <vidyas@nvidia.com>
-
-commit db744ddd59be798c2627efbfc71f707f5a935a40 upstream.
-
-While calculating the hardware interrupt number for a MSI interrupt, the
-higher bits (i.e. from bit-5 onwards a.k.a domain_nr >= 32) of the PCI
-domain number gets truncated because of the shifted value casting to return
-type of pci_domain_nr() which is 'int'. This for example is resulting in
-same hardware interrupt number for devices 0019:00:00.0 and 0039:00:00.0.
-
-To address this cast the PCI domain number to 'irq_hw_number_t' before left
-shifting it to calculate the hardware interrupt number.
-
-Please note that this fixes the issue only on 64-bit systems and doesn't
-change the behavior for 32-bit systems i.e. the 32-bit systems continue to
-have the issue. Since the issue surfaces only if there are too many PCIe
-controllers in the system which usually is the case in modern server
-systems and they don't tend to run 32-bit kernels.
-
-Fixes: 3878eaefb89a ("PCI/MSI: Enhance core to support hierarchy irqdomain")
-Signed-off-by: Vidya Sagar <vidyas@nvidia.com>
-Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
-Tested-by: Shanker Donthineni <sdonthineni@nvidia.com>
-Cc: stable@vger.kernel.org
-Link: https://lore.kernel.org/r/20240115135649.708536-1-vidyas@nvidia.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/pci/msi.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/pci/msi.c
-+++ b/drivers/pci/msi.c
-@@ -1428,7 +1428,7 @@ irq_hw_number_t pci_msi_domain_calc_hwir
- {
- return (irq_hw_number_t)desc->msi_attrib.entry_nr |
- pci_dev_id(dev) << 11 |
-- (pci_domain_nr(dev->bus) & 0xFFFFFFFF) << 27;
-+ ((irq_hw_number_t)(pci_domain_nr(dev->bus) & 0xFFFFFFFF)) << 27;
- }
-
- static inline bool pci_msi_desc_is_multi_msi(struct msi_desc *desc)
diff --git a/queue-5.4/pci-tegra-fix-of-node-reference-leak.patch b/queue-5.4/pci-tegra-fix-of-node-reference-leak.patch
deleted file mode 100644
index c2d084ebf9..0000000000
--- a/queue-5.4/pci-tegra-fix-of-node-reference-leak.patch
+++ /dev/null
@@ -1,63 +0,0 @@
-From abef663720e1250cc9a04bea4250ebe50009bd6e Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 4 May 2021 19:17:42 +0200
-Subject: PCI: tegra: Fix OF node reference leak
-
-From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
-
-[ Upstream commit eff21f5da308265678e7e59821795e606f3e560f ]
-
-Commit 9e38e690ace3 ("PCI: tegra: Fix OF node reference leak") has fixed
-some node reference leaks in this function but missed some of them.
-
-In fact, having 'port' referenced in the 'rp' structure is not enough to
-prevent the leak, until 'rp' is actually added in the 'pcie->ports' list.
-
-Add the missing 'goto err_node_put' accordingly.
-
-Link: https://lore.kernel.org/r/55b11e9a7fa2987fbc0869d68ae59888954d65e2.1620148539.git.christophe.jaillet@wanadoo.fr
-Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
-Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
-Reviewed-by: Vidya Sagar <vidyas@nvidia.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/pci/controller/pci-tegra.c | 13 ++++++++-----
- 1 file changed, 8 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c
-index 64921c63874fa..74c0ddd433815 100644
---- a/drivers/pci/controller/pci-tegra.c
-+++ b/drivers/pci/controller/pci-tegra.c
-@@ -2267,13 +2267,15 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
- rp->np = port;
-
- rp->base = devm_pci_remap_cfg_resource(dev, &rp->regs);
-- if (IS_ERR(rp->base))
-- return PTR_ERR(rp->base);
-+ if (IS_ERR(rp->base)) {
-+ err = PTR_ERR(rp->base);
-+ goto err_node_put;
-+ }
-
- label = devm_kasprintf(dev, GFP_KERNEL, "pex-reset-%u", index);
- if (!label) {
-- dev_err(dev, "failed to create reset GPIO label\n");
-- return -ENOMEM;
-+ err = -ENOMEM;
-+ goto err_node_put;
- }
-
- /*
-@@ -2291,7 +2293,8 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
- } else {
- dev_err(dev, "failed to get reset GPIO: %ld\n",
- PTR_ERR(rp->reset_gpio));
-- return PTR_ERR(rp->reset_gpio);
-+ err = PTR_ERR(rp->reset_gpio);
-+ goto err_node_put;
- }
- }
-
---
-2.43.0
-
diff --git a/queue-5.4/pci-tegra-fix-reporting-gpio-error-value.patch b/queue-5.4/pci-tegra-fix-reporting-gpio-error-value.patch
deleted file mode 100644
index 49dba130fc..0000000000
--- a/queue-5.4/pci-tegra-fix-reporting-gpio-error-value.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From b2de3cb2dcf33b2059328f6f38afb5329b93a9ca Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 14 Apr 2020 12:25:12 +0200
-Subject: PCI: tegra: Fix reporting GPIO error value
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Pali Rohár <pali@kernel.org>
-
-[ Upstream commit 63605f1cfcc56bcb25c48bbee75a679d85ba7675 ]
-
-Error code is stored in rp->reset_gpio and not in err variable.
-
-Link: https://lore.kernel.org/r/20200414102512.27506-1-pali@kernel.org
-Signed-off-by: Pali Rohár <pali@kernel.org>
-Signed-off-by: Lorenzo Pieralisi <lorenzo.pieralisi@arm.com>
-Acked-by: Thierry Reding <treding@nvidia.com>
-Acked-by: Rob Herring <robh@kernel.org>
-Stable-dep-of: eff21f5da308 ("PCI: tegra: Fix OF node reference leak")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/pci/controller/pci-tegra.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/drivers/pci/controller/pci-tegra.c b/drivers/pci/controller/pci-tegra.c
-index 99d505a85067b..64921c63874fa 100644
---- a/drivers/pci/controller/pci-tegra.c
-+++ b/drivers/pci/controller/pci-tegra.c
-@@ -2289,8 +2289,8 @@ static int tegra_pcie_parse_dt(struct tegra_pcie *pcie)
- if (PTR_ERR(rp->reset_gpio) == -ENOENT) {
- rp->reset_gpio = NULL;
- } else {
-- dev_err(dev, "failed to get reset GPIO: %d\n",
-- err);
-+ dev_err(dev, "failed to get reset GPIO: %ld\n",
-+ PTR_ERR(rp->reset_gpio));
- return PTR_ERR(rp->reset_gpio);
- }
- }
---
-2.43.0
-
diff --git a/queue-5.4/pinctrl-pinctrl-rockchip-fix-a-bunch-of-kerneldoc-mi.patch b/queue-5.4/pinctrl-pinctrl-rockchip-fix-a-bunch-of-kerneldoc-mi.patch
deleted file mode 100644
index fe0c5921fb..0000000000
--- a/queue-5.4/pinctrl-pinctrl-rockchip-fix-a-bunch-of-kerneldoc-mi.patch
+++ /dev/null
@@ -1,154 +0,0 @@
-From 4c7fed61191e70f79614a1402722fdc0b861bccb Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 13 Jul 2020 15:49:24 +0100
-Subject: pinctrl: pinctrl-rockchip: Fix a bunch of kerneldoc misdemeanours
-
-From: Lee Jones <lee.jones@linaro.org>
-
-[ Upstream commit e1524ea84af7172acc20827f8dca3fc8f72b8f37 ]
-
-Demote headers which are clearly not kerneldoc, provide titles for
-struct definition blocks, fix API slip (bitrot) misspellings and
-provide some missing entries.
-
-Fixes the following W=1 kernel build warning(s):
-
- drivers/pinctrl/pinctrl-rockchip.c:82: warning: cannot understand function prototype: 'struct rockchip_iomux '
- drivers/pinctrl/pinctrl-rockchip.c:97: warning: Enum value 'DRV_TYPE_IO_DEFAULT' not described in enum 'rockchip_pin_drv_type'
- drivers/pinctrl/pinctrl-rockchip.c:97: warning: Enum value 'DRV_TYPE_IO_1V8_OR_3V0' not described in enum 'rockchip_pin_drv_type'
- drivers/pinctrl/pinctrl-rockchip.c:97: warning: Enum value 'DRV_TYPE_IO_1V8_ONLY' not described in enum 'rockchip_pin_drv_type'
- drivers/pinctrl/pinctrl-rockchip.c:97: warning: Enum value 'DRV_TYPE_IO_1V8_3V0_AUTO' not described in enum 'rockchip_pin_drv_type'
- drivers/pinctrl/pinctrl-rockchip.c:97: warning: Enum value 'DRV_TYPE_IO_3V3_ONLY' not described in enum 'rockchip_pin_drv_type'
- drivers/pinctrl/pinctrl-rockchip.c:97: warning: Enum value 'DRV_TYPE_MAX' not described in enum 'rockchip_pin_drv_type'
- drivers/pinctrl/pinctrl-rockchip.c:106: warning: Enum value 'PULL_TYPE_IO_DEFAULT' not described in enum 'rockchip_pin_pull_type'
- drivers/pinctrl/pinctrl-rockchip.c:106: warning: Enum value 'PULL_TYPE_IO_1V8_ONLY' not described in enum 'rockchip_pin_pull_type'
- drivers/pinctrl/pinctrl-rockchip.c:106: warning: Enum value 'PULL_TYPE_MAX' not described in enum 'rockchip_pin_pull_type'
- drivers/pinctrl/pinctrl-rockchip.c:109: warning: Cannot understand * @drv_type: drive strength variant using rockchip_perpin_drv_type
- on line 109 - I thought it was a doc line
- drivers/pinctrl/pinctrl-rockchip.c:122: warning: Cannot understand * @reg_base: register base of the gpio bank
- on line 109 - I thought it was a doc line
- drivers/pinctrl/pinctrl-rockchip.c:325: warning: Function parameter or member 'route_location' not described in 'rockchip_mux_route_data'
- drivers/pinctrl/pinctrl-rockchip.c:328: warning: Cannot understand */
- on line 109 - I thought it was a doc line
- drivers/pinctrl/pinctrl-rockchip.c:375: warning: Function parameter or member 'data' not described in 'rockchip_pin_group'
- drivers/pinctrl/pinctrl-rockchip.c:387: warning: Function parameter or member 'ngroups' not described in 'rockchip_pmx_func'
-
-Signed-off-by: Lee Jones <lee.jones@linaro.org>
-Reviewed-by: Heiko Stuebner <heiko@sntech.de>
-Cc: Heiko Stuebner <heiko@sntech.de>
-Cc: Jean-Christophe PLAGNIOL-VILLARD <plagnioj@jcrosoft.com>
-Cc: linux-rockchip@lists.infradead.org
-Link: https://lore.kernel.org/r/20200713144930.1034632-20-lee.jones@linaro.org
-Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/pinctrl/pinctrl-rockchip.c | 22 ++++++++++++----------
- 1 file changed, 12 insertions(+), 10 deletions(-)
-
-diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
-index 4b972be3487f9..a44c2680c4230 100644
---- a/drivers/pinctrl/pinctrl-rockchip.c
-+++ b/drivers/pinctrl/pinctrl-rockchip.c
-@@ -62,7 +62,7 @@ enum rockchip_pinctrl_type {
- RK3399,
- };
-
--/**
-+/*
- * Encode variants of iomux registers into a type variable
- */
- #define IOMUX_GPIO_ONLY BIT(0)
-@@ -72,6 +72,7 @@ enum rockchip_pinctrl_type {
- #define IOMUX_WIDTH_3BIT BIT(4)
-
- /**
-+ * struct rockchip_iomux
- * @type: iomux variant using IOMUX_* constants
- * @offset: if initialized to -1 it will be autocalculated, by specifying
- * an initial offset value the relevant source offset can be reset
-@@ -82,7 +83,7 @@ struct rockchip_iomux {
- int offset;
- };
-
--/**
-+/*
- * enum type index corresponding to rockchip_perpin_drv_list arrays index.
- */
- enum rockchip_pin_drv_type {
-@@ -94,7 +95,7 @@ enum rockchip_pin_drv_type {
- DRV_TYPE_MAX
- };
-
--/**
-+/*
- * enum type index corresponding to rockchip_pull_list arrays index.
- */
- enum rockchip_pin_pull_type {
-@@ -104,6 +105,7 @@ enum rockchip_pin_pull_type {
- };
-
- /**
-+ * struct rockchip_drv
- * @drv_type: drive strength variant using rockchip_perpin_drv_type
- * @offset: if initialized to -1 it will be autocalculated, by specifying
- * an initial offset value the relevant source offset can be reset
-@@ -117,8 +119,9 @@ struct rockchip_drv {
- };
-
- /**
-+ * struct rockchip_pin_bank
- * @reg_base: register base of the gpio bank
-- * @reg_pull: optional separate register for additional pull settings
-+ * @regmap_pull: optional separate register for additional pull settings
- * @clk: clock of the gpio bank
- * @irq: interrupt of the gpio bank
- * @saved_masks: Saved content of GPIO_INTEN at suspend time.
-@@ -136,6 +139,8 @@ struct rockchip_drv {
- * @gpio_chip: gpiolib chip
- * @grange: gpio range
- * @slock: spinlock for the gpio bank
-+ * @toggle_edge_mode: bit mask to toggle (falling/rising) edge mode
-+ * @recalced_mask: bit mask to indicate a need to recalulate the mask
- * @route_mask: bits describing the routing pins of per bank
- */
- struct rockchip_pin_bank {
-@@ -310,6 +315,7 @@ enum rockchip_mux_route_location {
- * @bank_num: bank number.
- * @pin: index at register or used to calc index.
- * @func: the min pin.
-+ * @route_location: the mux route location (same, pmu, grf).
- * @route_offset: the max pin.
- * @route_val: the register offset.
- */
-@@ -322,8 +328,6 @@ struct rockchip_mux_route_data {
- u32 route_val;
- };
-
--/**
-- */
- struct rockchip_pin_ctrl {
- struct rockchip_pin_bank *pin_banks;
- u32 nr_banks;
-@@ -361,9 +365,7 @@ struct rockchip_pin_config {
- * @name: name of the pin group, used to lookup the group.
- * @pins: the pins included in this group.
- * @npins: number of pins included in this group.
-- * @func: the mux function number to be programmed when selected.
-- * @configs: the config values to be set for each pin
-- * @nconfigs: number of configs for each pin
-+ * @data: local pin configuration
- */
- struct rockchip_pin_group {
- const char *name;
-@@ -376,7 +378,7 @@ struct rockchip_pin_group {
- * struct rockchip_pmx_func: represent a pin function.
- * @name: name of the pin function, used to lookup the function.
- * @groups: one or more names of pin groups that provide this function.
-- * @num_groups: number of groups included in @groups.
-+ * @ngroups: number of groups included in @groups.
- */
- struct rockchip_pmx_func {
- const char *name;
---
-2.43.0
-
diff --git a/queue-5.4/pinctrl-rockchip-fix-refcount-leak-in-rockchip_pinct.patch b/queue-5.4/pinctrl-rockchip-fix-refcount-leak-in-rockchip_pinct.patch
deleted file mode 100644
index 79262cca3b..0000000000
--- a/queue-5.4/pinctrl-rockchip-fix-refcount-leak-in-rockchip_pinct.patch
+++ /dev/null
@@ -1,37 +0,0 @@
-From 6231eab8ea4a8f48c9a6efc7eea398748bef90d5 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 2 Jan 2023 15:28:45 +0400
-Subject: pinctrl: rockchip: Fix refcount leak in rockchip_pinctrl_parse_groups
-
-From: Miaoqian Lin <linmq006@gmail.com>
-
-[ Upstream commit c818ae563bf99457f02e8170aabd6b174f629f65 ]
-
-of_find_node_by_phandle() returns a node pointer with refcount incremented,
-We should use of_node_put() on it when not needed anymore.
-Add missing of_node_put() to avoid refcount leak.
-
-Fixes: d3e5116119bd ("pinctrl: add pinctrl driver for Rockchip SoCs")
-Signed-off-by: Miaoqian Lin <linmq006@gmail.com>
-Link: https://lore.kernel.org/r/20230102112845.3982407-1-linmq006@gmail.com
-Signed-off-by: Linus Walleij <linus.walleij@linaro.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/pinctrl/pinctrl-rockchip.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/drivers/pinctrl/pinctrl-rockchip.c b/drivers/pinctrl/pinctrl-rockchip.c
-index a44c2680c4230..9388d6fac7d40 100644
---- a/drivers/pinctrl/pinctrl-rockchip.c
-+++ b/drivers/pinctrl/pinctrl-rockchip.c
-@@ -2536,6 +2536,7 @@ static int rockchip_pinctrl_parse_groups(struct device_node *np,
- np_config = of_find_node_by_phandle(be32_to_cpup(phandle));
- ret = pinconf_generic_parse_dt_config(np_config, NULL,
- &grp->data[j].configs, &grp->data[j].nconfigs);
-+ of_node_put(np_config);
- if (ret)
- return ret;
- }
---
-2.43.0
-
diff --git a/queue-5.4/pmdomain-renesas-r8a77980-sysc-cr7-must-be-always-on.patch b/queue-5.4/pmdomain-renesas-r8a77980-sysc-cr7-must-be-always-on.patch
deleted file mode 100644
index 174571b1ed..0000000000
--- a/queue-5.4/pmdomain-renesas-r8a77980-sysc-cr7-must-be-always-on.patch
+++ /dev/null
@@ -1,47 +0,0 @@
-From a204887524abe9b42f0dfda1101743dc9e6ccab6 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 12 Jan 2024 17:33:55 +0100
-Subject: pmdomain: renesas: r8a77980-sysc: CR7 must be always on
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Geert Uytterhoeven <geert+renesas@glider.be>
-
-[ Upstream commit f0e4a1356466ec1858ae8e5c70bea2ce5e55008b ]
-
-The power domain containing the Cortex-R7 CPU core on the R-Car V3H SoC
-must always be in power-on state, unlike on other SoCs in the R-Car Gen3
-family. See Table 9.4 "Power domains" in the R-Car Series, 3rd
-Generation Hardware User’s Manual Rev.1.00 and later.
-
-Fix this by marking the domain as a CPU domain without control
-registers, so the driver will not touch it.
-
-Fixes: 41d6d8bd8ae9 ("soc: renesas: rcar-sysc: add R8A77980 support")
-Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
-Cc: stable@vger.kernel.org
-Link: https://lore.kernel.org/r/fdad9a86132d53ecddf72b734dac406915c4edc0.1705076735.git.geert+renesas@glider.be
-Signed-off-by: Ulf Hansson <ulf.hansson@linaro.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/soc/renesas/r8a77980-sysc.c | 3 ++-
- 1 file changed, 2 insertions(+), 1 deletion(-)
-
-diff --git a/drivers/soc/renesas/r8a77980-sysc.c b/drivers/soc/renesas/r8a77980-sysc.c
-index a8dbe55e8ba82..3d1ea245681b0 100644
---- a/drivers/soc/renesas/r8a77980-sysc.c
-+++ b/drivers/soc/renesas/r8a77980-sysc.c
-@@ -25,7 +25,8 @@ static const struct rcar_sysc_area r8a77980_areas[] __initconst = {
- PD_CPU_NOCR },
- { "ca53-cpu3", 0x200, 3, R8A77980_PD_CA53_CPU3, R8A77980_PD_CA53_SCU,
- PD_CPU_NOCR },
-- { "cr7", 0x240, 0, R8A77980_PD_CR7, R8A77980_PD_ALWAYS_ON },
-+ { "cr7", 0x240, 0, R8A77980_PD_CR7, R8A77980_PD_ALWAYS_ON,
-+ PD_CPU_NOCR },
- { "a3ir", 0x180, 0, R8A77980_PD_A3IR, R8A77980_PD_ALWAYS_ON },
- { "a2ir0", 0x400, 0, R8A77980_PD_A2IR0, R8A77980_PD_A3IR },
- { "a2ir1", 0x400, 1, R8A77980_PD_A2IR1, R8A77980_PD_A3IR },
---
-2.43.0
-
diff --git a/queue-5.4/rdma-bnxt_re-return-error-for-srq-resize.patch b/queue-5.4/rdma-bnxt_re-return-error-for-srq-resize.patch
deleted file mode 100644
index a4c4eb6305..0000000000
--- a/queue-5.4/rdma-bnxt_re-return-error-for-srq-resize.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From 1f3e2128daaef2423f20e5e7cf093358b6b1f4d0 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 22 Jan 2024 20:54:36 -0800
-Subject: RDMA/bnxt_re: Return error for SRQ resize
-
-From: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
-
-[ Upstream commit 3687b450c5f32e80f179ce4b09e0454da1449eac ]
-
-SRQ resize is not supported in the driver. But driver is not
-returning error from bnxt_re_modify_srq() for SRQ resize.
-
-Fixes: 37cb11acf1f7 ("RDMA/bnxt_re: Add SRQ support for Broadcom adapters")
-Signed-off-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
-Signed-off-by: Selvin Xavier <selvin.xavier@broadcom.com>
-Link: https://lore.kernel.org/r/1705985677-15551-5-git-send-email-selvin.xavier@broadcom.com
-Signed-off-by: Leon Romanovsky <leon@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/infiniband/hw/bnxt_re/ib_verbs.c | 5 ++---
- 1 file changed, 2 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/infiniband/hw/bnxt_re/ib_verbs.c b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
-index 183f1c3c1f5ef..c9a7c03403ac0 100644
---- a/drivers/infiniband/hw/bnxt_re/ib_verbs.c
-+++ b/drivers/infiniband/hw/bnxt_re/ib_verbs.c
-@@ -1623,7 +1623,7 @@ int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
- switch (srq_attr_mask) {
- case IB_SRQ_MAX_WR:
- /* SRQ resize is not supported */
-- break;
-+ return -EINVAL;
- case IB_SRQ_LIMIT:
- /* Change the SRQ threshold */
- if (srq_attr->srq_limit > srq->qplib_srq.max_wqe)
-@@ -1638,13 +1638,12 @@ int bnxt_re_modify_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr,
- /* On success, update the shadow */
- srq->srq_limit = srq_attr->srq_limit;
- /* No need to Build and send response back to udata */
-- break;
-+ return 0;
- default:
- dev_err(rdev_to_dev(rdev),
- "Unsupported srq_attr_mask 0x%x", srq_attr_mask);
- return -EINVAL;
- }
-- return 0;
- }
-
- int bnxt_re_query_srq(struct ib_srq *ib_srq, struct ib_srq_attr *srq_attr)
---
-2.43.0
-
diff --git a/queue-5.4/rdma-srpt-fix-function-pointer-cast-warnings.patch b/queue-5.4/rdma-srpt-fix-function-pointer-cast-warnings.patch
deleted file mode 100644
index 729efdd00c..0000000000
--- a/queue-5.4/rdma-srpt-fix-function-pointer-cast-warnings.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 27be4d398dbcb400f954b4ed2801dd82fd198f0f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 13 Feb 2024 11:07:13 +0100
-Subject: RDMA/srpt: fix function pointer cast warnings
-
-From: Arnd Bergmann <arnd@arndb.de>
-
-[ Upstream commit eb5c7465c3240151cd42a55c7ace9da0026308a1 ]
-
-clang-16 notices that srpt_qp_event() gets called through an incompatible
-pointer here:
-
-drivers/infiniband/ulp/srpt/ib_srpt.c:1815:5: error: cast from 'void (*)(struct ib_event *, struct srpt_rdma_ch *)' to 'void (*)(struct ib_event *, void *)' converts to incompatible function type [-Werror,-Wcast-function-type-strict]
- 1815 | = (void(*)(struct ib_event *, void*))srpt_qp_event;
-
-Change srpt_qp_event() to use the correct prototype and adjust the
-argument inside of it.
-
-Fixes: a42d985bd5b2 ("ib_srpt: Initial SRP Target merge for v3.3-rc1")
-Signed-off-by: Arnd Bergmann <arnd@arndb.de>
-Link: https://lore.kernel.org/r/20240213100728.458348-1-arnd@kernel.org
-Reviewed-by: Bart Van Assche <bvanassche@acm.org>
-Signed-off-by: Leon Romanovsky <leon@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/infiniband/ulp/srpt/ib_srpt.c | 9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
-index ccd9811c6c1e2..d03a4f2e006fb 100644
---- a/drivers/infiniband/ulp/srpt/ib_srpt.c
-+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
-@@ -213,10 +213,12 @@ static const char *get_ch_state_name(enum rdma_ch_state s)
- /**
- * srpt_qp_event - QP event callback function
- * @event: Description of the event that occurred.
-- * @ch: SRPT RDMA channel.
-+ * @ptr: SRPT RDMA channel.
- */
--static void srpt_qp_event(struct ib_event *event, struct srpt_rdma_ch *ch)
-+static void srpt_qp_event(struct ib_event *event, void *ptr)
- {
-+ struct srpt_rdma_ch *ch = ptr;
-+
- pr_debug("QP event %d on ch=%p sess_name=%s-%d state=%s\n",
- event->event, ch, ch->sess_name, ch->qp->qp_num,
- get_ch_state_name(ch->state));
-@@ -1802,8 +1804,7 @@ static int srpt_create_ch_ib(struct srpt_rdma_ch *ch)
- }
-
- qp_init->qp_context = (void *)ch;
-- qp_init->event_handler
-- = (void(*)(struct ib_event *, void*))srpt_qp_event;
-+ qp_init->event_handler = srpt_qp_event;
- qp_init->send_cq = ch->cq;
- qp_init->recv_cq = ch->cq;
- qp_init->sq_sig_type = IB_SIGNAL_REQ_WR;
---
-2.43.0
-
diff --git a/queue-5.4/rdma-srpt-make-debug-output-more-detailed.patch b/queue-5.4/rdma-srpt-make-debug-output-more-detailed.patch
deleted file mode 100644
index 6aa00a4cad..0000000000
--- a/queue-5.4/rdma-srpt-make-debug-output-more-detailed.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From a70716a39f2c4bf1af379a8b794c2f960a232901 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 25 May 2020 10:22:10 -0700
-Subject: RDMA/srpt: Make debug output more detailed
-
-From: Bart Van Assche <bvanassche@acm.org>
-
-[ Upstream commit d4ee7f3a4445ec1b0b88af216f4032c4d30abf5a ]
-
-Since the session name by itself is not sufficient to uniquely identify a
-queue pair, include the queue pair number. Show the ASCII channel state
-name instead of the numeric value. This change makes the ib_srpt debug
-output more consistent.
-
-Link: https://lore.kernel.org/r/20200525172212.14413-3-bvanassche@acm.org
-Signed-off-by: Bart Van Assche <bvanassche@acm.org>
-Signed-off-by: Jason Gunthorpe <jgg@mellanox.com>
-Stable-dep-of: eb5c7465c324 ("RDMA/srpt: fix function pointer cast warnings")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/infiniband/ulp/srpt/ib_srpt.c | 9 +++++----
- 1 file changed, 5 insertions(+), 4 deletions(-)
-
-diff --git a/drivers/infiniband/ulp/srpt/ib_srpt.c b/drivers/infiniband/ulp/srpt/ib_srpt.c
-index 2822ca5e82779..ccd9811c6c1e2 100644
---- a/drivers/infiniband/ulp/srpt/ib_srpt.c
-+++ b/drivers/infiniband/ulp/srpt/ib_srpt.c
-@@ -217,8 +217,9 @@ static const char *get_ch_state_name(enum rdma_ch_state s)
- */
- static void srpt_qp_event(struct ib_event *event, struct srpt_rdma_ch *ch)
- {
-- pr_debug("QP event %d on ch=%p sess_name=%s state=%d\n",
-- event->event, ch, ch->sess_name, ch->state);
-+ pr_debug("QP event %d on ch=%p sess_name=%s-%d state=%s\n",
-+ event->event, ch, ch->sess_name, ch->qp->qp_num,
-+ get_ch_state_name(ch->state));
-
- switch (event->event) {
- case IB_EVENT_COMM_EST:
-@@ -2005,8 +2006,8 @@ static void __srpt_close_all_ch(struct srpt_port *sport)
- list_for_each_entry(nexus, &sport->nexus_list, entry) {
- list_for_each_entry(ch, &nexus->ch_list, list) {
- if (srpt_disconnect_ch(ch) >= 0)
-- pr_info("Closing channel %s because target %s_%d has been disabled\n",
-- ch->sess_name,
-+ pr_info("Closing channel %s-%d because target %s_%d has been disabled\n",
-+ ch->sess_name, ch->qp->qp_num,
- dev_name(&sport->sdev->device->dev),
- sport->port);
- srpt_close_ch(ch);
---
-2.43.0
-
diff --git a/queue-5.4/regulator-pwm-regulator-add-validity-checks-in-conti.patch b/queue-5.4/regulator-pwm-regulator-add-validity-checks-in-conti.patch
deleted file mode 100644
index 9df4e40707..0000000000
--- a/queue-5.4/regulator-pwm-regulator-add-validity-checks-in-conti.patch
+++ /dev/null
@@ -1,43 +0,0 @@
-From b24a079442be63e18533fbc6eae89a1c45a03cc1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 13 Jan 2024 23:46:26 +0100
-Subject: regulator: pwm-regulator: Add validity checks in continuous
- .get_voltage
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
-
-[ Upstream commit c92688cac239794e4a1d976afa5203a4d3a2ac0e ]
-
-Continuous regulators can be configured to operate only in a certain
-duty cycle range (for example from 0..91%). Add a check to error out if
-the duty cycle translates to an unsupported (or out of range) voltage.
-
-Suggested-by: Uwe Kleine-König <u.kleine-koenig@pengutronix.de>
-Signed-off-by: Martin Blumenstingl <martin.blumenstingl@googlemail.com>
-Link: https://msgid.link/r/20240113224628.377993-2-martin.blumenstingl@googlemail.com
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/regulator/pwm-regulator.c | 3 +++
- 1 file changed, 3 insertions(+)
-
-diff --git a/drivers/regulator/pwm-regulator.c b/drivers/regulator/pwm-regulator.c
-index 0a9d61a91f436..1b06aaaaf8b8e 100644
---- a/drivers/regulator/pwm-regulator.c
-+++ b/drivers/regulator/pwm-regulator.c
-@@ -158,6 +158,9 @@ static int pwm_regulator_get_voltage(struct regulator_dev *rdev)
- pwm_get_state(drvdata->pwm, &pstate);
-
- voltage = pwm_get_relative_duty_cycle(&pstate, duty_unit);
-+ if (voltage < min(max_uV_duty, min_uV_duty) ||
-+ voltage > max(max_uV_duty, min_uV_duty))
-+ return -ENOTRECOVERABLE;
-
- /*
- * The dutycycle for min_uV might be greater than the one for max_uV.
---
-2.43.0
-
diff --git a/queue-5.4/revert-drm-sun4i-dsi-change-the-start-delay-calculat.patch b/queue-5.4/revert-drm-sun4i-dsi-change-the-start-delay-calculat.patch
deleted file mode 100644
index d8542b2c1e..0000000000
--- a/queue-5.4/revert-drm-sun4i-dsi-change-the-start-delay-calculat.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From eb14ebef6b9913bfaa5c173dc24b4283526f1adf Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 1 Oct 2019 16:02:51 +0800
-Subject: Revert "drm/sun4i: dsi: Change the start delay calculation"
-
-From: Icenowy Zheng <icenowy@aosc.io>
-
-[ Upstream commit a00d17e0a71ae2e4fdaac46e1c12785d3346c3f2 ]
-
-This reverts commit da676c6aa6413d59ab0a80c97bbc273025e640b2.
-
-The original commit adds a start parameter to the calculation of the
-start delay according to some old BSP versions from Allwinner. However,
-there're two ways to add this delay -- add it in DSI controller or add
-it in the TCON. Add it in both controllers won't work.
-
-The code before this commit is picked from new versions of BSP kernel,
-which has a comment for the 1 that says "put start_delay to tcon". By
-checking the sun4i_tcon0_mode_set_cpu() in sun4i_tcon driver, it has
-already added this delay, so we shouldn't repeat to add the delay in DSI
-controller, otherwise the timing won't match.
-
-Signed-off-by: Icenowy Zheng <icenowy@aosc.io>
-Reviewed-by: Jagan Teki <jagan@amarulasolutions.com>
-Signed-off-by: Maxime Ripard <mripard@kernel.org>
-Link: https://patchwork.freedesktop.org/patch/msgid/20191001080253.6135-2-icenowy@aosc.io
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
-index f2b288037b909..a18efd3055199 100644
---- a/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
-+++ b/drivers/gpu/drm/sun4i/sun6i_mipi_dsi.c
-@@ -365,8 +365,7 @@ static void sun6i_dsi_inst_init(struct sun6i_dsi *dsi,
- static u16 sun6i_dsi_get_video_start_delay(struct sun6i_dsi *dsi,
- struct drm_display_mode *mode)
- {
-- u16 start = clamp(mode->vtotal - mode->vdisplay - 10, 8, 100);
-- u16 delay = mode->vtotal - (mode->vsync_end - mode->vdisplay) + start;
-+ u16 delay = mode->vtotal - (mode->vsync_end - mode->vdisplay) + 1;
-
- if (delay > mode->vtotal)
- delay = delay % mode->vtotal;
---
-2.43.0
-
diff --git a/queue-5.4/s390-qeth-fix-potential-loss-of-l3-ip-in-case-of-net.patch b/queue-5.4/s390-qeth-fix-potential-loss-of-l3-ip-in-case-of-net.patch
deleted file mode 100644
index a9818535af..0000000000
--- a/queue-5.4/s390-qeth-fix-potential-loss-of-l3-ip-in-case-of-net.patch
+++ /dev/null
@@ -1,77 +0,0 @@
-From 1fbc7fc5f8e90792ee1c8500f1b572257d8b5456 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 6 Feb 2024 09:58:49 +0100
-Subject: s390/qeth: Fix potential loss of L3-IP@ in case of network issues
-
-From: Alexandra Winter <wintera@linux.ibm.com>
-
-[ Upstream commit 2fe8a236436fe40d8d26a1af8d150fc80f04ee1a ]
-
-Symptom:
-In case of a bad cable connection (e.g. dirty optics) a fast sequence of
-network DOWN-UP-DOWN-UP could happen. UP triggers recovery of the qeth
-interface. In case of a second DOWN while recovery is still ongoing, it
-can happen that the IP@ of a Layer3 qeth interface is lost and will not
-be recovered by the second UP.
-
-Problem:
-When registration of IP addresses with Layer 3 qeth devices fails, (e.g.
-because of bad address format) the respective IP address is deleted from
-its hash-table in the driver. If registration fails because of a ENETDOWN
-condition, the address should stay in the hashtable, so a subsequent
-recovery can restore it.
-
-3caa4af834df ("qeth: keep ip-address after LAN_OFFLINE failure")
-fixes this for registration failures during normal operation, but not
-during recovery.
-
-Solution:
-Keep L3-IP address in case of ENETDOWN in qeth_l3_recover_ip(). For
-consistency with qeth_l3_add_ip() we also keep it in case of EADDRINUSE,
-i.e. for some reason the card already/still has this address registered.
-
-Fixes: 4a71df50047f ("qeth: new qeth device driver")
-Cc: stable@vger.kernel.org
-Signed-off-by: Alexandra Winter <wintera@linux.ibm.com>
-Link: https://lore.kernel.org/r/20240206085849.2902775-1-wintera@linux.ibm.com
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/s390/net/qeth_l3_main.c | 9 ++++++---
- 1 file changed, 6 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/s390/net/qeth_l3_main.c b/drivers/s390/net/qeth_l3_main.c
-index 8dee16aca421f..fe2bea2409427 100644
---- a/drivers/s390/net/qeth_l3_main.c
-+++ b/drivers/s390/net/qeth_l3_main.c
-@@ -305,9 +305,10 @@ static void qeth_l3_clear_ip_htable(struct qeth_card *card, int recover)
- if (!recover) {
- hash_del(&addr->hnode);
- kfree(addr);
-- continue;
-+ } else {
-+ /* prepare for recovery */
-+ addr->disp_flag = QETH_DISP_ADDR_ADD;
- }
-- addr->disp_flag = QETH_DISP_ADDR_ADD;
- }
-
- mutex_unlock(&card->ip_lock);
-@@ -335,11 +336,13 @@ static void qeth_l3_recover_ip(struct qeth_card *card)
- } else
- rc = qeth_l3_register_addr_entry(card, addr);
-
-- if (!rc) {
-+ if (!rc || rc == -EADDRINUSE || rc == -ENETDOWN) {
-+ /* keep it in the records */
- addr->disp_flag = QETH_DISP_ADDR_DO_NOTHING;
- if (addr->ref_counter < 1)
- qeth_l3_delete_ip(card, addr);
- } else {
-+ /* bad address */
- hash_del(&addr->hnode);
- kfree(addr);
- }
---
-2.43.0
-
diff --git a/queue-5.4/s390-use-the-correct-count-for-__iowrite64_copy.patch b/queue-5.4/s390-use-the-correct-count-for-__iowrite64_copy.patch
deleted file mode 100644
index d1aa844905..0000000000
--- a/queue-5.4/s390-use-the-correct-count-for-__iowrite64_copy.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From 422f78d1080194c9bfe6d9449cb97456658e10f4 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Fri, 16 Feb 2024 20:48:14 -0400
-Subject: s390: use the correct count for __iowrite64_copy()
-
-From: Jason Gunthorpe <jgg@nvidia.com>
-
-[ Upstream commit 723a2cc8d69d4342b47dfddbfe6c19f1b135f09b ]
-
-The signature for __iowrite64_copy() requires the number of 64 bit
-quantities, not bytes. Multiple by 8 to get to a byte length before
-invoking zpci_memcpy_toio()
-
-Fixes: 87bc359b9822 ("s390/pci: speed up __iowrite64_copy by using pci store block insn")
-Acked-by: Niklas Schnelle <schnelle@linux.ibm.com>
-Signed-off-by: Jason Gunthorpe <jgg@nvidia.com>
-Link: https://lore.kernel.org/r/0-v1-9223d11a7662+1d7785-s390_iowrite64_jgg@nvidia.com
-Signed-off-by: Heiko Carstens <hca@linux.ibm.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/s390/pci/pci.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/arch/s390/pci/pci.c b/arch/s390/pci/pci.c
-index b8ddacf1efe11..8d241f3c3b78b 100644
---- a/arch/s390/pci/pci.c
-+++ b/arch/s390/pci/pci.c
-@@ -223,7 +223,7 @@ resource_size_t pcibios_align_resource(void *data, const struct resource *res,
- /* combine single writes by using store-block insn */
- void __iowrite64_copy(void __iomem *to, const void *from, size_t count)
- {
-- zpci_memcpy_toio(to, from, count);
-+ zpci_memcpy_toio(to, from, count * 8);
- }
-
- void __iomem *ioremap(unsigned long ioaddr, unsigned long size)
---
-2.43.0
-
diff --git a/queue-5.4/sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch b/queue-5.4/sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch
deleted file mode 100644
index 1923174ddf..0000000000
--- a/queue-5.4/sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch
+++ /dev/null
@@ -1,94 +0,0 @@
-From 079be8fc630943d9fc70a97807feb73d169ee3fc Mon Sep 17 00:00:00 2001
-From: Cyril Hrubis <chrubis@suse.cz>
-Date: Mon, 2 Oct 2023 13:55:51 +0200
-Subject: sched/rt: Disallow writing invalid values to sched_rt_period_us
-
-From: Cyril Hrubis <chrubis@suse.cz>
-
-commit 079be8fc630943d9fc70a97807feb73d169ee3fc upstream.
-
-The validation of the value written to sched_rt_period_us was broken
-because:
-
- - the sysclt_sched_rt_period is declared as unsigned int
- - parsed by proc_do_intvec()
- - the range is asserted after the value parsed by proc_do_intvec()
-
-Because of this negative values written to the file were written into a
-unsigned integer that were later on interpreted as large positive
-integers which did passed the check:
-
- if (sysclt_sched_rt_period <= 0)
- return EINVAL;
-
-This commit fixes the parsing by setting explicit range for both
-perid_us and runtime_us into the sched_rt_sysctls table and processes
-the values with proc_dointvec_minmax() instead.
-
-Alternatively if we wanted to use full range of unsigned int for the
-period value we would have to split the proc_handler and use
-proc_douintvec() for it however even the
-Documentation/scheduller/sched-rt-group.rst describes the range as 1 to
-INT_MAX.
-
-As far as I can tell the only problem this causes is that the sysctl
-file allows writing negative values which when read back may confuse
-userspace.
-
-There is also a LTP test being submitted for these sysctl files at:
-
- http://patchwork.ozlabs.org/project/ltp/patch/20230901144433.2526-1-chrubis@suse.cz/
-
-Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
-Signed-off-by: Ingo Molnar <mingo@kernel.org>
-Link: https://lore.kernel.org/r/20231002115553.3007-2-chrubis@suse.cz
-[ pvorel: rebased for 5.4 ]
-Reviewed-by: Petr Vorel <pvorel@suse.cz>
-Signed-off-by: Petr Vorel <pvorel@suse.cz>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- kernel/sched/rt.c | 5 +----
- kernel/sysctl.c | 4 ++++
- 2 files changed, 5 insertions(+), 4 deletions(-)
-
---- a/kernel/sched/rt.c
-+++ b/kernel/sched/rt.c
-@@ -2659,9 +2659,6 @@ static int sched_rt_global_constraints(v
-
- static int sched_rt_global_validate(void)
- {
-- if (sysctl_sched_rt_period <= 0)
-- return -EINVAL;
--
- if ((sysctl_sched_rt_runtime != RUNTIME_INF) &&
- ((sysctl_sched_rt_runtime > sysctl_sched_rt_period) ||
- ((u64)sysctl_sched_rt_runtime *
-@@ -2693,7 +2690,7 @@ int sched_rt_handler(struct ctl_table *t
- old_period = sysctl_sched_rt_period;
- old_runtime = sysctl_sched_rt_runtime;
-
-- ret = proc_dointvec(table, write, buffer, lenp, ppos);
-+ ret = proc_dointvec_minmax(table, write, buffer, lenp, ppos);
-
- if (!ret && write) {
- ret = sched_rt_global_validate();
---- a/kernel/sysctl.c
-+++ b/kernel/sysctl.c
-@@ -465,6 +465,8 @@ static struct ctl_table kern_table[] = {
- .maxlen = sizeof(unsigned int),
- .mode = 0644,
- .proc_handler = sched_rt_handler,
-+ .extra1 = SYSCTL_ONE,
-+ .extra2 = SYSCTL_INT_MAX,
- },
- {
- .procname = "sched_rt_runtime_us",
-@@ -472,6 +474,8 @@ static struct ctl_table kern_table[] = {
- .maxlen = sizeof(int),
- .mode = 0644,
- .proc_handler = sched_rt_handler,
-+ .extra1 = &neg_one,
-+ .extra2 = SYSCTL_INT_MAX,
- },
- {
- .procname = "sched_rr_timeslice_ms",
diff --git a/queue-5.4/sched-rt-fix-sysctl_sched_rr_timeslice-intial-value.patch b/queue-5.4/sched-rt-fix-sysctl_sched_rr_timeslice-intial-value.patch
deleted file mode 100644
index a7791de605..0000000000
--- a/queue-5.4/sched-rt-fix-sysctl_sched_rr_timeslice-intial-value.patch
+++ /dev/null
@@ -1,72 +0,0 @@
-From c7fcb99877f9f542c918509b2801065adcaf46fa Mon Sep 17 00:00:00 2001
-From: Cyril Hrubis <chrubis@suse.cz>
-Date: Wed, 2 Aug 2023 17:19:05 +0200
-Subject: sched/rt: Fix sysctl_sched_rr_timeslice intial value
-
-From: Cyril Hrubis <chrubis@suse.cz>
-
-commit c7fcb99877f9f542c918509b2801065adcaf46fa upstream.
-
-There is a 10% rounding error in the intial value of the
-sysctl_sched_rr_timeslice with CONFIG_HZ_300=y.
-
-This was found with LTP test sched_rr_get_interval01:
-
-sched_rr_get_interval01.c:57: TPASS: sched_rr_get_interval() passed
-sched_rr_get_interval01.c:64: TPASS: Time quantum 0s 99999990ns
-sched_rr_get_interval01.c:72: TFAIL: /proc/sys/kernel/sched_rr_timeslice_ms != 100 got 90
-sched_rr_get_interval01.c:57: TPASS: sched_rr_get_interval() passed
-sched_rr_get_interval01.c:64: TPASS: Time quantum 0s 99999990ns
-sched_rr_get_interval01.c:72: TFAIL: /proc/sys/kernel/sched_rr_timeslice_ms != 100 got 90
-
-What this test does is to compare the return value from the
-sched_rr_get_interval() and the sched_rr_timeslice_ms sysctl file and
-fails if they do not match.
-
-The problem it found is the intial sysctl file value which was computed as:
-
-static int sysctl_sched_rr_timeslice = (MSEC_PER_SEC / HZ) * RR_TIMESLICE;
-
-which works fine as long as MSEC_PER_SEC is multiple of HZ, however it
-introduces 10% rounding error for CONFIG_HZ_300:
-
-(MSEC_PER_SEC / HZ) * (100 * HZ / 1000)
-
-(1000 / 300) * (100 * 300 / 1000)
-
-3 * 30 = 90
-
-This can be easily fixed by reversing the order of the multiplication
-and division. After this fix we get:
-
-(MSEC_PER_SEC * (100 * HZ / 1000)) / HZ
-
-(1000 * (100 * 300 / 1000)) / 300
-
-(1000 * 30) / 300 = 100
-
-Fixes: 975e155ed873 ("sched/rt: Show the 'sched_rr_timeslice' SCHED_RR timeslice tuning knob in milliseconds")
-Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Reviewed-by: Petr Vorel <pvorel@suse.cz>
-Acked-by: Mel Gorman <mgorman@suse.de>
-Tested-by: Petr Vorel <pvorel@suse.cz>
-Link: https://lore.kernel.org/r/20230802151906.25258-2-chrubis@suse.cz
-[ pvorel: rebased for 5.4 ]
-Signed-off-by: Petr Vorel <pvorel@suse.cz>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- kernel/sched/rt.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/kernel/sched/rt.c
-+++ b/kernel/sched/rt.c
-@@ -8,7 +8,7 @@
- #include "pelt.h"
-
- int sched_rr_timeslice = RR_TIMESLICE;
--int sysctl_sched_rr_timeslice = (MSEC_PER_SEC / HZ) * RR_TIMESLICE;
-+int sysctl_sched_rr_timeslice = (MSEC_PER_SEC * RR_TIMESLICE) / HZ;
- /* More than 4 hours if BW_SHIFT equals 20. */
- static const u64 max_rt_runtime = MAX_BW;
-
diff --git a/queue-5.4/sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch b/queue-5.4/sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch
deleted file mode 100644
index a4043413d0..0000000000
--- a/queue-5.4/sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From c1fc6484e1fb7cc2481d169bfef129a1b0676abe Mon Sep 17 00:00:00 2001
-From: Cyril Hrubis <chrubis@suse.cz>
-Date: Wed, 2 Aug 2023 17:19:06 +0200
-Subject: sched/rt: sysctl_sched_rr_timeslice show default timeslice after reset
-
-From: Cyril Hrubis <chrubis@suse.cz>
-
-commit c1fc6484e1fb7cc2481d169bfef129a1b0676abe upstream.
-
-The sched_rr_timeslice can be reset to default by writing value that is
-<= 0. However after reading from this file we always got the last value
-written, which is not useful at all.
-
-$ echo -1 > /proc/sys/kernel/sched_rr_timeslice_ms
-$ cat /proc/sys/kernel/sched_rr_timeslice_ms
--1
-
-Fix this by setting the variable that holds the sysctl file value to the
-jiffies_to_msecs(RR_TIMESLICE) in case that <= 0 value was written.
-
-Signed-off-by: Cyril Hrubis <chrubis@suse.cz>
-Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Reviewed-by: Petr Vorel <pvorel@suse.cz>
-Acked-by: Mel Gorman <mgorman@suse.de>
-Tested-by: Petr Vorel <pvorel@suse.cz>
-Cc: Mahmoud Adam <mngyadam@amazon.com>
-Link: https://lore.kernel.org/r/20230802151906.25258-3-chrubis@suse.cz
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- kernel/sched/rt.c | 3 +++
- 1 file changed, 3 insertions(+)
-
---- a/kernel/sched/rt.c
-+++ b/kernel/sched/rt.c
-@@ -2738,6 +2738,9 @@ int sched_rr_handler(struct ctl_table *t
- sched_rr_timeslice =
- sysctl_sched_rr_timeslice <= 0 ? RR_TIMESLICE :
- msecs_to_jiffies(sysctl_sched_rr_timeslice);
-+
-+ if (sysctl_sched_rr_timeslice <= 0)
-+ sysctl_sched_rr_timeslice = jiffies_to_msecs(RR_TIMESLICE);
- }
- mutex_unlock(&mutex);
-
diff --git a/queue-5.4/scripts-bpf-fix-xdp_md-forward-declaration-typo.patch b/queue-5.4/scripts-bpf-fix-xdp_md-forward-declaration-typo.patch
deleted file mode 100644
index 800808d3b9..0000000000
--- a/queue-5.4/scripts-bpf-fix-xdp_md-forward-declaration-typo.patch
+++ /dev/null
@@ -1,32 +0,0 @@
-From e0b68fb186b251374adbd870f99b1ecea236e770 Mon Sep 17 00:00:00 2001
-From: Andrii Nakryiko <andriin@fb.com>
-Date: Wed, 9 Oct 2019 21:25:34 -0700
-Subject: scripts/bpf: Fix xdp_md forward declaration typo
-
-From: Andrii Nakryiko <andriin@fb.com>
-
-commit e0b68fb186b251374adbd870f99b1ecea236e770 upstream.
-
-Fix typo in struct xpd_md, generated from bpf_helpers_doc.py, which is
-causing compilation warnings for programs using bpf_helpers.h
-
-Fixes: 7a387bed47f7 ("scripts/bpf: teach bpf_helpers_doc.py to dump BPF helper definitions")
-Signed-off-by: Andrii Nakryiko <andriin@fb.com>
-Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-Link: https://lore.kernel.org/bpf/20191010042534.290562-1-andriin@fb.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- scripts/bpf_helpers_doc.py | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/scripts/bpf_helpers_doc.py
-+++ b/scripts/bpf_helpers_doc.py
-@@ -418,7 +418,7 @@ class PrinterHelpers(Printer):
-
- 'struct __sk_buff',
- 'struct sk_msg_md',
-- 'struct xpd_md',
-+ 'struct xdp_md',
- ]
- known_types = {
- '...',
diff --git a/queue-5.4/scripts-bpf-teach-bpf_helpers_doc.py-to-dump-bpf-hel.patch b/queue-5.4/scripts-bpf-teach-bpf_helpers_doc.py-to-dump-bpf-hel.patch
deleted file mode 100644
index d7074c2857..0000000000
--- a/queue-5.4/scripts-bpf-teach-bpf_helpers_doc.py-to-dump-bpf-hel.patch
+++ /dev/null
@@ -1,201 +0,0 @@
-From 3b32be33273af19784c071482fbd0b3755701a4a Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sun, 6 Oct 2019 20:07:37 -0700
-Subject: scripts/bpf: teach bpf_helpers_doc.py to dump BPF helper definitions
-
-From: Andrii Nakryiko <andriin@fb.com>
-
-[ Upstream commit 7a387bed47f7e80e257d966cd64a3e92a63e26a1 ]
-
-Enhance scripts/bpf_helpers_doc.py to emit C header with BPF helper
-definitions (to be included from libbpf's bpf_helpers.h).
-
-Signed-off-by: Andrii Nakryiko <andriin@fb.com>
-Signed-off-by: Alexei Starovoitov <ast@kernel.org>
-Stable-dep-of: e37243b65d52 ("bpf, scripts: Correct GPL license name")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- scripts/bpf_helpers_doc.py | 155 ++++++++++++++++++++++++++++++++++++-
- 1 file changed, 154 insertions(+), 1 deletion(-)
-
-diff --git a/scripts/bpf_helpers_doc.py b/scripts/bpf_helpers_doc.py
-index 894cc58c1a034..15d3d83d6297c 100755
---- a/scripts/bpf_helpers_doc.py
-+++ b/scripts/bpf_helpers_doc.py
-@@ -391,6 +391,154 @@ SEE ALSO
-
- print('')
-
-+class PrinterHelpers(Printer):
-+ """
-+ A printer for dumping collected information about helpers as C header to
-+ be included from BPF program.
-+ @helpers: array of Helper objects to print to standard output
-+ """
-+
-+ type_fwds = [
-+ 'struct bpf_fib_lookup',
-+ 'struct bpf_perf_event_data',
-+ 'struct bpf_perf_event_value',
-+ 'struct bpf_sock',
-+ 'struct bpf_sock_addr',
-+ 'struct bpf_sock_ops',
-+ 'struct bpf_sock_tuple',
-+ 'struct bpf_spin_lock',
-+ 'struct bpf_sysctl',
-+ 'struct bpf_tcp_sock',
-+ 'struct bpf_tunnel_key',
-+ 'struct bpf_xfrm_state',
-+ 'struct pt_regs',
-+ 'struct sk_reuseport_md',
-+ 'struct sockaddr',
-+ 'struct tcphdr',
-+
-+ 'struct __sk_buff',
-+ 'struct sk_msg_md',
-+ 'struct xpd_md',
-+ ]
-+ known_types = {
-+ '...',
-+ 'void',
-+ 'const void',
-+ 'char',
-+ 'const char',
-+ 'int',
-+ 'long',
-+ 'unsigned long',
-+
-+ '__be16',
-+ '__be32',
-+ '__wsum',
-+
-+ 'struct bpf_fib_lookup',
-+ 'struct bpf_perf_event_data',
-+ 'struct bpf_perf_event_value',
-+ 'struct bpf_sock',
-+ 'struct bpf_sock_addr',
-+ 'struct bpf_sock_ops',
-+ 'struct bpf_sock_tuple',
-+ 'struct bpf_spin_lock',
-+ 'struct bpf_sysctl',
-+ 'struct bpf_tcp_sock',
-+ 'struct bpf_tunnel_key',
-+ 'struct bpf_xfrm_state',
-+ 'struct pt_regs',
-+ 'struct sk_reuseport_md',
-+ 'struct sockaddr',
-+ 'struct tcphdr',
-+ }
-+ mapped_types = {
-+ 'u8': '__u8',
-+ 'u16': '__u16',
-+ 'u32': '__u32',
-+ 'u64': '__u64',
-+ 's8': '__s8',
-+ 's16': '__s16',
-+ 's32': '__s32',
-+ 's64': '__s64',
-+ 'size_t': 'unsigned long',
-+ 'struct bpf_map': 'void',
-+ 'struct sk_buff': 'struct __sk_buff',
-+ 'const struct sk_buff': 'const struct __sk_buff',
-+ 'struct sk_msg_buff': 'struct sk_msg_md',
-+ 'struct xdp_buff': 'struct xdp_md',
-+ }
-+
-+ def print_header(self):
-+ header = '''\
-+/* This is auto-generated file. See bpf_helpers_doc.py for details. */
-+
-+/* Forward declarations of BPF structs */'''
-+
-+ print(header)
-+ for fwd in self.type_fwds:
-+ print('%s;' % fwd)
-+ print('')
-+
-+ def print_footer(self):
-+ footer = ''
-+ print(footer)
-+
-+ def map_type(self, t):
-+ if t in self.known_types:
-+ return t
-+ if t in self.mapped_types:
-+ return self.mapped_types[t]
-+ print("")
-+ print("Unrecognized type '%s', please add it to known types!" % t)
-+ sys.exit(1)
-+
-+ seen_helpers = set()
-+
-+ def print_one(self, helper):
-+ proto = helper.proto_break_down()
-+
-+ if proto['name'] in self.seen_helpers:
-+ return
-+ self.seen_helpers.add(proto['name'])
-+
-+ print('/*')
-+ print(" * %s" % proto['name'])
-+ print(" *")
-+ if (helper.desc):
-+ # Do not strip all newline characters: formatted code at the end of
-+ # a section must be followed by a blank line.
-+ for line in re.sub('\n$', '', helper.desc, count=1).split('\n'):
-+ print(' *{}{}'.format(' \t' if line else '', line))
-+
-+ if (helper.ret):
-+ print(' *')
-+ print(' * Returns')
-+ for line in helper.ret.rstrip().split('\n'):
-+ print(' *{}{}'.format(' \t' if line else '', line))
-+
-+ print(' */')
-+ print('static %s %s(*%s)(' % (self.map_type(proto['ret_type']),
-+ proto['ret_star'], proto['name']), end='')
-+ comma = ''
-+ for i, a in enumerate(proto['args']):
-+ t = a['type']
-+ n = a['name']
-+ if proto['name'] == 'bpf_get_socket_cookie' and i == 0:
-+ t = 'void'
-+ n = 'ctx'
-+ one_arg = '{}{}'.format(comma, self.map_type(t))
-+ if n:
-+ if a['star']:
-+ one_arg += ' {}'.format(a['star'])
-+ else:
-+ one_arg += ' '
-+ one_arg += '{}'.format(n)
-+ comma = ', '
-+ print(one_arg, end='')
-+
-+ print(') = (void *) %d;' % len(self.seen_helpers))
-+ print('')
-+
- ###############################################################################
-
- # If script is launched from scripts/ from kernel tree and can access
-@@ -405,6 +553,8 @@ Parse eBPF header file and generate documentation for eBPF helper functions.
- The RST-formatted output produced can be turned into a manual page with the
- rst2man utility.
- """)
-+argParser.add_argument('--header', action='store_true',
-+ help='generate C header file')
- if (os.path.isfile(bpfh)):
- argParser.add_argument('--filename', help='path to include/uapi/linux/bpf.h',
- default=bpfh)
-@@ -417,5 +567,8 @@ headerParser = HeaderParser(args.filename)
- headerParser.run()
-
- # Print formatted output to standard output.
--printer = PrinterRST(headerParser.helpers)
-+if args.header:
-+ printer = PrinterHelpers(headerParser.helpers)
-+else:
-+ printer = PrinterRST(headerParser.helpers)
- printer.print_all()
---
-2.43.0
-
diff --git a/queue-5.4/scsi-jazz_esp-only-build-if-scsi-core-is-builtin.patch b/queue-5.4/scsi-jazz_esp-only-build-if-scsi-core-is-builtin.patch
deleted file mode 100644
index 1b45d20f60..0000000000
--- a/queue-5.4/scsi-jazz_esp-only-build-if-scsi-core-is-builtin.patch
+++ /dev/null
@@ -1,54 +0,0 @@
-From a20baf2ebc056e9a4d2e356c1dffe5c2e626d158 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 13 Feb 2024 21:59:53 -0800
-Subject: scsi: jazz_esp: Only build if SCSI core is builtin
-
-From: Randy Dunlap <rdunlap@infradead.org>
-
-[ Upstream commit 9ddf190a7df77b77817f955fdb9c2ae9d1c9c9a3 ]
-
-JAZZ_ESP is a bool kconfig symbol that selects SCSI_SPI_ATTRS. When
-CONFIG_SCSI=m, this results in SCSI_SPI_ATTRS=m while JAZZ_ESP=y, which
-causes many undefined symbol linker errors.
-
-Fix this by only offering to build this driver when CONFIG_SCSI=y.
-
-[mkp: JAZZ_ESP is unique in that it does not support being compiled as a
-module unlike the remaining SPI SCSI HBA drivers]
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
-Link: https://lore.kernel.org/r/20240214055953.9612-1-rdunlap@infradead.org
-Cc: Thomas Bogendoerfer <tsbogend@alpha.franken.de>
-Cc: linux-mips@vger.kernel.org
-Cc: Arnd Bergmann <arnd@arndb.de>
-Cc: Masahiro Yamada <masahiroy@kernel.org>
-Cc: Nicolas Schier <nicolas@fjasle.eu>
-Cc: James E.J. Bottomley <jejb@linux.ibm.com>
-Cc: Martin K. Petersen <martin.petersen@oracle.com>
-Cc: linux-scsi@vger.kernel.org
-Cc: Geert Uytterhoeven <geert@linux-m68k.org>
-Reported-by: kernel test robot <lkp@intel.com>
-Closes: https://lore.kernel.org/oe-kbuild-all/202402112222.Gl0udKyU-lkp@intel.com/
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/Kconfig | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/drivers/scsi/Kconfig b/drivers/scsi/Kconfig
-index 51bbc858a944c..cab6e67ea606b 100644
---- a/drivers/scsi/Kconfig
-+++ b/drivers/scsi/Kconfig
-@@ -1286,7 +1286,7 @@ source "drivers/scsi/arm/Kconfig"
-
- config JAZZ_ESP
- bool "MIPS JAZZ FAS216 SCSI support"
-- depends on MACH_JAZZ && SCSI
-+ depends on MACH_JAZZ && SCSI=y
- select SCSI_SPI_ATTRS
- help
- This is the driver for the onboard SCSI host adapter of MIPS Magnum
---
-2.43.0
-
diff --git a/queue-5.4/scsi-lpfc-use-unsigned-type-for-num_sge.patch b/queue-5.4/scsi-lpfc-use-unsigned-type-for-num_sge.patch
deleted file mode 100644
index 08130f3c62..0000000000
--- a/queue-5.4/scsi-lpfc-use-unsigned-type-for-num_sge.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From d05a0bb63ac4db769becb7e0e866290fa580d5b6 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 20 Dec 2023 17:26:58 +0100
-Subject: scsi: lpfc: Use unsigned type for num_sge
-
-From: Hannes Reinecke <hare@suse.de>
-
-[ Upstream commit d6c1b19153f92e95e5e1801d540e98771053afae ]
-
-LUNs going into "failed ready running" state observed on >1T and on even
-numbers of size (2T, 4T, 6T, 8T and 10T). The issue occurs when DIF is
-enabled at the host.
-
-The kernel logs:
-
- Cannot setup S/G List for HBAIO segs 1/1 SGL 512 SCSI 256: 3 0
-
-The host lpfc driver is failing to setup scatter/gather list (protection
-data) for the I/Os.
-
-The return type lpfc_bg_setup_sgl()/lpfc_bg_setup_sgl_prot() causes the
-compiler to remove the most significant bit. Use an unsigned type instead.
-
-Signed-off-by: Hannes Reinecke <hare@suse.de>
-[dwagner: added commit message]
-Signed-off-by: Daniel Wagner <dwagner@suse.de>
-Link: https://lore.kernel.org/r/20231220162658.12392-1-dwagner@suse.de
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/scsi/lpfc/lpfc_scsi.c | 12 ++++++------
- 1 file changed, 6 insertions(+), 6 deletions(-)
-
-diff --git a/drivers/scsi/lpfc/lpfc_scsi.c b/drivers/scsi/lpfc/lpfc_scsi.c
-index cbab15d299ca2..816235ccd2992 100644
---- a/drivers/scsi/lpfc/lpfc_scsi.c
-+++ b/drivers/scsi/lpfc/lpfc_scsi.c
-@@ -1942,7 +1942,7 @@ lpfc_bg_setup_bpl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
- *
- * Returns the number of SGEs added to the SGL.
- **/
--static int
-+static uint32_t
- lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
- struct sli4_sge *sgl, int datasegcnt,
- struct lpfc_io_buf *lpfc_cmd)
-@@ -1950,8 +1950,8 @@ lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
- struct scatterlist *sgde = NULL; /* s/g data entry */
- struct sli4_sge_diseed *diseed = NULL;
- dma_addr_t physaddr;
-- int i = 0, num_sge = 0, status;
-- uint32_t reftag;
-+ int i = 0, status;
-+ uint32_t reftag, num_sge = 0;
- uint8_t txop, rxop;
- #ifdef CONFIG_SCSI_LPFC_DEBUG_FS
- uint32_t rc;
-@@ -2122,7 +2122,7 @@ lpfc_bg_setup_sgl(struct lpfc_hba *phba, struct scsi_cmnd *sc,
- *
- * Returns the number of SGEs added to the SGL.
- **/
--static int
-+static uint32_t
- lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
- struct sli4_sge *sgl, int datacnt, int protcnt,
- struct lpfc_io_buf *lpfc_cmd)
-@@ -2146,8 +2146,8 @@ lpfc_bg_setup_sgl_prot(struct lpfc_hba *phba, struct scsi_cmnd *sc,
- uint32_t rc;
- #endif
- uint32_t checking = 1;
-- uint32_t dma_offset = 0;
-- int num_sge = 0, j = 2;
-+ uint32_t dma_offset = 0, num_sge = 0;
-+ int j = 2;
- struct sli4_hybrid_sgl *sgl_xtra = NULL;
-
- sgpe = scsi_prot_sglist(sc);
---
-2.43.0
-
diff --git a/queue-5.4/scsi-target-core-add-tmf-to-tmr_list-handling.patch b/queue-5.4/scsi-target-core-add-tmf-to-tmr_list-handling.patch
deleted file mode 100644
index 7cc2f401d5..0000000000
--- a/queue-5.4/scsi-target-core-add-tmf-to-tmr_list-handling.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From 4c2025b31661fcd770935c52cbbeadb31aea3905 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 11 Jan 2024 15:59:41 +0300
-Subject: scsi: target: core: Add TMF to tmr_list handling
-
-From: Dmitry Bogdanov <d.bogdanov@yadro.com>
-
-[ Upstream commit 83ab68168a3d990d5ff39ab030ad5754cbbccb25 ]
-
-An abort that is responded to by iSCSI itself is added to tmr_list but does
-not go to target core. A LUN_RESET that goes through tmr_list takes a
-refcounter on the abort and waits for completion. However, the abort will
-be never complete because it was not started in target core.
-
- Unable to locate ITT: 0x05000000 on CID: 0
- Unable to locate RefTaskTag: 0x05000000 on CID: 0.
- wait_for_tasks: Stopping tmf LUN_RESET with tag 0x0 ref_task_tag 0x0 i_state 34 t_state ISTATE_PROCESSING refcnt 2 transport_state active,stop,fabric_stop
- wait for tasks: tmf LUN_RESET with tag 0x0 ref_task_tag 0x0 i_state 34 t_state ISTATE_PROCESSING refcnt 2 transport_state active,stop,fabric_stop
-...
- INFO: task kworker/0:2:49 blocked for more than 491 seconds.
- task:kworker/0:2 state:D stack: 0 pid: 49 ppid: 2 flags:0x00000800
- Workqueue: events target_tmr_work [target_core_mod]
-Call Trace:
- __switch_to+0x2c4/0x470
- _schedule+0x314/0x1730
- schedule+0x64/0x130
- schedule_timeout+0x168/0x430
- wait_for_completion+0x140/0x270
- target_put_cmd_and_wait+0x64/0xb0 [target_core_mod]
- core_tmr_lun_reset+0x30/0xa0 [target_core_mod]
- target_tmr_work+0xc8/0x1b0 [target_core_mod]
- process_one_work+0x2d4/0x5d0
- worker_thread+0x78/0x6c0
-
-To fix this, only add abort to tmr_list if it will be handled by target
-core.
-
-Signed-off-by: Dmitry Bogdanov <d.bogdanov@yadro.com>
-Link: https://lore.kernel.org/r/20240111125941.8688-1-d.bogdanov@yadro.com
-Reviewed-by: Mike Christie <michael.christie@oracle.com>
-Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/target/target_core_device.c | 5 -----
- drivers/target/target_core_transport.c | 4 ++++
- 2 files changed, 4 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/target/target_core_device.c b/drivers/target/target_core_device.c
-index 8ba134ccd3b9c..edddc66ad1337 100644
---- a/drivers/target/target_core_device.c
-+++ b/drivers/target/target_core_device.c
-@@ -151,7 +151,6 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
- struct se_session *se_sess = se_cmd->se_sess;
- struct se_node_acl *nacl = se_sess->se_node_acl;
- struct se_tmr_req *se_tmr = se_cmd->se_tmr_req;
-- unsigned long flags;
-
- rcu_read_lock();
- deve = target_nacl_find_deve(nacl, unpacked_lun);
-@@ -182,10 +181,6 @@ int transport_lookup_tmr_lun(struct se_cmd *se_cmd, u64 unpacked_lun)
- se_cmd->se_dev = rcu_dereference_raw(se_lun->lun_se_dev);
- se_tmr->tmr_dev = rcu_dereference_raw(se_lun->lun_se_dev);
-
-- spin_lock_irqsave(&se_tmr->tmr_dev->se_tmr_lock, flags);
-- list_add_tail(&se_tmr->tmr_list, &se_tmr->tmr_dev->dev_tmr_list);
-- spin_unlock_irqrestore(&se_tmr->tmr_dev->se_tmr_lock, flags);
--
- return 0;
- }
- EXPORT_SYMBOL(transport_lookup_tmr_lun);
-diff --git a/drivers/target/target_core_transport.c b/drivers/target/target_core_transport.c
-index f52fe40002259..82d9e2659abe3 100644
---- a/drivers/target/target_core_transport.c
-+++ b/drivers/target/target_core_transport.c
-@@ -3392,6 +3392,10 @@ int transport_generic_handle_tmr(
- unsigned long flags;
- bool aborted = false;
-
-+ spin_lock_irqsave(&cmd->se_dev->se_tmr_lock, flags);
-+ list_add_tail(&cmd->se_tmr_req->tmr_list, &cmd->se_dev->dev_tmr_list);
-+ spin_unlock_irqrestore(&cmd->se_dev->se_tmr_lock, flags);
-+
- spin_lock_irqsave(&cmd->t_state_lock, flags);
- if (cmd->transport_state & CMD_T_ABORTED) {
- aborted = true;
---
-2.43.0
-
diff --git a/queue-5.4/selftests-bpf-avoid-running-unprivileged-tests-with-.patch b/queue-5.4/selftests-bpf-avoid-running-unprivileged-tests-with-.patch
deleted file mode 100644
index 35e330c1f0..0000000000
--- a/queue-5.4/selftests-bpf-avoid-running-unprivileged-tests-with-.patch
+++ /dev/null
@@ -1,60 +0,0 @@
-From 7f4979bc30e7e18e52f05d39eb1b6b37518fcf25 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Wed, 18 Nov 2020 08:16:39 +0100
-Subject: selftests/bpf: Avoid running unprivileged tests with alignment
- requirements
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Björn Töpel <bjorn.topel@gmail.com>
-
-[ Upstream commit c77b0589ca29ad1859fe7d7c1ecd63c0632379fa ]
-
-Some architectures have strict alignment requirements. In that case,
-the BPF verifier detects if a program has unaligned accesses and
-rejects them. A user can pass BPF_F_ANY_ALIGNMENT to a program to
-override this check. That, however, will only work when a privileged
-user loads a program. An unprivileged user loading a program with this
-flag will be rejected prior entering the verifier.
-
-Hence, it does not make sense to load unprivileged programs without
-strict alignment when testing the verifier. This patch avoids exactly
-that.
-
-Signed-off-by: Björn Töpel <bjorn.topel@gmail.com>
-Signed-off-by: Andrii Nakryiko <andrii@kernel.org>
-Acked-by: Luke Nelson <luke.r.nels@gmail.com>
-Link: https://lore.kernel.org/bpf/20201118071640.83773-3-bjorn.topel@gmail.com
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- tools/testing/selftests/bpf/test_verifier.c | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
-
-diff --git a/tools/testing/selftests/bpf/test_verifier.c b/tools/testing/selftests/bpf/test_verifier.c
-index 43224c5ec1e9b..1bd285dc55e94 100644
---- a/tools/testing/selftests/bpf/test_verifier.c
-+++ b/tools/testing/selftests/bpf/test_verifier.c
-@@ -1091,6 +1091,19 @@ static void get_unpriv_disabled()
-
- static bool test_as_unpriv(struct bpf_test *test)
- {
-+#ifndef CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS
-+ /* Some architectures have strict alignment requirements. In
-+ * that case, the BPF verifier detects if a program has
-+ * unaligned accesses and rejects them. A user can pass
-+ * BPF_F_ANY_ALIGNMENT to a program to override this
-+ * check. That, however, will only work when a privileged user
-+ * loads a program. An unprivileged user loading a program
-+ * with this flag will be rejected prior entering the
-+ * verifier.
-+ */
-+ if (test->flags & F_NEEDS_EFFICIENT_UNALIGNED_ACCESS)
-+ return false;
-+#endif
- return !test->prog_type ||
- test->prog_type == BPF_PROG_TYPE_SOCKET_FILTER ||
- test->prog_type == BPF_PROG_TYPE_CGROUP_SKB;
---
-2.43.0
-
diff --git a/queue-5.4/series b/queue-5.4/series
deleted file mode 100644
index e253a0e7f7..0000000000
--- a/queue-5.4/series
+++ /dev/null
@@ -1,83 +0,0 @@
-kvm-arm64-vgic-its-test-for-valid-irq-in-its_sync_lpi_pending_table.patch
-kvm-arm64-vgic-its-test-for-valid-irq-in-movall-handler.patch
-net-sched-retire-cbq-qdisc.patch
-net-sched-retire-atm-qdisc.patch
-net-sched-retire-dsmark-qdisc.patch
-sched-rt-sysctl_sched_rr_timeslice-show-default-timeslice-after-reset.patch
-memcg-add-refcnt-for-pcpu-stock-to-avoid-uaf-problem-in-drain_all_stock.patch
-nilfs2-replace-warn_ons-for-invalid-dat-metadata-block-requests.patch
-userfaultfd-fix-mmap_changing-checking-in-mfill_atomic_hugetlb.patch
-sched-rt-fix-sysctl_sched_rr_timeslice-intial-value.patch
-sched-rt-disallow-writing-invalid-values-to-sched_rt_period_us.patch
-scsi-target-core-add-tmf-to-tmr_list-handling.patch
-dmaengine-shdma-increase-size-of-dev_id.patch
-dmaengine-fsl-qdma-increase-size-of-irq_name.patch
-wifi-cfg80211-fix-missing-interfaces-when-dumping.patch
-wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch
-fbdev-savage-error-out-if-pixclock-equals-zero.patch
-fbdev-sis-error-out-if-pixclock-equals-zero.patch
-ahci-asm1166-correct-count-of-reported-ports.patch
-ahci-add-43-bit-dma-address-quirk-for-asmedia-asm106.patch
-ext4-avoid-allocating-blocks-from-corrupted-group-in.patch
-ext4-avoid-allocating-blocks-from-corrupted-group-in.patch-12902
-regulator-pwm-regulator-add-validity-checks-in-conti.patch
-nvmet-tcp-fix-nvme-tcp-ida-memory-leak.patch
-asoc-sunxi-sun4i-spdif-add-support-for-allwinner-h61.patch
-netfilter-conntrack-check-sctp_cid_shutdown_ack-for-.patch
-nvmet-fc-abort-command-when-there-is-no-binding.patch
-hwmon-coretemp-enlarge-per-package-core-count-limit.patch
-scsi-lpfc-use-unsigned-type-for-num_sge.patch
-firewire-core-send-bus-reset-promptly-on-gap-count-e.patch
-virtio-blk-ensure-no-requests-in-virtqueues-before-d.patch
-s390-qeth-fix-potential-loss-of-l3-ip-in-case-of-net.patch
-pmdomain-renesas-r8a77980-sysc-cr7-must-be-always-on.patch
-tcp-factor-out-__tcp_close-helper.patch
-tcp-return-epollout-from-tcp_poll-only-when-notsent_.patch
-tcp-add-annotations-around-sk-sk_shutdown-accesses.patch
-pinctrl-pinctrl-rockchip-fix-a-bunch-of-kerneldoc-mi.patch
-pinctrl-rockchip-fix-refcount-leak-in-rockchip_pinct.patch
-spi-mt7621-fix-an-error-message-in-mt7621_spi_probe.patch
-net-bridge-clear-bridge-s-private-skb-space-on-xmit.patch
-selftests-bpf-avoid-running-unprivileged-tests-with-.patch
-alsa-hda-realtek-enable-micmute-led-on-and-hp-system.patch
-revert-drm-sun4i-dsi-change-the-start-delay-calculat.patch
-drm-amdgpu-check-for-valid-number-of-registers-to-re.patch
-x86-alternatives-disable-kasan-in-apply_alternatives.patch
-dm-integrity-don-t-modify-bio-s-immutable-bio_vec-in.patch
-iomap-set-all-uptodate-bits-for-an-uptodate-page.patch
-drm-amdgpu-fix-type-of-second-parameter-in-trans_msg.patch
-arm64-dts-qcom-msm8916-fix-typo-in-pronto-remoteproc.patch
-pci-tegra-fix-reporting-gpio-error-value.patch
-pci-tegra-fix-of-node-reference-leak.patch
-ib-hfi1-fix-sdma.h-tx-num_descs-off-by-one-error.patch
-dm-crypt-don-t-modify-the-data-when-using-authenticated-encryption.patch
-gtp-fix-use-after-free-and-null-ptr-deref-in-gtp_genl_dump_pdp.patch
-pci-msi-prevent-msi-hardware-interrupt-number-truncation.patch
-l2tp-pass-correct-message-length-to-ip6_append_data.patch
-arm-ep93xx-add-terminator-to-gpiod_lookup_table.patch
-usb-cdns3-fixed-memory-use-after-free-at-cdns3_gadget_ep_disable.patch
-usb-cdns3-fix-memory-double-free-when-handle-zero-packet.patch
-usb-gadget-ncm-avoid-dropping-datagrams-of-properly-parsed-ntbs.patch
-usb-roles-don-t-get-set_role-when-usb_role_switch-is-unregistered.patch
-ib-hfi1-fix-a-memleak-in-init_credit_return.patch
-rdma-bnxt_re-return-error-for-srq-resize.patch
-rdma-srpt-make-debug-output-more-detailed.patch
-rdma-srpt-fix-function-pointer-cast-warnings.patch
-scripts-bpf-teach-bpf_helpers_doc.py-to-dump-bpf-hel.patch
-bpf-scripts-correct-gpl-license-name.patch
-scsi-jazz_esp-only-build-if-scsi-core-is-builtin.patch
-nouveau-fix-function-cast-warnings.patch
-ipv4-properly-combine-dev_base_seq-and-ipv4.dev_addr.patch
-ipv6-properly-combine-dev_base_seq-and-ipv6.dev_addr.patch
-afs-increase-buffer-size-in-afs_update_volume_status.patch
-ipv6-sr-fix-possible-use-after-free-and-null-ptr-der.patch
-packet-move-from-strlcpy-with-unused-retval-to-strsc.patch
-s390-use-the-correct-count-for-__iowrite64_copy.patch
-tls-rx-jump-to-a-more-appropriate-label.patch
-tls-rx-drop-pointless-else-after-goto.patch
-tls-stop-recv-if-initial-process_rx_list-gave-us-non.patch
-netfilter-nf_tables-set-dormant-flag-on-hook-registe.patch
-drm-syncobj-make-lockdep-complain-on-wait_for_submit.patch
-drm-syncobj-call-drm_syncobj_fence_add_wait-when-wai.patch
-fs-aio-restrict-kiocb_set_cancel_fn-to-i-o-submitted-via-libaio.patch
-scripts-bpf-fix-xdp_md-forward-declaration-typo.patch
diff --git a/queue-5.4/spi-mt7621-fix-an-error-message-in-mt7621_spi_probe.patch b/queue-5.4/spi-mt7621-fix-an-error-message-in-mt7621_spi_probe.patch
deleted file mode 100644
index 386645c1d7..0000000000
--- a/queue-5.4/spi-mt7621-fix-an-error-message-in-mt7621_spi_probe.patch
+++ /dev/null
@@ -1,48 +0,0 @@
-From c4e772c34e6075f6cf6803136a2e73382564c757 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Sat, 27 Aug 2022 13:42:07 +0200
-Subject: spi: mt7621: Fix an error message in mt7621_spi_probe()
-
-From: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
-
-[ Upstream commit 2b2bf6b7faa9010fae10dc7de76627a3fdb525b3 ]
-
-'status' is known to be 0 at this point. The expected error code is
-PTR_ERR(clk).
-
-Switch to dev_err_probe() in order to display the expected error code (in a
-human readable way).
-This also filters -EPROBE_DEFER cases, should it happen.
-
-Fixes: 1ab7f2a43558 ("staging: mt7621-spi: add mt7621 support")
-Signed-off-by: Christophe JAILLET <christophe.jaillet@wanadoo.fr>
-Reviewed-by: Matthias Brugger <matthias.bgg@gmail.com>
-Link: https://lore.kernel.org/r/928f3fb507d53ba0774df27cea0bbba4b055993b.1661599671.git.christophe.jaillet@wanadoo.fr
-Signed-off-by: Mark Brown <broonie@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/spi/spi-mt7621.c | 8 +++-----
- 1 file changed, 3 insertions(+), 5 deletions(-)
-
-diff --git a/drivers/spi/spi-mt7621.c b/drivers/spi/spi-mt7621.c
-index b4b9b7309b5e9..351b0ef52bbc8 100644
---- a/drivers/spi/spi-mt7621.c
-+++ b/drivers/spi/spi-mt7621.c
-@@ -340,11 +340,9 @@ static int mt7621_spi_probe(struct platform_device *pdev)
- return PTR_ERR(base);
-
- clk = devm_clk_get(&pdev->dev, NULL);
-- if (IS_ERR(clk)) {
-- dev_err(&pdev->dev, "unable to get SYS clock, err=%d\n",
-- status);
-- return PTR_ERR(clk);
-- }
-+ if (IS_ERR(clk))
-+ return dev_err_probe(&pdev->dev, PTR_ERR(clk),
-+ "unable to get SYS clock\n");
-
- status = clk_prepare_enable(clk);
- if (status)
---
-2.43.0
-
diff --git a/queue-5.4/tcp-add-annotations-around-sk-sk_shutdown-accesses.patch b/queue-5.4/tcp-add-annotations-around-sk-sk_shutdown-accesses.patch
deleted file mode 100644
index a42641bd01..0000000000
--- a/queue-5.4/tcp-add-annotations-around-sk-sk_shutdown-accesses.patch
+++ /dev/null
@@ -1,158 +0,0 @@
-From de4de149e7d947c9c9b11b80e6dbbfaae573971b Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 9 May 2023 20:36:56 +0000
-Subject: tcp: add annotations around sk->sk_shutdown accesses
-
-From: Eric Dumazet <edumazet@google.com>
-
-[ Upstream commit e14cadfd80d76f01bfaa1a8d745b1db19b57d6be ]
-
-Now sk->sk_shutdown is no longer a bitfield, we can add
-standard READ_ONCE()/WRITE_ONCE() annotations to silence
-KCSAN reports like the following:
-
-BUG: KCSAN: data-race in tcp_disconnect / tcp_poll
-
-write to 0xffff88814588582c of 1 bytes by task 3404 on cpu 1:
-tcp_disconnect+0x4d6/0xdb0 net/ipv4/tcp.c:3121
-__inet_stream_connect+0x5dd/0x6e0 net/ipv4/af_inet.c:715
-inet_stream_connect+0x48/0x70 net/ipv4/af_inet.c:727
-__sys_connect_file net/socket.c:2001 [inline]
-__sys_connect+0x19b/0x1b0 net/socket.c:2018
-__do_sys_connect net/socket.c:2028 [inline]
-__se_sys_connect net/socket.c:2025 [inline]
-__x64_sys_connect+0x41/0x50 net/socket.c:2025
-do_syscall_x64 arch/x86/entry/common.c:50 [inline]
-do_syscall_64+0x41/0xc0 arch/x86/entry/common.c:80
-entry_SYSCALL_64_after_hwframe+0x63/0xcd
-
-read to 0xffff88814588582c of 1 bytes by task 3374 on cpu 0:
-tcp_poll+0x2e6/0x7d0 net/ipv4/tcp.c:562
-sock_poll+0x253/0x270 net/socket.c:1383
-vfs_poll include/linux/poll.h:88 [inline]
-io_poll_check_events io_uring/poll.c:281 [inline]
-io_poll_task_func+0x15a/0x820 io_uring/poll.c:333
-handle_tw_list io_uring/io_uring.c:1184 [inline]
-tctx_task_work+0x1fe/0x4d0 io_uring/io_uring.c:1246
-task_work_run+0x123/0x160 kernel/task_work.c:179
-get_signal+0xe64/0xff0 kernel/signal.c:2635
-arch_do_signal_or_restart+0x89/0x2a0 arch/x86/kernel/signal.c:306
-exit_to_user_mode_loop+0x6f/0xe0 kernel/entry/common.c:168
-exit_to_user_mode_prepare+0x6c/0xb0 kernel/entry/common.c:204
-__syscall_exit_to_user_mode_work kernel/entry/common.c:286 [inline]
-syscall_exit_to_user_mode+0x26/0x140 kernel/entry/common.c:297
-do_syscall_64+0x4d/0xc0 arch/x86/entry/common.c:86
-entry_SYSCALL_64_after_hwframe+0x63/0xcd
-
-value changed: 0x03 -> 0x00
-
-Fixes: 1da177e4c3f4 ("Linux-2.6.12-rc2")
-Reported-by: syzbot <syzkaller@googlegroups.com>
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/ipv4/af_inet.c | 2 +-
- net/ipv4/tcp.c | 14 ++++++++------
- net/ipv4/tcp_input.c | 4 ++--
- 3 files changed, 11 insertions(+), 9 deletions(-)
-
-diff --git a/net/ipv4/af_inet.c b/net/ipv4/af_inet.c
-index e05cdc6088507..d7ebee3c048d5 100644
---- a/net/ipv4/af_inet.c
-+++ b/net/ipv4/af_inet.c
-@@ -876,7 +876,7 @@ int inet_shutdown(struct socket *sock, int how)
- EPOLLHUP, even on eg. unconnected UDP sockets -- RR */
- /* fall through */
- default:
-- sk->sk_shutdown |= how;
-+ WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | how);
- if (sk->sk_prot->shutdown)
- sk->sk_prot->shutdown(sk, how);
- break;
-diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
-index e45c09977c600..8d7933989de0e 100644
---- a/net/ipv4/tcp.c
-+++ b/net/ipv4/tcp.c
-@@ -505,6 +505,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
- __poll_t mask;
- struct sock *sk = sock->sk;
- const struct tcp_sock *tp = tcp_sk(sk);
-+ u8 shutdown;
- int state;
-
- sock_poll_wait(file, sock, wait);
-@@ -547,9 +548,10 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
- * NOTE. Check for TCP_CLOSE is added. The goal is to prevent
- * blocking on fresh not-connected or disconnected socket. --ANK
- */
-- if (sk->sk_shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
-+ shutdown = READ_ONCE(sk->sk_shutdown);
-+ if (shutdown == SHUTDOWN_MASK || state == TCP_CLOSE)
- mask |= EPOLLHUP;
-- if (sk->sk_shutdown & RCV_SHUTDOWN)
-+ if (shutdown & RCV_SHUTDOWN)
- mask |= EPOLLIN | EPOLLRDNORM | EPOLLRDHUP;
-
- /* Connected or passive Fast Open socket? */
-@@ -565,7 +567,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
- if (tcp_stream_is_readable(tp, target, sk))
- mask |= EPOLLIN | EPOLLRDNORM;
-
-- if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {
-+ if (!(shutdown & SEND_SHUTDOWN)) {
- if (__sk_stream_is_writeable(sk, 1)) {
- mask |= EPOLLOUT | EPOLLWRNORM;
- } else { /* send SIGIO later */
-@@ -2357,7 +2359,7 @@ void __tcp_close(struct sock *sk, long timeout)
- int data_was_unread = 0;
- int state;
-
-- sk->sk_shutdown = SHUTDOWN_MASK;
-+ WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK);
-
- if (sk->sk_state == TCP_LISTEN) {
- tcp_set_state(sk, TCP_CLOSE);
-@@ -2629,7 +2631,7 @@ int tcp_disconnect(struct sock *sk, int flags)
- if (!(sk->sk_userlocks & SOCK_BINDADDR_LOCK))
- inet_reset_saddr(sk);
-
-- sk->sk_shutdown = 0;
-+ WRITE_ONCE(sk->sk_shutdown, 0);
- sock_reset_flag(sk, SOCK_DONE);
- tp->srtt_us = 0;
- tp->mdev_us = jiffies_to_usecs(TCP_TIMEOUT_INIT);
-@@ -3905,7 +3907,7 @@ void tcp_done(struct sock *sk)
- if (req)
- reqsk_fastopen_remove(sk, req, false);
-
-- sk->sk_shutdown = SHUTDOWN_MASK;
-+ WRITE_ONCE(sk->sk_shutdown, SHUTDOWN_MASK);
-
- if (!sock_flag(sk, SOCK_DEAD))
- sk->sk_state_change(sk);
-diff --git a/net/ipv4/tcp_input.c b/net/ipv4/tcp_input.c
-index 982fe464156a4..61243531a7f4c 100644
---- a/net/ipv4/tcp_input.c
-+++ b/net/ipv4/tcp_input.c
-@@ -4216,7 +4216,7 @@ void tcp_fin(struct sock *sk)
-
- inet_csk_schedule_ack(sk);
-
-- sk->sk_shutdown |= RCV_SHUTDOWN;
-+ WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | RCV_SHUTDOWN);
- sock_set_flag(sk, SOCK_DONE);
-
- switch (sk->sk_state) {
-@@ -6354,7 +6354,7 @@ int tcp_rcv_state_process(struct sock *sk, struct sk_buff *skb)
- break;
-
- tcp_set_state(sk, TCP_FIN_WAIT2);
-- sk->sk_shutdown |= SEND_SHUTDOWN;
-+ WRITE_ONCE(sk->sk_shutdown, sk->sk_shutdown | SEND_SHUTDOWN);
-
- sk_dst_confirm(sk);
-
---
-2.43.0
-
diff --git a/queue-5.4/tcp-factor-out-__tcp_close-helper.patch b/queue-5.4/tcp-factor-out-__tcp_close-helper.patch
deleted file mode 100644
index 161d3d40f7..0000000000
--- a/queue-5.4/tcp-factor-out-__tcp_close-helper.patch
+++ /dev/null
@@ -1,67 +0,0 @@
-From 97ae9e0cd6f7e20c6f2eb580f14005e91777a3ab Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 16 Nov 2020 10:48:04 +0100
-Subject: tcp: factor out __tcp_close() helper
-
-From: Paolo Abeni <pabeni@redhat.com>
-
-[ Upstream commit 77c3c95637526f1e4330cc9a4b2065f668c2c4fe ]
-
-unlocked version of protocol level close, will be used by
-MPTCP to allow decouple orphaning and subflow level close.
-
-Signed-off-by: Paolo Abeni <pabeni@redhat.com>
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- include/net/tcp.h | 1 +
- net/ipv4/tcp.c | 9 +++++++--
- 2 files changed, 8 insertions(+), 2 deletions(-)
-
-diff --git a/include/net/tcp.h b/include/net/tcp.h
-index af67e19eba392..164ba7b77bd9f 100644
---- a/include/net/tcp.h
-+++ b/include/net/tcp.h
-@@ -391,6 +391,7 @@ void tcp_update_metrics(struct sock *sk);
- void tcp_init_metrics(struct sock *sk);
- void tcp_metrics_init(void);
- bool tcp_peer_is_proven(struct request_sock *req, struct dst_entry *dst);
-+void __tcp_close(struct sock *sk, long timeout);
- void tcp_close(struct sock *sk, long timeout);
- void tcp_init_sock(struct sock *sk);
- void tcp_init_transfer(struct sock *sk, int bpf_op);
-diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
-index 53a8522adf681..6a52fdcf9e4ef 100644
---- a/net/ipv4/tcp.c
-+++ b/net/ipv4/tcp.c
-@@ -2351,13 +2351,12 @@ bool tcp_check_oom(struct sock *sk, int shift)
- return too_many_orphans || out_of_socket_memory;
- }
-
--void tcp_close(struct sock *sk, long timeout)
-+void __tcp_close(struct sock *sk, long timeout)
- {
- struct sk_buff *skb;
- int data_was_unread = 0;
- int state;
-
-- lock_sock(sk);
- sk->sk_shutdown = SHUTDOWN_MASK;
-
- if (sk->sk_state == TCP_LISTEN) {
-@@ -2521,6 +2520,12 @@ void tcp_close(struct sock *sk, long timeout)
- out:
- bh_unlock_sock(sk);
- local_bh_enable();
-+}
-+
-+void tcp_close(struct sock *sk, long timeout)
-+{
-+ lock_sock(sk);
-+ __tcp_close(sk, timeout);
- release_sock(sk);
- sock_put(sk);
- }
---
-2.43.0
-
diff --git a/queue-5.4/tcp-return-epollout-from-tcp_poll-only-when-notsent_.patch b/queue-5.4/tcp-return-epollout-from-tcp_poll-only-when-notsent_.patch
deleted file mode 100644
index 77f6c1f962..0000000000
--- a/queue-5.4/tcp-return-epollout-from-tcp_poll-only-when-notsent_.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From d144016c436e114ea27bb2ec6d899243a3e8e5f7 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 14 Sep 2020 17:52:09 -0400
-Subject: tcp: return EPOLLOUT from tcp_poll only when notsent_bytes is half
- the limit
-
-From: Soheil Hassas Yeganeh <soheil@google.com>
-
-[ Upstream commit 8ba3c9d1c6d75d1e6af2087278b30e17f68e1fff ]
-
-If there was any event available on the TCP socket, tcp_poll()
-will be called to retrieve all the events. In tcp_poll(), we call
-sk_stream_is_writeable() which returns true as long as we are at least
-one byte below notsent_lowat. This will result in quite a few
-spurious EPLLOUT and frequent tiny sendmsg() calls as a result.
-
-Similar to sk_stream_write_space(), use __sk_stream_is_writeable
-with a wake value of 1, so that we set EPOLLOUT only if half the
-space is available for write.
-
-Signed-off-by: Soheil Hassas Yeganeh <soheil@google.com>
-Signed-off-by: Eric Dumazet <edumazet@google.com>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/ipv4/tcp.c | 4 ++--
- 1 file changed, 2 insertions(+), 2 deletions(-)
-
-diff --git a/net/ipv4/tcp.c b/net/ipv4/tcp.c
-index 6a52fdcf9e4ef..e45c09977c600 100644
---- a/net/ipv4/tcp.c
-+++ b/net/ipv4/tcp.c
-@@ -566,7 +566,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
- mask |= EPOLLIN | EPOLLRDNORM;
-
- if (!(sk->sk_shutdown & SEND_SHUTDOWN)) {
-- if (sk_stream_is_writeable(sk)) {
-+ if (__sk_stream_is_writeable(sk, 1)) {
- mask |= EPOLLOUT | EPOLLWRNORM;
- } else { /* send SIGIO later */
- sk_set_bit(SOCKWQ_ASYNC_NOSPACE, sk);
-@@ -578,7 +578,7 @@ __poll_t tcp_poll(struct file *file, struct socket *sock, poll_table *wait)
- * pairs with the input side.
- */
- smp_mb__after_atomic();
-- if (sk_stream_is_writeable(sk))
-+ if (__sk_stream_is_writeable(sk, 1))
- mask |= EPOLLOUT | EPOLLWRNORM;
- }
- } else
---
-2.43.0
-
diff --git a/queue-5.4/tls-rx-drop-pointless-else-after-goto.patch b/queue-5.4/tls-rx-drop-pointless-else-after-goto.patch
deleted file mode 100644
index 9e2492f17b..0000000000
--- a/queue-5.4/tls-rx-drop-pointless-else-after-goto.patch
+++ /dev/null
@@ -1,39 +0,0 @@
-From dc67caebe13b0c9ef56e3fe7420c91aa26ae9ec2 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 7 Apr 2022 20:38:15 -0700
-Subject: tls: rx: drop pointless else after goto
-
-From: Jakub Kicinski <kuba@kernel.org>
-
-[ Upstream commit d5123edd10cf9d324fcb88e276bdc7375f3c5321 ]
-
-Pointless else branch after goto makes the code harder to refactor
-down the line.
-
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: fdfbaec5923d ("tls: stop recv() if initial process_rx_list gave us non-DATA")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/tls/tls_sw.c | 3 +--
- 1 file changed, 1 insertion(+), 2 deletions(-)
-
-diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
-index 606a51237c50f..fb7428f222a8f 100644
---- a/net/tls/tls_sw.c
-+++ b/net/tls/tls_sw.c
-@@ -1777,10 +1777,9 @@ int tls_sw_recvmsg(struct sock *sk,
- if (err < 0) {
- tls_err_abort(sk, err);
- goto end;
-- } else {
-- copied = err;
- }
-
-+ copied = err;
- if (len <= copied)
- goto end;
-
---
-2.43.0
-
diff --git a/queue-5.4/tls-rx-jump-to-a-more-appropriate-label.patch b/queue-5.4/tls-rx-jump-to-a-more-appropriate-label.patch
deleted file mode 100644
index be43158173..0000000000
--- a/queue-5.4/tls-rx-jump-to-a-more-appropriate-label.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From c1198c25292d4bca2ce28a60f827c879408613d1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 7 Apr 2022 20:38:14 -0700
-Subject: tls: rx: jump to a more appropriate label
-
-From: Jakub Kicinski <kuba@kernel.org>
-
-[ Upstream commit bfc06e1aaa130b86a81ce3c41ec71a2f5e191690 ]
-
-'recv_end:' checks num_async and decrypted, and is then followed
-by the 'end' label. Since we know that decrypted and num_async
-are 0 at the start we can jump to 'end'.
-
-Move the init of decrypted and num_async to let the compiler
-catch if I'm wrong.
-
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: David S. Miller <davem@davemloft.net>
-Stable-dep-of: fdfbaec5923d ("tls: stop recv() if initial process_rx_list gave us non-DATA")
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/tls/tls_sw.c | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
-index 38592d0871a3f..606a51237c50f 100644
---- a/net/tls/tls_sw.c
-+++ b/net/tls/tls_sw.c
-@@ -1748,6 +1748,7 @@ int tls_sw_recvmsg(struct sock *sk,
- struct tls_sw_context_rx *ctx = tls_sw_ctx_rx(tls_ctx);
- struct tls_prot_info *prot = &tls_ctx->prot_info;
- struct sk_psock *psock;
-+ int num_async, pending;
- unsigned char control = 0;
- ssize_t decrypted = 0;
- struct strp_msg *rxm;
-@@ -1760,8 +1761,6 @@ int tls_sw_recvmsg(struct sock *sk,
- bool is_kvec = iov_iter_is_kvec(&msg->msg_iter);
- bool is_peek = flags & MSG_PEEK;
- bool bpf_strp_enabled;
-- int num_async = 0;
-- int pending;
-
- flags |= nonblock;
-
-@@ -1783,12 +1782,14 @@ int tls_sw_recvmsg(struct sock *sk,
- }
-
- if (len <= copied)
-- goto recv_end;
-+ goto end;
-
- target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
- len = len - copied;
- timeo = sock_rcvtimeo(sk, flags & MSG_DONTWAIT);
-
-+ decrypted = 0;
-+ num_async = 0;
- while (len && (decrypted + copied < target || ctx->recv_pkt)) {
- bool retain_skb = false;
- bool zc = false;
---
-2.43.0
-
diff --git a/queue-5.4/tls-stop-recv-if-initial-process_rx_list-gave-us-non.patch b/queue-5.4/tls-stop-recv-if-initial-process_rx_list-gave-us-non.patch
deleted file mode 100644
index c5d283f4ef..0000000000
--- a/queue-5.4/tls-stop-recv-if-initial-process_rx_list-gave-us-non.patch
+++ /dev/null
@@ -1,44 +0,0 @@
-From 1cf42821be21152e5b6e0f3847c439ffec22c3bb Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 15 Feb 2024 17:17:30 +0100
-Subject: tls: stop recv() if initial process_rx_list gave us non-DATA
-
-From: Sabrina Dubroca <sd@queasysnail.net>
-
-[ Upstream commit fdfbaec5923d9359698cbb286bc0deadbb717504 ]
-
-If we have a non-DATA record on the rx_list and another record of the
-same type still on the queue, we will end up merging them:
- - process_rx_list copies the non-DATA record
- - we start the loop and process the first available record since it's
- of the same type
- - we break out of the loop since the record was not DATA
-
-Just check the record type and jump to the end in case process_rx_list
-did some work.
-
-Fixes: 692d7b5d1f91 ("tls: Fix recvmsg() to be able to peek across multiple records")
-Signed-off-by: Sabrina Dubroca <sd@queasysnail.net>
-Link: https://lore.kernel.org/r/bd31449e43bd4b6ff546f5c51cf958c31c511deb.1708007371.git.sd@queasysnail.net
-Signed-off-by: Jakub Kicinski <kuba@kernel.org>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/tls/tls_sw.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
-diff --git a/net/tls/tls_sw.c b/net/tls/tls_sw.c
-index fb7428f222a8f..910da98d6bfb3 100644
---- a/net/tls/tls_sw.c
-+++ b/net/tls/tls_sw.c
-@@ -1780,7 +1780,7 @@ int tls_sw_recvmsg(struct sock *sk,
- }
-
- copied = err;
-- if (len <= copied)
-+ if (len <= copied || (copied && control != TLS_RECORD_TYPE_DATA))
- goto end;
-
- target = sock_rcvlowat(sk, flags & MSG_WAITALL, len);
---
-2.43.0
-
diff --git a/queue-5.4/usb-cdns3-fix-memory-double-free-when-handle-zero-packet.patch b/queue-5.4/usb-cdns3-fix-memory-double-free-when-handle-zero-packet.patch
deleted file mode 100644
index 12d2d14a93..0000000000
--- a/queue-5.4/usb-cdns3-fix-memory-double-free-when-handle-zero-packet.patch
+++ /dev/null
@@ -1,62 +0,0 @@
-From 5fd9e45f1ebcd57181358af28506e8a661a260b3 Mon Sep 17 00:00:00 2001
-From: Frank Li <Frank.Li@nxp.com>
-Date: Fri, 2 Feb 2024 10:42:17 -0500
-Subject: usb: cdns3: fix memory double free when handle zero packet
-
-From: Frank Li <Frank.Li@nxp.com>
-
-commit 5fd9e45f1ebcd57181358af28506e8a661a260b3 upstream.
-
-829 if (request->complete) {
-830 spin_unlock(&priv_dev->lock);
-831 usb_gadget_giveback_request(&priv_ep->endpoint,
-832 request);
-833 spin_lock(&priv_dev->lock);
-834 }
-835
-836 if (request->buf == priv_dev->zlp_buf)
-837 cdns3_gadget_ep_free_request(&priv_ep->endpoint, request);
-
-Driver append an additional zero packet request when queue a packet, which
-length mod max packet size is 0. When transfer complete, run to line 831,
-usb_gadget_giveback_request() will free this requestion. 836 condition is
-true, so cdns3_gadget_ep_free_request() free this request again.
-
-Log:
-
-[ 1920.140696][ T150] BUG: KFENCE: use-after-free read in cdns3_gadget_giveback+0x134/0x2c0 [cdns3]
-[ 1920.140696][ T150]
-[ 1920.151837][ T150] Use-after-free read at 0x000000003d1cd10b (in kfence-#36):
-[ 1920.159082][ T150] cdns3_gadget_giveback+0x134/0x2c0 [cdns3]
-[ 1920.164988][ T150] cdns3_transfer_completed+0x438/0x5f8 [cdns3]
-
-Add check at line 829, skip call usb_gadget_giveback_request() if it is
-additional zero length packet request. Needn't call
-usb_gadget_giveback_request() because it is allocated in this driver.
-
-Cc: stable@vger.kernel.org
-Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
-Signed-off-by: Frank Li <Frank.Li@nxp.com>
-Reviewed-by: Roger Quadros <rogerq@kernel.org>
-Acked-by: Peter Chen <peter.chen@kernel.org>
-Link: https://lore.kernel.org/r/20240202154217.661867-2-Frank.Li@nxp.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/usb/cdns3/gadget.c | 6 +++++-
- 1 file changed, 5 insertions(+), 1 deletion(-)
-
---- a/drivers/usb/cdns3/gadget.c
-+++ b/drivers/usb/cdns3/gadget.c
-@@ -661,7 +661,11 @@ void cdns3_gadget_giveback(struct cdns3_
- return;
- }
-
-- if (request->complete) {
-+ /*
-+ * zlp request is appended by driver, needn't call usb_gadget_giveback_request() to notify
-+ * gadget composite driver.
-+ */
-+ if (request->complete && request->buf != priv_dev->zlp_buf) {
- spin_unlock(&priv_dev->lock);
- usb_gadget_giveback_request(&priv_ep->endpoint,
- request);
diff --git a/queue-5.4/usb-cdns3-fixed-memory-use-after-free-at-cdns3_gadget_ep_disable.patch b/queue-5.4/usb-cdns3-fixed-memory-use-after-free-at-cdns3_gadget_ep_disable.patch
deleted file mode 100644
index abe5aa0e62..0000000000
--- a/queue-5.4/usb-cdns3-fixed-memory-use-after-free-at-cdns3_gadget_ep_disable.patch
+++ /dev/null
@@ -1,56 +0,0 @@
-From cd45f99034b0c8c9cb346dd0d6407a95ca3d36f6 Mon Sep 17 00:00:00 2001
-From: Frank Li <Frank.Li@nxp.com>
-Date: Fri, 2 Feb 2024 10:42:16 -0500
-Subject: usb: cdns3: fixed memory use after free at cdns3_gadget_ep_disable()
-
-From: Frank Li <Frank.Li@nxp.com>
-
-commit cd45f99034b0c8c9cb346dd0d6407a95ca3d36f6 upstream.
-
- ...
- cdns3_gadget_ep_free_request(&priv_ep->endpoint, &priv_req->request);
- list_del_init(&priv_req->list);
- ...
-
-'priv_req' actually free at cdns3_gadget_ep_free_request(). But
-list_del_init() use priv_req->list after it.
-
-[ 1542.642868][ T534] BUG: KFENCE: use-after-free read in __list_del_entry_valid+0x10/0xd4
-[ 1542.642868][ T534]
-[ 1542.653162][ T534] Use-after-free read at 0x000000009ed0ba99 (in kfence-#3):
-[ 1542.660311][ T534] __list_del_entry_valid+0x10/0xd4
-[ 1542.665375][ T534] cdns3_gadget_ep_disable+0x1f8/0x388 [cdns3]
-[ 1542.671571][ T534] usb_ep_disable+0x44/0xe4
-[ 1542.675948][ T534] ffs_func_eps_disable+0x64/0xc8
-[ 1542.680839][ T534] ffs_func_set_alt+0x74/0x368
-[ 1542.685478][ T534] ffs_func_disable+0x18/0x28
-
-Move list_del_init() before cdns3_gadget_ep_free_request() to resolve this
-problem.
-
-Cc: stable@vger.kernel.org
-Fixes: 7733f6c32e36 ("usb: cdns3: Add Cadence USB3 DRD Driver")
-Signed-off-by: Frank Li <Frank.Li@nxp.com>
-Reviewed-by: Roger Quadros <rogerq@kernel.org>
-Acked-by: Peter Chen <peter.chen@kernel.org>
-Link: https://lore.kernel.org/r/20240202154217.661867-1-Frank.Li@nxp.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/usb/cdns3/gadget.c | 2 +-
- 1 file changed, 1 insertion(+), 1 deletion(-)
-
---- a/drivers/usb/cdns3/gadget.c
-+++ b/drivers/usb/cdns3/gadget.c
-@@ -1951,11 +1951,11 @@ static int cdns3_gadget_ep_disable(struc
-
- while (!list_empty(&priv_ep->wa2_descmiss_req_list)) {
- priv_req = cdns3_next_priv_request(&priv_ep->wa2_descmiss_req_list);
-+ list_del_init(&priv_req->list);
-
- kfree(priv_req->request.buf);
- cdns3_gadget_ep_free_request(&priv_ep->endpoint,
- &priv_req->request);
-- list_del_init(&priv_req->list);
- --priv_ep->wa2_counter;
- }
-
diff --git a/queue-5.4/usb-gadget-ncm-avoid-dropping-datagrams-of-properly-parsed-ntbs.patch b/queue-5.4/usb-gadget-ncm-avoid-dropping-datagrams-of-properly-parsed-ntbs.patch
deleted file mode 100644
index 2ec0013133..0000000000
--- a/queue-5.4/usb-gadget-ncm-avoid-dropping-datagrams-of-properly-parsed-ntbs.patch
+++ /dev/null
@@ -1,88 +0,0 @@
-From 76c51146820c5dac629f21deafab0a7039bc3ccd Mon Sep 17 00:00:00 2001
-From: Krishna Kurapati <quic_kriskura@quicinc.com>
-Date: Mon, 5 Feb 2024 13:16:50 +0530
-Subject: usb: gadget: ncm: Avoid dropping datagrams of properly parsed NTBs
-MIME-Version: 1.0
-Content-Type: text/plain; charset=UTF-8
-Content-Transfer-Encoding: 8bit
-
-From: Krishna Kurapati <quic_kriskura@quicinc.com>
-
-commit 76c51146820c5dac629f21deafab0a7039bc3ccd upstream.
-
-It is observed sometimes when tethering is used over NCM with Windows 11
-as host, at some instances, the gadget_giveback has one byte appended at
-the end of a proper NTB. When the NTB is parsed, unwrap call looks for
-any leftover bytes in SKB provided by u_ether and if there are any pending
-bytes, it treats them as a separate NTB and parses it. But in case the
-second NTB (as per unwrap call) is faulty/corrupt, all the datagrams that
-were parsed properly in the first NTB and saved in rx_list are dropped.
-
-Adding a few custom traces showed the following:
-[002] d..1 7828.532866: dwc3_gadget_giveback: ep1out:
-req 000000003868811a length 1025/16384 zsI ==> 0
-[002] d..1 7828.532867: ncm_unwrap_ntb: K: ncm_unwrap_ntb toprocess: 1025
-[002] d..1 7828.532867: ncm_unwrap_ntb: K: ncm_unwrap_ntb nth: 1751999342
-[002] d..1 7828.532868: ncm_unwrap_ntb: K: ncm_unwrap_ntb seq: 0xce67
-[002] d..1 7828.532868: ncm_unwrap_ntb: K: ncm_unwrap_ntb blk_len: 0x400
-[002] d..1 7828.532868: ncm_unwrap_ntb: K: ncm_unwrap_ntb ndp_len: 0x10
-[002] d..1 7828.532869: ncm_unwrap_ntb: K: Parsed NTB with 1 frames
-
-In this case, the giveback is of 1025 bytes and block length is 1024.
-The rest 1 byte (which is 0x00) won't be parsed resulting in drop of
-all datagrams in rx_list.
-
-Same is case with packets of size 2048:
-[002] d..1 7828.557948: dwc3_gadget_giveback: ep1out:
-req 0000000011dfd96e length 2049/16384 zsI ==> 0
-[002] d..1 7828.557949: ncm_unwrap_ntb: K: ncm_unwrap_ntb nth: 1751999342
-[002] d..1 7828.557950: ncm_unwrap_ntb: K: ncm_unwrap_ntb blk_len: 0x800
-
-Lecroy shows one byte coming in extra confirming that the byte is coming
-in from PC:
-
- Transfer 2959 - Bytes Transferred(1025) Timestamp((18.524 843 590)
- - Transaction 8391 - Data(1025 bytes) Timestamp(18.524 843 590)
- --- Packet 4063861
- Data(1024 bytes)
- Duration(2.117us) Idle(14.700ns) Timestamp(18.524 843 590)
- --- Packet 4063863
- Data(1 byte)
- Duration(66.160ns) Time(282.000ns) Timestamp(18.524 845 722)
-
-According to Windows driver, no ZLP is needed if wBlockLength is non-zero,
-because the non-zero wBlockLength has already told the function side the
-size of transfer to be expected. However, there are in-market NCM devices
-that rely on ZLP as long as the wBlockLength is multiple of wMaxPacketSize.
-To deal with such devices, it pads an extra 0 at end so the transfer is no
-longer multiple of wMaxPacketSize.
-
-Cc: <stable@vger.kernel.org>
-Fixes: 9f6ce4240a2b ("usb: gadget: f_ncm.c added")
-Signed-off-by: Krishna Kurapati <quic_kriskura@quicinc.com>
-Reviewed-by: Maciej Żenczykowski <maze@google.com>
-Link: https://lore.kernel.org/r/20240205074650.200304-1-quic_kriskura@quicinc.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/usb/gadget/function/f_ncm.c | 10 +++++++++-
- 1 file changed, 9 insertions(+), 1 deletion(-)
-
---- a/drivers/usb/gadget/function/f_ncm.c
-+++ b/drivers/usb/gadget/function/f_ncm.c
-@@ -1349,7 +1349,15 @@ parse_ntb:
- "Parsed NTB with %d frames\n", dgram_counter);
-
- to_process -= block_len;
-- if (to_process != 0) {
-+
-+ /*
-+ * Windows NCM driver avoids USB ZLPs by adding a 1-byte
-+ * zero pad as needed.
-+ */
-+ if (to_process == 1 &&
-+ (*(unsigned char *)(ntb_ptr + block_len) == 0x00)) {
-+ to_process--;
-+ } else if (to_process > 0) {
- ntb_ptr = (unsigned char *)(ntb_ptr + block_len);
- goto parse_ntb;
- }
diff --git a/queue-5.4/usb-roles-don-t-get-set_role-when-usb_role_switch-is-unregistered.patch b/queue-5.4/usb-roles-don-t-get-set_role-when-usb_role_switch-is-unregistered.patch
deleted file mode 100644
index e7803f7468..0000000000
--- a/queue-5.4/usb-roles-don-t-get-set_role-when-usb_role_switch-is-unregistered.patch
+++ /dev/null
@@ -1,76 +0,0 @@
-From b787a3e781759026a6212736ef8e52cf83d1821a Mon Sep 17 00:00:00 2001
-From: Xu Yang <xu.yang_2@nxp.com>
-Date: Mon, 29 Jan 2024 17:37:39 +0800
-Subject: usb: roles: don't get/set_role() when usb_role_switch is unregistered
-
-From: Xu Yang <xu.yang_2@nxp.com>
-
-commit b787a3e781759026a6212736ef8e52cf83d1821a upstream.
-
-There is a possibility that usb_role_switch device is unregistered before
-the user put usb_role_switch. In this case, the user may still want to
-get/set_role() since the user can't sense the changes of usb_role_switch.
-
-This will add a flag to show if usb_role_switch is already registered and
-avoid unwanted behaviors.
-
-Fixes: fde0aa6c175a ("usb: common: Small class for USB role switches")
-cc: stable@vger.kernel.org
-Signed-off-by: Xu Yang <xu.yang_2@nxp.com>
-Acked-by: Heikki Krogerus <heikki.krogerus@linux.intel.com>
-Link: https://lore.kernel.org/r/20240129093739.2371530-2-xu.yang_2@nxp.com
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- drivers/usb/roles/class.c | 12 ++++++++++--
- 1 file changed, 10 insertions(+), 2 deletions(-)
-
---- a/drivers/usb/roles/class.c
-+++ b/drivers/usb/roles/class.c
-@@ -20,6 +20,7 @@ struct usb_role_switch {
- struct device dev;
- struct mutex lock; /* device lock*/
- enum usb_role role;
-+ bool registered;
-
- /* From descriptor */
- struct device *usb2_port;
-@@ -46,6 +47,9 @@ int usb_role_switch_set_role(struct usb_
- if (IS_ERR_OR_NULL(sw))
- return 0;
-
-+ if (!sw->registered)
-+ return -EOPNOTSUPP;
-+
- mutex_lock(&sw->lock);
-
- ret = sw->set(sw->dev.parent, role);
-@@ -69,7 +73,7 @@ enum usb_role usb_role_switch_get_role(s
- {
- enum usb_role role;
-
-- if (IS_ERR_OR_NULL(sw))
-+ if (IS_ERR_OR_NULL(sw) || !sw->registered)
- return USB_ROLE_NONE;
-
- mutex_lock(&sw->lock);
-@@ -319,6 +323,8 @@ usb_role_switch_register(struct device *
- return ERR_PTR(ret);
- }
-
-+ sw->registered = true;
-+
- /* TODO: Symlinks for the host port and the device controller. */
-
- return sw;
-@@ -333,8 +339,10 @@ EXPORT_SYMBOL_GPL(usb_role_switch_regist
- */
- void usb_role_switch_unregister(struct usb_role_switch *sw)
- {
-- if (!IS_ERR_OR_NULL(sw))
-+ if (!IS_ERR_OR_NULL(sw)) {
-+ sw->registered = false;
- device_unregister(&sw->dev);
-+ }
- }
- EXPORT_SYMBOL_GPL(usb_role_switch_unregister);
-
diff --git a/queue-5.4/userfaultfd-fix-mmap_changing-checking-in-mfill_atomic_hugetlb.patch b/queue-5.4/userfaultfd-fix-mmap_changing-checking-in-mfill_atomic_hugetlb.patch
deleted file mode 100644
index e01a894739..0000000000
--- a/queue-5.4/userfaultfd-fix-mmap_changing-checking-in-mfill_atomic_hugetlb.patch
+++ /dev/null
@@ -1,80 +0,0 @@
-From 67695f18d55924b2013534ef3bdc363bc9e14605 Mon Sep 17 00:00:00 2001
-From: Lokesh Gidra <lokeshgidra@google.com>
-Date: Wed, 17 Jan 2024 14:37:29 -0800
-Subject: userfaultfd: fix mmap_changing checking in mfill_atomic_hugetlb
-
-From: Lokesh Gidra <lokeshgidra@google.com>
-
-commit 67695f18d55924b2013534ef3bdc363bc9e14605 upstream.
-
-In mfill_atomic_hugetlb(), mmap_changing isn't being checked
-again if we drop mmap_lock and reacquire it. When the lock is not held,
-mmap_changing could have been incremented. This is also inconsistent
-with the behavior in mfill_atomic().
-
-Link: https://lkml.kernel.org/r/20240117223729.1444522-1-lokeshgidra@google.com
-Fixes: df2cc96e77011 ("userfaultfd: prevent non-cooperative events vs mcopy_atomic races")
-Signed-off-by: Lokesh Gidra <lokeshgidra@google.com>
-Cc: Andrea Arcangeli <aarcange@redhat.com>
-Cc: Mike Rapoport <rppt@kernel.org>
-Cc: Axel Rasmussen <axelrasmussen@google.com>
-Cc: Brian Geffon <bgeffon@google.com>
-Cc: David Hildenbrand <david@redhat.com>
-Cc: Jann Horn <jannh@google.com>
-Cc: Kalesh Singh <kaleshsingh@google.com>
-Cc: Matthew Wilcox (Oracle) <willy@infradead.org>
-Cc: Nicolas Geoffray <ngeoffray@google.com>
-Cc: Peter Xu <peterx@redhat.com>
-Cc: Suren Baghdasaryan <surenb@google.com>
-Cc: <stable@vger.kernel.org>
-Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
-Signed-off-by: Mike Rapoport (IBM) <rppt@kernel.org>
-Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
----
- mm/userfaultfd.c | 14 +++++++++++++-
- 1 file changed, 13 insertions(+), 1 deletion(-)
-
---- a/mm/userfaultfd.c
-+++ b/mm/userfaultfd.c
-@@ -177,6 +177,7 @@ static __always_inline ssize_t __mcopy_a
- unsigned long dst_start,
- unsigned long src_start,
- unsigned long len,
-+ bool *mmap_changing,
- bool zeropage)
- {
- int vm_alloc_shared = dst_vma->vm_flags & VM_SHARED;
-@@ -308,6 +309,15 @@ retry:
- goto out;
- }
- down_read(&dst_mm->mmap_sem);
-+ /*
-+ * If memory mappings are changing because of non-cooperative
-+ * operation (e.g. mremap) running in parallel, bail out and
-+ * request the user to retry later
-+ */
-+ if (mmap_changing && READ_ONCE(*mmap_changing)) {
-+ err = -EAGAIN;
-+ break;
-+ }
-
- dst_vma = NULL;
- goto retry;
-@@ -389,6 +399,7 @@ extern ssize_t __mcopy_atomic_hugetlb(st
- unsigned long dst_start,
- unsigned long src_start,
- unsigned long len,
-+ bool *mmap_changing,
- bool zeropage);
- #endif /* CONFIG_HUGETLB_PAGE */
-
-@@ -506,7 +517,8 @@ retry:
- */
- if (is_vm_hugetlb_page(dst_vma))
- return __mcopy_atomic_hugetlb(dst_mm, dst_vma, dst_start,
-- src_start, len, zeropage);
-+ src_start, len, mmap_changing,
-+ zeropage);
-
- if (!vma_is_anonymous(dst_vma) && !vma_is_shmem(dst_vma))
- goto out_unlock;
diff --git a/queue-5.4/virtio-blk-ensure-no-requests-in-virtqueues-before-d.patch b/queue-5.4/virtio-blk-ensure-no-requests-in-virtqueues-before-d.patch
deleted file mode 100644
index f8036f8730..0000000000
--- a/queue-5.4/virtio-blk-ensure-no-requests-in-virtqueues-before-d.patch
+++ /dev/null
@@ -1,64 +0,0 @@
-From 82580ed3a57ccdcabb59aeae29e62cbf3b999f5f Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Mon, 29 Jan 2024 16:52:50 +0800
-Subject: virtio-blk: Ensure no requests in virtqueues before deleting vqs.
-
-From: Yi Sun <yi.sun@unisoc.com>
-
-[ Upstream commit 4ce6e2db00de8103a0687fb0f65fd17124a51aaa ]
-
-Ensure no remaining requests in virtqueues before resetting vdev and
-deleting virtqueues. Otherwise these requests will never be completed.
-It may cause the system to become unresponsive.
-
-Function blk_mq_quiesce_queue() can ensure that requests have become
-in_flight status, but it cannot guarantee that requests have been
-processed by the device. Virtqueues should never be deleted before
-all requests become complete status.
-
-Function blk_mq_freeze_queue() ensure that all requests in virtqueues
-become complete status. And no requests can enter in virtqueues.
-
-Signed-off-by: Yi Sun <yi.sun@unisoc.com>
-Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com>
-Link: https://lore.kernel.org/r/20240129085250.1550594-1-yi.sun@unisoc.com
-Signed-off-by: Jens Axboe <axboe@kernel.dk>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- drivers/block/virtio_blk.c | 7 ++++---
- 1 file changed, 4 insertions(+), 3 deletions(-)
-
-diff --git a/drivers/block/virtio_blk.c b/drivers/block/virtio_blk.c
-index 9b3ea86c20e5e..3afc07b59477b 100644
---- a/drivers/block/virtio_blk.c
-+++ b/drivers/block/virtio_blk.c
-@@ -1063,14 +1063,15 @@ static int virtblk_freeze(struct virtio_device *vdev)
- {
- struct virtio_blk *vblk = vdev->priv;
-
-+ /* Ensure no requests in virtqueues before deleting vqs. */
-+ blk_mq_freeze_queue(vblk->disk->queue);
-+
- /* Ensure we don't receive any more interrupts */
- vdev->config->reset(vdev);
-
- /* Make sure no work handler is accessing the device. */
- flush_work(&vblk->config_work);
-
-- blk_mq_quiesce_queue(vblk->disk->queue);
--
- vdev->config->del_vqs(vdev);
- kfree(vblk->vqs);
-
-@@ -1088,7 +1089,7 @@ static int virtblk_restore(struct virtio_device *vdev)
-
- virtio_device_ready(vdev);
-
-- blk_mq_unquiesce_queue(vblk->disk->queue);
-+ blk_mq_unfreeze_queue(vblk->disk->queue);
- return 0;
- }
- #endif
---
-2.43.0
-
diff --git a/queue-5.4/wifi-cfg80211-fix-missing-interfaces-when-dumping.patch b/queue-5.4/wifi-cfg80211-fix-missing-interfaces-when-dumping.patch
deleted file mode 100644
index 4ecd614900..0000000000
--- a/queue-5.4/wifi-cfg80211-fix-missing-interfaces-when-dumping.patch
+++ /dev/null
@@ -1,71 +0,0 @@
-From 653c4dedca61b312e11b899c4b9298461be56f19 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Tue, 16 Jan 2024 14:22:57 +0000
-Subject: wifi: cfg80211: fix missing interfaces when dumping
-
-From: Michal Kazior <michal@plume.com>
-
-[ Upstream commit a6e4f85d3820d00694ed10f581f4c650445dbcda ]
-
-The nl80211_dump_interface() supports resumption
-in case nl80211_send_iface() doesn't have the
-resources to complete its work.
-
-The logic would store the progress as iteration
-offsets for rdev and wdev loops.
-
-However the logic did not properly handle
-resumption for non-last rdev. Assuming a system
-with 2 rdevs, with 2 wdevs each, this could
-happen:
-
- dump(cb=[0, 0]):
- if_start=cb[1] (=0)
- send rdev0.wdev0 -> ok
- send rdev0.wdev1 -> yield
- cb[1] = 1
-
- dump(cb=[0, 1]):
- if_start=cb[1] (=1)
- send rdev0.wdev1 -> ok
- // since if_start=1 the rdev0.wdev0 got skipped
- // through if_idx < if_start
- send rdev1.wdev1 -> ok
-
-The if_start needs to be reset back to 0 upon wdev
-loop end.
-
-The problem is actually hard to hit on a desktop,
-and even on most routers. The prerequisites for
-this manifesting was:
- - more than 1 wiphy
- - a few handful of interfaces
- - dump without rdev or wdev filter
-
-I was seeing this with 4 wiphys 9 interfaces each.
-It'd miss 6 interfaces from the last wiphy
-reported to userspace.
-
-Signed-off-by: Michal Kazior <michal@plume.com>
-Link: https://msgid.link/20240116142340.89678-1-kazikcz@gmail.com
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/wireless/nl80211.c | 1 +
- 1 file changed, 1 insertion(+)
-
-diff --git a/net/wireless/nl80211.c b/net/wireless/nl80211.c
-index 0926a30bc7391..494de0161d2fc 100644
---- a/net/wireless/nl80211.c
-+++ b/net/wireless/nl80211.c
-@@ -3350,6 +3350,7 @@ static int nl80211_dump_interface(struct sk_buff *skb, struct netlink_callback *
- if_idx++;
- }
-
-+ if_start = 0;
- wp_idx++;
- }
- out:
---
-2.43.0
-
diff --git a/queue-5.4/wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch b/queue-5.4/wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch
deleted file mode 100644
index 7839ef11dd..0000000000
--- a/queue-5.4/wifi-mac80211-fix-race-condition-on-enabling-fast-xm.patch
+++ /dev/null
@@ -1,53 +0,0 @@
-From a76fd2cce0487ef1c1d83b9fdebbb9bcae6a5de4 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 4 Jan 2024 19:10:59 +0100
-Subject: wifi: mac80211: fix race condition on enabling fast-xmit
-
-From: Felix Fietkau <nbd@nbd.name>
-
-[ Upstream commit bcbc84af1183c8cf3d1ca9b78540c2185cd85e7f ]
-
-fast-xmit must only be enabled after the sta has been uploaded to the driver,
-otherwise it could end up passing the not-yet-uploaded sta via drv_tx calls
-to the driver, leading to potential crashes because of uninitialized drv_priv
-data.
-Add a missing sta->uploaded check and re-check fast xmit after inserting a sta.
-
-Signed-off-by: Felix Fietkau <nbd@nbd.name>
-Link: https://msgid.link/20240104181059.84032-1-nbd@nbd.name
-Signed-off-by: Johannes Berg <johannes.berg@intel.com>
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- net/mac80211/sta_info.c | 2 ++
- net/mac80211/tx.c | 2 +-
- 2 files changed, 3 insertions(+), 1 deletion(-)
-
-diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c
-index 0f97c6fcec174..e330036e02eac 100644
---- a/net/mac80211/sta_info.c
-+++ b/net/mac80211/sta_info.c
-@@ -683,6 +683,8 @@ static int sta_info_insert_finish(struct sta_info *sta) __acquires(RCU)
- if (ieee80211_vif_is_mesh(&sdata->vif))
- mesh_accept_plinks_update(sdata);
-
-+ ieee80211_check_fast_xmit(sta);
-+
- return 0;
- out_remove:
- sta_info_hash_del(local, sta);
-diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
-index 8bd01dfa75cb1..5fd9a6f752a1d 100644
---- a/net/mac80211/tx.c
-+++ b/net/mac80211/tx.c
-@@ -2919,7 +2919,7 @@ void ieee80211_check_fast_xmit(struct sta_info *sta)
- sdata->vif.type == NL80211_IFTYPE_STATION)
- goto out;
-
-- if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED))
-+ if (!test_sta_flag(sta, WLAN_STA_AUTHORIZED) || !sta->uploaded)
- goto out;
-
- if (test_sta_flag(sta, WLAN_STA_PS_STA) ||
---
-2.43.0
-
diff --git a/queue-5.4/x86-alternatives-disable-kasan-in-apply_alternatives.patch b/queue-5.4/x86-alternatives-disable-kasan-in-apply_alternatives.patch
deleted file mode 100644
index 7ca66a5516..0000000000
--- a/queue-5.4/x86-alternatives-disable-kasan-in-apply_alternatives.patch
+++ /dev/null
@@ -1,81 +0,0 @@
-From 07f101c011767f7e86e370622ff6457246b4c6e1 Mon Sep 17 00:00:00 2001
-From: Sasha Levin <sashal@kernel.org>
-Date: Thu, 12 Oct 2023 13:04:24 +0300
-Subject: x86/alternatives: Disable KASAN in apply_alternatives()
-
-From: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
-
-[ Upstream commit d35652a5fc9944784f6f50a5c979518ff8dacf61 ]
-
-Fei has reported that KASAN triggers during apply_alternatives() on
-a 5-level paging machine:
-
- BUG: KASAN: out-of-bounds in rcu_is_watching()
- Read of size 4 at addr ff110003ee6419a0 by task swapper/0/0
- ...
- __asan_load4()
- rcu_is_watching()
- trace_hardirqs_on()
- text_poke_early()
- apply_alternatives()
- ...
-
-On machines with 5-level paging, cpu_feature_enabled(X86_FEATURE_LA57)
-gets patched. It includes KASAN code, where KASAN_SHADOW_START depends on
-__VIRTUAL_MASK_SHIFT, which is defined with cpu_feature_enabled().
-
-KASAN gets confused when apply_alternatives() patches the
-KASAN_SHADOW_START users. A test patch that makes KASAN_SHADOW_START
-static, by replacing __VIRTUAL_MASK_SHIFT with 56, works around the issue.
-
-Fix it for real by disabling KASAN while the kernel is patching alternatives.
-
-[ mingo: updated the changelog ]
-
-Fixes: 6657fca06e3f ("x86/mm: Allow to boot without LA57 if CONFIG_X86_5LEVEL=y")
-Reported-by: Fei Yang <fei.yang@intel.com>
-Signed-off-by: Kirill A. Shutemov <kirill.shutemov@linux.intel.com>
-Signed-off-by: Ingo Molnar <mingo@kernel.org>
-Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
-Cc: Linus Torvalds <torvalds@linux-foundation.org>
-Cc: stable@vger.kernel.org
-Link: https://lore.kernel.org/r/20231012100424.1456-1-kirill.shutemov@linux.intel.com
-Signed-off-by: Sasha Levin <sashal@kernel.org>
----
- arch/x86/kernel/alternative.c | 13 +++++++++++++
- 1 file changed, 13 insertions(+)
-
-diff --git a/arch/x86/kernel/alternative.c b/arch/x86/kernel/alternative.c
-index 15bad8d598949..faae8a1856709 100644
---- a/arch/x86/kernel/alternative.c
-+++ b/arch/x86/kernel/alternative.c
-@@ -374,6 +374,17 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start,
- u8 insn_buff[MAX_PATCH_LEN];
-
- DPRINTK("alt table %px, -> %px", start, end);
-+
-+ /*
-+ * In the case CONFIG_X86_5LEVEL=y, KASAN_SHADOW_START is defined using
-+ * cpu_feature_enabled(X86_FEATURE_LA57) and is therefore patched here.
-+ * During the process, KASAN becomes confused seeing partial LA57
-+ * conversion and triggers a false-positive out-of-bound report.
-+ *
-+ * Disable KASAN until the patching is complete.
-+ */
-+ kasan_disable_current();
-+
- /*
- * The scan order should be from start to end. A later scanned
- * alternative code can overwrite previously scanned alternative code.
-@@ -434,6 +445,8 @@ void __init_or_module noinline apply_alternatives(struct alt_instr *start,
-
- text_poke_early(instr, insn_buff, insn_buff_sz);
- }
-+
-+ kasan_enable_current();
- }
-
- #ifdef CONFIG_SMP
---
-2.43.0
-