From 6af17fb04f399a76df93dcbd2e8816e15a7cf524 Mon Sep 17 00:00:00 2001 From: Sasha Levin Date: Mon, 22 Jan 2024 17:48:43 -0500 Subject: [PATCH] Fixes for 5.10 Signed-off-by: Sasha Levin --- ...t-args-be-null-in-__acpi_node_get_pr.patch | 52 ++++ ...rash-when-parsed-profile-name-is-emp.patch | 82 ++++++ ...add-missing-ethnl_ops_begin-complete.patch | 64 ++++ ...x-fix-read-transfers-in-polling-mode.patch | 50 ++++ ...transferring-more-than-one-message-i.patch | 88 ++++++ ...enefit-from-devm_clk_get_enabled-to-.patch | 66 +++++ ...-adc-ad9467-don-t-ignore-error-codes.patch | 85 ++++++ ...o-adc-ad9467-fix-reset-gpio-handling.patch | 91 ++++++ .../iio-adc-ad9467-fix-scale-setting.patch | 255 ++++++++++++++++ ...macros-calls-from-preemptible-contex.patch | 83 ++++++ ...tential-buffer-overflow-in-kdb_local.patch | 45 +++ ...select-missing-dependency-regmap_i2c.patch | 41 +++ ...ng-linux-types.h-header-to-get-the-_.patch | 40 +++ ...ull-pointer-dereference-in-of_syscon.patch | 40 +++ ...-an-out-of-bound-access-in-db1200_de.patch | 36 +++ ...-an-out-of-bound-access-in-db1550_de.patch | 35 +++ .../mips-dmi-fix-early-remap-on-mips32.patch | 44 +++ ...fix-incorrect-max_low_pfn-adjustment.patch | 80 +++++ ...um-use-bitmap_zalloc-when-applicable.patch | 205 +++++++++++++ ...cl_erp-fix-error-flow-of-pool-alloca.patch | 185 ++++++++++++ ...m_acl_tcam-add-missing-mutex_destroy.patch | 52 ++++ ...ectrum_acl_tcam-fix-stack-corruption.patch | 162 ++++++++++ ...acl_tcam-make-fini-symmetric-to-init.patch | 42 +++ ...cl_tcam-reorder-functions-to-avoid-f.patch | 176 +++++++++++ ...add-null-pointer-check-to-vsc73xx_gp.patch | 39 +++ ...am65-cpsw-fix-max-mtu-to-fit-etherne.patch | 63 ++++ ...rel-populate-.soft_reset-for-ksz9131.patch | 100 +++++++ ...rmnet-fix-global-oob-in-rmnet_policy.patch | 105 +++++++ ...-dma_addr_t-truncation-in-error-case.patch | 53 ++++ ...les-do-not-allow-mismatch-field-size.patch | 51 ++++ ...les-reject-nft_set_concat-with-not-f.patch | 41 +++ ...les-skip-dead-set-elements-in-netlin.patch | 47 +++ ...cp-fix-a-crash-in-nvmet_req_complete.patch | 45 +++ ...kernel-panic-when-host-sends-an-inva.patch | 84 ++++++ ...the-h2c-expected-pdu-len-calculation.patch | 55 ++++ ...-race-condition-when-initializing-ph.patch | 64 ++++ ...ecursively-taking-env-bpf_progs.lock.patch | 276 ++++++++++++++++++ ...elf-program-header-addresses-properl.patch | 50 ++++ ...015-correct-time_to_empty-units-in-s.patch | 38 +++ ...-size-calculation-in-zpci_memcpy_toi.patch | 145 +++++++++ ...qos_pfc-adjust-the-test-to-support-8.patch | 88 ++++++ ...lxsw-qos_pfc-convert-to-iproute2-dcb.patch | 96 ++++++ ...-don-t-skip-resource-freeing-if-pm_r.patch | 51 ++++ ...ct-clock-error-message-in-function-p.patch | 40 +++ ...ial-imx-fix-tx-statemachine-deadlock.patch | 58 ++++ queue-5.10/series | 51 ++++ ...t-args-be-null-in-software_node_get_.patch | 42 +++ ...rite_lock-s-ndelay-parameter-to-bool.patch | 82 ++++++ ...eck-for-signal_pending-in-send_break.patch | 38 +++ ...-from-send_break-on-tty_driver_hardw.patch | 74 +++++ ...use-if-in-send_break-instead-of-goto.patch | 44 +++ ...rn-correct-error-code-on-unsupported.patch | 62 ++++ 52 files changed, 4081 insertions(+) create mode 100644 queue-5.10/acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch create mode 100644 queue-5.10/apparmor-avoid-crash-when-parsed-profile-name-is-emp.patch create mode 100644 queue-5.10/ethtool-netlink-add-missing-ethnl_ops_begin-complete.patch create mode 100644 queue-5.10/i2c-s3c24xx-fix-read-transfers-in-polling-mode.patch create mode 100644 queue-5.10/i2c-s3c24xx-fix-transferring-more-than-one-message-i.patch create mode 100644 queue-5.10/iio-adc-ad9467-benefit-from-devm_clk_get_enabled-to-.patch create mode 100644 queue-5.10/iio-adc-ad9467-don-t-ignore-error-codes.patch create mode 100644 queue-5.10/iio-adc-ad9467-fix-reset-gpio-handling.patch create mode 100644 queue-5.10/iio-adc-ad9467-fix-scale-setting.patch create mode 100644 queue-5.10/ipvs-avoid-stat-macros-calls-from-preemptible-contex.patch create mode 100644 queue-5.10/kdb-fix-a-potential-buffer-overflow-in-kdb_local.patch create mode 100644 queue-5.10/leds-aw2013-select-missing-dependency-regmap_i2c.patch create mode 100644 queue-5.10/libapi-add-missing-linux-types.h-header-to-get-the-_.patch create mode 100644 queue-5.10/mfd-syscon-fix-null-pointer-dereference-in-of_syscon.patch create mode 100644 queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1200_de.patch create mode 100644 queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1550_de.patch create mode 100644 queue-5.10/mips-dmi-fix-early-remap-on-mips32.patch create mode 100644 queue-5.10/mips-fix-incorrect-max_low_pfn-adjustment.patch create mode 100644 queue-5.10/mlxsw-spectrum-use-bitmap_zalloc-when-applicable.patch create mode 100644 queue-5.10/mlxsw-spectrum_acl_erp-fix-error-flow-of-pool-alloca.patch create mode 100644 queue-5.10/mlxsw-spectrum_acl_tcam-add-missing-mutex_destroy.patch create mode 100644 queue-5.10/mlxsw-spectrum_acl_tcam-fix-stack-corruption.patch create mode 100644 queue-5.10/mlxsw-spectrum_acl_tcam-make-fini-symmetric-to-init.patch create mode 100644 queue-5.10/mlxsw-spectrum_acl_tcam-reorder-functions-to-avoid-f.patch create mode 100644 queue-5.10/net-dsa-vsc73xx-add-null-pointer-check-to-vsc73xx_gp.patch create mode 100644 queue-5.10/net-ethernet-ti-am65-cpsw-fix-max-mtu-to-fit-etherne.patch create mode 100644 queue-5.10/net-phy-micrel-populate-.soft_reset-for-ksz9131.patch create mode 100644 queue-5.10/net-qualcomm-rmnet-fix-global-oob-in-rmnet_policy.patch create mode 100644 queue-5.10/net-ravb-fix-dma_addr_t-truncation-in-error-case.patch create mode 100644 queue-5.10/netfilter-nf_tables-do-not-allow-mismatch-field-size.patch create mode 100644 queue-5.10/netfilter-nf_tables-reject-nft_set_concat-with-not-f.patch create mode 100644 queue-5.10/netfilter-nf_tables-skip-dead-set-elements-in-netlin.patch create mode 100644 queue-5.10/nvmet-tcp-fix-a-crash-in-nvmet_req_complete.patch create mode 100644 queue-5.10/nvmet-tcp-fix-a-kernel-panic-when-host-sends-an-inva.patch create mode 100644 queue-5.10/nvmet-tcp-fix-the-h2c-expected-pdu-len-calculation.patch create mode 100644 queue-5.10/pci-keystone-fix-race-condition-when-initializing-ph.patch create mode 100644 queue-5.10/perf-env-avoid-recursively-taking-env-bpf_progs.lock.patch create mode 100644 queue-5.10/perf-genelf-set-elf-program-header-addresses-properl.patch create mode 100644 queue-5.10/power-supply-cw2015-correct-time_to_empty-units-in-s.patch create mode 100644 queue-5.10/s390-pci-fix-max-size-calculation-in-zpci_memcpy_toi.patch create mode 100644 queue-5.10/selftests-mlxsw-qos_pfc-adjust-the-test-to-support-8.patch create mode 100644 queue-5.10/selftests-mlxsw-qos_pfc-convert-to-iproute2-dcb.patch create mode 100644 queue-5.10/serial-8250-omap-don-t-skip-resource-freeing-if-pm_r.patch create mode 100644 queue-5.10/serial-imx-correct-clock-error-message-in-function-p.patch create mode 100644 queue-5.10/serial-imx-fix-tx-statemachine-deadlock.patch create mode 100644 queue-5.10/software-node-let-args-be-null-in-software_node_get_.patch create mode 100644 queue-5.10/tty-change-tty_write_lock-s-ndelay-parameter-to-bool.patch create mode 100644 queue-5.10/tty-don-t-check-for-signal_pending-in-send_break.patch create mode 100644 queue-5.10/tty-early-return-from-send_break-on-tty_driver_hardw.patch create mode 100644 queue-5.10/tty-use-if-in-send_break-instead-of-goto.patch create mode 100644 queue-5.10/usb-cdc-acm-return-correct-error-code-on-unsupported.patch diff --git a/queue-5.10/acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch b/queue-5.10/acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch new file mode 100644 index 00000000000..1fa6ed74d80 --- /dev/null +++ b/queue-5.10/acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch @@ -0,0 +1,52 @@ +From 9ad6c76e2ca89c085fb957c4f48406db766ef235 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Nov 2023 12:10:08 +0200 +Subject: acpi: property: Let args be NULL in + __acpi_node_get_property_reference + +From: Sakari Ailus + +[ Upstream commit bef52aa0f3de1b7d8c258c13b16e577361dabf3a ] + +fwnode_get_property_reference_args() may not be called with args argument +NULL on ACPI, OF already supports this. Add the missing NULL checks and +document this. + +The purpose is to be able to count the references. + +Fixes: 977d5ad39f3e ("ACPI: Convert ACPI reference args to generic fwnode reference args") +Signed-off-by: Sakari Ailus +Reviewed-by: Andy Shevchenko +Reviewed-by: Heikki Krogerus +Link: https://lore.kernel.org/r/20231109101010.1329587-2-sakari.ailus@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/acpi/property.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/acpi/property.c b/drivers/acpi/property.c +index 80e92c298055..cf872dc5b07a 100644 +--- a/drivers/acpi/property.c ++++ b/drivers/acpi/property.c +@@ -639,6 +639,7 @@ acpi_fwnode_get_named_child_node(const struct fwnode_handle *fwnode, + * @index: Index of the reference to return + * @num_args: Maximum number of arguments after each reference + * @args: Location to store the returned reference with optional arguments ++ * (may be NULL) + * + * Find property with @name, verifify that it is a package containing at least + * one object reference and if so, store the ACPI device object pointer to the +@@ -697,6 +698,9 @@ int __acpi_node_get_property_reference(const struct fwnode_handle *fwnode, + if (ret) + return ret == -ENODEV ? -EINVAL : ret; + ++ if (!args) ++ return 0; ++ + args->fwnode = acpi_fwnode_handle(device); + args->nargs = 0; + return 0; +-- +2.43.0 + diff --git a/queue-5.10/apparmor-avoid-crash-when-parsed-profile-name-is-emp.patch b/queue-5.10/apparmor-avoid-crash-when-parsed-profile-name-is-emp.patch new file mode 100644 index 00000000000..018aed72ec3 --- /dev/null +++ b/queue-5.10/apparmor-avoid-crash-when-parsed-profile-name-is-emp.patch @@ -0,0 +1,82 @@ +From 2254dd29fd3b0c8e2447bb0534e3b7dec4a774ab Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 28 Dec 2023 19:07:43 +0300 +Subject: apparmor: avoid crash when parsed profile name is empty + +From: Fedor Pchelkin + +[ Upstream commit 55a8210c9e7d21ff2644809699765796d4bfb200 ] + +When processing a packed profile in unpack_profile() described like + + "profile :ns::samba-dcerpcd /usr/lib*/samba/{,samba/}samba-dcerpcd {...}" + +a string ":samba-dcerpcd" is unpacked as a fully-qualified name and then +passed to aa_splitn_fqname(). + +aa_splitn_fqname() treats ":samba-dcerpcd" as only containing a namespace. +Thus it returns NULL for tmpname, meanwhile tmpns is non-NULL. Later +aa_alloc_profile() crashes as the new profile name is NULL now. + +general protection fault, probably for non-canonical address 0xdffffc0000000000: 0000 [#1] PREEMPT SMP KASAN NOPTI +KASAN: null-ptr-deref in range [0x0000000000000000-0x0000000000000007] +CPU: 6 PID: 1657 Comm: apparmor_parser Not tainted 6.7.0-rc2-dirty #16 +Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS rel-1.16.2-3-gd478f380-rebuilt.opensuse.org 04/01/2014 +RIP: 0010:strlen+0x1e/0xa0 +Call Trace: + + ? strlen+0x1e/0xa0 + aa_policy_init+0x1bb/0x230 + aa_alloc_profile+0xb1/0x480 + unpack_profile+0x3bc/0x4960 + aa_unpack+0x309/0x15e0 + aa_replace_profiles+0x213/0x33c0 + policy_update+0x261/0x370 + profile_replace+0x20e/0x2a0 + vfs_write+0x2af/0xe00 + ksys_write+0x126/0x250 + do_syscall_64+0x46/0xf0 + entry_SYSCALL_64_after_hwframe+0x6e/0x76 + +---[ end trace 0000000000000000 ]--- +RIP: 0010:strlen+0x1e/0xa0 + +It seems such behaviour of aa_splitn_fqname() is expected and checked in +other places where it is called (e.g. aa_remove_profiles). Well, there +is an explicit comment "a ns name without a following profile is allowed" +inside. + +AFAICS, nothing can prevent unpacked "name" to be in form like +":samba-dcerpcd" - it is passed from userspace. + +Deny the whole profile set replacement in such case and inform user with +EPROTO and an explaining message. + +Found by Linux Verification Center (linuxtesting.org). + +Fixes: 04dc715e24d0 ("apparmor: audit policy ns specified in policy load") +Signed-off-by: Fedor Pchelkin +Signed-off-by: John Johansen +Signed-off-by: Sasha Levin +--- + security/apparmor/policy_unpack.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/security/apparmor/policy_unpack.c b/security/apparmor/policy_unpack.c +index 10896d69c442..6c2a536173b5 100644 +--- a/security/apparmor/policy_unpack.c ++++ b/security/apparmor/policy_unpack.c +@@ -696,6 +696,10 @@ static struct aa_profile *unpack_profile(struct aa_ext *e, char **ns_name) + + tmpname = aa_splitn_fqname(name, strlen(name), &tmpns, &ns_len); + if (tmpns) { ++ if (!tmpname) { ++ info = "empty profile name"; ++ goto fail; ++ } + *ns_name = kstrndup(tmpns, ns_len, GFP_KERNEL); + if (!*ns_name) { + info = "out of memory"; +-- +2.43.0 + diff --git a/queue-5.10/ethtool-netlink-add-missing-ethnl_ops_begin-complete.patch b/queue-5.10/ethtool-netlink-add-missing-ethnl_ops_begin-complete.patch new file mode 100644 index 00000000000..31cc076d110 --- /dev/null +++ b/queue-5.10/ethtool-netlink-add-missing-ethnl_ops_begin-complete.patch @@ -0,0 +1,64 @@ +From 4f974adb1c01b7faaaa65ae4b490d001a4876fc5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Jan 2024 13:03:14 +0100 +Subject: ethtool: netlink: Add missing ethnl_ops_begin/complete +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Ludvig Pärsson + +[ Upstream commit f1172f3ee3a98754d95b968968920a7d03fdebcc ] + +Accessing an ethernet device that is powered off or clock gated might +cause the CPU to hang. Add ethnl_ops_begin/complete in +ethnl_set_features() to protect against this. + +Fixes: 0980bfcd6954 ("ethtool: set netdev features with FEATURES_SET request") +Signed-off-by: Ludvig Pärsson +Link: https://lore.kernel.org/r/20240117-etht2-v2-1-1a96b6e8c650@axis.com +Signed-off-by: Paolo Abeni +Signed-off-by: Sasha Levin +--- + net/ethtool/features.c | 9 +++++++-- + 1 file changed, 7 insertions(+), 2 deletions(-) + +diff --git a/net/ethtool/features.c b/net/ethtool/features.c +index 1c9f4df273bd..faccab84d865 100644 +--- a/net/ethtool/features.c ++++ b/net/ethtool/features.c +@@ -235,17 +235,20 @@ int ethnl_set_features(struct sk_buff *skb, struct genl_info *info) + dev = req_info.dev; + + rtnl_lock(); ++ ret = ethnl_ops_begin(dev); ++ if (ret < 0) ++ goto out_rtnl; + ethnl_features_to_bitmap(old_active, dev->features); + ethnl_features_to_bitmap(old_wanted, dev->wanted_features); + ret = ethnl_parse_bitset(req_wanted, req_mask, NETDEV_FEATURE_COUNT, + tb[ETHTOOL_A_FEATURES_WANTED], + netdev_features_strings, info->extack); + if (ret < 0) +- goto out_rtnl; ++ goto out_ops; + if (ethnl_bitmap_to_features(req_mask) & ~NETIF_F_ETHTOOL_BITS) { + GENL_SET_ERR_MSG(info, "attempt to change non-ethtool features"); + ret = -EINVAL; +- goto out_rtnl; ++ goto out_ops; + } + + /* set req_wanted bits not in req_mask from old_wanted */ +@@ -282,6 +285,8 @@ int ethnl_set_features(struct sk_buff *skb, struct genl_info *info) + if (mod) + netdev_features_change(dev); + ++out_ops: ++ ethnl_ops_complete(dev); + out_rtnl: + rtnl_unlock(); + dev_put(dev); +-- +2.43.0 + diff --git a/queue-5.10/i2c-s3c24xx-fix-read-transfers-in-polling-mode.patch b/queue-5.10/i2c-s3c24xx-fix-read-transfers-in-polling-mode.patch new file mode 100644 index 00000000000..f0234259aa0 --- /dev/null +++ b/queue-5.10/i2c-s3c24xx-fix-read-transfers-in-polling-mode.patch @@ -0,0 +1,50 @@ +From 83746a84c7f5dd2027d3a1c3c679749fca7b33bb Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Nov 2023 17:43:52 +0100 +Subject: i2c: s3c24xx: fix read transfers in polling mode + +From: Marek Szyprowski + +[ Upstream commit 0d9cf23ed55d7ba3ab26d617a3ae507863674c8f ] + +To properly handle read transfers in polling mode, no waiting for the ACK +state is needed as it will never come. Just wait a bit to ensure start +state is on the bus and continue processing next bytes. + +Fixes: 117053f77a5a ("i2c: s3c2410: Add polling mode support") +Signed-off-by: Marek Szyprowski +Reviewed-by: Chanho Park +Reviewed-by: Andi Shyti +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-s3c2410.c | 13 +++++++++++-- + 1 file changed, 11 insertions(+), 2 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c +index 05831848b7bf..687588834fc8 100644 +--- a/drivers/i2c/busses/i2c-s3c2410.c ++++ b/drivers/i2c/busses/i2c-s3c2410.c +@@ -223,8 +223,17 @@ static bool is_ack(struct s3c24xx_i2c *i2c) + int tries; + + for (tries = 50; tries; --tries) { +- if (readl(i2c->regs + S3C2410_IICCON) +- & S3C2410_IICCON_IRQPEND) { ++ unsigned long tmp = readl(i2c->regs + S3C2410_IICCON); ++ ++ if (!(tmp & S3C2410_IICCON_ACKEN)) { ++ /* ++ * Wait a bit for the bus to stabilize, ++ * delay estimated experimentally. ++ */ ++ usleep_range(100, 200); ++ return true; ++ } ++ if (tmp & S3C2410_IICCON_IRQPEND) { + if (!(readl(i2c->regs + S3C2410_IICSTAT) + & S3C2410_IICSTAT_LASTBIT)) + return true; +-- +2.43.0 + diff --git a/queue-5.10/i2c-s3c24xx-fix-transferring-more-than-one-message-i.patch b/queue-5.10/i2c-s3c24xx-fix-transferring-more-than-one-message-i.patch new file mode 100644 index 00000000000..28990bf5138 --- /dev/null +++ b/queue-5.10/i2c-s3c24xx-fix-transferring-more-than-one-message-i.patch @@ -0,0 +1,88 @@ +From e3510d8129503363b646891d84026f6d62860f28 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 8 Nov 2023 17:43:53 +0100 +Subject: i2c: s3c24xx: fix transferring more than one message in polling mode + +From: Marek Szyprowski + +[ Upstream commit 990489e1042c6c5d6bccf56deca68f8dbeed8180 ] + +To properly handle ACK on the bus when transferring more than one +message in polling mode, move the polling handling loop from +s3c24xx_i2c_message_start() to s3c24xx_i2c_doxfer(). This way +i2c_s3c_irq_nextbyte() is always executed till the end, properly +acknowledging the IRQ bits and no recursive calls to +i2c_s3c_irq_nextbyte() are made. + +While touching this, also fix finishing transfers in polling mode by +using common code path and always waiting for the bus to become idle +and disabled. + +Fixes: 117053f77a5a ("i2c: s3c2410: Add polling mode support") +Signed-off-by: Marek Szyprowski +Reviewed-by: Andi Shyti +Signed-off-by: Wolfram Sang +Signed-off-by: Sasha Levin +--- + drivers/i2c/busses/i2c-s3c2410.c | 27 ++++++++++----------------- + 1 file changed, 10 insertions(+), 17 deletions(-) + +diff --git a/drivers/i2c/busses/i2c-s3c2410.c b/drivers/i2c/busses/i2c-s3c2410.c +index 687588834fc8..fd0969cd7dc6 100644 +--- a/drivers/i2c/busses/i2c-s3c2410.c ++++ b/drivers/i2c/busses/i2c-s3c2410.c +@@ -286,16 +286,6 @@ static void s3c24xx_i2c_message_start(struct s3c24xx_i2c *i2c, + + stat |= S3C2410_IICSTAT_START; + writel(stat, i2c->regs + S3C2410_IICSTAT); +- +- if (i2c->quirks & QUIRK_POLL) { +- while ((i2c->msg_num != 0) && is_ack(i2c)) { +- i2c_s3c_irq_nextbyte(i2c, stat); +- stat = readl(i2c->regs + S3C2410_IICSTAT); +- +- if (stat & S3C2410_IICSTAT_ARBITR) +- dev_err(i2c->dev, "deal with arbitration loss\n"); +- } +- } + } + + static inline void s3c24xx_i2c_stop(struct s3c24xx_i2c *i2c, int ret) +@@ -702,7 +692,7 @@ static void s3c24xx_i2c_wait_idle(struct s3c24xx_i2c *i2c) + static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, + struct i2c_msg *msgs, int num) + { +- unsigned long timeout; ++ unsigned long timeout = 0; + int ret; + + ret = s3c24xx_i2c_set_master(i2c); +@@ -722,16 +712,19 @@ static int s3c24xx_i2c_doxfer(struct s3c24xx_i2c *i2c, + s3c24xx_i2c_message_start(i2c, msgs); + + if (i2c->quirks & QUIRK_POLL) { +- ret = i2c->msg_idx; ++ while ((i2c->msg_num != 0) && is_ack(i2c)) { ++ unsigned long stat = readl(i2c->regs + S3C2410_IICSTAT); + +- if (ret != num) +- dev_dbg(i2c->dev, "incomplete xfer (%d)\n", ret); ++ i2c_s3c_irq_nextbyte(i2c, stat); + +- goto out; ++ stat = readl(i2c->regs + S3C2410_IICSTAT); ++ if (stat & S3C2410_IICSTAT_ARBITR) ++ dev_err(i2c->dev, "deal with arbitration loss\n"); ++ } ++ } else { ++ timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); + } + +- timeout = wait_event_timeout(i2c->wait, i2c->msg_num == 0, HZ * 5); +- + ret = i2c->msg_idx; + + /* +-- +2.43.0 + diff --git a/queue-5.10/iio-adc-ad9467-benefit-from-devm_clk_get_enabled-to-.patch b/queue-5.10/iio-adc-ad9467-benefit-from-devm_clk_get_enabled-to-.patch new file mode 100644 index 00000000000..8f38ab4fc13 --- /dev/null +++ b/queue-5.10/iio-adc-ad9467-benefit-from-devm_clk_get_enabled-to-.patch @@ -0,0 +1,66 @@ +From 0a40b438c3e5ee02e8dde7f83765a1b0bd18c482 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 8 Aug 2022 22:47:30 +0200 +Subject: iio: adc: ad9467: Benefit from devm_clk_get_enabled() to simplify +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit cdd07b3ab94a020570132558442a26e74b70bc42 ] + +Make use of devm_clk_get_enabled() to replace some code that effectively +open codes this new function. + +Reviewed-by: Andy Shevchenko +Signed-off-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20220808204740.307667-3-u.kleine-koenig@pengutronix.de +Signed-off-by: Jonathan Cameron +Stable-dep-of: 76f028539cf3 ("iio: adc: ad9467: fix reset gpio handling") +Signed-off-by: Sasha Levin +--- + drivers/iio/adc/ad9467.c | 17 +---------------- + 1 file changed, 1 insertion(+), 16 deletions(-) + +diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c +index 19a45dd43796..92837dcbc170 100644 +--- a/drivers/iio/adc/ad9467.c ++++ b/drivers/iio/adc/ad9467.c +@@ -378,13 +378,6 @@ static int ad9467_preenable_setup(struct adi_axi_adc_conv *conv) + return ad9467_outputmode_set(st->spi, st->output_mode); + } + +-static void ad9467_clk_disable(void *data) +-{ +- struct ad9467_state *st = data; +- +- clk_disable_unprepare(st->clk); +-} +- + static int ad9467_probe(struct spi_device *spi) + { + const struct ad9467_chip_info *info; +@@ -404,18 +397,10 @@ static int ad9467_probe(struct spi_device *spi) + st = adi_axi_adc_conv_priv(conv); + st->spi = spi; + +- st->clk = devm_clk_get(&spi->dev, "adc-clk"); ++ st->clk = devm_clk_get_enabled(&spi->dev, "adc-clk"); + if (IS_ERR(st->clk)) + return PTR_ERR(st->clk); + +- ret = clk_prepare_enable(st->clk); +- if (ret < 0) +- return ret; +- +- ret = devm_add_action_or_reset(&spi->dev, ad9467_clk_disable, st); +- if (ret) +- return ret; +- + st->pwrdown_gpio = devm_gpiod_get_optional(&spi->dev, "powerdown", + GPIOD_OUT_LOW); + if (IS_ERR(st->pwrdown_gpio)) +-- +2.43.0 + diff --git a/queue-5.10/iio-adc-ad9467-don-t-ignore-error-codes.patch b/queue-5.10/iio-adc-ad9467-don-t-ignore-error-codes.patch new file mode 100644 index 00000000000..5a173e40425 --- /dev/null +++ b/queue-5.10/iio-adc-ad9467-don-t-ignore-error-codes.patch @@ -0,0 +1,85 @@ +From caf5daf7f167ec9ab1b7299b60e780448065ab85 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Dec 2023 13:39:25 +0100 +Subject: iio: adc: ad9467: don't ignore error codes + +From: Nuno Sa + +[ Upstream commit e072e149cfb827e0ab4cafb0547e9658e35393cd ] + +Make sure functions that return errors are not ignored. + +Fixes: ad6797120238 ("iio: adc: ad9467: add support AD9467 ADC") +Reviewed-by: David Lechner +Signed-off-by: Nuno Sa +Link: https://lore.kernel.org/r/20231207-iio-backend-prep-v2-2-a4a33bc4d70e@analog.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/adc/ad9467.c | 27 +++++++++++++++++---------- + 1 file changed, 17 insertions(+), 10 deletions(-) + +diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c +index f2620dcd2a2c..df23bceb6bb4 100644 +--- a/drivers/iio/adc/ad9467.c ++++ b/drivers/iio/adc/ad9467.c +@@ -162,9 +162,10 @@ static int ad9467_reg_access(struct adi_axi_adc_conv *conv, unsigned int reg, + + if (readval == NULL) { + ret = ad9467_spi_write(spi, reg, writeval); +- ad9467_spi_write(spi, AN877_ADC_REG_TRANSFER, +- AN877_ADC_TRANSFER_SYNC); +- return ret; ++ if (ret) ++ return ret; ++ return ad9467_spi_write(spi, AN877_ADC_REG_TRANSFER, ++ AN877_ADC_TRANSFER_SYNC); + } + + ret = ad9467_spi_read(spi, reg); +@@ -272,10 +273,13 @@ static int ad9467_get_scale(struct adi_axi_adc_conv *conv, int *val, int *val2) + const struct ad9467_chip_info *info1 = to_ad9467_chip_info(info); + struct ad9467_state *st = adi_axi_adc_conv_priv(conv); + unsigned int i, vref_val; ++ int ret; + +- vref_val = ad9467_spi_read(st->spi, AN877_ADC_REG_VREF); ++ ret = ad9467_spi_read(st->spi, AN877_ADC_REG_VREF); ++ if (ret < 0) ++ return ret; + +- vref_val &= info1->vref_mask; ++ vref_val = ret & info1->vref_mask; + + for (i = 0; i < info->num_scales; i++) { + if (vref_val == info->scale_table[i][1]) +@@ -296,6 +300,7 @@ static int ad9467_set_scale(struct adi_axi_adc_conv *conv, int val, int val2) + struct ad9467_state *st = adi_axi_adc_conv_priv(conv); + unsigned int scale_val[2]; + unsigned int i; ++ int ret; + + if (val != 0) + return -EINVAL; +@@ -305,11 +310,13 @@ static int ad9467_set_scale(struct adi_axi_adc_conv *conv, int val, int val2) + if (scale_val[0] != val || scale_val[1] != val2) + continue; + +- ad9467_spi_write(st->spi, AN877_ADC_REG_VREF, +- info->scale_table[i][1]); +- ad9467_spi_write(st->spi, AN877_ADC_REG_TRANSFER, +- AN877_ADC_TRANSFER_SYNC); +- return 0; ++ ret = ad9467_spi_write(st->spi, AN877_ADC_REG_VREF, ++ info->scale_table[i][1]); ++ if (ret < 0) ++ return ret; ++ ++ return ad9467_spi_write(st->spi, AN877_ADC_REG_TRANSFER, ++ AN877_ADC_TRANSFER_SYNC); + } + + return -EINVAL; +-- +2.43.0 + diff --git a/queue-5.10/iio-adc-ad9467-fix-reset-gpio-handling.patch b/queue-5.10/iio-adc-ad9467-fix-reset-gpio-handling.patch new file mode 100644 index 00000000000..665680c5405 --- /dev/null +++ b/queue-5.10/iio-adc-ad9467-fix-reset-gpio-handling.patch @@ -0,0 +1,91 @@ +From 754dc78a4d3b0ded06d94d3814102cb17f439174 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Dec 2023 13:39:24 +0100 +Subject: iio: adc: ad9467: fix reset gpio handling + +From: Nuno Sa + +[ Upstream commit 76f028539cf360f750efd8cde560edda298e4c6b ] + +The reset gpio was being handled with inverted polarity. This means that +as far as gpiolib is concerned we were actually leaving the pin asserted +(in theory, this would mean reset). However, inverting the polarity in +devicetree made things work. Fix it by doing it the proper way and how +gpiolib expects it to be done. + +While at it, moved the handling to it's own function and dropped +'reset_gpio' from the 'struct ad9467_state' as we only need it during +probe. On top of that, refactored things so that we now request the gpio +asserted (i.e in reset) and then de-assert it. Also note that we now use +gpiod_set_value_cansleep() instead of gpiod_direction_output() as we +already request the pin as output. + +Fixes: ad6797120238 ("iio: adc: ad9467: add support AD9467 ADC") +Reviewed-by: David Lechner +Signed-off-by: Nuno Sa +Link: https://lore.kernel.org/r/20231207-iio-backend-prep-v2-1-a4a33bc4d70e@analog.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/adc/ad9467.c | 31 ++++++++++++++++++------------- + 1 file changed, 18 insertions(+), 13 deletions(-) + +diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c +index 92837dcbc170..f2620dcd2a2c 100644 +--- a/drivers/iio/adc/ad9467.c ++++ b/drivers/iio/adc/ad9467.c +@@ -121,7 +121,6 @@ struct ad9467_state { + unsigned int output_mode; + + struct gpio_desc *pwrdown_gpio; +- struct gpio_desc *reset_gpio; + }; + + static int ad9467_spi_read(struct spi_device *spi, unsigned int reg) +@@ -378,6 +377,21 @@ static int ad9467_preenable_setup(struct adi_axi_adc_conv *conv) + return ad9467_outputmode_set(st->spi, st->output_mode); + } + ++static int ad9467_reset(struct device *dev) ++{ ++ struct gpio_desc *gpio; ++ ++ gpio = devm_gpiod_get_optional(dev, "reset", GPIOD_OUT_HIGH); ++ if (IS_ERR_OR_NULL(gpio)) ++ return PTR_ERR_OR_ZERO(gpio); ++ ++ fsleep(1); ++ gpiod_set_value_cansleep(gpio, 0); ++ fsleep(10 * USEC_PER_MSEC); ++ ++ return 0; ++} ++ + static int ad9467_probe(struct spi_device *spi) + { + const struct ad9467_chip_info *info; +@@ -406,18 +420,9 @@ static int ad9467_probe(struct spi_device *spi) + if (IS_ERR(st->pwrdown_gpio)) + return PTR_ERR(st->pwrdown_gpio); + +- st->reset_gpio = devm_gpiod_get_optional(&spi->dev, "reset", +- GPIOD_OUT_LOW); +- if (IS_ERR(st->reset_gpio)) +- return PTR_ERR(st->reset_gpio); +- +- if (st->reset_gpio) { +- udelay(1); +- ret = gpiod_direction_output(st->reset_gpio, 1); +- if (ret) +- return ret; +- mdelay(10); +- } ++ ret = ad9467_reset(&spi->dev); ++ if (ret) ++ return ret; + + spi_set_drvdata(spi, st); + +-- +2.43.0 + diff --git a/queue-5.10/iio-adc-ad9467-fix-scale-setting.patch b/queue-5.10/iio-adc-ad9467-fix-scale-setting.patch new file mode 100644 index 00000000000..fd55d39eebb --- /dev/null +++ b/queue-5.10/iio-adc-ad9467-fix-scale-setting.patch @@ -0,0 +1,255 @@ +From 1f973039ed81f5d01ed232e3e850998fc018b21f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Dec 2023 13:39:27 +0100 +Subject: iio: adc: ad9467: fix scale setting + +From: Nuno Sa + +[ Upstream commit b73f08bb7fe5a0901646ca5ceaa1e7a2d5ee6293 ] + +When reading in_voltage_scale we can get something like: + +root@analog:/sys/bus/iio/devices/iio:device2# cat in_voltage_scale +0.038146 + +However, when reading the available options: + +root@analog:/sys/bus/iio/devices/iio:device2# cat +in_voltage_scale_available +2000.000000 2100.000006 2200.000007 2300.000008 2400.000009 2500.000010 + +which does not make sense. Moreover, when trying to set a new scale we +get an error because there's no call to __ad9467_get_scale() to give us +values as given when reading in_voltage_scale. Fix it by computing the +available scales during probe and properly pass the list when +.read_available() is called. + +While at it, change to use .read_available() from iio_info. Also note +that to properly fix this, adi-axi-adc.c has to be changed accordingly. + +Fixes: ad6797120238 ("iio: adc: ad9467: add support AD9467 ADC") +Signed-off-by: Nuno Sa +Reviewed-by: David Lechner +Link: https://lore.kernel.org/r/20231207-iio-backend-prep-v2-4-a4a33bc4d70e@analog.com +Signed-off-by: Jonathan Cameron +Signed-off-by: Sasha Levin +--- + drivers/iio/adc/ad9467.c | 47 ++++++++++++++++++ + drivers/iio/adc/adi-axi-adc.c | 74 ++++++----------------------- + include/linux/iio/adc/adi-axi-adc.h | 4 ++ + 3 files changed, 66 insertions(+), 59 deletions(-) + +diff --git a/drivers/iio/adc/ad9467.c b/drivers/iio/adc/ad9467.c +index df23bceb6bb4..6b9627bfebb0 100644 +--- a/drivers/iio/adc/ad9467.c ++++ b/drivers/iio/adc/ad9467.c +@@ -119,6 +119,7 @@ struct ad9467_state { + struct spi_device *spi; + struct clk *clk; + unsigned int output_mode; ++ unsigned int (*scales)[2]; + + struct gpio_desc *pwrdown_gpio; + }; +@@ -212,6 +213,7 @@ static void __ad9467_get_scale(struct adi_axi_adc_conv *conv, int index, + .channel = _chan, \ + .info_mask_shared_by_type = BIT(IIO_CHAN_INFO_SCALE) | \ + BIT(IIO_CHAN_INFO_SAMP_FREQ), \ ++ .info_mask_shared_by_type_available = BIT(IIO_CHAN_INFO_SCALE), \ + .scan_index = _si, \ + .scan_type = { \ + .sign = _sign, \ +@@ -365,6 +367,26 @@ static int ad9467_write_raw(struct adi_axi_adc_conv *conv, + } + } + ++static int ad9467_read_avail(struct adi_axi_adc_conv *conv, ++ struct iio_chan_spec const *chan, ++ const int **vals, int *type, int *length, ++ long mask) ++{ ++ const struct adi_axi_adc_chip_info *info = conv->chip_info; ++ struct ad9467_state *st = adi_axi_adc_conv_priv(conv); ++ ++ switch (mask) { ++ case IIO_CHAN_INFO_SCALE: ++ *vals = (const int *)st->scales; ++ *type = IIO_VAL_INT_PLUS_MICRO; ++ /* Values are stored in a 2D matrix */ ++ *length = info->num_scales * 2; ++ return IIO_AVAIL_LIST; ++ default: ++ return -EINVAL; ++ } ++} ++ + static int ad9467_outputmode_set(struct spi_device *spi, unsigned int mode) + { + int ret; +@@ -377,6 +399,26 @@ static int ad9467_outputmode_set(struct spi_device *spi, unsigned int mode) + AN877_ADC_TRANSFER_SYNC); + } + ++static int ad9467_scale_fill(struct adi_axi_adc_conv *conv) ++{ ++ const struct adi_axi_adc_chip_info *info = conv->chip_info; ++ struct ad9467_state *st = adi_axi_adc_conv_priv(conv); ++ unsigned int i, val1, val2; ++ ++ st->scales = devm_kmalloc_array(&st->spi->dev, info->num_scales, ++ sizeof(*st->scales), GFP_KERNEL); ++ if (!st->scales) ++ return -ENOMEM; ++ ++ for (i = 0; i < info->num_scales; i++) { ++ __ad9467_get_scale(conv, i, &val1, &val2); ++ st->scales[i][0] = val1; ++ st->scales[i][1] = val2; ++ } ++ ++ return 0; ++} ++ + static int ad9467_preenable_setup(struct adi_axi_adc_conv *conv) + { + struct ad9467_state *st = adi_axi_adc_conv_priv(conv); +@@ -435,6 +477,10 @@ static int ad9467_probe(struct spi_device *spi) + + conv->chip_info = &info->axi_adc_info; + ++ ret = ad9467_scale_fill(conv); ++ if (ret) ++ return ret; ++ + id = ad9467_spi_read(spi, AN877_ADC_REG_CHIP_ID); + if (id != conv->chip_info->id) { + dev_err(&spi->dev, "Mismatch CHIP_ID, got 0x%X, expected 0x%X\n", +@@ -445,6 +491,7 @@ static int ad9467_probe(struct spi_device *spi) + conv->reg_access = ad9467_reg_access; + conv->write_raw = ad9467_write_raw; + conv->read_raw = ad9467_read_raw; ++ conv->read_avail = ad9467_read_avail; + conv->preenable_setup = ad9467_preenable_setup; + + st->output_mode = info->default_output_mode | +diff --git a/drivers/iio/adc/adi-axi-adc.c b/drivers/iio/adc/adi-axi-adc.c +index cbe1011a2408..d721fb1bcae7 100644 +--- a/drivers/iio/adc/adi-axi-adc.c ++++ b/drivers/iio/adc/adi-axi-adc.c +@@ -150,6 +150,20 @@ static int adi_axi_adc_write_raw(struct iio_dev *indio_dev, + return conv->write_raw(conv, chan, val, val2, mask); + } + ++static int adi_axi_adc_read_avail(struct iio_dev *indio_dev, ++ struct iio_chan_spec const *chan, ++ const int **vals, int *type, int *length, ++ long mask) ++{ ++ struct adi_axi_adc_state *st = iio_priv(indio_dev); ++ struct adi_axi_adc_conv *conv = &st->client->conv; ++ ++ if (!conv->read_avail) ++ return -EOPNOTSUPP; ++ ++ return conv->read_avail(conv, chan, vals, type, length, mask); ++} ++ + static int adi_axi_adc_update_scan_mode(struct iio_dev *indio_dev, + const unsigned long *scan_mask) + { +@@ -238,69 +252,11 @@ struct adi_axi_adc_conv *devm_adi_axi_adc_conv_register(struct device *dev, + } + EXPORT_SYMBOL_GPL(devm_adi_axi_adc_conv_register); + +-static ssize_t in_voltage_scale_available_show(struct device *dev, +- struct device_attribute *attr, +- char *buf) +-{ +- struct iio_dev *indio_dev = dev_to_iio_dev(dev); +- struct adi_axi_adc_state *st = iio_priv(indio_dev); +- struct adi_axi_adc_conv *conv = &st->client->conv; +- size_t len = 0; +- int i; +- +- for (i = 0; i < conv->chip_info->num_scales; i++) { +- const unsigned int *s = conv->chip_info->scale_table[i]; +- +- len += scnprintf(buf + len, PAGE_SIZE - len, +- "%u.%06u ", s[0], s[1]); +- } +- buf[len - 1] = '\n'; +- +- return len; +-} +- +-static IIO_DEVICE_ATTR_RO(in_voltage_scale_available, 0); +- +-enum { +- ADI_AXI_ATTR_SCALE_AVAIL, +-}; +- +-#define ADI_AXI_ATTR(_en_, _file_) \ +- [ADI_AXI_ATTR_##_en_] = &iio_dev_attr_##_file_.dev_attr.attr +- +-static struct attribute *adi_axi_adc_attributes[] = { +- ADI_AXI_ATTR(SCALE_AVAIL, in_voltage_scale_available), +- NULL +-}; +- +-static umode_t axi_adc_attr_is_visible(struct kobject *kobj, +- struct attribute *attr, int n) +-{ +- struct device *dev = kobj_to_dev(kobj); +- struct iio_dev *indio_dev = dev_to_iio_dev(dev); +- struct adi_axi_adc_state *st = iio_priv(indio_dev); +- struct adi_axi_adc_conv *conv = &st->client->conv; +- +- switch (n) { +- case ADI_AXI_ATTR_SCALE_AVAIL: +- if (!conv->chip_info->num_scales) +- return 0; +- return attr->mode; +- default: +- return attr->mode; +- } +-} +- +-static const struct attribute_group adi_axi_adc_attribute_group = { +- .attrs = adi_axi_adc_attributes, +- .is_visible = axi_adc_attr_is_visible, +-}; +- + static const struct iio_info adi_axi_adc_info = { + .read_raw = &adi_axi_adc_read_raw, + .write_raw = &adi_axi_adc_write_raw, +- .attrs = &adi_axi_adc_attribute_group, + .update_scan_mode = &adi_axi_adc_update_scan_mode, ++ .read_avail = &adi_axi_adc_read_avail, + }; + + static const struct adi_axi_adc_core_info adi_axi_adc_10_0_a_info = { +diff --git a/include/linux/iio/adc/adi-axi-adc.h b/include/linux/iio/adc/adi-axi-adc.h +index c5d48e1c2d36..77b7f66e6fa8 100644 +--- a/include/linux/iio/adc/adi-axi-adc.h ++++ b/include/linux/iio/adc/adi-axi-adc.h +@@ -41,6 +41,7 @@ struct adi_axi_adc_chip_info { + * @reg_access IIO debugfs_reg_access hook for the client ADC + * @read_raw IIO read_raw hook for the client ADC + * @write_raw IIO write_raw hook for the client ADC ++ * @read_avail IIO read_avail hook for the client ADC + */ + struct adi_axi_adc_conv { + const struct adi_axi_adc_chip_info *chip_info; +@@ -54,6 +55,9 @@ struct adi_axi_adc_conv { + int (*write_raw)(struct adi_axi_adc_conv *conv, + struct iio_chan_spec const *chan, + int val, int val2, long mask); ++ int (*read_avail)(struct adi_axi_adc_conv *conv, ++ struct iio_chan_spec const *chan, ++ const int **val, int *type, int *length, long mask); + }; + + struct adi_axi_adc_conv *devm_adi_axi_adc_conv_register(struct device *dev, +-- +2.43.0 + diff --git a/queue-5.10/ipvs-avoid-stat-macros-calls-from-preemptible-contex.patch b/queue-5.10/ipvs-avoid-stat-macros-calls-from-preemptible-contex.patch new file mode 100644 index 00000000000..f81e1ae2455 --- /dev/null +++ b/queue-5.10/ipvs-avoid-stat-macros-calls-from-preemptible-contex.patch @@ -0,0 +1,83 @@ +From a51807fdc4857e55976d32811c9fb3c5adfd54d2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jan 2024 17:39:22 +0300 +Subject: ipvs: avoid stat macros calls from preemptible context + +From: Fedor Pchelkin + +[ Upstream commit d6938c1c76c64f42363d0d1f051e1b4641c2ad40 ] + +Inside decrement_ttl() upon discovering that the packet ttl has exceeded, +__IP_INC_STATS and __IP6_INC_STATS macros can be called from preemptible +context having the following backtrace: + +check_preemption_disabled: 48 callbacks suppressed +BUG: using __this_cpu_add() in preemptible [00000000] code: curl/1177 +caller is decrement_ttl+0x217/0x830 +CPU: 5 PID: 1177 Comm: curl Not tainted 6.7.0+ #34 +Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 04/01/2014 +Call Trace: + + dump_stack_lvl+0xbd/0xe0 + check_preemption_disabled+0xd1/0xe0 + decrement_ttl+0x217/0x830 + __ip_vs_get_out_rt+0x4e0/0x1ef0 + ip_vs_nat_xmit+0x205/0xcd0 + ip_vs_in_hook+0x9b1/0x26a0 + nf_hook_slow+0xc2/0x210 + nf_hook+0x1fb/0x770 + __ip_local_out+0x33b/0x640 + ip_local_out+0x2a/0x490 + __ip_queue_xmit+0x990/0x1d10 + __tcp_transmit_skb+0x288b/0x3d10 + tcp_connect+0x3466/0x5180 + tcp_v4_connect+0x1535/0x1bb0 + __inet_stream_connect+0x40d/0x1040 + inet_stream_connect+0x57/0xa0 + __sys_connect_file+0x162/0x1a0 + __sys_connect+0x137/0x160 + __x64_sys_connect+0x72/0xb0 + do_syscall_64+0x6f/0x140 + entry_SYSCALL_64_after_hwframe+0x6e/0x76 +RIP: 0033:0x7fe6dbbc34e0 + +Use the corresponding preemption-aware variants: IP_INC_STATS and +IP6_INC_STATS. + +Found by Linux Verification Center (linuxtesting.org). + +Fixes: 8d8e20e2d7bb ("ipvs: Decrement ttl") +Signed-off-by: Fedor Pchelkin +Acked-by: Julian Anastasov +Acked-by: Simon Horman +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/ipvs/ip_vs_xmit.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/net/netfilter/ipvs/ip_vs_xmit.c b/net/netfilter/ipvs/ip_vs_xmit.c +index cd2130e98836..c87dbc897002 100644 +--- a/net/netfilter/ipvs/ip_vs_xmit.c ++++ b/net/netfilter/ipvs/ip_vs_xmit.c +@@ -271,7 +271,7 @@ static inline bool decrement_ttl(struct netns_ipvs *ipvs, + skb->dev = dst->dev; + icmpv6_send(skb, ICMPV6_TIME_EXCEED, + ICMPV6_EXC_HOPLIMIT, 0); +- __IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS); ++ IP6_INC_STATS(net, idev, IPSTATS_MIB_INHDRERRORS); + + return false; + } +@@ -286,7 +286,7 @@ static inline bool decrement_ttl(struct netns_ipvs *ipvs, + { + if (ip_hdr(skb)->ttl <= 1) { + /* Tell the sender its packet died... */ +- __IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS); ++ IP_INC_STATS(net, IPSTATS_MIB_INHDRERRORS); + icmp_send(skb, ICMP_TIME_EXCEEDED, ICMP_EXC_TTL, 0); + return false; + } +-- +2.43.0 + diff --git a/queue-5.10/kdb-fix-a-potential-buffer-overflow-in-kdb_local.patch b/queue-5.10/kdb-fix-a-potential-buffer-overflow-in-kdb_local.patch new file mode 100644 index 00000000000..6982dec0dd0 --- /dev/null +++ b/queue-5.10/kdb-fix-a-potential-buffer-overflow-in-kdb_local.patch @@ -0,0 +1,45 @@ +From 74e0970d19b0ecd853531be20d4443526e80a2a8 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 25 Nov 2023 13:05:04 +0100 +Subject: kdb: Fix a potential buffer overflow in kdb_local() + +From: Christophe JAILLET + +[ Upstream commit 4f41d30cd6dc865c3cbc1a852372321eba6d4e4c ] + +When appending "[defcmd]" to 'kdb_prompt_str', the size of the string +already in the buffer should be taken into account. + +An option could be to switch from strncat() to strlcat() which does the +correct test to avoid such an overflow. + +However, this actually looks as dead code, because 'defcmd_in_progress' +can't be true here. +See a more detailed explanation at [1]. + +[1]: https://lore.kernel.org/all/CAD=FV=WSh7wKN7Yp-3wWiDgX4E3isQ8uh0LCzTmd1v9Cg9j+nQ@mail.gmail.com/ + +Fixes: 5d5314d6795f ("kdb: core for kgdb back end (1 of 2)") +Signed-off-by: Christophe JAILLET +Reviewed-by: Douglas Anderson +Signed-off-by: Sasha Levin +--- + kernel/debug/kdb/kdb_main.c | 2 -- + 1 file changed, 2 deletions(-) + +diff --git a/kernel/debug/kdb/kdb_main.c b/kernel/debug/kdb/kdb_main.c +index 4e09fab52faf..c27b3dfa1921 100644 +--- a/kernel/debug/kdb/kdb_main.c ++++ b/kernel/debug/kdb/kdb_main.c +@@ -1364,8 +1364,6 @@ static int kdb_local(kdb_reason_t reason, int error, struct pt_regs *regs, + /* PROMPT can only be set if we have MEM_READ permission. */ + snprintf(kdb_prompt_str, CMD_BUFLEN, kdbgetenv("PROMPT"), + raw_smp_processor_id()); +- if (defcmd_in_progress) +- strncat(kdb_prompt_str, "[defcmd]", CMD_BUFLEN); + + /* + * Fetch command from keyboard +-- +2.43.0 + diff --git a/queue-5.10/leds-aw2013-select-missing-dependency-regmap_i2c.patch b/queue-5.10/leds-aw2013-select-missing-dependency-regmap_i2c.patch new file mode 100644 index 00000000000..b6456648f63 --- /dev/null +++ b/queue-5.10/leds-aw2013-select-missing-dependency-regmap_i2c.patch @@ -0,0 +1,41 @@ +From ff563d98843070da96d5f8e73d343236e4d8925a Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 3 Nov 2023 18:42:03 +0700 +Subject: leds: aw2013: Select missing dependency REGMAP_I2C + +From: Dang Huynh + +[ Upstream commit 75469bb0537ad2ab0fc1fb6e534a79cfc03f3b3f ] + +The AW2013 driver uses devm_regmap_init_i2c, so REGMAP_I2C needs to +be selected. + +Otherwise build process may fail with: + ld: drivers/leds/leds-aw2013.o: in function `aw2013_probe': + leds-aw2013.c:345: undefined reference to `__devm_regmap_init_i2c' + +Signed-off-by: Dang Huynh +Acked-by: Nikita Travkin +Fixes: 59ea3c9faf32 ("leds: add aw2013 driver") +Link: https://lore.kernel.org/r/20231103114203.1108922-1-danct12@riseup.net +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/leds/Kconfig | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/leds/Kconfig b/drivers/leds/Kconfig +index ad84be4f6817..03c4c5e4d35c 100644 +--- a/drivers/leds/Kconfig ++++ b/drivers/leds/Kconfig +@@ -116,6 +116,7 @@ config LEDS_AS3645A + config LEDS_AW2013 + tristate "LED support for Awinic AW2013" + depends on LEDS_CLASS && I2C && OF ++ select REGMAP_I2C + help + This option enables support for the AW2013 3-channel + LED driver. +-- +2.43.0 + diff --git a/queue-5.10/libapi-add-missing-linux-types.h-header-to-get-the-_.patch b/queue-5.10/libapi-add-missing-linux-types.h-header-to-get-the-_.patch new file mode 100644 index 00000000000..ed6ed16dfcc --- /dev/null +++ b/queue-5.10/libapi-add-missing-linux-types.h-header-to-get-the-_.patch @@ -0,0 +1,40 @@ +From 317dcf1cc4d826013664e4420b62ff6b3e3134b0 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 30 Nov 2023 14:11:45 -0300 +Subject: libapi: Add missing linux/types.h header to get the __u64 type on + io.h + +From: Arnaldo Carvalho de Melo + +[ Upstream commit af76b2dec0984a079d8497bfa37d29a9b55932e1 ] + +There are functions using __u64, so we need to have the linux/types.h +header otherwise we'll break when its not included before api/io.h. + +Fixes: e95770af4c4a280f ("tools api: Add a lightweight buffered reading api") +Reviewed-by: Ian Rogers +Cc: Adrian Hunter +Cc: Jiri Olsa +Cc: Namhyung Kim +Link: https://lore.kernel.org/lkml/ZWjDPL+IzPPsuC3X@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/lib/api/io.h | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/tools/lib/api/io.h b/tools/lib/api/io.h +index 777c20f6b604..458acd294237 100644 +--- a/tools/lib/api/io.h ++++ b/tools/lib/api/io.h +@@ -9,6 +9,7 @@ + + #include + #include ++#include + + struct io { + /* File descriptor being read/ */ +-- +2.43.0 + diff --git a/queue-5.10/mfd-syscon-fix-null-pointer-dereference-in-of_syscon.patch b/queue-5.10/mfd-syscon-fix-null-pointer-dereference-in-of_syscon.patch new file mode 100644 index 00000000000..9a6d9f6584b --- /dev/null +++ b/queue-5.10/mfd-syscon-fix-null-pointer-dereference-in-of_syscon.patch @@ -0,0 +1,40 @@ +From 0bcf80380f921bc56b5fff5d74fe8d251bd385ee Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 4 Dec 2023 17:24:43 +0800 +Subject: mfd: syscon: Fix null pointer dereference in of_syscon_register() + +From: Kunwu Chan + +[ Upstream commit 41673c66b3d0c09915698fec5c13b24336f18dd1 ] + +kasprintf() returns a pointer to dynamically allocated memory +which can be NULL upon failure. + +Fixes: e15d7f2b81d2 ("mfd: syscon: Use a unique name with regmap_config") +Signed-off-by: Kunwu Chan +Reviewed-by: Arnd Bergmann +Link: https://lore.kernel.org/r/20231204092443.2462115-1-chentao@kylinos.cn +Signed-off-by: Lee Jones +Signed-off-by: Sasha Levin +--- + drivers/mfd/syscon.c | 4 ++++ + 1 file changed, 4 insertions(+) + +diff --git a/drivers/mfd/syscon.c b/drivers/mfd/syscon.c +index df5cebb372a5..60f74144a4f8 100644 +--- a/drivers/mfd/syscon.c ++++ b/drivers/mfd/syscon.c +@@ -103,6 +103,10 @@ static struct syscon *of_syscon_register(struct device_node *np, bool check_clk) + + syscon_config.name = kasprintf(GFP_KERNEL, "%pOFn@%llx", np, + (u64)res.start); ++ if (!syscon_config.name) { ++ ret = -ENOMEM; ++ goto err_regmap; ++ } + syscon_config.reg_stride = reg_io_width; + syscon_config.val_bits = reg_io_width * 8; + syscon_config.max_register = resource_size(&res) - reg_io_width; +-- +2.43.0 + diff --git a/queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1200_de.patch b/queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1200_de.patch new file mode 100644 index 00000000000..9699aa7414a --- /dev/null +++ b/queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1200_de.patch @@ -0,0 +1,36 @@ +From 24d0381567e352457eb55030746fbb30e88a7e10 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jan 2024 19:07:36 +0100 +Subject: MIPS: Alchemy: Fix an out-of-bound access in db1200_dev_setup() + +From: Christophe JAILLET + +[ Upstream commit 89c4b588d11e9acf01d604de4b0c715884f59213 ] + +When calling spi_register_board_info(), we should pass the number of +elements in 'db1200_spi_devs', not 'db1200_i2c_devs'. + +Fixes: 63323ec54a7e ("MIPS: Alchemy: Extended DB1200 board support.") +Signed-off-by: Christophe JAILLET +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/alchemy/devboards/db1200.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/mips/alchemy/devboards/db1200.c b/arch/mips/alchemy/devboards/db1200.c +index 414f92eacb5e..9ad26215b004 100644 +--- a/arch/mips/alchemy/devboards/db1200.c ++++ b/arch/mips/alchemy/devboards/db1200.c +@@ -847,7 +847,7 @@ int __init db1200_dev_setup(void) + i2c_register_board_info(0, db1200_i2c_devs, + ARRAY_SIZE(db1200_i2c_devs)); + spi_register_board_info(db1200_spi_devs, +- ARRAY_SIZE(db1200_i2c_devs)); ++ ARRAY_SIZE(db1200_spi_devs)); + + /* SWITCHES: S6.8 I2C/SPI selector (OFF=I2C ON=SPI) + * S6.7 AC97/I2S selector (OFF=AC97 ON=I2S) +-- +2.43.0 + diff --git a/queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1550_de.patch b/queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1550_de.patch new file mode 100644 index 00000000000..60ba178b4a8 --- /dev/null +++ b/queue-5.10/mips-alchemy-fix-an-out-of-bound-access-in-db1550_de.patch @@ -0,0 +1,35 @@ +From 87601742a0403747a86b069b029e5be522fae125 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jan 2024 19:09:46 +0100 +Subject: MIPS: Alchemy: Fix an out-of-bound access in db1550_dev_setup() + +From: Christophe JAILLET + +[ Upstream commit 3c1e5abcda64bed0c7bffa65af2316995f269a61 ] + +When calling spi_register_board_info(), + +Fixes: f869d42e580f ("MIPS: Alchemy: Improved DB1550 support, with audio and serial busses.") +Signed-off-by: Christophe JAILLET +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/alchemy/devboards/db1550.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/mips/alchemy/devboards/db1550.c b/arch/mips/alchemy/devboards/db1550.c +index 752b93d91ac9..06811a5db71d 100644 +--- a/arch/mips/alchemy/devboards/db1550.c ++++ b/arch/mips/alchemy/devboards/db1550.c +@@ -588,7 +588,7 @@ int __init db1550_dev_setup(void) + i2c_register_board_info(0, db1550_i2c_devs, + ARRAY_SIZE(db1550_i2c_devs)); + spi_register_board_info(db1550_spi_devs, +- ARRAY_SIZE(db1550_i2c_devs)); ++ ARRAY_SIZE(db1550_spi_devs)); + + c = clk_get(NULL, "psc0_intclk"); + if (!IS_ERR(c)) { +-- +2.43.0 + diff --git a/queue-5.10/mips-dmi-fix-early-remap-on-mips32.patch b/queue-5.10/mips-dmi-fix-early-remap-on-mips32.patch new file mode 100644 index 00000000000..0c076f0edc6 --- /dev/null +++ b/queue-5.10/mips-dmi-fix-early-remap-on-mips32.patch @@ -0,0 +1,44 @@ +From bff368c9c12b3bff830e93f591321bbf42fafed6 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Dec 2023 14:14:18 +0300 +Subject: mips: dmi: Fix early remap on MIPS32 + +From: Serge Semin + +[ Upstream commit 0d0a3748a2cb38f9da1f08d357688ebd982eb788 ] + +dmi_early_remap() has been defined as ioremap_cache() which on MIPS32 gets +to be converted to the VM-based mapping. DMI early remapping is performed +at the setup_arch() stage with no VM available. So calling the +dmi_early_remap() for MIPS32 causes the system to crash at the early boot +time. Fix that by converting dmi_early_remap() to the uncached remapping +which is always available on both 32 and 64-bits MIPS systems. + +Note this change shall not cause any regressions on the current DMI +support implementation because on the early boot-up stage neither MIPS32 +nor MIPS64 has the cacheable ioremapping support anyway. + +Fixes: be8fa1cb444c ("MIPS: Add support for Desktop Management Interface (DMI)") +Signed-off-by: Serge Semin +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/include/asm/dmi.h | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/arch/mips/include/asm/dmi.h b/arch/mips/include/asm/dmi.h +index 27415a288adf..dc397f630c66 100644 +--- a/arch/mips/include/asm/dmi.h ++++ b/arch/mips/include/asm/dmi.h +@@ -5,7 +5,7 @@ + #include + #include + +-#define dmi_early_remap(x, l) ioremap_cache(x, l) ++#define dmi_early_remap(x, l) ioremap(x, l) + #define dmi_early_unmap(x, l) iounmap(x) + #define dmi_remap(x, l) ioremap_cache(x, l) + #define dmi_unmap(x) iounmap(x) +-- +2.43.0 + diff --git a/queue-5.10/mips-fix-incorrect-max_low_pfn-adjustment.patch b/queue-5.10/mips-fix-incorrect-max_low_pfn-adjustment.patch new file mode 100644 index 00000000000..d7745444adf --- /dev/null +++ b/queue-5.10/mips-fix-incorrect-max_low_pfn-adjustment.patch @@ -0,0 +1,80 @@ +From 51a44a3c913a226b07084272241abc7098f9f0f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 2 Dec 2023 14:14:19 +0300 +Subject: mips: Fix incorrect max_low_pfn adjustment + +From: Serge Semin + +[ Upstream commit 0f5cc249ff73552d3bd864e62f85841dafaa107d ] + +max_low_pfn variable is incorrectly adjusted if the kernel is built with +high memory support and the later is detected in a running system, so the +memory which actually can be directly mapped is getting into the highmem +zone. See the ZONE_NORMAL range on my MIPS32r5 system: + +> Zone ranges: +> DMA [mem 0x0000000000000000-0x0000000000ffffff] +> Normal [mem 0x0000000001000000-0x0000000007ffffff] +> HighMem [mem 0x0000000008000000-0x000000020fffffff] + +while the zones are supposed to look as follows: + +> Zone ranges: +> DMA [mem 0x0000000000000000-0x0000000000ffffff] +> Normal [mem 0x0000000001000000-0x000000001fffffff] +> HighMem [mem 0x0000000020000000-0x000000020fffffff] + +Even though the physical memory within the range [0x08000000;0x20000000] +belongs to MMIO on our system, we don't really want it to be considered as +high memory since on MIPS32 that range still can be directly mapped. + +Note there might be other problems caused by the max_low_pfn variable +misconfiguration. For instance high_memory variable is initialize with +virtual address corresponding to the max_low_pfn PFN, and by design it +must define the upper bound on direct map memory, then end of the normal +zone. That in its turn potentially may cause problems in accessing the +memory by means of the /dev/mem and /dev/kmem devices. + +Let's fix the discovered misconfiguration then. It turns out the commit +a94e4f24ec83 ("MIPS: init: Drop boot_mem_map") didn't introduce the +max_low_pfn adjustment quite correct. If the kernel is built with high +memory support and the system is equipped with high memory, the +max_low_pfn variable will need to be initialized with PFN of the most +upper directly reachable memory address so the zone normal would be +correctly setup. On MIPS that PFN corresponds to PFN_DOWN(HIGHMEM_START). +If the system is built with no high memory support and one is detected in +the running system, we'll just need to adjust the max_pfn variable to +discard the found high memory from the system and leave the max_low_pfn as +is, since the later will be less than PFN_DOWN(HIGHMEM_START) anyway by +design of the for_each_memblock() loop performed a bit early in the +bootmem_init() method. + +Fixes: a94e4f24ec83 ("MIPS: init: Drop boot_mem_map") +Signed-off-by: Serge Semin +Signed-off-by: Thomas Bogendoerfer +Signed-off-by: Sasha Levin +--- + arch/mips/kernel/setup.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/arch/mips/kernel/setup.c b/arch/mips/kernel/setup.c +index b7eb7dd96e17..66643cb65963 100644 +--- a/arch/mips/kernel/setup.c ++++ b/arch/mips/kernel/setup.c +@@ -322,11 +322,11 @@ static void __init bootmem_init(void) + panic("Incorrect memory mapping !!!"); + + if (max_pfn > PFN_DOWN(HIGHMEM_START)) { ++ max_low_pfn = PFN_DOWN(HIGHMEM_START); + #ifdef CONFIG_HIGHMEM +- highstart_pfn = PFN_DOWN(HIGHMEM_START); ++ highstart_pfn = max_low_pfn; + highend_pfn = max_pfn; + #else +- max_low_pfn = PFN_DOWN(HIGHMEM_START); + max_pfn = max_low_pfn; + #endif + } +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum-use-bitmap_zalloc-when-applicable.patch b/queue-5.10/mlxsw-spectrum-use-bitmap_zalloc-when-applicable.patch new file mode 100644 index 00000000000..f9a12beb24b --- /dev/null +++ b/queue-5.10/mlxsw-spectrum-use-bitmap_zalloc-when-applicable.patch @@ -0,0 +1,205 @@ +From 23d7a04fe960eb7729d3e1bea912297df1648e2f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Oct 2021 21:17:51 +0200 +Subject: mlxsw: spectrum: Use 'bitmap_zalloc()' when applicable + +From: Christophe JAILLET + +[ Upstream commit 2c087dfcc9d5e7e8557d217f01f58ba42d1ddbf1 ] + +Use 'bitmap_zalloc()' to simplify code, improve the semantic and avoid +some open-coded arithmetic in allocator arguments. + +Also change the corresponding 'kfree()' into 'bitmap_free()' to keep +consistency. + +Signed-off-by: Christophe JAILLET +Reviewed-by: Ido Schimmel +Signed-off-by: David S. Miller +Stable-dep-of: 483ae90d8f97 ("mlxsw: spectrum_acl_tcam: Fix stack corruption") +Signed-off-by: Sasha Levin +--- + .../ethernet/mellanox/mlxsw/spectrum_acl_atcam.c | 8 +++----- + .../ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 15 ++++++--------- + .../net/ethernet/mellanox/mlxsw/spectrum_cnt.c | 9 +++------ + .../ethernet/mellanox/mlxsw/spectrum_switchdev.c | 11 ++++------- + 4 files changed, 16 insertions(+), 27 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c +index ded4cf658680..4b713832fdd5 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_atcam.c +@@ -119,7 +119,6 @@ mlxsw_sp_acl_atcam_region_12kb_init(struct mlxsw_sp_acl_atcam_region *aregion) + { + struct mlxsw_sp *mlxsw_sp = aregion->region->mlxsw_sp; + struct mlxsw_sp_acl_atcam_region_12kb *region_12kb; +- size_t alloc_size; + u64 max_lkey_id; + int err; + +@@ -131,8 +130,7 @@ mlxsw_sp_acl_atcam_region_12kb_init(struct mlxsw_sp_acl_atcam_region *aregion) + if (!region_12kb) + return -ENOMEM; + +- alloc_size = BITS_TO_LONGS(max_lkey_id) * sizeof(unsigned long); +- region_12kb->used_lkey_id = kzalloc(alloc_size, GFP_KERNEL); ++ region_12kb->used_lkey_id = bitmap_zalloc(max_lkey_id, GFP_KERNEL); + if (!region_12kb->used_lkey_id) { + err = -ENOMEM; + goto err_used_lkey_id_alloc; +@@ -149,7 +147,7 @@ mlxsw_sp_acl_atcam_region_12kb_init(struct mlxsw_sp_acl_atcam_region *aregion) + return 0; + + err_rhashtable_init: +- kfree(region_12kb->used_lkey_id); ++ bitmap_free(region_12kb->used_lkey_id); + err_used_lkey_id_alloc: + kfree(region_12kb); + return err; +@@ -161,7 +159,7 @@ mlxsw_sp_acl_atcam_region_12kb_fini(struct mlxsw_sp_acl_atcam_region *aregion) + struct mlxsw_sp_acl_atcam_region_12kb *region_12kb = aregion->priv; + + rhashtable_destroy(®ion_12kb->lkey_ht); +- kfree(region_12kb->used_lkey_id); ++ bitmap_free(region_12kb->used_lkey_id); + kfree(region_12kb); + } + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +index 7cccc41dd69c..31f7f4c3acc3 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +@@ -36,7 +36,6 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, + u64 max_tcam_regions; + u64 max_regions; + u64 max_groups; +- size_t alloc_size; + int err; + + mutex_init(&tcam->lock); +@@ -52,15 +51,13 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, + if (max_tcam_regions < max_regions) + max_regions = max_tcam_regions; + +- alloc_size = sizeof(tcam->used_regions[0]) * BITS_TO_LONGS(max_regions); +- tcam->used_regions = kzalloc(alloc_size, GFP_KERNEL); ++ tcam->used_regions = bitmap_zalloc(max_regions, GFP_KERNEL); + if (!tcam->used_regions) + return -ENOMEM; + tcam->max_regions = max_regions; + + max_groups = MLXSW_CORE_RES_GET(mlxsw_sp->core, ACL_MAX_GROUPS); +- alloc_size = sizeof(tcam->used_groups[0]) * BITS_TO_LONGS(max_groups); +- tcam->used_groups = kzalloc(alloc_size, GFP_KERNEL); ++ tcam->used_groups = bitmap_zalloc(max_groups, GFP_KERNEL); + if (!tcam->used_groups) { + err = -ENOMEM; + goto err_alloc_used_groups; +@@ -76,9 +73,9 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, + return 0; + + err_tcam_init: +- kfree(tcam->used_groups); ++ bitmap_free(tcam->used_groups); + err_alloc_used_groups: +- kfree(tcam->used_regions); ++ bitmap_free(tcam->used_regions); + return err; + } + +@@ -89,8 +86,8 @@ void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp, + + mutex_destroy(&tcam->lock); + ops->fini(mlxsw_sp, tcam->priv); +- kfree(tcam->used_groups); +- kfree(tcam->used_regions); ++ bitmap_free(tcam->used_groups); ++ bitmap_free(tcam->used_regions); + } + + int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp, +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_cnt.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_cnt.c +index b65b93a2b9bc..fc2257753b9b 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_cnt.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_cnt.c +@@ -122,7 +122,6 @@ int mlxsw_sp_counter_pool_init(struct mlxsw_sp *mlxsw_sp) + unsigned int sub_pools_count = ARRAY_SIZE(mlxsw_sp_counter_sub_pools); + struct devlink *devlink = priv_to_devlink(mlxsw_sp->core); + struct mlxsw_sp_counter_pool *pool; +- unsigned int map_size; + int err; + + pool = kzalloc(struct_size(pool, sub_pools, sub_pools_count), +@@ -143,9 +142,7 @@ int mlxsw_sp_counter_pool_init(struct mlxsw_sp *mlxsw_sp) + devlink_resource_occ_get_register(devlink, MLXSW_SP_RESOURCE_COUNTERS, + mlxsw_sp_counter_pool_occ_get, pool); + +- map_size = BITS_TO_LONGS(pool->pool_size) * sizeof(unsigned long); +- +- pool->usage = kzalloc(map_size, GFP_KERNEL); ++ pool->usage = bitmap_zalloc(pool->pool_size, GFP_KERNEL); + if (!pool->usage) { + err = -ENOMEM; + goto err_usage_alloc; +@@ -158,7 +155,7 @@ int mlxsw_sp_counter_pool_init(struct mlxsw_sp *mlxsw_sp) + return 0; + + err_sub_pools_init: +- kfree(pool->usage); ++ bitmap_free(pool->usage); + err_usage_alloc: + devlink_resource_occ_get_unregister(devlink, + MLXSW_SP_RESOURCE_COUNTERS); +@@ -176,7 +173,7 @@ void mlxsw_sp_counter_pool_fini(struct mlxsw_sp *mlxsw_sp) + WARN_ON(find_first_bit(pool->usage, pool->pool_size) != + pool->pool_size); + WARN_ON(atomic_read(&pool->active_entries_count)); +- kfree(pool->usage); ++ bitmap_free(pool->usage); + devlink_resource_occ_get_unregister(devlink, + MLXSW_SP_RESOURCE_COUNTERS); + kfree(pool); +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +index 368fa0e5ad31..ea37f5000caa 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_switchdev.c +@@ -1631,16 +1631,13 @@ mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp, + u16 fid) + { + struct mlxsw_sp_mid *mid; +- size_t alloc_size; + + mid = kzalloc(sizeof(*mid), GFP_KERNEL); + if (!mid) + return NULL; + +- alloc_size = sizeof(unsigned long) * +- BITS_TO_LONGS(mlxsw_core_max_ports(mlxsw_sp->core)); +- +- mid->ports_in_mid = kzalloc(alloc_size, GFP_KERNEL); ++ mid->ports_in_mid = bitmap_zalloc(mlxsw_core_max_ports(mlxsw_sp->core), ++ GFP_KERNEL); + if (!mid->ports_in_mid) + goto err_ports_in_mid_alloc; + +@@ -1659,7 +1656,7 @@ mlxsw_sp_mid *__mlxsw_sp_mc_alloc(struct mlxsw_sp *mlxsw_sp, + return mid; + + err_write_mdb_entry: +- kfree(mid->ports_in_mid); ++ bitmap_free(mid->ports_in_mid); + err_ports_in_mid_alloc: + kfree(mid); + return NULL; +@@ -1676,7 +1673,7 @@ static int mlxsw_sp_port_remove_from_mid(struct mlxsw_sp_port *mlxsw_sp_port, + mlxsw_core_max_ports(mlxsw_sp->core))) { + err = mlxsw_sp_mc_remove_mdb_entry(mlxsw_sp, mid); + list_del(&mid->list); +- kfree(mid->ports_in_mid); ++ bitmap_free(mid->ports_in_mid); + kfree(mid); + } + return err; +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl_erp-fix-error-flow-of-pool-alloca.patch b/queue-5.10/mlxsw-spectrum_acl_erp-fix-error-flow-of-pool-alloca.patch new file mode 100644 index 00000000000..00d8a75277f --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl_erp-fix-error-flow-of-pool-alloca.patch @@ -0,0 +1,185 @@ +From a50244999b7a8902ef940e41dbd277bb78776b6f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Jan 2024 16:04:16 +0100 +Subject: mlxsw: spectrum_acl_erp: Fix error flow of pool allocation failure + +From: Amit Cohen + +[ Upstream commit 6d6eeabcfaba2fcadf5443b575789ea606f9de83 ] + +Lately, a bug was found when many TC filters are added - at some point, +several bugs are printed to dmesg [1] and the switch is crashed with +segmentation fault. + +The issue starts when gen_pool_free() fails because of unexpected +behavior - a try to free memory which is already freed, this leads to BUG() +call which crashes the switch and makes many other bugs. + +Trying to track down the unexpected behavior led to a bug in eRP code. The +function mlxsw_sp_acl_erp_table_alloc() gets a pointer to the allocated +index, sets the value and returns an error code. When gen_pool_alloc() +fails it returns address 0, we track it and return -ENOBUFS outside, BUT +the call for gen_pool_alloc() already override the index in erp_table +structure. This is a problem when such allocation is done as part of +table expansion. This is not a new table, which will not be used in case +of allocation failure. We try to expand eRP table and override the +current index (non-zero) with zero. Then, it leads to an unexpected +behavior when address 0 is freed twice. Note that address 0 is valid in +erp_table->base_index and indeed other tables use it. + +gen_pool_alloc() fails in case that there is no space left in the +pre-allocated pool, in our case, the pool is limited to +ACL_MAX_ERPT_BANK_SIZE, which is read from hardware. When more than max +erp entries are required, we exceed the limit and return an error, this +error leads to "Failed to migrate vregion" print. + +Fix this by changing erp_table->base_index only in case of a successful +allocation. + +Add a test case for such a scenario. Without this fix it causes +segmentation fault: + +$ TESTS="max_erp_entries_test" ./tc_flower.sh +./tc_flower.sh: line 988: 1560 Segmentation fault tc filter del dev $h2 ingress chain $i protocol ip pref $i handle $j flower &>/dev/null + +[1]: +kernel BUG at lib/genalloc.c:508! +invalid opcode: 0000 [#1] PREEMPT SMP +CPU: 6 PID: 3531 Comm: tc Not tainted 6.7.0-rc5-custom-ga6893f479f5e #1 +Hardware name: Mellanox Technologies Ltd. MSN4700/VMOD0010, BIOS 5.11 07/12/2021 +RIP: 0010:gen_pool_free_owner+0xc9/0xe0 +... +Call Trace: + + __mlxsw_sp_acl_erp_table_other_dec+0x70/0xa0 [mlxsw_spectrum] + mlxsw_sp_acl_erp_mask_destroy+0xf5/0x110 [mlxsw_spectrum] + objagg_obj_root_destroy+0x18/0x80 [objagg] + objagg_obj_destroy+0x12c/0x130 [objagg] + mlxsw_sp_acl_erp_mask_put+0x37/0x50 [mlxsw_spectrum] + mlxsw_sp_acl_ctcam_region_entry_remove+0x74/0xa0 [mlxsw_spectrum] + mlxsw_sp_acl_ctcam_entry_del+0x1e/0x40 [mlxsw_spectrum] + mlxsw_sp_acl_tcam_ventry_del+0x78/0xd0 [mlxsw_spectrum] + mlxsw_sp_flower_destroy+0x4d/0x70 [mlxsw_spectrum] + mlxsw_sp_flow_block_cb+0x73/0xb0 [mlxsw_spectrum] + tc_setup_cb_destroy+0xc1/0x180 + fl_hw_destroy_filter+0x94/0xc0 [cls_flower] + __fl_delete+0x1ac/0x1c0 [cls_flower] + fl_destroy+0xc2/0x150 [cls_flower] + tcf_proto_destroy+0x1a/0xa0 +... +mlxsw_spectrum3 0000:07:00.0: Failed to migrate vregion +mlxsw_spectrum3 0000:07:00.0: Failed to migrate vregion + +Fixes: f465261aa105 ("mlxsw: spectrum_acl: Implement common eRP core") +Signed-off-by: Amit Cohen +Signed-off-by: Ido Schimmel +Signed-off-by: Petr Machata +Acked-by: Paolo Abeni +Link: https://lore.kernel.org/r/4cfca254dfc0e5d283974801a24371c7b6db5989.1705502064.git.petrm@nvidia.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + .../mellanox/mlxsw/spectrum_acl_erp.c | 8 +-- + .../drivers/net/mlxsw/spectrum-2/tc_flower.sh | 52 ++++++++++++++++++- + 2 files changed, 56 insertions(+), 4 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +index 4c98950380d5..d231f4d2888b 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_erp.c +@@ -301,6 +301,7 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core, + unsigned long *p_index) + { + unsigned int num_rows, entry_size; ++ unsigned long index; + + /* We only allow allocations of entire rows */ + if (num_erps % erp_core->num_erp_banks != 0) +@@ -309,10 +310,11 @@ mlxsw_sp_acl_erp_table_alloc(struct mlxsw_sp_acl_erp_core *erp_core, + entry_size = erp_core->erpt_entries_size[region_type]; + num_rows = num_erps / erp_core->num_erp_banks; + +- *p_index = gen_pool_alloc(erp_core->erp_tables, num_rows * entry_size); +- if (*p_index == 0) ++ index = gen_pool_alloc(erp_core->erp_tables, num_rows * entry_size); ++ if (!index) + return -ENOBUFS; +- *p_index -= MLXSW_SP_ACL_ERP_GENALLOC_OFFSET; ++ ++ *p_index = index - MLXSW_SP_ACL_ERP_GENALLOC_OFFSET; + + return 0; + } +diff --git a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +index fb850e0ec837..7bf56ea161e3 100755 +--- a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh ++++ b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +@@ -10,7 +10,8 @@ lib_dir=$(dirname $0)/../../../../net/forwarding + ALL_TESTS="single_mask_test identical_filters_test two_masks_test \ + multiple_masks_test ctcam_edge_cases_test delta_simple_test \ + delta_two_masks_one_key_test delta_simple_rehash_test \ +- bloom_simple_test bloom_complex_test bloom_delta_test" ++ bloom_simple_test bloom_complex_test bloom_delta_test \ ++ max_erp_entries_test" + NUM_NETIFS=2 + source $lib_dir/lib.sh + source $lib_dir/tc_common.sh +@@ -983,6 +984,55 @@ bloom_delta_test() + log_test "bloom delta test ($tcflags)" + } + ++max_erp_entries_test() ++{ ++ # The number of eRP entries is limited. Once the maximum number of eRPs ++ # has been reached, filters cannot be added. This test verifies that ++ # when this limit is reached, inserstion fails without crashing. ++ ++ RET=0 ++ ++ local num_masks=32 ++ local num_regions=15 ++ local chain_failed ++ local mask_failed ++ local ret ++ ++ if [[ "$tcflags" != "skip_sw" ]]; then ++ return 0; ++ fi ++ ++ for ((i=1; i < $num_regions; i++)); do ++ for ((j=$num_masks; j >= 0; j--)); do ++ tc filter add dev $h2 ingress chain $i protocol ip \ ++ pref $i handle $j flower $tcflags \ ++ dst_ip 192.1.0.0/$j &> /dev/null ++ ret=$? ++ ++ if [ $ret -ne 0 ]; then ++ chain_failed=$i ++ mask_failed=$j ++ break 2 ++ fi ++ done ++ done ++ ++ # We expect to exceed the maximum number of eRP entries, so that ++ # insertion eventually fails. Otherwise, the test should be adjusted to ++ # add more filters. ++ check_fail $ret "expected to exceed number of eRP entries" ++ ++ for ((; i >= 1; i--)); do ++ for ((j=0; j <= $num_masks; j++)); do ++ tc filter del dev $h2 ingress chain $i protocol ip \ ++ pref $i handle $j flower &> /dev/null ++ done ++ done ++ ++ log_test "max eRP entries test ($tcflags). " \ ++ "max chain $chain_failed, mask $mask_failed" ++} ++ + setup_prepare() + { + h1=${NETIFS[p1]} +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl_tcam-add-missing-mutex_destroy.patch b/queue-5.10/mlxsw-spectrum_acl_tcam-add-missing-mutex_destroy.patch new file mode 100644 index 00000000000..5eb0db405a7 --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl_tcam-add-missing-mutex_destroy.patch @@ -0,0 +1,52 @@ +From c02a2a71dbd0e32f41244dbc5ee738b325791333 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Feb 2023 16:39:19 +0100 +Subject: mlxsw: spectrum_acl_tcam: Add missing mutex_destroy() + +From: Ido Schimmel + +[ Upstream commit 65823e07b1e4055b6278725fd92f4d7e6f8d53fd ] + +Pair mutex_init() with a mutex_destroy() in the error path. Found during +code review. No functional changes. + +Signed-off-by: Ido Schimmel +Reviewed-by: Jiri Pirko +Signed-off-by: Petr Machata +Reviewed-by: Jacob Keller +Signed-off-by: Jakub Kicinski +Stable-dep-of: 483ae90d8f97 ("mlxsw: spectrum_acl_tcam: Fix stack corruption") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 8 ++++++-- + 1 file changed, 6 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +index 31f7f4c3acc3..c8d9f523242e 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +@@ -52,8 +52,10 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, + max_regions = max_tcam_regions; + + tcam->used_regions = bitmap_zalloc(max_regions, GFP_KERNEL); +- if (!tcam->used_regions) +- return -ENOMEM; ++ if (!tcam->used_regions) { ++ err = -ENOMEM; ++ goto err_alloc_used_regions; ++ } + tcam->max_regions = max_regions; + + max_groups = MLXSW_CORE_RES_GET(mlxsw_sp->core, ACL_MAX_GROUPS); +@@ -76,6 +78,8 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, + bitmap_free(tcam->used_groups); + err_alloc_used_groups: + bitmap_free(tcam->used_regions); ++err_alloc_used_regions: ++ mutex_destroy(&tcam->lock); + return err; + } + +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl_tcam-fix-stack-corruption.patch b/queue-5.10/mlxsw-spectrum_acl_tcam-fix-stack-corruption.patch new file mode 100644 index 00000000000..c3c88c8618d --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl_tcam-fix-stack-corruption.patch @@ -0,0 +1,162 @@ +From b7e0f6f3b5040eb074a72d6417c28a6bbdd860b5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Jan 2024 16:04:18 +0100 +Subject: mlxsw: spectrum_acl_tcam: Fix stack corruption + +From: Ido Schimmel + +[ Upstream commit 483ae90d8f976f8339cf81066312e1329f2d3706 ] + +When tc filters are first added to a net device, the corresponding local +port gets bound to an ACL group in the device. The group contains a list +of ACLs. In turn, each ACL points to a different TCAM region where the +filters are stored. During forwarding, the ACLs are sequentially +evaluated until a match is found. + +One reason to place filters in different regions is when they are added +with decreasing priorities and in an alternating order so that two +consecutive filters can never fit in the same region because of their +key usage. + +In Spectrum-2 and newer ASICs the firmware started to report that the +maximum number of ACLs in a group is more than 16, but the layout of the +register that configures ACL groups (PAGT) was not updated to account +for that. It is therefore possible to hit stack corruption [1] in the +rare case where more than 16 ACLs in a group are required. + +Fix by limiting the maximum ACL group size to the minimum between what +the firmware reports and the maximum ACLs that fit in the PAGT register. + +Add a test case to make sure the machine does not crash when this +condition is hit. + +[1] +Kernel panic - not syncing: stack-protector: Kernel stack is corrupted in: mlxsw_sp_acl_tcam_group_update+0x116/0x120 +[...] + dump_stack_lvl+0x36/0x50 + panic+0x305/0x330 + __stack_chk_fail+0x15/0x20 + mlxsw_sp_acl_tcam_group_update+0x116/0x120 + mlxsw_sp_acl_tcam_group_region_attach+0x69/0x110 + mlxsw_sp_acl_tcam_vchunk_get+0x492/0xa20 + mlxsw_sp_acl_tcam_ventry_add+0x25/0xe0 + mlxsw_sp_acl_rule_add+0x47/0x240 + mlxsw_sp_flower_replace+0x1a9/0x1d0 + tc_setup_cb_add+0xdc/0x1c0 + fl_hw_replace_filter+0x146/0x1f0 + fl_change+0xc17/0x1360 + tc_new_tfilter+0x472/0xb90 + rtnetlink_rcv_msg+0x313/0x3b0 + netlink_rcv_skb+0x58/0x100 + netlink_unicast+0x244/0x390 + netlink_sendmsg+0x1e4/0x440 + ____sys_sendmsg+0x164/0x260 + ___sys_sendmsg+0x9a/0xe0 + __sys_sendmsg+0x7a/0xc0 + do_syscall_64+0x40/0xe0 + entry_SYSCALL_64_after_hwframe+0x63/0x6b + +Fixes: c3ab435466d5 ("mlxsw: spectrum: Extend to support Spectrum-2 ASIC") +Reported-by: Orel Hagag +Signed-off-by: Ido Schimmel +Reviewed-by: Amit Cohen +Signed-off-by: Petr Machata +Acked-by: Paolo Abeni +Link: https://lore.kernel.org/r/2d91c89afba59c22587b444994ae419dbea8d876.1705502064.git.petrm@nvidia.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + .../mellanox/mlxsw/spectrum_acl_tcam.c | 2 + + .../drivers/net/mlxsw/spectrum-2/tc_flower.sh | 56 ++++++++++++++++++- + 2 files changed, 57 insertions(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +index ab897b8be39f..483c8b75bebb 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +@@ -1519,6 +1519,8 @@ int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, + tcam->max_groups = max_groups; + tcam->max_group_size = MLXSW_CORE_RES_GET(mlxsw_sp->core, + ACL_MAX_GROUP_SIZE); ++ tcam->max_group_size = min_t(unsigned int, tcam->max_group_size, ++ MLXSW_REG_PAGT_ACL_MAX_NUM); + + err = ops->init(mlxsw_sp, tcam->priv, tcam); + if (err) +diff --git a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +index 7bf56ea161e3..616d3581419c 100755 +--- a/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh ++++ b/tools/testing/selftests/drivers/net/mlxsw/spectrum-2/tc_flower.sh +@@ -11,7 +11,7 @@ ALL_TESTS="single_mask_test identical_filters_test two_masks_test \ + multiple_masks_test ctcam_edge_cases_test delta_simple_test \ + delta_two_masks_one_key_test delta_simple_rehash_test \ + bloom_simple_test bloom_complex_test bloom_delta_test \ +- max_erp_entries_test" ++ max_erp_entries_test max_group_size_test" + NUM_NETIFS=2 + source $lib_dir/lib.sh + source $lib_dir/tc_common.sh +@@ -1033,6 +1033,60 @@ max_erp_entries_test() + "max chain $chain_failed, mask $mask_failed" + } + ++max_group_size_test() ++{ ++ # The number of ACLs in an ACL group is limited. Once the maximum ++ # number of ACLs has been reached, filters cannot be added. This test ++ # verifies that when this limit is reached, insertion fails without ++ # crashing. ++ ++ RET=0 ++ ++ local num_acls=32 ++ local max_size ++ local ret ++ ++ if [[ "$tcflags" != "skip_sw" ]]; then ++ return 0; ++ fi ++ ++ for ((i=1; i < $num_acls; i++)); do ++ if [[ $(( i % 2 )) == 1 ]]; then ++ tc filter add dev $h2 ingress pref $i proto ipv4 \ ++ flower $tcflags dst_ip 198.51.100.1/32 \ ++ ip_proto tcp tcp_flags 0x01/0x01 \ ++ action drop &> /dev/null ++ else ++ tc filter add dev $h2 ingress pref $i proto ipv6 \ ++ flower $tcflags dst_ip 2001:db8:1::1/128 \ ++ action drop &> /dev/null ++ fi ++ ++ ret=$? ++ [[ $ret -ne 0 ]] && max_size=$((i - 1)) && break ++ done ++ ++ # We expect to exceed the maximum number of ACLs in a group, so that ++ # insertion eventually fails. Otherwise, the test should be adjusted to ++ # add more filters. ++ check_fail $ret "expected to exceed number of ACLs in a group" ++ ++ for ((; i >= 1; i--)); do ++ if [[ $(( i % 2 )) == 1 ]]; then ++ tc filter del dev $h2 ingress pref $i proto ipv4 \ ++ flower $tcflags dst_ip 198.51.100.1/32 \ ++ ip_proto tcp tcp_flags 0x01/0x01 \ ++ action drop &> /dev/null ++ else ++ tc filter del dev $h2 ingress pref $i proto ipv6 \ ++ flower $tcflags dst_ip 2001:db8:1::1/128 \ ++ action drop &> /dev/null ++ fi ++ done ++ ++ log_test "max ACL group size test ($tcflags). max size $max_size" ++} ++ + setup_prepare() + { + h1=${NETIFS[p1]} +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl_tcam-make-fini-symmetric-to-init.patch b/queue-5.10/mlxsw-spectrum_acl_tcam-make-fini-symmetric-to-init.patch new file mode 100644 index 00000000000..46f6d33d4c1 --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl_tcam-make-fini-symmetric-to-init.patch @@ -0,0 +1,42 @@ +From 9334eba293681ee2bba387a319a3315727840ad2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Feb 2023 16:39:20 +0100 +Subject: mlxsw: spectrum_acl_tcam: Make fini symmetric to init + +From: Ido Schimmel + +[ Upstream commit 61fe3b9102ac84ba479ab84d8f5454af2e21e468 ] + +Move mutex_destroy() to the end to make the function symmetric with +mlxsw_sp_acl_tcam_init(). No functional changes. + +Signed-off-by: Ido Schimmel +Reviewed-by: Jiri Pirko +Signed-off-by: Petr Machata +Reviewed-by: Jacob Keller +Signed-off-by: Jakub Kicinski +Stable-dep-of: 483ae90d8f97 ("mlxsw: spectrum_acl_tcam: Fix stack corruption") +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +index c8d9f523242e..08d91bfa7b39 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +@@ -88,10 +88,10 @@ void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp, + { + const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; + +- mutex_destroy(&tcam->lock); + ops->fini(mlxsw_sp, tcam->priv); + bitmap_free(tcam->used_groups); + bitmap_free(tcam->used_regions); ++ mutex_destroy(&tcam->lock); + } + + int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp, +-- +2.43.0 + diff --git a/queue-5.10/mlxsw-spectrum_acl_tcam-reorder-functions-to-avoid-f.patch b/queue-5.10/mlxsw-spectrum_acl_tcam-reorder-functions-to-avoid-f.patch new file mode 100644 index 00000000000..45409c4d5fd --- /dev/null +++ b/queue-5.10/mlxsw-spectrum_acl_tcam-reorder-functions-to-avoid-f.patch @@ -0,0 +1,176 @@ +From 4d56fa82f932f3b0df194f40a91bdb75fb2ad616 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Feb 2023 16:39:21 +0100 +Subject: mlxsw: spectrum_acl_tcam: Reorder functions to avoid forward + declarations + +From: Ido Schimmel + +[ Upstream commit 194ab9476089bbfc021073214e071a404e375ee6 ] + +Move the initialization and de-initialization code further below in +order to avoid forward declarations in the next patch. No functional +changes. + +Signed-off-by: Ido Schimmel +Reviewed-by: Jiri Pirko +Signed-off-by: Petr Machata +Reviewed-by: Jacob Keller +Signed-off-by: Jakub Kicinski +Stable-dep-of: 483ae90d8f97 ("mlxsw: spectrum_acl_tcam: Fix stack corruption") +Signed-off-by: Sasha Levin +--- + .../mellanox/mlxsw/spectrum_acl_tcam.c | 130 +++++++++--------- + 1 file changed, 65 insertions(+), 65 deletions(-) + +diff --git a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +index 08d91bfa7b39..ab897b8be39f 100644 +--- a/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c ++++ b/drivers/net/ethernet/mellanox/mlxsw/spectrum_acl_tcam.c +@@ -29,71 +29,6 @@ size_t mlxsw_sp_acl_tcam_priv_size(struct mlxsw_sp *mlxsw_sp) + #define MLXSW_SP_ACL_TCAM_VREGION_REHASH_INTRVL_MIN 3000 /* ms */ + #define MLXSW_SP_ACL_TCAM_VREGION_REHASH_CREDITS 100 /* number of entries */ + +-int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, +- struct mlxsw_sp_acl_tcam *tcam) +-{ +- const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; +- u64 max_tcam_regions; +- u64 max_regions; +- u64 max_groups; +- int err; +- +- mutex_init(&tcam->lock); +- tcam->vregion_rehash_intrvl = +- MLXSW_SP_ACL_TCAM_VREGION_REHASH_INTRVL_DFLT; +- INIT_LIST_HEAD(&tcam->vregion_list); +- +- max_tcam_regions = MLXSW_CORE_RES_GET(mlxsw_sp->core, +- ACL_MAX_TCAM_REGIONS); +- max_regions = MLXSW_CORE_RES_GET(mlxsw_sp->core, ACL_MAX_REGIONS); +- +- /* Use 1:1 mapping between ACL region and TCAM region */ +- if (max_tcam_regions < max_regions) +- max_regions = max_tcam_regions; +- +- tcam->used_regions = bitmap_zalloc(max_regions, GFP_KERNEL); +- if (!tcam->used_regions) { +- err = -ENOMEM; +- goto err_alloc_used_regions; +- } +- tcam->max_regions = max_regions; +- +- max_groups = MLXSW_CORE_RES_GET(mlxsw_sp->core, ACL_MAX_GROUPS); +- tcam->used_groups = bitmap_zalloc(max_groups, GFP_KERNEL); +- if (!tcam->used_groups) { +- err = -ENOMEM; +- goto err_alloc_used_groups; +- } +- tcam->max_groups = max_groups; +- tcam->max_group_size = MLXSW_CORE_RES_GET(mlxsw_sp->core, +- ACL_MAX_GROUP_SIZE); +- +- err = ops->init(mlxsw_sp, tcam->priv, tcam); +- if (err) +- goto err_tcam_init; +- +- return 0; +- +-err_tcam_init: +- bitmap_free(tcam->used_groups); +-err_alloc_used_groups: +- bitmap_free(tcam->used_regions); +-err_alloc_used_regions: +- mutex_destroy(&tcam->lock); +- return err; +-} +- +-void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp, +- struct mlxsw_sp_acl_tcam *tcam) +-{ +- const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; +- +- ops->fini(mlxsw_sp, tcam->priv); +- bitmap_free(tcam->used_groups); +- bitmap_free(tcam->used_regions); +- mutex_destroy(&tcam->lock); +-} +- + int mlxsw_sp_acl_tcam_priority_get(struct mlxsw_sp *mlxsw_sp, + struct mlxsw_sp_acl_rule_info *rulei, + u32 *priority, bool fillup_priority) +@@ -1546,6 +1481,71 @@ mlxsw_sp_acl_tcam_vregion_rehash(struct mlxsw_sp *mlxsw_sp, + mlxsw_sp_acl_tcam_vregion_rehash_end(mlxsw_sp, vregion, ctx); + } + ++int mlxsw_sp_acl_tcam_init(struct mlxsw_sp *mlxsw_sp, ++ struct mlxsw_sp_acl_tcam *tcam) ++{ ++ const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; ++ u64 max_tcam_regions; ++ u64 max_regions; ++ u64 max_groups; ++ int err; ++ ++ mutex_init(&tcam->lock); ++ tcam->vregion_rehash_intrvl = ++ MLXSW_SP_ACL_TCAM_VREGION_REHASH_INTRVL_DFLT; ++ INIT_LIST_HEAD(&tcam->vregion_list); ++ ++ max_tcam_regions = MLXSW_CORE_RES_GET(mlxsw_sp->core, ++ ACL_MAX_TCAM_REGIONS); ++ max_regions = MLXSW_CORE_RES_GET(mlxsw_sp->core, ACL_MAX_REGIONS); ++ ++ /* Use 1:1 mapping between ACL region and TCAM region */ ++ if (max_tcam_regions < max_regions) ++ max_regions = max_tcam_regions; ++ ++ tcam->used_regions = bitmap_zalloc(max_regions, GFP_KERNEL); ++ if (!tcam->used_regions) { ++ err = -ENOMEM; ++ goto err_alloc_used_regions; ++ } ++ tcam->max_regions = max_regions; ++ ++ max_groups = MLXSW_CORE_RES_GET(mlxsw_sp->core, ACL_MAX_GROUPS); ++ tcam->used_groups = bitmap_zalloc(max_groups, GFP_KERNEL); ++ if (!tcam->used_groups) { ++ err = -ENOMEM; ++ goto err_alloc_used_groups; ++ } ++ tcam->max_groups = max_groups; ++ tcam->max_group_size = MLXSW_CORE_RES_GET(mlxsw_sp->core, ++ ACL_MAX_GROUP_SIZE); ++ ++ err = ops->init(mlxsw_sp, tcam->priv, tcam); ++ if (err) ++ goto err_tcam_init; ++ ++ return 0; ++ ++err_tcam_init: ++ bitmap_free(tcam->used_groups); ++err_alloc_used_groups: ++ bitmap_free(tcam->used_regions); ++err_alloc_used_regions: ++ mutex_destroy(&tcam->lock); ++ return err; ++} ++ ++void mlxsw_sp_acl_tcam_fini(struct mlxsw_sp *mlxsw_sp, ++ struct mlxsw_sp_acl_tcam *tcam) ++{ ++ const struct mlxsw_sp_acl_tcam_ops *ops = mlxsw_sp->acl_tcam_ops; ++ ++ ops->fini(mlxsw_sp, tcam->priv); ++ bitmap_free(tcam->used_groups); ++ bitmap_free(tcam->used_regions); ++ mutex_destroy(&tcam->lock); ++} ++ + static const enum mlxsw_afk_element mlxsw_sp_acl_tcam_pattern_ipv4[] = { + MLXSW_AFK_ELEMENT_SRC_SYS_PORT, + MLXSW_AFK_ELEMENT_DMAC_32_47, +-- +2.43.0 + diff --git a/queue-5.10/net-dsa-vsc73xx-add-null-pointer-check-to-vsc73xx_gp.patch b/queue-5.10/net-dsa-vsc73xx-add-null-pointer-check-to-vsc73xx_gp.patch new file mode 100644 index 00000000000..64d34d00781 --- /dev/null +++ b/queue-5.10/net-dsa-vsc73xx-add-null-pointer-check-to-vsc73xx_gp.patch @@ -0,0 +1,39 @@ +From 205900c07c37521705ced563e2467d0d0852e47d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 11 Jan 2024 15:20:18 +0800 +Subject: net: dsa: vsc73xx: Add null pointer check to vsc73xx_gpio_probe + +From: Kunwu Chan + +[ Upstream commit 776dac5a662774f07a876b650ba578d0a62d20db ] + +devm_kasprintf() returns a pointer to dynamically allocated memory +which can be NULL upon failure. + +Fixes: 05bd97fc559d ("net: dsa: Add Vitesse VSC73xx DSA router driver") +Signed-off-by: Kunwu Chan +Suggested-by: Jakub Kicinski +Reviewed-by: Simon Horman +Link: https://lore.kernel.org/r/20240111072018.75971-1-chentao@kylinos.cn +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/dsa/vitesse-vsc73xx-core.c | 2 ++ + 1 file changed, 2 insertions(+) + +diff --git a/drivers/net/dsa/vitesse-vsc73xx-core.c b/drivers/net/dsa/vitesse-vsc73xx-core.c +index 80eadf509c0a..018988b95035 100644 +--- a/drivers/net/dsa/vitesse-vsc73xx-core.c ++++ b/drivers/net/dsa/vitesse-vsc73xx-core.c +@@ -1119,6 +1119,8 @@ static int vsc73xx_gpio_probe(struct vsc73xx *vsc) + + vsc->gc.label = devm_kasprintf(vsc->dev, GFP_KERNEL, "VSC%04x", + vsc->chipid); ++ if (!vsc->gc.label) ++ return -ENOMEM; + vsc->gc.ngpio = 4; + vsc->gc.owner = THIS_MODULE; + vsc->gc.parent = vsc->dev; +-- +2.43.0 + diff --git a/queue-5.10/net-ethernet-ti-am65-cpsw-fix-max-mtu-to-fit-etherne.patch b/queue-5.10/net-ethernet-ti-am65-cpsw-fix-max-mtu-to-fit-etherne.patch new file mode 100644 index 00000000000..0263bfd9b6e --- /dev/null +++ b/queue-5.10/net-ethernet-ti-am65-cpsw-fix-max-mtu-to-fit-etherne.patch @@ -0,0 +1,63 @@ +From d992814c62d0965116e59f0a351af80519701d3b Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jan 2024 08:55:43 +0000 +Subject: net: ethernet: ti: am65-cpsw: Fix max mtu to fit ethernet frames +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Sanjuán García, Jorge + +[ Upstream commit 64e47d8afb5ca533b27efc006405e5bcae2c4a7b ] + +The value of AM65_CPSW_MAX_PACKET_SIZE represents the maximum length +of a received frame. This value is written to the register +AM65_CPSW_PORT_REG_RX_MAXLEN. + +The maximum MTU configured on the network device should then leave +some room for the ethernet headers and frame check. Otherwise, if +the network interface is configured to its maximum mtu possible, +the frames will be larger than AM65_CPSW_MAX_PACKET_SIZE and will +get dropped as oversized. + +The switch supports ethernet frame sizes between 64 and 2024 bytes +(including VLAN) as stated in the technical reference manual, so +define AM65_CPSW_MAX_PACKET_SIZE with that maximum size. + +Fixes: 93a76530316a ("net: ethernet: ti: introduce am65x/j721e gigabit eth subsystem driver") +Signed-off-by: Jorge Sanjuan Garcia +Reviewed-by: Horatiu Vultur +Reviewed-by: Siddharth Vadapalli +Link: https://lore.kernel.org/r/20240105085530.14070-2-jorge.sanjuangarcia@duagon.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/ti/am65-cpsw-nuss.c | 5 +++-- + 1 file changed, 3 insertions(+), 2 deletions(-) + +diff --git a/drivers/net/ethernet/ti/am65-cpsw-nuss.c b/drivers/net/ethernet/ti/am65-cpsw-nuss.c +index d10324431354..94e36deefe88 100644 +--- a/drivers/net/ethernet/ti/am65-cpsw-nuss.c ++++ b/drivers/net/ethernet/ti/am65-cpsw-nuss.c +@@ -51,7 +51,7 @@ + #define AM65_CPSW_MAX_PORTS 8 + + #define AM65_CPSW_MIN_PACKET_SIZE VLAN_ETH_ZLEN +-#define AM65_CPSW_MAX_PACKET_SIZE (VLAN_ETH_FRAME_LEN + ETH_FCS_LEN) ++#define AM65_CPSW_MAX_PACKET_SIZE 2024 + + #define AM65_CPSW_REG_CTL 0x004 + #define AM65_CPSW_REG_STAT_PORT_EN 0x014 +@@ -1853,7 +1853,8 @@ static int am65_cpsw_nuss_init_ndev_2g(struct am65_cpsw_common *common) + ether_addr_copy(port->ndev->dev_addr, port->slave.mac_addr); + + port->ndev->min_mtu = AM65_CPSW_MIN_PACKET_SIZE; +- port->ndev->max_mtu = AM65_CPSW_MAX_PACKET_SIZE; ++ port->ndev->max_mtu = AM65_CPSW_MAX_PACKET_SIZE - ++ (VLAN_ETH_HLEN + ETH_FCS_LEN); + port->ndev->hw_features = NETIF_F_SG | + NETIF_F_RXCSUM | + NETIF_F_HW_CSUM | +-- +2.43.0 + diff --git a/queue-5.10/net-phy-micrel-populate-.soft_reset-for-ksz9131.patch b/queue-5.10/net-phy-micrel-populate-.soft_reset-for-ksz9131.patch new file mode 100644 index 00000000000..63fa3bb1948 --- /dev/null +++ b/queue-5.10/net-phy-micrel-populate-.soft_reset-for-ksz9131.patch @@ -0,0 +1,100 @@ +From 6fc745f9eb66a4ed7198b35804c10b5a143d8f3e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jan 2024 10:52:42 +0200 +Subject: net: phy: micrel: populate .soft_reset for KSZ9131 + +From: Claudiu Beznea + +[ Upstream commit e398822c4751017fe401f57409488f5948d12fb5 ] + +The RZ/G3S SMARC Module has 2 KSZ9131 PHYs. In this setup, the KSZ9131 PHY +is used with the ravb Ethernet driver. It has been discovered that when +bringing the Ethernet interface down/up continuously, e.g., with the +following sh script: + +$ while :; do ifconfig eth0 down; ifconfig eth0 up; done + +the link speed and duplex are wrong after interrupting the bring down/up +operation even though the Ethernet interface is up. To recover from this +state the following configuration sequence is necessary (executed +manually): + +$ ifconfig eth0 down +$ ifconfig eth0 up + +The behavior has been identified also on the Microchip SAMA7G5-EK board +which runs the macb driver and uses the same PHY. + +The order of PHY-related operations in ravb_open() is as follows: +ravb_open() -> + ravb_phy_start() -> + ravb_phy_init() -> + of_phy_connect() -> + phy_connect_direct() -> + phy_attach_direct() -> + phy_init_hw() -> + phydev->drv->soft_reset() + phydev->drv->config_init() + phydev->drv->config_intr() + phy_resume() + kszphy_resume() + +The order of PHY-related operations in ravb_close is as follows: +ravb_close() -> + phy_stop() -> + phy_suspend() -> + kszphy_suspend() -> + genphy_suspend() + // set BMCR_PDOWN bit in MII_BMCR + +In genphy_suspend() setting the BMCR_PDWN bit in MII_BMCR switches the PHY +to Software Power-Down (SPD) mode (according to the KSZ9131 datasheet). +Thus, when opening the interface after it has been previously closed (via +ravb_close()), the phydev->drv->config_init() and +phydev->drv->config_intr() reach the KSZ9131 PHY driver via the +ksz9131_config_init() and kszphy_config_intr() functions. + +KSZ9131 specifies that the MII management interface remains operational +during SPD (Software Power-Down), but (according to manual): +- Only access to the standard registers (0 through 31) is supported. +- Access to MMD address spaces other than MMD address space 1 is possible + if the spd_clock_gate_override bit is set. +- Access to MMD address space 1 is not possible. + +The spd_clock_gate_override bit is not used in the KSZ9131 driver. + +ksz9131_config_init() configures RGMII delay, pad skews and LEDs by +accessesing MMD registers other than those in address space 1. + +The datasheet for the KSZ9131 does not specify what happens if registers +from an unsupported address space are accessed while the PHY is in SPD. + +To fix the issue the .soft_reset method has been instantiated for KSZ9131, +too. This resets the PHY to the default state before doing any +configurations to it, thus switching it out of SPD. + +Fixes: bff5b4b37372 ("net: phy: micrel: add Microchip KSZ9131 initial driver") +Signed-off-by: Claudiu Beznea +Reviewed-by: Maxime Chevallier +Reviewed-by: Andrew Lunn +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/phy/micrel.c | 1 + + 1 file changed, 1 insertion(+) + +diff --git a/drivers/net/phy/micrel.c b/drivers/net/phy/micrel.c +index bbbe198f83e8..2b7616f161d6 100644 +--- a/drivers/net/phy/micrel.c ++++ b/drivers/net/phy/micrel.c +@@ -1345,6 +1345,7 @@ static struct phy_driver ksphy_driver[] = { + /* PHY_GBIT_FEATURES */ + .driver_data = &ksz9021_type, + .probe = kszphy_probe, ++ .soft_reset = genphy_soft_reset, + .config_init = ksz9131_config_init, + .read_status = genphy_read_status, + .ack_interrupt = kszphy_ack_interrupt, +-- +2.43.0 + diff --git a/queue-5.10/net-qualcomm-rmnet-fix-global-oob-in-rmnet_policy.patch b/queue-5.10/net-qualcomm-rmnet-fix-global-oob-in-rmnet_policy.patch new file mode 100644 index 00000000000..8a11a475055 --- /dev/null +++ b/queue-5.10/net-qualcomm-rmnet-fix-global-oob-in-rmnet_policy.patch @@ -0,0 +1,105 @@ +From 1eb48a6b739d48ba982c64549f92bc887d6d3b9c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 10 Jan 2024 14:14:00 +0800 +Subject: net: qualcomm: rmnet: fix global oob in rmnet_policy + +From: Lin Ma + +[ Upstream commit b33fb5b801c6db408b774a68e7c8722796b59ecc ] + +The variable rmnet_link_ops assign a *bigger* maxtype which leads to a +global out-of-bounds read when parsing the netlink attributes. See bug +trace below: + +================================================================== +BUG: KASAN: global-out-of-bounds in validate_nla lib/nlattr.c:386 [inline] +BUG: KASAN: global-out-of-bounds in __nla_validate_parse+0x24af/0x2750 lib/nlattr.c:600 +Read of size 1 at addr ffffffff92c438d0 by task syz-executor.6/84207 + +CPU: 0 PID: 84207 Comm: syz-executor.6 Tainted: G N 6.1.0 #3 +Hardware name: QEMU Standard PC (i440FX + PIIX, 1996), BIOS 1.13.0-1ubuntu1.1 04/01/2014 +Call Trace: + + __dump_stack lib/dump_stack.c:88 [inline] + dump_stack_lvl+0x8b/0xb3 lib/dump_stack.c:106 + print_address_description mm/kasan/report.c:284 [inline] + print_report+0x172/0x475 mm/kasan/report.c:395 + kasan_report+0xbb/0x1c0 mm/kasan/report.c:495 + validate_nla lib/nlattr.c:386 [inline] + __nla_validate_parse+0x24af/0x2750 lib/nlattr.c:600 + __nla_parse+0x3e/0x50 lib/nlattr.c:697 + nla_parse_nested_deprecated include/net/netlink.h:1248 [inline] + __rtnl_newlink+0x50a/0x1880 net/core/rtnetlink.c:3485 + rtnl_newlink+0x64/0xa0 net/core/rtnetlink.c:3594 + rtnetlink_rcv_msg+0x43c/0xd70 net/core/rtnetlink.c:6091 + netlink_rcv_skb+0x14f/0x410 net/netlink/af_netlink.c:2540 + netlink_unicast_kernel net/netlink/af_netlink.c:1319 [inline] + netlink_unicast+0x54e/0x800 net/netlink/af_netlink.c:1345 + netlink_sendmsg+0x930/0xe50 net/netlink/af_netlink.c:1921 + sock_sendmsg_nosec net/socket.c:714 [inline] + sock_sendmsg+0x154/0x190 net/socket.c:734 + ____sys_sendmsg+0x6df/0x840 net/socket.c:2482 + ___sys_sendmsg+0x110/0x1b0 net/socket.c:2536 + __sys_sendmsg+0xf3/0x1c0 net/socket.c:2565 + do_syscall_x64 arch/x86/entry/common.c:50 [inline] + do_syscall_64+0x3b/0x90 arch/x86/entry/common.c:80 + entry_SYSCALL_64_after_hwframe+0x63/0xcd +RIP: 0033:0x7fdcf2072359 +Code: 28 00 00 00 75 05 48 83 c4 28 c3 e8 f1 19 00 00 90 48 89 f8 48 89 f7 48 89 d6 48 89 ca 4d 89 c2 4d 89 c8 4c 8b 4c 24 08 0f 05 <48> 3d 01 f0 ff ff 73 01 c3 48 c7 c1 b8 ff ff ff f7 d8 64 89 01 48 +RSP: 002b:00007fdcf13e3168 EFLAGS: 00000246 ORIG_RAX: 000000000000002e +RAX: ffffffffffffffda RBX: 00007fdcf219ff80 RCX: 00007fdcf2072359 +RDX: 0000000000000000 RSI: 0000000020000200 RDI: 0000000000000003 +RBP: 00007fdcf20bd493 R08: 0000000000000000 R09: 0000000000000000 +R10: 0000000000000000 R11: 0000000000000246 R12: 0000000000000000 +R13: 00007fffbb8d7bdf R14: 00007fdcf13e3300 R15: 0000000000022000 + + +The buggy address belongs to the variable: + rmnet_policy+0x30/0xe0 + +The buggy address belongs to the physical page: +page:0000000065bdeb3c refcount:1 mapcount:0 mapping:0000000000000000 index:0x0 pfn:0x155243 +flags: 0x200000000001000(reserved|node=0|zone=2) +raw: 0200000000001000 ffffea00055490c8 ffffea00055490c8 0000000000000000 +raw: 0000000000000000 0000000000000000 00000001ffffffff 0000000000000000 +page dumped because: kasan: bad access detected + +Memory state around the buggy address: + ffffffff92c43780: f9 f9 f9 f9 00 00 00 02 f9 f9 f9 f9 00 00 00 07 + ffffffff92c43800: f9 f9 f9 f9 00 00 00 05 f9 f9 f9 f9 06 f9 f9 f9 +>ffffffff92c43880: f9 f9 f9 f9 00 00 00 00 00 00 f9 f9 f9 f9 f9 f9 + ^ + ffffffff92c43900: 00 00 00 00 00 00 00 00 07 f9 f9 f9 f9 f9 f9 f9 + ffffffff92c43980: 00 00 00 07 f9 f9 f9 f9 00 00 00 05 f9 f9 f9 f9 + +According to the comment of `nla_parse_nested_deprecated`, the maxtype +should be len(destination array) - 1. Hence use `IFLA_RMNET_MAX` here. + +Fixes: 14452ca3b5ce ("net: qualcomm: rmnet: Export mux_id and flags to netlink") +Signed-off-by: Lin Ma +Reviewed-by: Subash Abhinov Kasiviswanathan +Reviewed-by: Simon Horman +Reviewed-by: Jiri Pirko +Link: https://lore.kernel.org/r/20240110061400.3356108-1-linma@zju.edu.cn +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +index 8d51b0cb545c..93fa10ad08a0 100644 +--- a/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c ++++ b/drivers/net/ethernet/qualcomm/rmnet/rmnet_config.c +@@ -389,7 +389,7 @@ static int rmnet_fill_info(struct sk_buff *skb, const struct net_device *dev) + + struct rtnl_link_ops rmnet_link_ops __read_mostly = { + .kind = "rmnet", +- .maxtype = __IFLA_RMNET_MAX, ++ .maxtype = IFLA_RMNET_MAX, + .priv_size = sizeof(struct rmnet_priv), + .setup = rmnet_vnd_setup, + .validate = rmnet_rtnl_validate, +-- +2.43.0 + diff --git a/queue-5.10/net-ravb-fix-dma_addr_t-truncation-in-error-case.patch b/queue-5.10/net-ravb-fix-dma_addr_t-truncation-in-error-case.patch new file mode 100644 index 00000000000..0cd52ede46a --- /dev/null +++ b/queue-5.10/net-ravb-fix-dma_addr_t-truncation-in-error-case.patch @@ -0,0 +1,53 @@ +From 71175866390414b7913cf28196be93e87dd0b17e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 13 Jan 2024 10:22:21 +0600 +Subject: net: ravb: Fix dma_addr_t truncation in error case +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Nikita Yushchenko + +[ Upstream commit e327b2372bc0f18c30433ac40be07741b59231c5 ] + +In ravb_start_xmit(), ravb driver uses u32 variable to store result of +dma_map_single() call. Since ravb hardware has 32-bit address fields in +descriptors, this works properly when mapping is successful - it is +platform's job to provide mapping addresses that fit into hardware +limitations. + +However, in failure case dma_map_single() returns DMA_MAPPING_ERROR +constant that is 64-bit when dma_addr_t is 64-bit. Storing this constant +in u32 leads to truncation, and further call to dma_mapping_error() +fails to notice the error. + +Fix that by storing result of dma_map_single() in a dma_addr_t +variable. + +Fixes: c156633f1353 ("Renesas Ethernet AVB driver proper") +Signed-off-by: Nikita Yushchenko +Reviewed-by: Niklas Söderlund +Reviewed-by: Sergey Shtylyov +Reviewed-by: Florian Fainelli +Signed-off-by: David S. Miller +Signed-off-by: Sasha Levin +--- + drivers/net/ethernet/renesas/ravb_main.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/net/ethernet/renesas/ravb_main.c b/drivers/net/ethernet/renesas/ravb_main.c +index f092f468016b..8a4dff0566f7 100644 +--- a/drivers/net/ethernet/renesas/ravb_main.c ++++ b/drivers/net/ethernet/renesas/ravb_main.c +@@ -1500,7 +1500,7 @@ static netdev_tx_t ravb_start_xmit(struct sk_buff *skb, struct net_device *ndev) + struct ravb_tstamp_skb *ts_skb; + struct ravb_tx_desc *desc; + unsigned long flags; +- u32 dma_addr; ++ dma_addr_t dma_addr; + void *buffer; + u32 entry; + u32 len; +-- +2.43.0 + diff --git a/queue-5.10/netfilter-nf_tables-do-not-allow-mismatch-field-size.patch b/queue-5.10/netfilter-nf_tables-do-not-allow-mismatch-field-size.patch new file mode 100644 index 00000000000..32d4dc4dabd --- /dev/null +++ b/queue-5.10/netfilter-nf_tables-do-not-allow-mismatch-field-size.patch @@ -0,0 +1,51 @@ +From 9e54cc1f06b84c1131521d9dd3fa1d4e8785af35 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 14 Jan 2024 23:53:39 +0100 +Subject: netfilter: nf_tables: do not allow mismatch field size and set key + length + +From: Pablo Neira Ayuso + +[ Upstream commit 3ce67e3793f48c1b9635beb9bb71116ca1e51b58 ] + +The set description provides the size of each field in the set whose sum +should not mismatch the set key length, bail out otherwise. + +I did not manage to crash nft_set_pipapo with mismatch fields and set key +length so far, but this is UB which must be disallowed. + +Fixes: f3a2181e16f1 ("netfilter: nf_tables: Support for sets with multiple ranged fields") +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_tables_api.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 6e91c743a4d4..009cb23bc972 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -4302,8 +4302,8 @@ static int nft_set_desc_concat_parse(const struct nlattr *attr, + static int nft_set_desc_concat(struct nft_set_desc *desc, + const struct nlattr *nla) + { ++ u32 num_regs = 0, key_num_regs = 0; + struct nlattr *attr; +- u32 num_regs = 0; + int rem, err, i; + + nla_for_each_nested(attr, nla, rem) { +@@ -4318,6 +4318,10 @@ static int nft_set_desc_concat(struct nft_set_desc *desc, + for (i = 0; i < desc->field_count; i++) + num_regs += DIV_ROUND_UP(desc->field_len[i], sizeof(u32)); + ++ key_num_regs = DIV_ROUND_UP(desc->klen, sizeof(u32)); ++ if (key_num_regs != num_regs) ++ return -EINVAL; ++ + if (num_regs > NFT_REG32_COUNT) + return -E2BIG; + +-- +2.43.0 + diff --git a/queue-5.10/netfilter-nf_tables-reject-nft_set_concat-with-not-f.patch b/queue-5.10/netfilter-nf_tables-reject-nft_set_concat-with-not-f.patch new file mode 100644 index 00000000000..3bab160ab0b --- /dev/null +++ b/queue-5.10/netfilter-nf_tables-reject-nft_set_concat-with-not-f.patch @@ -0,0 +1,41 @@ +From b381f601bc85764cd647012d56f796421f3a6a12 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jan 2024 12:50:29 +0100 +Subject: netfilter: nf_tables: reject NFT_SET_CONCAT with not field length + description + +From: Pablo Neira Ayuso + +[ Upstream commit 113661e07460a6604aacc8ae1b23695a89e7d4b3 ] + +It is still possible to set on the NFT_SET_CONCAT flag by specifying a +set size and no field description, report EINVAL in such case. + +Fixes: 1b6345d4160e ("netfilter: nf_tables: check NFT_SET_CONCAT flag if field_count is specified") +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_tables_api.c | 6 +++++- + 1 file changed, 5 insertions(+), 1 deletion(-) + +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 7a1a21cde760..fca8f9a36063 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -4466,8 +4466,12 @@ static int nf_tables_newset(struct net *net, struct sock *nlsk, + if (err < 0) + return err; + +- if (desc.field_count > 1 && !(flags & NFT_SET_CONCAT)) ++ if (desc.field_count > 1) { ++ if (!(flags & NFT_SET_CONCAT)) ++ return -EINVAL; ++ } else if (flags & NFT_SET_CONCAT) { + return -EINVAL; ++ } + } else if (flags & NFT_SET_CONCAT) { + return -EINVAL; + } +-- +2.43.0 + diff --git a/queue-5.10/netfilter-nf_tables-skip-dead-set-elements-in-netlin.patch b/queue-5.10/netfilter-nf_tables-skip-dead-set-elements-in-netlin.patch new file mode 100644 index 00000000000..ee159394bf4 --- /dev/null +++ b/queue-5.10/netfilter-nf_tables-skip-dead-set-elements-in-netlin.patch @@ -0,0 +1,47 @@ +From b98d0c331904ecb4e0bad9326dbd4bbe26127baa Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 15 Jan 2024 00:14:38 +0100 +Subject: netfilter: nf_tables: skip dead set elements in netlink dump + +From: Pablo Neira Ayuso + +[ Upstream commit 6b1ca88e4bb63673dc9f9c7f23c899f22c3cb17a ] + +Delete from packet path relies on the garbage collector to purge +elements with NFT_SET_ELEM_DEAD_BIT on. + +Skip these dead elements from nf_tables_dump_setelem() path, I very +rarely see tests/shell/testcases/maps/typeof_maps_add_delete reports +[DUMP FAILED] showing a mismatch in the expected output with an element +that should not be there. + +If the netlink dump happens before GC worker run, it might show dead +elements in the ruleset listing. + +nft_rhash_get() already skips dead elements in nft_rhash_cmp(), +therefore, it already does not show the element when getting a single +element via netlink control plane. + +Fixes: 5f68718b34a5 ("netfilter: nf_tables: GC transaction API to avoid race with control plane") +Signed-off-by: Pablo Neira Ayuso +Signed-off-by: Sasha Levin +--- + net/netfilter/nf_tables_api.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/net/netfilter/nf_tables_api.c b/net/netfilter/nf_tables_api.c +index 009cb23bc972..7a1a21cde760 100644 +--- a/net/netfilter/nf_tables_api.c ++++ b/net/netfilter/nf_tables_api.c +@@ -5011,7 +5011,7 @@ static int nf_tables_dump_setelem(const struct nft_ctx *ctx, + const struct nft_set_ext *ext = nft_set_elem_ext(set, elem->priv); + struct nft_set_dump_args *args; + +- if (nft_set_elem_expired(ext)) ++ if (nft_set_elem_expired(ext) || nft_set_elem_is_dead(ext)) + return 0; + + args = container_of(iter, struct nft_set_dump_args, iter); +-- +2.43.0 + diff --git a/queue-5.10/nvmet-tcp-fix-a-crash-in-nvmet_req_complete.patch b/queue-5.10/nvmet-tcp-fix-a-crash-in-nvmet_req_complete.patch new file mode 100644 index 00000000000..1542d6dd433 --- /dev/null +++ b/queue-5.10/nvmet-tcp-fix-a-crash-in-nvmet_req_complete.patch @@ -0,0 +1,45 @@ +From db2a8f4c3b5aaa117eb5bb768b61912c61894d95 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Dec 2023 16:17:49 +0100 +Subject: nvmet-tcp: fix a crash in nvmet_req_complete() + +From: Maurizio Lombardi + +[ Upstream commit 0849a5441358cef02586fb2d60f707c0db195628 ] + +in nvmet_tcp_handle_h2c_data_pdu(), if the host sends a data_offset +different from rbytes_done, the driver ends up calling nvmet_req_complete() +passing a status error. +The problem is that at this point cmd->req is not yet initialized, +the kernel will crash after dereferencing a NULL pointer. + +Fix the bug by replacing the call to nvmet_req_complete() with +nvmet_tcp_fatal_error(). + +Fixes: 872d26a391da ("nvmet-tcp: add NVMe over TCP target driver") +Reviewed-by: Keith Busch +Reviewed-by: Sagi Grimberg +Signed-off-by: Maurizio Lombardi +Signed-off-by: Keith Busch +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/tcp.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c +index 153150e8beb9..9ec8ed369eb7 100644 +--- a/drivers/nvme/target/tcp.c ++++ b/drivers/nvme/target/tcp.c +@@ -938,8 +938,7 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) + data->ttag, le32_to_cpu(data->data_offset), + cmd->rbytes_done); + /* FIXME: use path and transport errors */ +- nvmet_req_complete(&cmd->req, +- NVME_SC_INVALID_FIELD | NVME_SC_DNR); ++ nvmet_tcp_fatal_error(queue); + return -EPROTO; + } + +-- +2.43.0 + diff --git a/queue-5.10/nvmet-tcp-fix-a-kernel-panic-when-host-sends-an-inva.patch b/queue-5.10/nvmet-tcp-fix-a-kernel-panic-when-host-sends-an-inva.patch new file mode 100644 index 00000000000..b19bf97be88 --- /dev/null +++ b/queue-5.10/nvmet-tcp-fix-a-kernel-panic-when-host-sends-an-inva.patch @@ -0,0 +1,84 @@ +From 1a67f3962e830051a5d40e0d2253f72e8bab1348 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 22 Dec 2023 16:17:48 +0100 +Subject: nvmet-tcp: Fix a kernel panic when host sends an invalid H2C PDU + length + +From: Maurizio Lombardi + +[ Upstream commit efa56305908ba20de2104f1b8508c6a7401833be ] + +If the host sends an H2CData command with an invalid DATAL, +the kernel may crash in nvmet_tcp_build_pdu_iovec(). + +Unable to handle kernel NULL pointer dereference at +virtual address 0000000000000000 +lr : nvmet_tcp_io_work+0x6ac/0x718 [nvmet_tcp] +Call trace: + process_one_work+0x174/0x3c8 + worker_thread+0x2d0/0x3e8 + kthread+0x104/0x110 + +Fix the bug by raising a fatal error if DATAL isn't coherent +with the packet size. +Also, the PDU length should never exceed the MAXH2CDATA parameter which +has been communicated to the host in nvmet_tcp_handle_icreq(). + +Fixes: 872d26a391da ("nvmet-tcp: add NVMe over TCP target driver") +Signed-off-by: Maurizio Lombardi +Reviewed-by: Sagi Grimberg +Signed-off-by: Keith Busch +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/tcp.c | 13 ++++++++++++- + 1 file changed, 12 insertions(+), 1 deletion(-) + +diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c +index 7ce22d173fc7..153150e8beb9 100644 +--- a/drivers/nvme/target/tcp.c ++++ b/drivers/nvme/target/tcp.c +@@ -18,6 +18,7 @@ + #include "nvmet.h" + + #define NVMET_TCP_DEF_INLINE_DATA_SIZE (4 * PAGE_SIZE) ++#define NVMET_TCP_MAXH2CDATA 0x400000 /* 16M arbitrary limit */ + + /* Define the socket priority to use for connections were it is desirable + * that the NIC consider performing optimized packet processing or filtering. +@@ -872,7 +873,7 @@ static int nvmet_tcp_handle_icreq(struct nvmet_tcp_queue *queue) + icresp->hdr.pdo = 0; + icresp->hdr.plen = cpu_to_le32(icresp->hdr.hlen); + icresp->pfv = cpu_to_le16(NVME_TCP_PFV_1_0); +- icresp->maxdata = cpu_to_le32(0x400000); /* 16M arbitrary limit */ ++ icresp->maxdata = cpu_to_le32(NVMET_TCP_MAXH2CDATA); + icresp->cpda = 0; + if (queue->hdr_digest) + icresp->digest |= NVME_TCP_HDR_DIGEST_ENABLE; +@@ -918,6 +919,7 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) + { + struct nvme_tcp_data_pdu *data = &queue->pdu.data; + struct nvmet_tcp_cmd *cmd; ++ unsigned int plen; + + if (likely(queue->nr_cmds)) { + if (unlikely(data->ttag >= queue->nr_cmds)) { +@@ -941,7 +943,16 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) + return -EPROTO; + } + ++ plen = le32_to_cpu(data->hdr.plen); + cmd->pdu_len = le32_to_cpu(data->data_length); ++ if (unlikely(cmd->pdu_len != (plen - sizeof(*data)) || ++ cmd->pdu_len == 0 || ++ cmd->pdu_len > NVMET_TCP_MAXH2CDATA)) { ++ pr_err("H2CData PDU len %u is invalid\n", cmd->pdu_len); ++ /* FIXME: use proper transport errors */ ++ nvmet_tcp_fatal_error(queue); ++ return -EPROTO; ++ } + cmd->pdu_recv = 0; + nvmet_tcp_map_pdu_iovec(cmd); + queue->cmd = cmd; +-- +2.43.0 + diff --git a/queue-5.10/nvmet-tcp-fix-the-h2c-expected-pdu-len-calculation.patch b/queue-5.10/nvmet-tcp-fix-the-h2c-expected-pdu-len-calculation.patch new file mode 100644 index 00000000000..ece3a5d803c --- /dev/null +++ b/queue-5.10/nvmet-tcp-fix-the-h2c-expected-pdu-len-calculation.patch @@ -0,0 +1,55 @@ +From 458f9186d8fd9e284068df5581a1a4c0091a4ec7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 5 Jan 2024 09:14:44 +0100 +Subject: nvmet-tcp: Fix the H2C expected PDU len calculation + +From: Maurizio Lombardi + +[ Upstream commit 9a1abc24850eb759e36a2f8869161c3b7254c904 ] + +The nvmet_tcp_handle_h2c_data_pdu() function should take into +consideration the possibility that the header digest and/or the data +digests are enabled when calculating the expected PDU length, before +comparing it to the value stored in cmd->pdu_len. + +Fixes: efa56305908b ("nvmet-tcp: Fix a kernel panic when host sends an invalid H2C PDU length") +Signed-off-by: Maurizio Lombardi +Reviewed-by: Sagi Grimberg +Signed-off-by: Keith Busch +Signed-off-by: Sasha Levin +--- + drivers/nvme/target/tcp.c | 10 +++++++--- + 1 file changed, 7 insertions(+), 3 deletions(-) + +diff --git a/drivers/nvme/target/tcp.c b/drivers/nvme/target/tcp.c +index 9ec8ed369eb7..116ae6fd35e2 100644 +--- a/drivers/nvme/target/tcp.c ++++ b/drivers/nvme/target/tcp.c +@@ -919,7 +919,7 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) + { + struct nvme_tcp_data_pdu *data = &queue->pdu.data; + struct nvmet_tcp_cmd *cmd; +- unsigned int plen; ++ unsigned int exp_data_len; + + if (likely(queue->nr_cmds)) { + if (unlikely(data->ttag >= queue->nr_cmds)) { +@@ -942,9 +942,13 @@ static int nvmet_tcp_handle_h2c_data_pdu(struct nvmet_tcp_queue *queue) + return -EPROTO; + } + +- plen = le32_to_cpu(data->hdr.plen); ++ exp_data_len = le32_to_cpu(data->hdr.plen) - ++ nvmet_tcp_hdgst_len(queue) - ++ nvmet_tcp_ddgst_len(queue) - ++ sizeof(*data); ++ + cmd->pdu_len = le32_to_cpu(data->data_length); +- if (unlikely(cmd->pdu_len != (plen - sizeof(*data)) || ++ if (unlikely(cmd->pdu_len != exp_data_len || + cmd->pdu_len == 0 || + cmd->pdu_len > NVMET_TCP_MAXH2CDATA)) { + pr_err("H2CData PDU len %u is invalid\n", cmd->pdu_len); +-- +2.43.0 + diff --git a/queue-5.10/pci-keystone-fix-race-condition-when-initializing-ph.patch b/queue-5.10/pci-keystone-fix-race-condition-when-initializing-ph.patch new file mode 100644 index 00000000000..611bbe921a4 --- /dev/null +++ b/queue-5.10/pci-keystone-fix-race-condition-when-initializing-ph.patch @@ -0,0 +1,64 @@ +From 7f81c1c18429d9355741ed54c447bef81fd51222 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 27 Sep 2023 09:48:45 +0530 +Subject: PCI: keystone: Fix race condition when initializing PHYs +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Siddharth Vadapalli + +[ Upstream commit c12ca110c613a81cb0f0099019c839d078cd0f38 ] + +The PCI driver invokes the PHY APIs using the ks_pcie_enable_phy() +function. The PHY in this case is the Serdes. It is possible that the +PCI instance is configured for two lane operation across two different +Serdes instances, using one lane of each Serdes. + +In such a configuration, if the reference clock for one Serdes is +provided by the other Serdes, it results in a race condition. After the +Serdes providing the reference clock is initialized by the PCI driver by +invoking its PHY APIs, it is not guaranteed that this Serdes remains +powered on long enough for the PHY APIs based initialization of the +dependent Serdes. In such cases, the PLL of the dependent Serdes fails +to lock due to the absence of the reference clock from the former Serdes +which has been powered off by the PM Core. + +Fix this by obtaining reference to the PHYs before invoking the PHY +initialization APIs and releasing reference after the initialization is +complete. + +Link: https://lore.kernel.org/linux-pci/20230927041845.1222080-1-s-vadapalli@ti.com +Fixes: 49229238ab47 ("PCI: keystone: Cleanup PHY handling") +Signed-off-by: Siddharth Vadapalli +Signed-off-by: Krzysztof Wilczyński +Acked-by: Ravi Gunasekaran +Signed-off-by: Sasha Levin +--- + drivers/pci/controller/dwc/pci-keystone.c | 9 +++++++++ + 1 file changed, 9 insertions(+) + +diff --git a/drivers/pci/controller/dwc/pci-keystone.c b/drivers/pci/controller/dwc/pci-keystone.c +index afaea201a5af..d3c3ca3ef4ba 100644 +--- a/drivers/pci/controller/dwc/pci-keystone.c ++++ b/drivers/pci/controller/dwc/pci-keystone.c +@@ -1261,7 +1261,16 @@ static int ks_pcie_probe(struct platform_device *pdev) + goto err_link; + } + ++ /* Obtain references to the PHYs */ ++ for (i = 0; i < num_lanes; i++) ++ phy_pm_runtime_get_sync(ks_pcie->phy[i]); ++ + ret = ks_pcie_enable_phy(ks_pcie); ++ ++ /* Release references to the PHYs */ ++ for (i = 0; i < num_lanes; i++) ++ phy_pm_runtime_put_sync(ks_pcie->phy[i]); ++ + if (ret) { + dev_err(dev, "failed to enable phy\n"); + goto err_link; +-- +2.43.0 + diff --git a/queue-5.10/perf-env-avoid-recursively-taking-env-bpf_progs.lock.patch b/queue-5.10/perf-env-avoid-recursively-taking-env-bpf_progs.lock.patch new file mode 100644 index 00000000000..35142b7c1cb --- /dev/null +++ b/queue-5.10/perf-env-avoid-recursively-taking-env-bpf_progs.lock.patch @@ -0,0 +1,276 @@ +From 1362ac275757503e6614245428d7e3202b47e865 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 6 Dec 2023 17:46:55 -0800 +Subject: perf env: Avoid recursively taking env->bpf_progs.lock + +From: Ian Rogers + +[ Upstream commit 9c51f8788b5d4e9f46afbcf563255cfd355690b3 ] + +Add variants of perf_env__insert_bpf_prog_info(), perf_env__insert_btf() +and perf_env__find_btf prefixed with __ to indicate the +env->bpf_progs.lock is assumed held. + +Call these variants when the lock is held to avoid recursively taking it +and potentially having a thread deadlock with itself. + +Fixes: f8dfeae009effc0b ("perf bpf: Show more BPF program info in print_bpf_prog_info()") +Signed-off-by: Ian Rogers +Acked-by: Jiri Olsa +Acked-by: Song Liu +Cc: Adrian Hunter +Cc: Alexander Shishkin +Cc: Huacai Chen +Cc: Ingo Molnar +Cc: K Prateek Nayak +Cc: Kan Liang +Cc: Mark Rutland +Cc: Ming Wang +Cc: Namhyung Kim +Cc: Peter Zijlstra +Cc: Ravi Bangoria +Link: https://lore.kernel.org/r/20231207014655.1252484-1-irogers@google.com +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/bpf-event.c | 8 +++--- + tools/perf/util/bpf-event.h | 12 ++++----- + tools/perf/util/env.c | 50 ++++++++++++++++++++++++------------- + tools/perf/util/env.h | 4 +++ + tools/perf/util/header.c | 8 +++--- + 5 files changed, 50 insertions(+), 32 deletions(-) + +diff --git a/tools/perf/util/bpf-event.c b/tools/perf/util/bpf-event.c +index 4eb02762104b..c50d2c7a264f 100644 +--- a/tools/perf/util/bpf-event.c ++++ b/tools/perf/util/bpf-event.c +@@ -533,9 +533,9 @@ int evlist__add_bpf_sb_event(struct evlist *evlist, struct perf_env *env) + return perf_evlist__add_sb_event(evlist, &attr, bpf_event__sb_cb, env); + } + +-void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info, +- struct perf_env *env, +- FILE *fp) ++void __bpf_event__print_bpf_prog_info(struct bpf_prog_info *info, ++ struct perf_env *env, ++ FILE *fp) + { + __u32 *prog_lens = (__u32 *)(uintptr_t)(info->jited_func_lens); + __u64 *prog_addrs = (__u64 *)(uintptr_t)(info->jited_ksyms); +@@ -551,7 +551,7 @@ void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info, + if (info->btf_id) { + struct btf_node *node; + +- node = perf_env__find_btf(env, info->btf_id); ++ node = __perf_env__find_btf(env, info->btf_id); + if (node) + btf = btf__new((__u8 *)(node->data), + node->data_size); +diff --git a/tools/perf/util/bpf-event.h b/tools/perf/util/bpf-event.h +index 68f315c3df5b..50f7412464df 100644 +--- a/tools/perf/util/bpf-event.h ++++ b/tools/perf/util/bpf-event.h +@@ -34,9 +34,9 @@ struct btf_node { + int machine__process_bpf(struct machine *machine, union perf_event *event, + struct perf_sample *sample); + int evlist__add_bpf_sb_event(struct evlist *evlist, struct perf_env *env); +-void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info, +- struct perf_env *env, +- FILE *fp); ++void __bpf_event__print_bpf_prog_info(struct bpf_prog_info *info, ++ struct perf_env *env, ++ FILE *fp); + #else + static inline int machine__process_bpf(struct machine *machine __maybe_unused, + union perf_event *event __maybe_unused, +@@ -51,9 +51,9 @@ static inline int evlist__add_bpf_sb_event(struct evlist *evlist __maybe_unused, + return 0; + } + +-static inline void bpf_event__print_bpf_prog_info(struct bpf_prog_info *info __maybe_unused, +- struct perf_env *env __maybe_unused, +- FILE *fp __maybe_unused) ++static inline void __bpf_event__print_bpf_prog_info(struct bpf_prog_info *info __maybe_unused, ++ struct perf_env *env __maybe_unused, ++ FILE *fp __maybe_unused) + { + + } +diff --git a/tools/perf/util/env.c b/tools/perf/util/env.c +index d81ed1bc14bd..ed2a42abe127 100644 +--- a/tools/perf/util/env.c ++++ b/tools/perf/util/env.c +@@ -17,13 +17,19 @@ struct perf_env perf_env; + + void perf_env__insert_bpf_prog_info(struct perf_env *env, + struct bpf_prog_info_node *info_node) ++{ ++ down_write(&env->bpf_progs.lock); ++ __perf_env__insert_bpf_prog_info(env, info_node); ++ up_write(&env->bpf_progs.lock); ++} ++ ++void __perf_env__insert_bpf_prog_info(struct perf_env *env, struct bpf_prog_info_node *info_node) + { + __u32 prog_id = info_node->info_linear->info.id; + struct bpf_prog_info_node *node; + struct rb_node *parent = NULL; + struct rb_node **p; + +- down_write(&env->bpf_progs.lock); + p = &env->bpf_progs.infos.rb_node; + + while (*p != NULL) { +@@ -35,15 +41,13 @@ void perf_env__insert_bpf_prog_info(struct perf_env *env, + p = &(*p)->rb_right; + } else { + pr_debug("duplicated bpf prog info %u\n", prog_id); +- goto out; ++ return; + } + } + + rb_link_node(&info_node->rb_node, parent, p); + rb_insert_color(&info_node->rb_node, &env->bpf_progs.infos); + env->bpf_progs.infos_cnt++; +-out: +- up_write(&env->bpf_progs.lock); + } + + struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, +@@ -72,14 +76,22 @@ struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, + } + + bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) ++{ ++ bool ret; ++ ++ down_write(&env->bpf_progs.lock); ++ ret = __perf_env__insert_btf(env, btf_node); ++ up_write(&env->bpf_progs.lock); ++ return ret; ++} ++ ++bool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) + { + struct rb_node *parent = NULL; + __u32 btf_id = btf_node->id; + struct btf_node *node; + struct rb_node **p; +- bool ret = true; + +- down_write(&env->bpf_progs.lock); + p = &env->bpf_progs.btfs.rb_node; + + while (*p != NULL) { +@@ -91,25 +103,31 @@ bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node) + p = &(*p)->rb_right; + } else { + pr_debug("duplicated btf %u\n", btf_id); +- ret = false; +- goto out; ++ return false; + } + } + + rb_link_node(&btf_node->rb_node, parent, p); + rb_insert_color(&btf_node->rb_node, &env->bpf_progs.btfs); + env->bpf_progs.btfs_cnt++; +-out: +- up_write(&env->bpf_progs.lock); +- return ret; ++ return true; + } + + struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id) ++{ ++ struct btf_node *res; ++ ++ down_read(&env->bpf_progs.lock); ++ res = __perf_env__find_btf(env, btf_id); ++ up_read(&env->bpf_progs.lock); ++ return res; ++} ++ ++struct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id) + { + struct btf_node *node = NULL; + struct rb_node *n; + +- down_read(&env->bpf_progs.lock); + n = env->bpf_progs.btfs.rb_node; + + while (n) { +@@ -119,13 +137,9 @@ struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id) + else if (btf_id > node->id) + n = n->rb_right; + else +- goto out; ++ return node; + } +- node = NULL; +- +-out: +- up_read(&env->bpf_progs.lock); +- return node; ++ return NULL; + } + + /* purge data in bpf_progs.infos tree */ +diff --git a/tools/perf/util/env.h b/tools/perf/util/env.h +index 01378a955dd5..ef0fd544cd67 100644 +--- a/tools/perf/util/env.h ++++ b/tools/perf/util/env.h +@@ -139,12 +139,16 @@ const char *perf_env__raw_arch(struct perf_env *env); + int perf_env__nr_cpus_avail(struct perf_env *env); + + void perf_env__init(struct perf_env *env); ++void __perf_env__insert_bpf_prog_info(struct perf_env *env, ++ struct bpf_prog_info_node *info_node); + void perf_env__insert_bpf_prog_info(struct perf_env *env, + struct bpf_prog_info_node *info_node); + struct bpf_prog_info_node *perf_env__find_bpf_prog_info(struct perf_env *env, + __u32 prog_id); + bool perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node); ++bool __perf_env__insert_btf(struct perf_env *env, struct btf_node *btf_node); + struct btf_node *perf_env__find_btf(struct perf_env *env, __u32 btf_id); ++struct btf_node *__perf_env__find_btf(struct perf_env *env, __u32 btf_id); + + int perf_env__numa_node(struct perf_env *env, int cpu); + #endif /* __PERF_ENV_H */ +diff --git a/tools/perf/util/header.c b/tools/perf/util/header.c +index dd06770b43f1..d2812d98968d 100644 +--- a/tools/perf/util/header.c ++++ b/tools/perf/util/header.c +@@ -1655,8 +1655,8 @@ static void print_bpf_prog_info(struct feat_fd *ff, FILE *fp) + node = rb_entry(next, struct bpf_prog_info_node, rb_node); + next = rb_next(&node->rb_node); + +- bpf_event__print_bpf_prog_info(&node->info_linear->info, +- env, fp); ++ __bpf_event__print_bpf_prog_info(&node->info_linear->info, ++ env, fp); + } + + up_read(&env->bpf_progs.lock); +@@ -2927,7 +2927,7 @@ static int process_bpf_prog_info(struct feat_fd *ff, void *data __maybe_unused) + /* after reading from file, translate offset to address */ + bpf_program__bpil_offs_to_addr(info_linear); + info_node->info_linear = info_linear; +- perf_env__insert_bpf_prog_info(env, info_node); ++ __perf_env__insert_bpf_prog_info(env, info_node); + } + + up_write(&env->bpf_progs.lock); +@@ -2980,7 +2980,7 @@ static int process_bpf_btf(struct feat_fd *ff, void *data __maybe_unused) + if (__do_read(ff, node->data, data_size)) + goto out; + +- perf_env__insert_btf(env, node); ++ __perf_env__insert_btf(env, node); + node = NULL; + } + +-- +2.43.0 + diff --git a/queue-5.10/perf-genelf-set-elf-program-header-addresses-properl.patch b/queue-5.10/perf-genelf-set-elf-program-header-addresses-properl.patch new file mode 100644 index 00000000000..a01b5294621 --- /dev/null +++ b/queue-5.10/perf-genelf-set-elf-program-header-addresses-properl.patch @@ -0,0 +1,50 @@ +From 2f7b5c4e5bf9c6c6691337ded1297e17ea1564f2 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Dec 2023 23:05:44 -0800 +Subject: perf genelf: Set ELF program header addresses properly + +From: Namhyung Kim + +[ Upstream commit 1af478903fc48c1409a8dd6b698383b62387adf1 ] + +The text section starts after the ELF headers so PHDR.p_vaddr and +others should have the correct addresses. + +Fixes: babd04386b1df8c3 ("perf jit: Include program header in ELF files") +Reviewed-by: Ian Rogers +Signed-off-by: Namhyung Kim +Cc: Adrian Hunter +Cc: Fangrui Song +Cc: Ingo Molnar +Cc: Jiri Olsa +Cc: Lieven Hey +Cc: Milian Wolff +Cc: Pablo Galindo +Cc: Peter Zijlstra +Link: https://lore.kernel.org/r/20231212070547.612536-2-namhyung@kernel.org +Signed-off-by: Arnaldo Carvalho de Melo +Signed-off-by: Sasha Levin +--- + tools/perf/util/genelf.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +diff --git a/tools/perf/util/genelf.c b/tools/perf/util/genelf.c +index 02cd9f75e3d2..89a85601485d 100644 +--- a/tools/perf/util/genelf.c ++++ b/tools/perf/util/genelf.c +@@ -291,9 +291,9 @@ jit_write_elf(int fd, uint64_t load_addr, const char *sym, + */ + phdr = elf_newphdr(e, 1); + phdr[0].p_type = PT_LOAD; +- phdr[0].p_offset = 0; +- phdr[0].p_vaddr = 0; +- phdr[0].p_paddr = 0; ++ phdr[0].p_offset = GEN_ELF_TEXT_OFFSET; ++ phdr[0].p_vaddr = GEN_ELF_TEXT_OFFSET; ++ phdr[0].p_paddr = GEN_ELF_TEXT_OFFSET; + phdr[0].p_filesz = csize; + phdr[0].p_memsz = csize; + phdr[0].p_flags = PF_X | PF_R; +-- +2.43.0 + diff --git a/queue-5.10/power-supply-cw2015-correct-time_to_empty-units-in-s.patch b/queue-5.10/power-supply-cw2015-correct-time_to_empty-units-in-s.patch new file mode 100644 index 00000000000..4bae114c267 --- /dev/null +++ b/queue-5.10/power-supply-cw2015-correct-time_to_empty-units-in-s.patch @@ -0,0 +1,38 @@ +From d6dd1517bd66ef42a72de6dec92cb2cd151f6b90 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 11 Nov 2023 23:17:04 +0100 +Subject: power: supply: cw2015: correct time_to_empty units in sysfs + +From: Jan Palus + +[ Upstream commit f37669119423ca852ca855b24732f25c0737aa57 ] + +RRT_ALRT register holds remaining battery time in minutes therefore it +needs to be scaled accordingly when exposing TIME_TO_EMPTY via sysfs +expressed in seconds + +Fixes: b4c7715c10c1 ("power: supply: add CellWise cw2015 fuel gauge driver") +Signed-off-by: Jan Palus +Link: https://lore.kernel.org/r/20231111221704.5579-1-jpalus@fastmail.com +Signed-off-by: Sebastian Reichel +Signed-off-by: Sasha Levin +--- + drivers/power/supply/cw2015_battery.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/power/supply/cw2015_battery.c b/drivers/power/supply/cw2015_battery.c +index de1fa71be1e8..d1071dbb904e 100644 +--- a/drivers/power/supply/cw2015_battery.c ++++ b/drivers/power/supply/cw2015_battery.c +@@ -490,7 +490,7 @@ static int cw_battery_get_property(struct power_supply *psy, + + case POWER_SUPPLY_PROP_TIME_TO_EMPTY_NOW: + if (cw_battery_valid_time_to_empty(cw_bat)) +- val->intval = cw_bat->time_to_empty; ++ val->intval = cw_bat->time_to_empty * 60; + else + val->intval = 0; + break; +-- +2.43.0 + diff --git a/queue-5.10/s390-pci-fix-max-size-calculation-in-zpci_memcpy_toi.patch b/queue-5.10/s390-pci-fix-max-size-calculation-in-zpci_memcpy_toi.patch new file mode 100644 index 00000000000..21b8eba8527 --- /dev/null +++ b/queue-5.10/s390-pci-fix-max-size-calculation-in-zpci_memcpy_toi.patch @@ -0,0 +1,145 @@ +From 10a3185c1aedac16532bbfe10a83152972251b6c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 28 Nov 2023 16:22:49 +0100 +Subject: s390/pci: fix max size calculation in zpci_memcpy_toio() + +From: Niklas Schnelle + +[ Upstream commit 80df7d6af7f6d229b34cf237b2cc9024c07111cd ] + +The zpci_get_max_write_size() helper is used to determine the maximum +size a PCI store or load can use at a given __iomem address. + +For the PCI block store the following restrictions apply: + +1. The dst + len must not cross a 4K boundary in the (pseudo-)MMIO space +2. len must not exceed ZPCI_MAX_WRITE_SIZE +3. len must be a multiple of 8 bytes +4. The src address must be double word (8 byte) aligned +5. The dst address must be double word (8 byte) aligned + +Otherwise only a normal PCI store which takes its src value from +a register can be used. For these PCI store restriction 1 still applies. +Similarly 1 also applies to PCI loads. + +It turns out zpci_max_write_size() instead implements stricter +conditions which prevents PCI block stores from being used where they +can and should be used. In particular instead of conditions 4 and 5 it +wrongly enforces both dst and src to be size aligned. This indirectly +covers condition 1 but also prevents many legal PCI block stores. + +On top of the functional shortcomings the zpci_get_max_write_size() is +misnamed as it is used for both read and write size calculations. Rename +it to zpci_get_max_io_size() and implement the listed conditions +explicitly. + +Reviewed-by: Matthew Rosato +Fixes: cd24834130ac ("s390/pci: base support") +Signed-off-by: Niklas Schnelle +[agordeev@linux.ibm.com replaced spaces with tabs] +Signed-off-by: Alexander Gordeev +Signed-off-by: Sasha Levin +--- + arch/s390/include/asm/pci_io.h | 32 ++++++++++++++++++-------------- + arch/s390/pci/pci_mmio.c | 12 ++++++------ + 2 files changed, 24 insertions(+), 20 deletions(-) + +diff --git a/arch/s390/include/asm/pci_io.h b/arch/s390/include/asm/pci_io.h +index 287bb88f7698..2686bee800e3 100644 +--- a/arch/s390/include/asm/pci_io.h ++++ b/arch/s390/include/asm/pci_io.h +@@ -11,6 +11,8 @@ + /* I/O size constraints */ + #define ZPCI_MAX_READ_SIZE 8 + #define ZPCI_MAX_WRITE_SIZE 128 ++#define ZPCI_BOUNDARY_SIZE (1 << 12) ++#define ZPCI_BOUNDARY_MASK (ZPCI_BOUNDARY_SIZE - 1) + + /* I/O Map */ + #define ZPCI_IOMAP_SHIFT 48 +@@ -125,16 +127,18 @@ static inline int zpci_read_single(void *dst, const volatile void __iomem *src, + int zpci_write_block(volatile void __iomem *dst, const void *src, + unsigned long len); + +-static inline u8 zpci_get_max_write_size(u64 src, u64 dst, int len, int max) ++static inline int zpci_get_max_io_size(u64 src, u64 dst, int len, int max) + { +- int count = len > max ? max : len, size = 1; ++ int offset = dst & ZPCI_BOUNDARY_MASK; ++ int size; + +- while (!(src & 0x1) && !(dst & 0x1) && ((size << 1) <= count)) { +- dst = dst >> 1; +- src = src >> 1; +- size = size << 1; +- } +- return size; ++ size = min3(len, ZPCI_BOUNDARY_SIZE - offset, max); ++ if (IS_ALIGNED(src, 8) && IS_ALIGNED(dst, 8) && IS_ALIGNED(size, 8)) ++ return size; ++ ++ if (size >= 8) ++ return 8; ++ return rounddown_pow_of_two(size); + } + + static inline int zpci_memcpy_fromio(void *dst, +@@ -144,9 +148,9 @@ static inline int zpci_memcpy_fromio(void *dst, + int size, rc = 0; + + while (n > 0) { +- size = zpci_get_max_write_size((u64 __force) src, +- (u64) dst, n, +- ZPCI_MAX_READ_SIZE); ++ size = zpci_get_max_io_size((u64 __force) src, ++ (u64) dst, n, ++ ZPCI_MAX_READ_SIZE); + rc = zpci_read_single(dst, src, size); + if (rc) + break; +@@ -166,9 +170,9 @@ static inline int zpci_memcpy_toio(volatile void __iomem *dst, + return -EINVAL; + + while (n > 0) { +- size = zpci_get_max_write_size((u64 __force) dst, +- (u64) src, n, +- ZPCI_MAX_WRITE_SIZE); ++ size = zpci_get_max_io_size((u64 __force) dst, ++ (u64) src, n, ++ ZPCI_MAX_WRITE_SIZE); + if (size > 8) /* main path */ + rc = zpci_write_block(dst, src, size); + else +diff --git a/arch/s390/pci/pci_mmio.c b/arch/s390/pci/pci_mmio.c +index 1ec8076209ca..6e7c4762bd23 100644 +--- a/arch/s390/pci/pci_mmio.c ++++ b/arch/s390/pci/pci_mmio.c +@@ -100,9 +100,9 @@ static inline int __memcpy_toio_inuser(void __iomem *dst, + + old_fs = enable_sacf_uaccess(); + while (n > 0) { +- size = zpci_get_max_write_size((u64 __force) dst, +- (u64 __force) src, n, +- ZPCI_MAX_WRITE_SIZE); ++ size = zpci_get_max_io_size((u64 __force) dst, ++ (u64 __force) src, n, ++ ZPCI_MAX_WRITE_SIZE); + if (size > 8) /* main path */ + rc = __pcistb_mio_inuser(dst, src, size, &status); + else +@@ -252,9 +252,9 @@ static inline int __memcpy_fromio_inuser(void __user *dst, + + old_fs = enable_sacf_uaccess(); + while (n > 0) { +- size = zpci_get_max_write_size((u64 __force) src, +- (u64 __force) dst, n, +- ZPCI_MAX_READ_SIZE); ++ size = zpci_get_max_io_size((u64 __force) src, ++ (u64 __force) dst, n, ++ ZPCI_MAX_READ_SIZE); + rc = __pcilg_mio_inuser(dst, src, size, &status); + if (rc) + break; +-- +2.43.0 + diff --git a/queue-5.10/selftests-mlxsw-qos_pfc-adjust-the-test-to-support-8.patch b/queue-5.10/selftests-mlxsw-qos_pfc-adjust-the-test-to-support-8.patch new file mode 100644 index 00000000000..59d6ab760a0 --- /dev/null +++ b/queue-5.10/selftests-mlxsw-qos_pfc-adjust-the-test-to-support-8.patch @@ -0,0 +1,88 @@ +From 3a8a56f01e8c720cd0b24e803a7eff0d048915cd Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 17 Jan 2024 16:04:21 +0100 +Subject: selftests: mlxsw: qos_pfc: Adjust the test to support 8 lanes + +From: Amit Cohen + +[ Upstream commit b34f4de6d30cbaa8fed905a5080b6eace8c84dc7 ] + +'qos_pfc' test checks PFC behavior. The idea is to limit the traffic +using a shaper somewhere in the flow of the packets. In this area, the +buffer is smaller than the buffer at the beginning of the flow, so it fills +up until there is no more space left. The test configures there PFC +which is supposed to notice that the headroom is filling up and send PFC +Xoff to indicate the transmitter to stop sending traffic for the priorities +sharing this PG. + +The Xon/Xoff threshold is auto-configured and always equal to +2*(MTU rounded up to cell size). Even after sending the PFC Xoff packet, +traffic will keep arriving until the transmitter receives and processes +the PFC packet. This amount of traffic is known as the PFC delay allowance. + +Currently the buffer for the delay traffic is configured as 100KB. The +MTU in the test is 10KB, therefore the threshold for Xoff is about 20KB. +This allows 80KB extra to be stored in this buffer. + +8-lane ports use two buffers among which the configured buffer is split, +the Xoff threshold then applies to each buffer in parallel. + +The test does not take into account the behavior of 8-lane ports, when the +ports are configured to 400Gbps with 8 lanes or 800Gbps with 8 lanes, +packets are dropped and the test fails. + +Check if the relevant ports use 8 lanes, in such case double the size of +the buffer, as the headroom is split half-half. + +Cc: Shuah Khan +Fixes: bfa804784e32 ("selftests: mlxsw: Add a PFC test") +Signed-off-by: Amit Cohen +Reviewed-by: Ido Schimmel +Signed-off-by: Petr Machata +Acked-by: Paolo Abeni +Link: https://lore.kernel.org/r/23ff11b7dff031eb04a41c0f5254a2b636cd8ebb.1705502064.git.petrm@nvidia.com +Signed-off-by: Jakub Kicinski +Signed-off-by: Sasha Levin +--- + .../selftests/drivers/net/mlxsw/qos_pfc.sh | 18 +++++++++++++++++- + 1 file changed, 17 insertions(+), 1 deletion(-) + +diff --git a/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh b/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh +index 5d5622fc2758..56761de1ca3b 100755 +--- a/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh ++++ b/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh +@@ -121,6 +121,9 @@ h2_destroy() + + switch_create() + { ++ local lanes_swp4 ++ local pg1_size ++ + # pools + # ----- + +@@ -230,7 +233,20 @@ switch_create() + dcb pfc set dev $swp4 prio-pfc all:off 1:on + # PG0 will get autoconfigured to Xoff, give PG1 arbitrarily 100K, which + # is (-2*MTU) about 80K of delay provision. +- dcb buffer set dev $swp4 buffer-size all:0 1:$_100KB ++ pg1_size=$_100KB ++ ++ setup_wait_dev_with_timeout $swp4 ++ ++ lanes_swp4=$(ethtool $swp4 | grep 'Lanes:') ++ lanes_swp4=${lanes_swp4#*"Lanes: "} ++ ++ # 8-lane ports use two buffers among which the configured buffer ++ # is split, so double the size to get twice (20K + 80K). ++ if [[ $lanes_swp4 -eq 8 ]]; then ++ pg1_size=$((pg1_size * 2)) ++ fi ++ ++ dcb buffer set dev $swp4 buffer-size all:0 1:$pg1_size + + # bridges + # ------- +-- +2.43.0 + diff --git a/queue-5.10/selftests-mlxsw-qos_pfc-convert-to-iproute2-dcb.patch b/queue-5.10/selftests-mlxsw-qos_pfc-convert-to-iproute2-dcb.patch new file mode 100644 index 00000000000..f0d4aa08f39 --- /dev/null +++ b/queue-5.10/selftests-mlxsw-qos_pfc-convert-to-iproute2-dcb.patch @@ -0,0 +1,96 @@ +From 3a3cad2c9b86086b5b72158d5c05c1fc21a70d5f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 17 May 2021 20:03:54 +0300 +Subject: selftests: mlxsw: qos_pfc: Convert to iproute2 dcb + +From: Petr Machata + +[ Upstream commit b0bab2298ec9b3a837f8ef4a0cae4b42a4d03365 ] + +There is a dedicated tool for configuration of DCB in iproute2 now. Use it +in the selftest instead of mlnx_qos. + +Signed-off-by: Petr Machata +Signed-off-by: Ido Schimmel +Signed-off-by: David S. Miller +Stable-dep-of: b34f4de6d30c ("selftests: mlxsw: qos_pfc: Adjust the test to support 8 lanes") +Signed-off-by: Sasha Levin +--- + .../selftests/drivers/net/mlxsw/qos_pfc.sh | 24 +++++++++---------- + 1 file changed, 12 insertions(+), 12 deletions(-) + +diff --git a/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh b/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh +index 5c7700212f75..5d5622fc2758 100755 +--- a/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh ++++ b/tools/testing/selftests/drivers/net/mlxsw/qos_pfc.sh +@@ -171,7 +171,7 @@ switch_create() + # assignment. + tc qdisc replace dev $swp1 root handle 1: \ + ets bands 8 strict 8 priomap 7 6 +- __mlnx_qos -i $swp1 --prio2buffer=0,1,0,0,0,0,0,0 >/dev/null ++ dcb buffer set dev $swp1 prio-buffer all:0 1:1 + + # $swp2 + # ----- +@@ -209,8 +209,8 @@ switch_create() + # the lossless prio into a buffer of its own. Don't bother with buffer + # sizes though, there is not going to be any pressure in the "backward" + # direction. +- __mlnx_qos -i $swp3 --prio2buffer=0,1,0,0,0,0,0,0 >/dev/null +- __mlnx_qos -i $swp3 --pfc=0,1,0,0,0,0,0,0 >/dev/null ++ dcb buffer set dev $swp3 prio-buffer all:0 1:1 ++ dcb pfc set dev $swp3 prio-pfc all:off 1:on + + # $swp4 + # ----- +@@ -226,11 +226,11 @@ switch_create() + # Configure qdisc so that we can hand-tune headroom. + tc qdisc replace dev $swp4 root handle 1: \ + ets bands 8 strict 8 priomap 7 6 +- __mlnx_qos -i $swp4 --prio2buffer=0,1,0,0,0,0,0,0 >/dev/null +- __mlnx_qos -i $swp4 --pfc=0,1,0,0,0,0,0,0 >/dev/null ++ dcb buffer set dev $swp4 prio-buffer all:0 1:1 ++ dcb pfc set dev $swp4 prio-pfc all:off 1:on + # PG0 will get autoconfigured to Xoff, give PG1 arbitrarily 100K, which + # is (-2*MTU) about 80K of delay provision. +- __mlnx_qos -i $swp4 --buffer_size=0,$_100KB,0,0,0,0,0,0 >/dev/null ++ dcb buffer set dev $swp4 buffer-size all:0 1:$_100KB + + # bridges + # ------- +@@ -273,9 +273,9 @@ switch_destroy() + # $swp4 + # ----- + +- __mlnx_qos -i $swp4 --buffer_size=0,0,0,0,0,0,0,0 >/dev/null +- __mlnx_qos -i $swp4 --pfc=0,0,0,0,0,0,0,0 >/dev/null +- __mlnx_qos -i $swp4 --prio2buffer=0,0,0,0,0,0,0,0 >/dev/null ++ dcb buffer set dev $swp4 buffer-size all:0 ++ dcb pfc set dev $swp4 prio-pfc all:off ++ dcb buffer set dev $swp4 prio-buffer all:0 + tc qdisc del dev $swp4 root + + devlink_tc_bind_pool_th_restore $swp4 1 ingress +@@ -288,8 +288,8 @@ switch_destroy() + # $swp3 + # ----- + +- __mlnx_qos -i $swp3 --pfc=0,0,0,0,0,0,0,0 >/dev/null +- __mlnx_qos -i $swp3 --prio2buffer=0,0,0,0,0,0,0,0 >/dev/null ++ dcb pfc set dev $swp3 prio-pfc all:off ++ dcb buffer set dev $swp3 prio-buffer all:0 + tc qdisc del dev $swp3 root + + devlink_tc_bind_pool_th_restore $swp3 1 egress +@@ -315,7 +315,7 @@ switch_destroy() + # $swp1 + # ----- + +- __mlnx_qos -i $swp1 --prio2buffer=0,0,0,0,0,0,0,0 >/dev/null ++ dcb buffer set dev $swp1 prio-buffer all:0 + tc qdisc del dev $swp1 root + + devlink_tc_bind_pool_th_restore $swp1 1 ingress +-- +2.43.0 + diff --git a/queue-5.10/serial-8250-omap-don-t-skip-resource-freeing-if-pm_r.patch b/queue-5.10/serial-8250-omap-don-t-skip-resource-freeing-if-pm_r.patch new file mode 100644 index 00000000000..757f3d06e23 --- /dev/null +++ b/queue-5.10/serial-8250-omap-don-t-skip-resource-freeing-if-pm_r.patch @@ -0,0 +1,51 @@ +From 6fbbac6e0460ee1eb0c69edb83ef35a828c811ac Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 10 Nov 2023 16:29:29 +0100 +Subject: serial: 8250: omap: Don't skip resource freeing if + pm_runtime_resume_and_get() failed +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Uwe Kleine-König + +[ Upstream commit ad90d0358bd3b4554f243a425168fc7cebe7d04e ] + +Returning an error code from .remove() makes the driver core emit the +little helpful error message: + + remove callback returned a non-zero value. This will be ignored. + +and then remove the device anyhow. So all resources that were not freed +are leaked in this case. Skipping serial8250_unregister_port() has the +potential to keep enough of the UART around to trigger a use-after-free. + +So replace the error return (and with it the little helpful error +message) by a more useful error message and continue to cleanup. + +Fixes: e3f0c638f428 ("serial: 8250: omap: Fix unpaired pm_runtime_put_sync() in omap8250_remove()") +Signed-off-by: Uwe Kleine-König +Reviewed-by: Tony Lindgren +Link: https://lore.kernel.org/r/20231110152927.70601-2-u.kleine-koenig@pengutronix.de +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/8250/8250_omap.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/8250/8250_omap.c b/drivers/tty/serial/8250/8250_omap.c +index bd4118f1b694..25765ebb756a 100644 +--- a/drivers/tty/serial/8250/8250_omap.c ++++ b/drivers/tty/serial/8250/8250_omap.c +@@ -1497,7 +1497,7 @@ static int omap8250_remove(struct platform_device *pdev) + + err = pm_runtime_resume_and_get(&pdev->dev); + if (err) +- return err; ++ dev_err(&pdev->dev, "Failed to resume hardware\n"); + + serial8250_unregister_port(priv->line); + priv->line = -ENODEV; +-- +2.43.0 + diff --git a/queue-5.10/serial-imx-correct-clock-error-message-in-function-p.patch b/queue-5.10/serial-imx-correct-clock-error-message-in-function-p.patch new file mode 100644 index 00000000000..bfff5adf203 --- /dev/null +++ b/queue-5.10/serial-imx-correct-clock-error-message-in-function-p.patch @@ -0,0 +1,40 @@ +From 83501f51bb5886c43fad60f3d803c2b64724ecf3 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sun, 24 Dec 2023 10:32:09 +0100 +Subject: serial: imx: Correct clock error message in function probe() +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Christoph Niedermaier + +[ Upstream commit 3e189470cad27d41a3a9dc02649f965b7ed1c90f ] + +Correct the clock error message by changing the clock name. + +Fixes: 1e512d45332b ("serial: imx: add error messages when .probe fails") +Signed-off-by: Christoph Niedermaier +Reviewed-by: Uwe Kleine-König +Link: https://lore.kernel.org/r/20231224093209.2612-1-cniedermaier@dh-electronics.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/imx.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index 8bb7d5b5de9d..6e49928bb864 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -2346,7 +2346,7 @@ static int imx_uart_probe(struct platform_device *pdev) + /* For register access, we only need to enable the ipg clock. */ + ret = clk_prepare_enable(sport->clk_ipg); + if (ret) { +- dev_err(&pdev->dev, "failed to enable per clk: %d\n", ret); ++ dev_err(&pdev->dev, "failed to enable ipg clk: %d\n", ret); + return ret; + } + +-- +2.43.0 + diff --git a/queue-5.10/serial-imx-fix-tx-statemachine-deadlock.patch b/queue-5.10/serial-imx-fix-tx-statemachine-deadlock.patch new file mode 100644 index 00000000000..044122ab738 --- /dev/null +++ b/queue-5.10/serial-imx-fix-tx-statemachine-deadlock.patch @@ -0,0 +1,58 @@ +From d0da713c70c7edb12411cdc5dc55aee1c8dc0706 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 24 Nov 2023 14:11:10 +0100 +Subject: serial: imx: fix tx statemachine deadlock + +From: Paul Geurts + +[ Upstream commit 78d60dae9a0c9f09aa3d6477c94047df2fe6f7b0 ] + +When using the serial port as RS485 port, the tx statemachine is used to +control the RTS pin to drive the RS485 transceiver TX_EN pin. When the +TTY port is closed in the middle of a transmission (for instance during +userland application crash), imx_uart_shutdown disables the interface +and disables the Transmission Complete interrupt. afer that, +imx_uart_stop_tx bails on an incomplete transmission, to be retriggered +by the TC interrupt. This interrupt is disabled and therefore the tx +statemachine never transitions out of SEND. The statemachine is in +deadlock now, and the TX_EN remains low, making the interface useless. + +imx_uart_stop_tx now checks for incomplete transmission AND whether TC +interrupts are enabled before bailing to be retriggered. This makes sure +the state machine handling is reached, and is properly set to +WAIT_AFTER_SEND. + +Fixes: cb1a60923609 ("serial: imx: implement rts delaying for rs485") +Signed-off-by: Paul Geurts +Tested-by: Rasmus Villemoes +Tested-by: Eberhard Stoll +Link: https://lore.kernel.org/r/AM0PR09MB26758F651BC1B742EB45775995B8A@AM0PR09MB2675.eurprd09.prod.outlook.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/serial/imx.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/drivers/tty/serial/imx.c b/drivers/tty/serial/imx.c +index f236e4738b78..8bb7d5b5de9d 100644 +--- a/drivers/tty/serial/imx.c ++++ b/drivers/tty/serial/imx.c +@@ -461,13 +461,13 @@ static void imx_uart_stop_tx(struct uart_port *port) + ucr1 = imx_uart_readl(sport, UCR1); + imx_uart_writel(sport, ucr1 & ~UCR1_TRDYEN, UCR1); + ++ ucr4 = imx_uart_readl(sport, UCR4); + usr2 = imx_uart_readl(sport, USR2); +- if (!(usr2 & USR2_TXDC)) { ++ if ((!(usr2 & USR2_TXDC)) && (ucr4 & UCR4_TCEN)) { + /* The shifter is still busy, so retry once TC triggers */ + return; + } + +- ucr4 = imx_uart_readl(sport, UCR4); + ucr4 &= ~UCR4_TCEN; + imx_uart_writel(sport, ucr4, UCR4); + +-- +2.43.0 + diff --git a/queue-5.10/series b/queue-5.10/series index c8c6f02f991..bb8db500dea 100644 --- a/queue-5.10/series +++ b/queue-5.10/series @@ -233,3 +233,54 @@ kvm-arm64-vgic-v4-restore-pending-state-on-host-userspace-write.patch kvm-arm64-vgic-its-avoid-potential-uaf-in-lpi-translation-cache.patch iio-adc-ad7091r-pass-iio_dev-to-event-handler.patch hid-wacom-correct-behavior-when-processing-some-confidence-false-touches.patch +mfd-syscon-fix-null-pointer-dereference-in-of_syscon.patch +leds-aw2013-select-missing-dependency-regmap_i2c.patch +mips-dmi-fix-early-remap-on-mips32.patch +mips-fix-incorrect-max_low_pfn-adjustment.patch +mips-alchemy-fix-an-out-of-bound-access-in-db1200_de.patch +mips-alchemy-fix-an-out-of-bound-access-in-db1550_de.patch +power-supply-cw2015-correct-time_to_empty-units-in-s.patch +serial-8250-omap-don-t-skip-resource-freeing-if-pm_r.patch +libapi-add-missing-linux-types.h-header-to-get-the-_.patch +acpi-property-let-args-be-null-in-__acpi_node_get_pr.patch +software-node-let-args-be-null-in-software_node_get_.patch +serial-imx-fix-tx-statemachine-deadlock.patch +iio-adc-ad9467-benefit-from-devm_clk_get_enabled-to-.patch +iio-adc-ad9467-fix-reset-gpio-handling.patch +iio-adc-ad9467-don-t-ignore-error-codes.patch +iio-adc-ad9467-fix-scale-setting.patch +perf-genelf-set-elf-program-header-addresses-properl.patch +tty-change-tty_write_lock-s-ndelay-parameter-to-bool.patch +tty-early-return-from-send_break-on-tty_driver_hardw.patch +tty-don-t-check-for-signal_pending-in-send_break.patch +tty-use-if-in-send_break-instead-of-goto.patch +usb-cdc-acm-return-correct-error-code-on-unsupported.patch +nvmet-tcp-fix-a-kernel-panic-when-host-sends-an-inva.patch +nvmet-tcp-fix-a-crash-in-nvmet_req_complete.patch +perf-env-avoid-recursively-taking-env-bpf_progs.lock.patch +apparmor-avoid-crash-when-parsed-profile-name-is-emp.patch +serial-imx-correct-clock-error-message-in-function-p.patch +nvmet-tcp-fix-the-h2c-expected-pdu-len-calculation.patch +pci-keystone-fix-race-condition-when-initializing-ph.patch +s390-pci-fix-max-size-calculation-in-zpci_memcpy_toi.patch +net-qualcomm-rmnet-fix-global-oob-in-rmnet_policy.patch +net-ethernet-ti-am65-cpsw-fix-max-mtu-to-fit-etherne.patch +net-phy-micrel-populate-.soft_reset-for-ksz9131.patch +net-ravb-fix-dma_addr_t-truncation-in-error-case.patch +net-dsa-vsc73xx-add-null-pointer-check-to-vsc73xx_gp.patch +netfilter-nf_tables-do-not-allow-mismatch-field-size.patch +netfilter-nf_tables-skip-dead-set-elements-in-netlin.patch +netfilter-nf_tables-reject-nft_set_concat-with-not-f.patch +ipvs-avoid-stat-macros-calls-from-preemptible-contex.patch +kdb-fix-a-potential-buffer-overflow-in-kdb_local.patch +ethtool-netlink-add-missing-ethnl_ops_begin-complete.patch +mlxsw-spectrum_acl_erp-fix-error-flow-of-pool-alloca.patch +mlxsw-spectrum-use-bitmap_zalloc-when-applicable.patch +mlxsw-spectrum_acl_tcam-add-missing-mutex_destroy.patch +mlxsw-spectrum_acl_tcam-make-fini-symmetric-to-init.patch +mlxsw-spectrum_acl_tcam-reorder-functions-to-avoid-f.patch +mlxsw-spectrum_acl_tcam-fix-stack-corruption.patch +selftests-mlxsw-qos_pfc-convert-to-iproute2-dcb.patch +selftests-mlxsw-qos_pfc-adjust-the-test-to-support-8.patch +i2c-s3c24xx-fix-read-transfers-in-polling-mode.patch +i2c-s3c24xx-fix-transferring-more-than-one-message-i.patch diff --git a/queue-5.10/software-node-let-args-be-null-in-software_node_get_.patch b/queue-5.10/software-node-let-args-be-null-in-software_node_get_.patch new file mode 100644 index 00000000000..de4b1486665 --- /dev/null +++ b/queue-5.10/software-node-let-args-be-null-in-software_node_get_.patch @@ -0,0 +1,42 @@ +From adb7b72ef06910a3a06b720dfe7778cc5f8a0364 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Nov 2023 12:10:09 +0200 +Subject: software node: Let args be NULL in software_node_get_reference_args + +From: Sakari Ailus + +[ Upstream commit 1eaea4b3604eb9ca7d9a1e73d88fc121bb4061f5 ] + +fwnode_get_property_reference_args() may not be called with args argument +NULL and while OF already supports this. Add the missing NULL check. + +The purpose is to be able to count the references. + +Fixes: b06184acf751 ("software node: Add software_node_get_reference_args()") +Signed-off-by: Sakari Ailus +Reviewed-by: Andy Shevchenko +Reviewed-by: Heikki Krogerus +Link: https://lore.kernel.org/r/20231109101010.1329587-3-sakari.ailus@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/base/swnode.c | 3 +++ + 1 file changed, 3 insertions(+) + +diff --git a/drivers/base/swnode.c b/drivers/base/swnode.c +index d2fb3eb5816c..b664c36388e2 100644 +--- a/drivers/base/swnode.c ++++ b/drivers/base/swnode.c +@@ -531,6 +531,9 @@ software_node_get_reference_args(const struct fwnode_handle *fwnode, + if (nargs > NR_FWNODE_REFERENCE_ARGS) + return -EINVAL; + ++ if (!args) ++ return 0; ++ + args->fwnode = software_node_get(refnode); + args->nargs = nargs; + +-- +2.43.0 + diff --git a/queue-5.10/tty-change-tty_write_lock-s-ndelay-parameter-to-bool.patch b/queue-5.10/tty-change-tty_write_lock-s-ndelay-parameter-to-bool.patch new file mode 100644 index 00000000000..720efb6a552 --- /dev/null +++ b/queue-5.10/tty-change-tty_write_lock-s-ndelay-parameter-to-bool.patch @@ -0,0 +1,82 @@ +From 4b315ebf1e00856e1dcf0df6f98169ce9101bbb9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 10 Aug 2023 11:14:39 +0200 +Subject: tty: change tty_write_lock()'s ndelay parameter to bool + +From: Jiri Slaby (SUSE) + +[ Upstream commit af815336556df28f800669c58ab3bdad7d786b98 ] + +It's a yes-no parameter, so convert it to bool to be obvious. + +Signed-off-by: "Jiri Slaby (SUSE)" +Link: https://lore.kernel.org/r/20230810091510.13006-6-jirislaby@kernel.org +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: 66aad7d8d3ec ("usb: cdc-acm: return correct error code on unsupported break") +Signed-off-by: Sasha Levin +--- + drivers/tty/tty.h | 2 +- + drivers/tty/tty_io.c | 6 +++--- + drivers/tty/tty_ioctl.c | 2 +- + 3 files changed, 5 insertions(+), 5 deletions(-) + +diff --git a/drivers/tty/tty.h b/drivers/tty/tty.h +index 1908f27a795a..3d2d82ff6a03 100644 +--- a/drivers/tty/tty.h ++++ b/drivers/tty/tty.h +@@ -64,7 +64,7 @@ int tty_check_change(struct tty_struct *tty); + void __stop_tty(struct tty_struct *tty); + void __start_tty(struct tty_struct *tty); + void tty_write_unlock(struct tty_struct *tty); +-int tty_write_lock(struct tty_struct *tty, int ndelay); ++int tty_write_lock(struct tty_struct *tty, bool ndelay); + void tty_vhangup_session(struct tty_struct *tty); + void tty_open_proc_set_tty(struct file *filp, struct tty_struct *tty); + int tty_signal_session_leader(struct tty_struct *tty, int exit_session); +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index 094e82a12d29..38877489f700 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -948,7 +948,7 @@ void tty_write_unlock(struct tty_struct *tty) + wake_up_interruptible_poll(&tty->write_wait, EPOLLOUT); + } + +-int tty_write_lock(struct tty_struct *tty, int ndelay) ++int tty_write_lock(struct tty_struct *tty, bool ndelay) + { + if (!mutex_trylock(&tty->atomic_write_lock)) { + if (ndelay) +@@ -1167,7 +1167,7 @@ int tty_send_xchar(struct tty_struct *tty, char ch) + return 0; + } + +- if (tty_write_lock(tty, 0) < 0) ++ if (tty_write_lock(tty, false) < 0) + return -ERESTARTSYS; + + down_read(&tty->termios_rwsem); +@@ -2473,7 +2473,7 @@ static int send_break(struct tty_struct *tty, unsigned int duration) + retval = tty->ops->break_ctl(tty, duration); + else { + /* Do the work ourselves */ +- if (tty_write_lock(tty, 0) < 0) ++ if (tty_write_lock(tty, false) < 0) + return -EINTR; + retval = tty->ops->break_ctl(tty, -1); + if (retval) +diff --git a/drivers/tty/tty_ioctl.c b/drivers/tty/tty_ioctl.c +index 68b07250dcb6..12a30329abdb 100644 +--- a/drivers/tty/tty_ioctl.c ++++ b/drivers/tty/tty_ioctl.c +@@ -404,7 +404,7 @@ static int set_termios(struct tty_struct *tty, void __user *arg, int opt) + if (retval < 0) + return retval; + +- if (tty_write_lock(tty, 0) < 0) ++ if (tty_write_lock(tty, false) < 0) + goto retry_write_wait; + + /* Racing writer? */ +-- +2.43.0 + diff --git a/queue-5.10/tty-don-t-check-for-signal_pending-in-send_break.patch b/queue-5.10/tty-don-t-check-for-signal_pending-in-send_break.patch new file mode 100644 index 00000000000..fa3f3ea8f35 --- /dev/null +++ b/queue-5.10/tty-don-t-check-for-signal_pending-in-send_break.patch @@ -0,0 +1,38 @@ +From 6d2405e17204f870e4be7de85fc5e3b24d5ce07d Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Sep 2023 10:51:55 +0200 +Subject: tty: don't check for signal_pending() in send_break() + +From: Jiri Slaby (SUSE) + +[ Upstream commit fd99392b643b824813df2edbaebe26a2136d31e6 ] + +msleep_interruptible() will check on its own. So no need to do the check +in send_break() before calling the above. + +Signed-off-by: "Jiri Slaby (SUSE)" +Link: https://lore.kernel.org/r/20230919085156.1578-15-jirislaby@kernel.org +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: 66aad7d8d3ec ("usb: cdc-acm: return correct error code on unsupported break") +Signed-off-by: Sasha Levin +--- + drivers/tty/tty_io.c | 3 +-- + 1 file changed, 1 insertion(+), 2 deletions(-) + +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index 145c26401218..a45e6e1423d8 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -2479,8 +2479,7 @@ static int send_break(struct tty_struct *tty, unsigned int duration) + retval = tty->ops->break_ctl(tty, -1); + if (retval) + goto out; +- if (!signal_pending(current)) +- msleep_interruptible(duration); ++ msleep_interruptible(duration); + retval = tty->ops->break_ctl(tty, 0); + out: + tty_write_unlock(tty); +-- +2.43.0 + diff --git a/queue-5.10/tty-early-return-from-send_break-on-tty_driver_hardw.patch b/queue-5.10/tty-early-return-from-send_break-on-tty_driver_hardw.patch new file mode 100644 index 00000000000..1c6e39745c9 --- /dev/null +++ b/queue-5.10/tty-early-return-from-send_break-on-tty_driver_hardw.patch @@ -0,0 +1,74 @@ +From 0a9bd53d5bfc9e968579cfcf594bee684c420d40 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Sep 2023 10:51:54 +0200 +Subject: tty: early return from send_break() on TTY_DRIVER_HARDWARE_BREAK + +From: Jiri Slaby (SUSE) + +[ Upstream commit 66619686d187b4a6395316b7f39881e945dce4bc ] + +If the driver sets TTY_DRIVER_HARDWARE_BREAK, we leave ops->break_ctl() +to the driver and return from send_break(). But we do it using a local +variable and keep the code flowing through the end of the function. +Instead, do 'return' immediately with the ops->break_ctl()'s return +value. + +This way, we don't have to stuff the 'else' branch of the 'if' with the +software break handling. And we can re-indent the function too. + +Signed-off-by: "Jiri Slaby (SUSE)" +Link: https://lore.kernel.org/r/20230919085156.1578-14-jirislaby@kernel.org +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: 66aad7d8d3ec ("usb: cdc-acm: return correct error code on unsupported break") +Signed-off-by: Sasha Levin +--- + drivers/tty/tty_io.c | 32 +++++++++++++++++--------------- + 1 file changed, 17 insertions(+), 15 deletions(-) + +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index 38877489f700..145c26401218 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -2470,22 +2470,24 @@ static int send_break(struct tty_struct *tty, unsigned int duration) + return 0; + + if (tty->driver->flags & TTY_DRIVER_HARDWARE_BREAK) +- retval = tty->ops->break_ctl(tty, duration); +- else { +- /* Do the work ourselves */ +- if (tty_write_lock(tty, false) < 0) +- return -EINTR; +- retval = tty->ops->break_ctl(tty, -1); +- if (retval) +- goto out; +- if (!signal_pending(current)) +- msleep_interruptible(duration); +- retval = tty->ops->break_ctl(tty, 0); ++ return tty->ops->break_ctl(tty, duration); ++ ++ /* Do the work ourselves */ ++ if (tty_write_lock(tty, false) < 0) ++ return -EINTR; ++ ++ retval = tty->ops->break_ctl(tty, -1); ++ if (retval) ++ goto out; ++ if (!signal_pending(current)) ++ msleep_interruptible(duration); ++ retval = tty->ops->break_ctl(tty, 0); + out: +- tty_write_unlock(tty); +- if (signal_pending(current)) +- retval = -EINTR; +- } ++ tty_write_unlock(tty); ++ ++ if (signal_pending(current)) ++ retval = -EINTR; ++ + return retval; + } + +-- +2.43.0 + diff --git a/queue-5.10/tty-use-if-in-send_break-instead-of-goto.patch b/queue-5.10/tty-use-if-in-send_break-instead-of-goto.patch new file mode 100644 index 00000000000..1ce00d6f8dd --- /dev/null +++ b/queue-5.10/tty-use-if-in-send_break-instead-of-goto.patch @@ -0,0 +1,44 @@ +From 8af6f242e3bcfa8e07e29646e5b7cbd4e93b4324 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Tue, 19 Sep 2023 10:51:56 +0200 +Subject: tty: use 'if' in send_break() instead of 'goto' + +From: Jiri Slaby (SUSE) + +[ Upstream commit 24f2cd019946fc2e88e632d2e24a34c2cc3f2be4 ] + +Now, the "jumped-over" code is simple enough to be put inside an 'if'. +Do so to make it 'goto'-less. + +Signed-off-by: "Jiri Slaby (SUSE)" +Link: https://lore.kernel.org/r/20230919085156.1578-16-jirislaby@kernel.org +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: 66aad7d8d3ec ("usb: cdc-acm: return correct error code on unsupported break") +Signed-off-by: Sasha Levin +--- + drivers/tty/tty_io.c | 9 ++++----- + 1 file changed, 4 insertions(+), 5 deletions(-) + +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index a45e6e1423d8..1c76e77e2d07 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -2477,11 +2477,10 @@ static int send_break(struct tty_struct *tty, unsigned int duration) + return -EINTR; + + retval = tty->ops->break_ctl(tty, -1); +- if (retval) +- goto out; +- msleep_interruptible(duration); +- retval = tty->ops->break_ctl(tty, 0); +-out: ++ if (!retval) { ++ msleep_interruptible(duration); ++ retval = tty->ops->break_ctl(tty, 0); ++ } + tty_write_unlock(tty); + + if (signal_pending(current)) +-- +2.43.0 + diff --git a/queue-5.10/usb-cdc-acm-return-correct-error-code-on-unsupported.patch b/queue-5.10/usb-cdc-acm-return-correct-error-code-on-unsupported.patch new file mode 100644 index 00000000000..c93d298c402 --- /dev/null +++ b/queue-5.10/usb-cdc-acm-return-correct-error-code-on-unsupported.patch @@ -0,0 +1,62 @@ +From e0ca2dbe4246a72ed9191ea107075dc5955d7ac4 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 7 Dec 2023 14:26:30 +0100 +Subject: usb: cdc-acm: return correct error code on unsupported break + +From: Oliver Neukum + +[ Upstream commit 66aad7d8d3ec5a3a8ec2023841bcec2ded5f65c9 ] + +In ACM support for sending breaks to devices is optional. +If a device says that it doenot support sending breaks, +the host must respect that. +Given the number of optional features providing tty operations +for each combination is not practical and errors need to be +returned dynamically if unsupported features are requested. + +In case a device does not support break, we want the tty layer +to treat that like it treats drivers that statically cannot +support sending a break. It ignores the inability and does nothing. +This patch uses EOPNOTSUPP to indicate that. + +Signed-off-by: Oliver Neukum +Fixes: 9e98966c7bb94 ("tty: rework break handling") +Link: https://lore.kernel.org/r/20231207132639.18250-1-oneukum@suse.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + drivers/tty/tty_io.c | 3 +++ + drivers/usb/class/cdc-acm.c | 3 +++ + 2 files changed, 6 insertions(+) + +diff --git a/drivers/tty/tty_io.c b/drivers/tty/tty_io.c +index 1c76e77e2d07..984e3098e631 100644 +--- a/drivers/tty/tty_io.c ++++ b/drivers/tty/tty_io.c +@@ -2480,6 +2480,9 @@ static int send_break(struct tty_struct *tty, unsigned int duration) + if (!retval) { + msleep_interruptible(duration); + retval = tty->ops->break_ctl(tty, 0); ++ } else if (retval == -EOPNOTSUPP) { ++ /* some drivers can tell only dynamically */ ++ retval = 0; + } + tty_write_unlock(tty); + +diff --git a/drivers/usb/class/cdc-acm.c b/drivers/usb/class/cdc-acm.c +index 070b838c7da9..4e4a71307d63 100644 +--- a/drivers/usb/class/cdc-acm.c ++++ b/drivers/usb/class/cdc-acm.c +@@ -896,6 +896,9 @@ static int acm_tty_break_ctl(struct tty_struct *tty, int state) + struct acm *acm = tty->driver_data; + int retval; + ++ if (!(acm->ctrl_caps & USB_CDC_CAP_BRK)) ++ return -EOPNOTSUPP; ++ + retval = acm_send_break(acm, state ? 0xffff : 0); + if (retval < 0) + dev_dbg(&acm->control->dev, +-- +2.43.0 + -- 2.47.3