From: Greg Kroah-Hartman Date: Mon, 20 Mar 2023 09:25:59 +0000 (+0100) Subject: 6.2-stable patches X-Git-Tag: v4.14.311~44 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=02fc93f7d6ed4b968dd942553051b940779b77b8;p=thirdparty%2Fkernel%2Fstable-queue.git 6.2-stable patches added patches: cifs-generate-signkey-for-the-channel-that-s-reconnecting.patch drm-ttm-fix-a-null-pointer-dereference.patch firmware-xilinx-don-t-make-a-sleepable-memory-allocation-from-an-atomic-context.patch interconnect-exynos-fix-node-leak-in-probe-pm-qos-error-path.patch interconnect-exynos-fix-registration-race.patch interconnect-fix-icc_provider_del-error-handling.patch interconnect-fix-mem-leak-when-freeing-nodes.patch interconnect-fix-provider-registration-api.patch interconnect-imx-fix-registration-race.patch interconnect-qcom-msm8974-fix-registration-race.patch interconnect-qcom-osm-l3-fix-registration-race.patch interconnect-qcom-rpm-fix-probe-child-node-error-handling.patch interconnect-qcom-rpm-fix-registration-race.patch interconnect-qcom-rpmh-fix-probe-child-node-error-handling.patch interconnect-qcom-rpmh-fix-registration-race.patch md-select-block_legacy_autoload.patch memory-tegra-fix-interconnect-registration-race.patch memory-tegra124-emc-fix-interconnect-registration-race.patch memory-tegra20-emc-fix-interconnect-registration-race.patch memory-tegra30-emc-fix-interconnect-registration-race.patch s390-ipl-add-missing-intersection-check-to-ipl_report-handling.patch serial-qcom-geni-fix-console-shutdown-hang.patch --- diff --git a/queue-6.2/cifs-generate-signkey-for-the-channel-that-s-reconnecting.patch b/queue-6.2/cifs-generate-signkey-for-the-channel-that-s-reconnecting.patch new file mode 100644 index 00000000000..c7fec85d204 --- /dev/null +++ b/queue-6.2/cifs-generate-signkey-for-the-channel-that-s-reconnecting.patch @@ -0,0 +1,35 @@ +From 05ce0448c3f36febd8db0ee0e9e16557f3ab5ee8 Mon Sep 17 00:00:00 2001 +From: Shyam Prasad N +Date: Fri, 10 Mar 2023 15:32:01 +0000 +Subject: cifs: generate signkey for the channel that's reconnecting + +From: Shyam Prasad N + +commit 05ce0448c3f36febd8db0ee0e9e16557f3ab5ee8 upstream. + +Before my changes to how multichannel reconnects work, the +primary channel was always used to do a non-binding session +setup. With my changes, that is not the case anymore. +Missed this place where channel at index 0 was forcibly +updated with the signing key. + +Signed-off-by: Shyam Prasad N +Reviewed-by: Paulo Alcantara (SUSE) +Cc: stable@vger.kernel.org +Signed-off-by: Steve French +Signed-off-by: Greg Kroah-Hartman +--- + fs/cifs/smb2transport.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/fs/cifs/smb2transport.c ++++ b/fs/cifs/smb2transport.c +@@ -425,7 +425,7 @@ generate_smb3signingkey(struct cifs_ses + + /* safe to access primary channel, since it will never go away */ + spin_lock(&ses->chan_lock); +- memcpy(ses->chans[0].signkey, ses->smb3signingkey, ++ memcpy(ses->chans[chan_index].signkey, ses->smb3signingkey, + SMB3_SIGN_KEY_SIZE); + spin_unlock(&ses->chan_lock); + diff --git a/queue-6.2/drm-ttm-fix-a-null-pointer-dereference.patch b/queue-6.2/drm-ttm-fix-a-null-pointer-dereference.patch new file mode 100644 index 00000000000..dd17fd4ae03 --- /dev/null +++ b/queue-6.2/drm-ttm-fix-a-null-pointer-dereference.patch @@ -0,0 +1,58 @@ +From 9a9a8fe26751334b7739193a94eba741073b8a55 Mon Sep 17 00:00:00 2001 +From: =?UTF-8?q?Thomas=20Hellstr=C3=B6m?= +Date: Tue, 7 Mar 2023 15:46:15 +0100 +Subject: drm/ttm: Fix a NULL pointer dereference +MIME-Version: 1.0 +Content-Type: text/plain; charset=UTF-8 +Content-Transfer-Encoding: 8bit + +From: Thomas Hellström + +commit 9a9a8fe26751334b7739193a94eba741073b8a55 upstream. + +The LRU mechanism may look up a resource in the process of being removed +from an object. The locking rules here are a bit unclear but it looks +currently like res->bo assignment is protected by the LRU lock, whereas +bo->resource is protected by the object lock, while *clearing* of +bo->resource is also protected by the LRU lock. This means that if +we check that bo->resource points to the LRU resource under the LRU +lock we should be safe. +So perform that check before deciding to swap out a bo. That avoids +dereferencing a NULL bo->resource in ttm_bo_swapout(). + +Fixes: 6a9b02899402 ("drm/ttm: move the LRU into resource handling v4") +Cc: Christian König +Cc: Daniel Vetter +Cc: Christian Koenig +Cc: Huang Rui +Cc: Alex Deucher +Cc: Felix Kuehling +Cc: Philip Yang +Cc: Qiang Yu +Cc: Matthew Auld +Cc: Nirmoy Das +Cc: Tvrtko Ursulin +Cc: "Thomas Hellström" +Cc: Anshuman Gupta +Cc: Arunpravin Paneer Selvam +Cc: dri-devel@lists.freedesktop.org +Cc: # v5.19+ +Signed-off-by: Thomas Hellström +Reviewed-by: Christian König +Link: https://patchwork.freedesktop.org/patch/msgid/20230307144621.10748-2-thomas.hellstrom@linux.intel.com +Signed-off-by: Greg Kroah-Hartman +--- + drivers/gpu/drm/ttm/ttm_device.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/gpu/drm/ttm/ttm_device.c ++++ b/drivers/gpu/drm/ttm/ttm_device.c +@@ -158,7 +158,7 @@ int ttm_device_swapout(struct ttm_device + struct ttm_buffer_object *bo = res->bo; + uint32_t num_pages; + +- if (!bo) ++ if (!bo || bo->resource != res) + continue; + + num_pages = PFN_UP(bo->base.size); diff --git a/queue-6.2/firmware-xilinx-don-t-make-a-sleepable-memory-allocation-from-an-atomic-context.patch b/queue-6.2/firmware-xilinx-don-t-make-a-sleepable-memory-allocation-from-an-atomic-context.patch new file mode 100644 index 00000000000..d3a2c429037 --- /dev/null +++ b/queue-6.2/firmware-xilinx-don-t-make-a-sleepable-memory-allocation-from-an-atomic-context.patch @@ -0,0 +1,89 @@ +From 38ed310c22e7a0fc978b1f8292136a4a4a8b3051 Mon Sep 17 00:00:00 2001 +From: Roman Gushchin +Date: Wed, 8 Mar 2023 14:26:02 -0800 +Subject: firmware: xilinx: don't make a sleepable memory allocation from an atomic context + +From: Roman Gushchin + +commit 38ed310c22e7a0fc978b1f8292136a4a4a8b3051 upstream. + +The following issue was discovered using lockdep: +[ 6.691371] BUG: sleeping function called from invalid context at include/linux/sched/mm.h:209 +[ 6.694602] in_atomic(): 1, irqs_disabled(): 128, non_block: 0, pid: 1, name: swapper/0 +[ 6.702431] 2 locks held by swapper/0/1: +[ 6.706300] #0: ffffff8800f6f188 (&dev->mutex){....}-{3:3}, at: __device_driver_lock+0x4c/0x90 +[ 6.714900] #1: ffffffc009a2abb8 (enable_lock){....}-{2:2}, at: clk_enable_lock+0x4c/0x140 +[ 6.723156] irq event stamp: 304030 +[ 6.726596] hardirqs last enabled at (304029): [] _raw_spin_unlock_irqrestore+0xc0/0xd0 +[ 6.736142] hardirqs last disabled at (304030): [] clk_enable_lock+0xfc/0x140 +[ 6.744742] softirqs last enabled at (303958): [] _stext+0x4f0/0x894 +[ 6.752655] softirqs last disabled at (303951): [] irq_exit+0x238/0x280 +[ 6.760744] CPU: 1 PID: 1 Comm: swapper/0 Tainted: G U 5.15.36 #2 +[ 6.768048] Hardware name: xlnx,zynqmp (DT) +[ 6.772179] Call trace: +[ 6.774584] dump_backtrace+0x0/0x300 +[ 6.778197] show_stack+0x18/0x30 +[ 6.781465] dump_stack_lvl+0xb8/0xec +[ 6.785077] dump_stack+0x1c/0x38 +[ 6.788345] ___might_sleep+0x1a8/0x2a0 +[ 6.792129] __might_sleep+0x6c/0xd0 +[ 6.795655] kmem_cache_alloc_trace+0x270/0x3d0 +[ 6.800127] do_feature_check_call+0x100/0x220 +[ 6.804513] zynqmp_pm_invoke_fn+0x8c/0xb0 +[ 6.808555] zynqmp_pm_clock_getstate+0x90/0xe0 +[ 6.813027] zynqmp_pll_is_enabled+0x8c/0x120 +[ 6.817327] zynqmp_pll_enable+0x38/0xc0 +[ 6.821197] clk_core_enable+0x144/0x400 +[ 6.825067] clk_core_enable+0xd4/0x400 +[ 6.828851] clk_core_enable+0xd4/0x400 +[ 6.832635] clk_core_enable+0xd4/0x400 +[ 6.836419] clk_core_enable+0xd4/0x400 +[ 6.840203] clk_core_enable+0xd4/0x400 +[ 6.843987] clk_core_enable+0xd4/0x400 +[ 6.847771] clk_core_enable+0xd4/0x400 +[ 6.851555] clk_core_enable_lock+0x24/0x50 +[ 6.855683] clk_enable+0x24/0x40 +[ 6.858952] fclk_probe+0x84/0xf0 +[ 6.862220] platform_probe+0x8c/0x110 +[ 6.865918] really_probe+0x110/0x5f0 +[ 6.869530] __driver_probe_device+0xcc/0x210 +[ 6.873830] driver_probe_device+0x64/0x140 +[ 6.877958] __driver_attach+0x114/0x1f0 +[ 6.881828] bus_for_each_dev+0xe8/0x160 +[ 6.885698] driver_attach+0x34/0x50 +[ 6.889224] bus_add_driver+0x228/0x300 +[ 6.893008] driver_register+0xc0/0x1e0 +[ 6.896792] __platform_driver_register+0x44/0x60 +[ 6.901436] fclk_driver_init+0x1c/0x28 +[ 6.905220] do_one_initcall+0x104/0x590 +[ 6.909091] kernel_init_freeable+0x254/0x2bc +[ 6.913390] kernel_init+0x24/0x130 +[ 6.916831] ret_from_fork+0x10/0x20 + +Fix it by passing the GFP_ATOMIC gfp flag for the corresponding +memory allocation. + +Fixes: acfdd18591ea ("firmware: xilinx: Use hash-table for api feature check") +Cc: stable +Signed-off-by: Roman Gushchin +Cc: Amit Sunil Dhamne +Cc: Michal Simek +Cc: linux-arm-kernel@lists.infradead.org +Cc: linux-kernel@vger.kernel.org +Link: https://lore.kernel.org/r/20230308222602.123866-1-roman.gushchin@linux.dev +Signed-off-by: Greg Kroah-Hartman +--- + drivers/firmware/xilinx/zynqmp.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +--- a/drivers/firmware/xilinx/zynqmp.c ++++ b/drivers/firmware/xilinx/zynqmp.c +@@ -206,7 +206,7 @@ static int do_feature_check_call(const u + } + + /* Add new entry if not present */ +- feature_data = kmalloc(sizeof(*feature_data), GFP_KERNEL); ++ feature_data = kmalloc(sizeof(*feature_data), GFP_ATOMIC); + if (!feature_data) + return -ENOMEM; + diff --git a/queue-6.2/interconnect-exynos-fix-node-leak-in-probe-pm-qos-error-path.patch b/queue-6.2/interconnect-exynos-fix-node-leak-in-probe-pm-qos-error-path.patch new file mode 100644 index 00000000000..80a7c151f0f --- /dev/null +++ b/queue-6.2/interconnect-exynos-fix-node-leak-in-probe-pm-qos-error-path.patch @@ -0,0 +1,46 @@ +From 3aab264875bf3c915ea2517fae1eec213e0b4987 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:42 +0100 +Subject: interconnect: exynos: fix node leak in probe PM QoS error path + +From: Johan Hovold + +commit 3aab264875bf3c915ea2517fae1eec213e0b4987 upstream. + +Make sure to add the newly allocated interconnect node to the provider +before adding the PM QoS request so that the node is freed on errors. + +Fixes: 2f95b9d5cf0b ("interconnect: Add generic interconnect driver for Exynos SoCs") +Cc: stable@vger.kernel.org # 5.11 +Cc: Sylwester Nawrocki +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-15-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/samsung/exynos.c | 6 +++--- + 1 file changed, 3 insertions(+), 3 deletions(-) + +--- a/drivers/interconnect/samsung/exynos.c ++++ b/drivers/interconnect/samsung/exynos.c +@@ -149,6 +149,9 @@ static int exynos_generic_icc_probe(stru + &priv->bus_clk_ratio)) + priv->bus_clk_ratio = EXYNOS_ICC_DEFAULT_BUS_CLK_RATIO; + ++ icc_node->data = priv; ++ icc_node_add(icc_node, provider); ++ + /* + * Register a PM QoS request for the parent (devfreq) device. + */ +@@ -157,9 +160,6 @@ static int exynos_generic_icc_probe(stru + if (ret < 0) + goto err_node_del; + +- icc_node->data = priv; +- icc_node_add(icc_node, provider); +- + icc_parent_node = exynos_icc_get_parent(bus_dev->of_node); + if (IS_ERR(icc_parent_node)) { + ret = PTR_ERR(icc_parent_node); diff --git a/queue-6.2/interconnect-exynos-fix-registration-race.patch b/queue-6.2/interconnect-exynos-fix-registration-race.patch new file mode 100644 index 00000000000..7710fc6bb06 --- /dev/null +++ b/queue-6.2/interconnect-exynos-fix-registration-race.patch @@ -0,0 +1,86 @@ +From c9e46ca612cfbb0cf890f7ae7389b742e90efe64 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:43 +0100 +Subject: interconnect: exynos: fix registration race + +From: Johan Hovold + +commit c9e46ca612cfbb0cf890f7ae7389b742e90efe64 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to trigger a NULL-pointer +deference when either a NULL pointer or not fully initialised node is +returned from exynos_generic_icc_xlate(). + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: 2f95b9d5cf0b ("interconnect: Add generic interconnect driver for Exynos SoCs") +Cc: stable@vger.kernel.org # 5.11 +Cc: Sylwester Nawrocki +Reviewed-by: Krzysztof Kozlowski +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-16-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/samsung/exynos.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +--- a/drivers/interconnect/samsung/exynos.c ++++ b/drivers/interconnect/samsung/exynos.c +@@ -98,12 +98,13 @@ static int exynos_generic_icc_remove(str + struct exynos_icc_priv *priv = platform_get_drvdata(pdev); + struct icc_node *parent_node, *node = priv->node; + ++ icc_provider_deregister(&priv->provider); ++ + parent_node = exynos_icc_get_parent(priv->dev->parent->of_node); + if (parent_node && !IS_ERR(parent_node)) + icc_link_destroy(node, parent_node); + + icc_nodes_remove(&priv->provider); +- icc_provider_del(&priv->provider); + + return 0; + } +@@ -132,15 +133,11 @@ static int exynos_generic_icc_probe(stru + provider->inter_set = true; + provider->data = priv; + +- ret = icc_provider_add(provider); +- if (ret < 0) +- return ret; ++ icc_provider_init(provider); + + icc_node = icc_node_create(pdev->id); +- if (IS_ERR(icc_node)) { +- ret = PTR_ERR(icc_node); +- goto err_prov_del; +- } ++ if (IS_ERR(icc_node)) ++ return PTR_ERR(icc_node); + + priv->node = icc_node; + icc_node->name = devm_kasprintf(&pdev->dev, GFP_KERNEL, "%pOFn", +@@ -171,14 +168,17 @@ static int exynos_generic_icc_probe(stru + goto err_pmqos_del; + } + ++ ret = icc_provider_register(provider); ++ if (ret < 0) ++ goto err_pmqos_del; ++ + return 0; + + err_pmqos_del: + dev_pm_qos_remove_request(&priv->qos_req); + err_node_del: + icc_nodes_remove(provider); +-err_prov_del: +- icc_provider_del(provider); ++ + return ret; + } + diff --git a/queue-6.2/interconnect-fix-icc_provider_del-error-handling.patch b/queue-6.2/interconnect-fix-icc_provider_del-error-handling.patch new file mode 100644 index 00000000000..8e5695b7f36 --- /dev/null +++ b/queue-6.2/interconnect-fix-icc_provider_del-error-handling.patch @@ -0,0 +1,56 @@ +From e0e7089bf9a87bc5e3997422e4e24563424f9018 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:30 +0100 +Subject: interconnect: fix icc_provider_del() error handling + +From: Johan Hovold + +commit e0e7089bf9a87bc5e3997422e4e24563424f9018 upstream. + +The interconnect framework currently expects that providers are only +removed when there are no users and after all nodes have been removed. + +There is currently nothing that guarantees this to be the case and the +framework does not do any reference counting, but refusing to remove the +provider is never correct as that would leave a dangling pointer to a +resource that is about to be released in the global provider list (e.g. +accessible through debugfs). + +Replace the current sanity checks with WARN_ON() so that the provider is +always removed. + +Fixes: 11f1ceca7031 ("interconnect: Add generic on-chip interconnect API") +Cc: stable@vger.kernel.org # 5.1: 680f8666baf6: interconnect: Make icc_provider_del() return void +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Tested-by: Luca Ceresoli # i.MX8MP MSC SM2-MB-EP1 Board +Link: https://lore.kernel.org/r/20230306075651.2449-3-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/core.c | 14 ++------------ + 1 file changed, 2 insertions(+), 12 deletions(-) + +--- a/drivers/interconnect/core.c ++++ b/drivers/interconnect/core.c +@@ -1061,18 +1061,8 @@ EXPORT_SYMBOL_GPL(icc_provider_add); + void icc_provider_del(struct icc_provider *provider) + { + mutex_lock(&icc_lock); +- if (provider->users) { +- pr_warn("interconnect provider still has %d users\n", +- provider->users); +- mutex_unlock(&icc_lock); +- return; +- } +- +- if (!list_empty(&provider->nodes)) { +- pr_warn("interconnect provider still has nodes\n"); +- mutex_unlock(&icc_lock); +- return; +- } ++ WARN_ON(provider->users); ++ WARN_ON(!list_empty(&provider->nodes)); + + list_del(&provider->provider_list); + mutex_unlock(&icc_lock); diff --git a/queue-6.2/interconnect-fix-mem-leak-when-freeing-nodes.patch b/queue-6.2/interconnect-fix-mem-leak-when-freeing-nodes.patch new file mode 100644 index 00000000000..82ae96f112e --- /dev/null +++ b/queue-6.2/interconnect-fix-mem-leak-when-freeing-nodes.patch @@ -0,0 +1,37 @@ +From a5904f415e1af72fa8fe6665aa4f554dc2099a95 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:29 +0100 +Subject: interconnect: fix mem leak when freeing nodes + +From: Johan Hovold + +commit a5904f415e1af72fa8fe6665aa4f554dc2099a95 upstream. + +The node link array is allocated when adding links to a node but is not +deallocated when nodes are destroyed. + +Fixes: 11f1ceca7031 ("interconnect: Add generic on-chip interconnect API") +Cc: stable@vger.kernel.org # 5.1 +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Tested-by: Luca Ceresoli # i.MX8MP MSC SM2-MB-EP1 Board +Link: https://lore.kernel.org/r/20230306075651.2449-2-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/core.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/interconnect/core.c ++++ b/drivers/interconnect/core.c +@@ -850,6 +850,10 @@ void icc_node_destroy(int id) + + mutex_unlock(&icc_lock); + ++ if (!node) ++ return; ++ ++ kfree(node->links); + kfree(node); + } + EXPORT_SYMBOL_GPL(icc_node_destroy); diff --git a/queue-6.2/interconnect-fix-provider-registration-api.patch b/queue-6.2/interconnect-fix-provider-registration-api.patch new file mode 100644 index 00000000000..464edefa0d3 --- /dev/null +++ b/queue-6.2/interconnect-fix-provider-registration-api.patch @@ -0,0 +1,149 @@ +From eb59eca0d8ac15f8c1b7f1cd35999455a90292c0 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:31 +0100 +Subject: interconnect: fix provider registration API + +From: Johan Hovold + +commit eb59eca0d8ac15f8c1b7f1cd35999455a90292c0 upstream. + +The current interconnect provider interface is inherently racy as +providers are expected to be added before being fully initialised. + +Specifically, nodes are currently not added and the provider data is not +initialised until after registering the provider which can cause racing +DT lookups to fail. + +Add a new provider API which will be used to fix up the interconnect +drivers. + +The old API is reimplemented using the new interface and will be removed +once all drivers have been fixed. + +Fixes: 11f1ceca7031 ("interconnect: Add generic on-chip interconnect API") +Fixes: 87e3031b6fbd ("interconnect: Allow endpoints translation via DT") +Cc: stable@vger.kernel.org # 5.1 +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Tested-by: Luca Ceresoli # i.MX8MP MSC SM2-MB-EP1 Board +Link: https://lore.kernel.org/r/20230306075651.2449-4-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/core.c | 52 ++++++++++++++++++++++++---------- + include/linux/interconnect-provider.h | 12 +++++++ + 2 files changed, 50 insertions(+), 14 deletions(-) + +--- a/drivers/interconnect/core.c ++++ b/drivers/interconnect/core.c +@@ -1029,44 +1029,68 @@ int icc_nodes_remove(struct icc_provider + EXPORT_SYMBOL_GPL(icc_nodes_remove); + + /** +- * icc_provider_add() - add a new interconnect provider +- * @provider: the interconnect provider that will be added into topology ++ * icc_provider_init() - initialize a new interconnect provider ++ * @provider: the interconnect provider to initialize ++ * ++ * Must be called before adding nodes to the provider. ++ */ ++void icc_provider_init(struct icc_provider *provider) ++{ ++ WARN_ON(!provider->set); ++ ++ INIT_LIST_HEAD(&provider->nodes); ++} ++EXPORT_SYMBOL_GPL(icc_provider_init); ++ ++/** ++ * icc_provider_register() - register a new interconnect provider ++ * @provider: the interconnect provider to register + * + * Return: 0 on success, or an error code otherwise + */ +-int icc_provider_add(struct icc_provider *provider) ++int icc_provider_register(struct icc_provider *provider) + { +- if (WARN_ON(!provider->set)) +- return -EINVAL; + if (WARN_ON(!provider->xlate && !provider->xlate_extended)) + return -EINVAL; + + mutex_lock(&icc_lock); +- +- INIT_LIST_HEAD(&provider->nodes); + list_add_tail(&provider->provider_list, &icc_providers); +- + mutex_unlock(&icc_lock); + +- dev_dbg(provider->dev, "interconnect provider added to topology\n"); ++ dev_dbg(provider->dev, "interconnect provider registered\n"); + + return 0; + } +-EXPORT_SYMBOL_GPL(icc_provider_add); ++EXPORT_SYMBOL_GPL(icc_provider_register); + + /** +- * icc_provider_del() - delete previously added interconnect provider +- * @provider: the interconnect provider that will be removed from topology ++ * icc_provider_deregister() - deregister an interconnect provider ++ * @provider: the interconnect provider to deregister + */ +-void icc_provider_del(struct icc_provider *provider) ++void icc_provider_deregister(struct icc_provider *provider) + { + mutex_lock(&icc_lock); + WARN_ON(provider->users); +- WARN_ON(!list_empty(&provider->nodes)); + + list_del(&provider->provider_list); + mutex_unlock(&icc_lock); + } ++EXPORT_SYMBOL_GPL(icc_provider_deregister); ++ ++int icc_provider_add(struct icc_provider *provider) ++{ ++ icc_provider_init(provider); ++ ++ return icc_provider_register(provider); ++} ++EXPORT_SYMBOL_GPL(icc_provider_add); ++ ++void icc_provider_del(struct icc_provider *provider) ++{ ++ WARN_ON(!list_empty(&provider->nodes)); ++ ++ icc_provider_deregister(provider); ++} + EXPORT_SYMBOL_GPL(icc_provider_del); + + static int of_count_icc_providers(struct device_node *np) +--- a/include/linux/interconnect-provider.h ++++ b/include/linux/interconnect-provider.h +@@ -122,6 +122,9 @@ int icc_link_destroy(struct icc_node *sr + void icc_node_add(struct icc_node *node, struct icc_provider *provider); + void icc_node_del(struct icc_node *node); + int icc_nodes_remove(struct icc_provider *provider); ++void icc_provider_init(struct icc_provider *provider); ++int icc_provider_register(struct icc_provider *provider); ++void icc_provider_deregister(struct icc_provider *provider); + int icc_provider_add(struct icc_provider *provider); + void icc_provider_del(struct icc_provider *provider); + struct icc_node_data *of_icc_get_from_provider(struct of_phandle_args *spec); +@@ -167,6 +170,15 @@ static inline int icc_nodes_remove(struc + return -ENOTSUPP; + } + ++static inline void icc_provider_init(struct icc_provider *provider) { } ++ ++static inline int icc_provider_register(struct icc_provider *provider) ++{ ++ return -ENOTSUPP; ++} ++ ++static inline void icc_provider_deregister(struct icc_provider *provider) { } ++ + static inline int icc_provider_add(struct icc_provider *provider) + { + return -ENOTSUPP; diff --git a/queue-6.2/interconnect-imx-fix-registration-race.patch b/queue-6.2/interconnect-imx-fix-registration-race.patch new file mode 100644 index 00000000000..3f8869e3782 --- /dev/null +++ b/queue-6.2/interconnect-imx-fix-registration-race.patch @@ -0,0 +1,79 @@ +From 9fbd35520f1f7f3cbe1873939a27ad9b009f21f9 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:32 +0100 +Subject: interconnect: imx: fix registration race + +From: Johan Hovold + +commit 9fbd35520f1f7f3cbe1873939a27ad9b009f21f9 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: f0d8048525d7 ("interconnect: Add imx core driver") +Cc: stable@vger.kernel.org # 5.8 +Cc: Alexandre Bailon +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Tested-by: Luca Ceresoli # i.MX8MP MSC SM2-MB-EP1 Board +Link: https://lore.kernel.org/r/20230306075651.2449-5-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/imx/imx.c | 20 ++++++++++---------- + 1 file changed, 10 insertions(+), 10 deletions(-) + +--- a/drivers/interconnect/imx/imx.c ++++ b/drivers/interconnect/imx/imx.c +@@ -295,6 +295,9 @@ int imx_icc_register(struct platform_dev + provider->xlate = of_icc_xlate_onecell; + provider->data = data; + provider->dev = dev->parent; ++ ++ icc_provider_init(provider); ++ + platform_set_drvdata(pdev, imx_provider); + + if (settings) { +@@ -306,20 +309,18 @@ int imx_icc_register(struct platform_dev + } + } + +- ret = icc_provider_add(provider); +- if (ret) { +- dev_err(dev, "error adding interconnect provider: %d\n", ret); ++ ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings); ++ if (ret) + return ret; +- } + +- ret = imx_icc_register_nodes(imx_provider, nodes, nodes_count, settings); ++ ret = icc_provider_register(provider); + if (ret) +- goto provider_del; ++ goto err_unregister_nodes; + + return 0; + +-provider_del: +- icc_provider_del(provider); ++err_unregister_nodes: ++ imx_icc_unregister_nodes(&imx_provider->provider); + return ret; + } + EXPORT_SYMBOL_GPL(imx_icc_register); +@@ -328,9 +329,8 @@ void imx_icc_unregister(struct platform_ + { + struct imx_icc_provider *imx_provider = platform_get_drvdata(pdev); + ++ icc_provider_deregister(&imx_provider->provider); + imx_icc_unregister_nodes(&imx_provider->provider); +- +- icc_provider_del(&imx_provider->provider); + } + EXPORT_SYMBOL_GPL(imx_icc_unregister); + diff --git a/queue-6.2/interconnect-qcom-msm8974-fix-registration-race.patch b/queue-6.2/interconnect-qcom-msm8974-fix-registration-race.patch new file mode 100644 index 00000000000..b81e1a2c171 --- /dev/null +++ b/queue-6.2/interconnect-qcom-msm8974-fix-registration-race.patch @@ -0,0 +1,92 @@ +From bfe7bcd2b9f5215de2144f097f39971180e7ea54 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:39 +0100 +Subject: interconnect: qcom: msm8974: fix registration race + +From: Johan Hovold + +commit bfe7bcd2b9f5215de2144f097f39971180e7ea54 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: 4e60a9568dc6 ("interconnect: qcom: add msm8974 driver") +Cc: stable@vger.kernel.org # 5.5 +Reviewed-by: Brian Masney +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-12-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/qcom/msm8974.c | 20 ++++++++------------ + 1 file changed, 8 insertions(+), 12 deletions(-) + +--- a/drivers/interconnect/qcom/msm8974.c ++++ b/drivers/interconnect/qcom/msm8974.c +@@ -692,7 +692,6 @@ static int msm8974_icc_probe(struct plat + return ret; + + provider = &qp->provider; +- INIT_LIST_HEAD(&provider->nodes); + provider->dev = dev; + provider->set = msm8974_icc_set; + provider->aggregate = icc_std_aggregate; +@@ -700,11 +699,7 @@ static int msm8974_icc_probe(struct plat + provider->data = data; + provider->get_bw = msm8974_get_bw; + +- ret = icc_provider_add(provider); +- if (ret) { +- dev_err(dev, "error adding interconnect provider: %d\n", ret); +- goto err_disable_clks; +- } ++ icc_provider_init(provider); + + for (i = 0; i < num_nodes; i++) { + size_t j; +@@ -712,7 +707,7 @@ static int msm8974_icc_probe(struct plat + node = icc_node_create(qnodes[i]->id); + if (IS_ERR(node)) { + ret = PTR_ERR(node); +- goto err_del_icc; ++ goto err_remove_nodes; + } + + node->name = qnodes[i]->name; +@@ -729,15 +724,16 @@ static int msm8974_icc_probe(struct plat + } + data->num_nodes = num_nodes; + ++ ret = icc_provider_register(provider); ++ if (ret) ++ goto err_remove_nodes; ++ + platform_set_drvdata(pdev, qp); + + return 0; + +-err_del_icc: ++err_remove_nodes: + icc_nodes_remove(provider); +- icc_provider_del(provider); +- +-err_disable_clks: + clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); + + return ret; +@@ -747,9 +743,9 @@ static int msm8974_icc_remove(struct pla + { + struct msm8974_icc_provider *qp = platform_get_drvdata(pdev); + ++ icc_provider_deregister(&qp->provider); + icc_nodes_remove(&qp->provider); + clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); +- icc_provider_del(&qp->provider); + + return 0; + } diff --git a/queue-6.2/interconnect-qcom-osm-l3-fix-registration-race.patch b/queue-6.2/interconnect-qcom-osm-l3-fix-registration-race.patch new file mode 100644 index 00000000000..c14a9dc3980 --- /dev/null +++ b/queue-6.2/interconnect-qcom-osm-l3-fix-registration-race.patch @@ -0,0 +1,77 @@ +From 174941ed28a3573db075da46d95b4dcf9d4c49c2 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:33 +0100 +Subject: interconnect: qcom: osm-l3: fix registration race + +From: Johan Hovold + +commit 174941ed28a3573db075da46d95b4dcf9d4c49c2 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail: + + of_icc_xlate_onecell: invalid index 0 + cpu cpu0: error -EINVAL: error finding src node + cpu cpu0: dev_pm_opp_of_find_icc_paths: Unable to get path0: -22 + qcom-cpufreq-hw: probe of 18591000.cpufreq failed with error -22 + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: 5bc9900addaf ("interconnect: qcom: Add OSM L3 interconnect provider support") +Cc: stable@vger.kernel.org # 5.7 +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-6-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/qcom/osm-l3.c | 14 ++++++-------- + 1 file changed, 6 insertions(+), 8 deletions(-) + +--- a/drivers/interconnect/qcom/osm-l3.c ++++ b/drivers/interconnect/qcom/osm-l3.c +@@ -158,8 +158,8 @@ static int qcom_osm_l3_remove(struct pla + { + struct qcom_osm_l3_icc_provider *qp = platform_get_drvdata(pdev); + ++ icc_provider_deregister(&qp->provider); + icc_nodes_remove(&qp->provider); +- icc_provider_del(&qp->provider); + + return 0; + } +@@ -245,14 +245,9 @@ static int qcom_osm_l3_probe(struct plat + provider->set = qcom_osm_l3_set; + provider->aggregate = icc_std_aggregate; + provider->xlate = of_icc_xlate_onecell; +- INIT_LIST_HEAD(&provider->nodes); + provider->data = data; + +- ret = icc_provider_add(provider); +- if (ret) { +- dev_err(&pdev->dev, "error adding interconnect provider\n"); +- return ret; +- } ++ icc_provider_init(provider); + + for (i = 0; i < num_nodes; i++) { + size_t j; +@@ -275,12 +270,15 @@ static int qcom_osm_l3_probe(struct plat + } + data->num_nodes = num_nodes; + ++ ret = icc_provider_register(provider); ++ if (ret) ++ goto err; ++ + platform_set_drvdata(pdev, qp); + + return 0; + err: + icc_nodes_remove(provider); +- icc_provider_del(provider); + + return ret; + } diff --git a/queue-6.2/interconnect-qcom-rpm-fix-probe-child-node-error-handling.patch b/queue-6.2/interconnect-qcom-rpm-fix-probe-child-node-error-handling.patch new file mode 100644 index 00000000000..9241b38b1fa --- /dev/null +++ b/queue-6.2/interconnect-qcom-rpm-fix-probe-child-node-error-handling.patch @@ -0,0 +1,39 @@ +From bc463201f60803fa6bf2741d59441031cd0910e4 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:34 +0100 +Subject: interconnect: qcom: rpm: fix probe child-node error handling + +From: Johan Hovold + +commit bc463201f60803fa6bf2741d59441031cd0910e4 upstream. + +Make sure to clean up and release resources properly also in case probe +fails when populating child devices. + +Fixes: e39bf2972c6e ("interconnect: icc-rpm: Support child NoC device probe") +Cc: stable@vger.kernel.org # 5.17 +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-7-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/qcom/icc-rpm.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/drivers/interconnect/qcom/icc-rpm.c ++++ b/drivers/interconnect/qcom/icc-rpm.c +@@ -541,8 +541,11 @@ regmap_done: + platform_set_drvdata(pdev, qp); + + /* Populate child NoC devices if any */ +- if (of_get_child_count(dev->of_node) > 0) +- return of_platform_populate(dev->of_node, NULL, NULL, dev); ++ if (of_get_child_count(dev->of_node) > 0) { ++ ret = of_platform_populate(dev->of_node, NULL, NULL, dev); ++ if (ret) ++ goto err; ++ } + + return 0; + err: diff --git a/queue-6.2/interconnect-qcom-rpm-fix-registration-race.patch b/queue-6.2/interconnect-qcom-rpm-fix-registration-race.patch new file mode 100644 index 00000000000..89e6d414df4 --- /dev/null +++ b/queue-6.2/interconnect-qcom-rpm-fix-registration-race.patch @@ -0,0 +1,103 @@ +From 90ae93d8affc1061cd87ca8ddd9a838c7d31a158 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:36 +0100 +Subject: interconnect: qcom: rpm: fix registration race + +From: Johan Hovold + +commit 90ae93d8affc1061cd87ca8ddd9a838c7d31a158 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: 62feb14ee8a3 ("interconnect: qcom: Consolidate interconnect RPM support") +Fixes: 30c8fa3ec61a ("interconnect: qcom: Add MSM8916 interconnect provider driver") +Cc: stable@vger.kernel.org # 5.7 +Reviewed-by: Konrad Dybcio +Reviewed-by: Jun Nie +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-9-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/qcom/icc-rpm.c | 24 ++++++++++++------------ + 1 file changed, 12 insertions(+), 12 deletions(-) + +--- a/drivers/interconnect/qcom/icc-rpm.c ++++ b/drivers/interconnect/qcom/icc-rpm.c +@@ -503,7 +503,6 @@ regmap_done: + } + + provider = &qp->provider; +- INIT_LIST_HEAD(&provider->nodes); + provider->dev = dev; + provider->set = qcom_icc_set; + provider->pre_aggregate = qcom_icc_pre_bw_aggregate; +@@ -511,12 +510,7 @@ regmap_done: + provider->xlate_extended = qcom_icc_xlate_extended; + provider->data = data; + +- ret = icc_provider_add(provider); +- if (ret) { +- dev_err(dev, "error adding interconnect provider: %d\n", ret); +- clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); +- return ret; +- } ++ icc_provider_init(provider); + + for (i = 0; i < num_nodes; i++) { + size_t j; +@@ -524,7 +518,7 @@ regmap_done: + node = icc_node_create(qnodes[i]->id); + if (IS_ERR(node)) { + ret = PTR_ERR(node); +- goto err; ++ goto err_remove_nodes; + } + + node->name = qnodes[i]->name; +@@ -538,20 +532,26 @@ regmap_done: + } + data->num_nodes = num_nodes; + ++ ret = icc_provider_register(provider); ++ if (ret) ++ goto err_remove_nodes; ++ + platform_set_drvdata(pdev, qp); + + /* Populate child NoC devices if any */ + if (of_get_child_count(dev->of_node) > 0) { + ret = of_platform_populate(dev->of_node, NULL, NULL, dev); + if (ret) +- goto err; ++ goto err_deregister_provider; + } + + return 0; +-err: ++ ++err_deregister_provider: ++ icc_provider_deregister(provider); ++err_remove_nodes: + icc_nodes_remove(provider); + clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); +- icc_provider_del(provider); + + return ret; + } +@@ -561,9 +561,9 @@ int qnoc_remove(struct platform_device * + { + struct qcom_icc_provider *qp = platform_get_drvdata(pdev); + ++ icc_provider_deregister(&qp->provider); + icc_nodes_remove(&qp->provider); + clk_bulk_disable_unprepare(qp->num_clks, qp->bus_clks); +- icc_provider_del(&qp->provider); + + return 0; + } diff --git a/queue-6.2/interconnect-qcom-rpmh-fix-probe-child-node-error-handling.patch b/queue-6.2/interconnect-qcom-rpmh-fix-probe-child-node-error-handling.patch new file mode 100644 index 00000000000..f72263fc851 --- /dev/null +++ b/queue-6.2/interconnect-qcom-rpmh-fix-probe-child-node-error-handling.patch @@ -0,0 +1,40 @@ +From 6570d1d46eeade82965ccc4a3ab7d778898ef4bf Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:37 +0100 +Subject: interconnect: qcom: rpmh: fix probe child-node error handling + +From: Johan Hovold + +commit 6570d1d46eeade82965ccc4a3ab7d778898ef4bf upstream. + +Make sure to clean up and release resources properly also in case probe +fails when populating child devices. + +Fixes: 57eb14779dfd ("interconnect: qcom: icc-rpmh: Support child NoC device probe") +Cc: stable@vger.kernel.org # 6.0 +Cc: Luca Weiss +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-10-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/qcom/icc-rpmh.c | 7 +++++-- + 1 file changed, 5 insertions(+), 2 deletions(-) + +--- a/drivers/interconnect/qcom/icc-rpmh.c ++++ b/drivers/interconnect/qcom/icc-rpmh.c +@@ -235,8 +235,11 @@ int qcom_icc_rpmh_probe(struct platform_ + platform_set_drvdata(pdev, qp); + + /* Populate child NoC devices if any */ +- if (of_get_child_count(dev->of_node) > 0) +- return of_platform_populate(dev->of_node, NULL, NULL, dev); ++ if (of_get_child_count(dev->of_node) > 0) { ++ ret = of_platform_populate(dev->of_node, NULL, NULL, dev); ++ if (ret) ++ goto err; ++ } + + return 0; + err: diff --git a/queue-6.2/interconnect-qcom-rpmh-fix-registration-race.patch b/queue-6.2/interconnect-qcom-rpmh-fix-registration-race.patch new file mode 100644 index 00000000000..e9926e01904 --- /dev/null +++ b/queue-6.2/interconnect-qcom-rpmh-fix-registration-race.patch @@ -0,0 +1,102 @@ +From 74240a5bebd48d8b843c6d0f1acfaa722a5abeb7 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:38 +0100 +Subject: interconnect: qcom: rpmh: fix registration race + +From: Johan Hovold + +commit 74240a5bebd48d8b843c6d0f1acfaa722a5abeb7 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: 976daac4a1c5 ("interconnect: qcom: Consolidate interconnect RPMh support") +Cc: stable@vger.kernel.org # 5.7 +Reviewed-by: Konrad Dybcio +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-11-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/interconnect/qcom/icc-rpmh.c | 25 +++++++++++++++---------- + 1 file changed, 15 insertions(+), 10 deletions(-) + +--- a/drivers/interconnect/qcom/icc-rpmh.c ++++ b/drivers/interconnect/qcom/icc-rpmh.c +@@ -192,9 +192,10 @@ int qcom_icc_rpmh_probe(struct platform_ + provider->pre_aggregate = qcom_icc_pre_aggregate; + provider->aggregate = qcom_icc_aggregate; + provider->xlate_extended = qcom_icc_xlate_extended; +- INIT_LIST_HEAD(&provider->nodes); + provider->data = data; + ++ icc_provider_init(provider); ++ + qp->dev = dev; + qp->bcms = desc->bcms; + qp->num_bcms = desc->num_bcms; +@@ -203,10 +204,6 @@ int qcom_icc_rpmh_probe(struct platform_ + if (IS_ERR(qp->voter)) + return PTR_ERR(qp->voter); + +- ret = icc_provider_add(provider); +- if (ret) +- return ret; +- + for (i = 0; i < qp->num_bcms; i++) + qcom_icc_bcm_init(qp->bcms[i], dev); + +@@ -218,7 +215,7 @@ int qcom_icc_rpmh_probe(struct platform_ + node = icc_node_create(qn->id); + if (IS_ERR(node)) { + ret = PTR_ERR(node); +- goto err; ++ goto err_remove_nodes; + } + + node->name = qn->name; +@@ -232,19 +229,27 @@ int qcom_icc_rpmh_probe(struct platform_ + } + + data->num_nodes = num_nodes; ++ ++ ret = icc_provider_register(provider); ++ if (ret) ++ goto err_remove_nodes; ++ + platform_set_drvdata(pdev, qp); + + /* Populate child NoC devices if any */ + if (of_get_child_count(dev->of_node) > 0) { + ret = of_platform_populate(dev->of_node, NULL, NULL, dev); + if (ret) +- goto err; ++ goto err_deregister_provider; + } + + return 0; +-err: ++ ++err_deregister_provider: ++ icc_provider_deregister(provider); ++err_remove_nodes: + icc_nodes_remove(provider); +- icc_provider_del(provider); ++ + return ret; + } + EXPORT_SYMBOL_GPL(qcom_icc_rpmh_probe); +@@ -253,8 +258,8 @@ int qcom_icc_rpmh_remove(struct platform + { + struct qcom_icc_provider *qp = platform_get_drvdata(pdev); + ++ icc_provider_deregister(&qp->provider); + icc_nodes_remove(&qp->provider); +- icc_provider_del(&qp->provider); + + return 0; + } diff --git a/queue-6.2/md-select-block_legacy_autoload.patch b/queue-6.2/md-select-block_legacy_autoload.patch new file mode 100644 index 00000000000..26d8350f743 --- /dev/null +++ b/queue-6.2/md-select-block_legacy_autoload.patch @@ -0,0 +1,39 @@ +From 6c0f5898836c05c6d850a750ed7940ba29e4e6c5 Mon Sep 17 00:00:00 2001 +From: NeilBrown +Date: Mon, 13 Mar 2023 13:29:17 -0700 +Subject: md: select BLOCK_LEGACY_AUTOLOAD + +From: NeilBrown + +commit 6c0f5898836c05c6d850a750ed7940ba29e4e6c5 upstream. + +When BLOCK_LEGACY_AUTOLOAD is not enable, mdadm is not able to +activate new arrays unless "CREATE names=yes" appears in +mdadm.conf + +As this is a regression we need to always enable BLOCK_LEGACY_AUTOLOAD +for when MD is selected - at least until mdadm is updated and the +updates widely available. + +Cc: stable@vger.kernel.org # v5.18+ +Fixes: fbdee71bb5d8 ("block: deprecate autoloading based on dev_t") +Signed-off-by: NeilBrown +Signed-off-by: Song Liu +Signed-off-by: Greg Kroah-Hartman +--- + drivers/md/Kconfig | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/md/Kconfig ++++ b/drivers/md/Kconfig +@@ -16,6 +16,10 @@ if MD + config BLK_DEV_MD + tristate "RAID support" + select BLOCK_HOLDER_DEPRECATED if SYSFS ++ # BLOCK_LEGACY_AUTOLOAD requirement should be removed ++ # after relevant mdadm enhancements - to make "names=yes" ++ # the default - are widely available. ++ select BLOCK_LEGACY_AUTOLOAD + help + This driver lets you combine several hard disk partitions into one + logical block device. This can be used to simply append one diff --git a/queue-6.2/memory-tegra-fix-interconnect-registration-race.patch b/queue-6.2/memory-tegra-fix-interconnect-registration-race.patch new file mode 100644 index 00000000000..e17677bfe20 --- /dev/null +++ b/queue-6.2/memory-tegra-fix-interconnect-registration-race.patch @@ -0,0 +1,67 @@ +From 5553055c62683ce339f9ef5fb2a26c8331485d68 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:45 +0100 +Subject: memory: tegra: fix interconnect registration race + +From: Johan Hovold + +commit 5553055c62683ce339f9ef5fb2a26c8331485d68 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: 06f079816d4c ("memory: tegra-mc: Add interconnect framework") +Cc: stable@vger.kernel.org # 5.11 +Cc: Dmitry Osipenko +Acked-by: Krzysztof Kozlowski +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-18-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/memory/tegra/mc.c | 16 +++++++--------- + 1 file changed, 7 insertions(+), 9 deletions(-) + +--- a/drivers/memory/tegra/mc.c ++++ b/drivers/memory/tegra/mc.c +@@ -794,16 +794,12 @@ static int tegra_mc_interconnect_setup(s + mc->provider.aggregate = mc->soc->icc_ops->aggregate; + mc->provider.xlate_extended = mc->soc->icc_ops->xlate_extended; + +- err = icc_provider_add(&mc->provider); +- if (err) +- return err; ++ icc_provider_init(&mc->provider); + + /* create Memory Controller node */ + node = icc_node_create(TEGRA_ICC_MC); +- if (IS_ERR(node)) { +- err = PTR_ERR(node); +- goto del_provider; +- } ++ if (IS_ERR(node)) ++ return PTR_ERR(node); + + node->name = "Memory Controller"; + icc_node_add(node, &mc->provider); +@@ -830,12 +826,14 @@ static int tegra_mc_interconnect_setup(s + goto remove_nodes; + } + ++ err = icc_provider_register(&mc->provider); ++ if (err) ++ goto remove_nodes; ++ + return 0; + + remove_nodes: + icc_nodes_remove(&mc->provider); +-del_provider: +- icc_provider_del(&mc->provider); + + return err; + } diff --git a/queue-6.2/memory-tegra124-emc-fix-interconnect-registration-race.patch b/queue-6.2/memory-tegra124-emc-fix-interconnect-registration-race.patch new file mode 100644 index 00000000000..2de34b23453 --- /dev/null +++ b/queue-6.2/memory-tegra124-emc-fix-interconnect-registration-race.patch @@ -0,0 +1,65 @@ +From abd9f1b49cf25eebeaba193c7707355be3f48dae Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:46 +0100 +Subject: memory: tegra124-emc: fix interconnect registration race + +From: Johan Hovold + +commit abd9f1b49cf25eebeaba193c7707355be3f48dae upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: 380def2d4cf2 ("memory: tegra124: Support interconnect framework") +Cc: stable@vger.kernel.org # 5.12 +Cc: Dmitry Osipenko +Acked-by: Krzysztof Kozlowski +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-19-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/memory/tegra/tegra124-emc.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/memory/tegra/tegra124-emc.c ++++ b/drivers/memory/tegra/tegra124-emc.c +@@ -1351,15 +1351,13 @@ static int tegra_emc_interconnect_init(s + emc->provider.aggregate = soc->icc_ops->aggregate; + emc->provider.xlate_extended = emc_of_icc_xlate_extended; + +- err = icc_provider_add(&emc->provider); +- if (err) +- goto err_msg; ++ icc_provider_init(&emc->provider); + + /* create External Memory Controller node */ + node = icc_node_create(TEGRA_ICC_EMC); + if (IS_ERR(node)) { + err = PTR_ERR(node); +- goto del_provider; ++ goto err_msg; + } + + node->name = "External Memory Controller"; +@@ -1380,12 +1378,14 @@ static int tegra_emc_interconnect_init(s + node->name = "External Memory (DRAM)"; + icc_node_add(node, &emc->provider); + ++ err = icc_provider_register(&emc->provider); ++ if (err) ++ goto remove_nodes; ++ + return 0; + + remove_nodes: + icc_nodes_remove(&emc->provider); +-del_provider: +- icc_provider_del(&emc->provider); + err_msg: + dev_err(emc->dev, "failed to initialize ICC: %d\n", err); + diff --git a/queue-6.2/memory-tegra20-emc-fix-interconnect-registration-race.patch b/queue-6.2/memory-tegra20-emc-fix-interconnect-registration-race.patch new file mode 100644 index 00000000000..0fdb0433baf --- /dev/null +++ b/queue-6.2/memory-tegra20-emc-fix-interconnect-registration-race.patch @@ -0,0 +1,65 @@ +From c5587f61ec050f7e9ebb3e2da29d12af63e833d3 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:47 +0100 +Subject: memory: tegra20-emc: fix interconnect registration race + +From: Johan Hovold + +commit c5587f61ec050f7e9ebb3e2da29d12af63e833d3 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: d5ef16ba5fbe ("memory: tegra20: Support interconnect framework") +Cc: stable@vger.kernel.org # 5.11 +Cc: Dmitry Osipenko +Acked-by: Krzysztof Kozlowski +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-20-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/memory/tegra/tegra20-emc.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/memory/tegra/tegra20-emc.c ++++ b/drivers/memory/tegra/tegra20-emc.c +@@ -1021,15 +1021,13 @@ static int tegra_emc_interconnect_init(s + emc->provider.aggregate = soc->icc_ops->aggregate; + emc->provider.xlate_extended = emc_of_icc_xlate_extended; + +- err = icc_provider_add(&emc->provider); +- if (err) +- goto err_msg; ++ icc_provider_init(&emc->provider); + + /* create External Memory Controller node */ + node = icc_node_create(TEGRA_ICC_EMC); + if (IS_ERR(node)) { + err = PTR_ERR(node); +- goto del_provider; ++ goto err_msg; + } + + node->name = "External Memory Controller"; +@@ -1050,12 +1048,14 @@ static int tegra_emc_interconnect_init(s + node->name = "External Memory (DRAM)"; + icc_node_add(node, &emc->provider); + ++ err = icc_provider_register(&emc->provider); ++ if (err) ++ goto remove_nodes; ++ + return 0; + + remove_nodes: + icc_nodes_remove(&emc->provider); +-del_provider: +- icc_provider_del(&emc->provider); + err_msg: + dev_err(emc->dev, "failed to initialize ICC: %d\n", err); + diff --git a/queue-6.2/memory-tegra30-emc-fix-interconnect-registration-race.patch b/queue-6.2/memory-tegra30-emc-fix-interconnect-registration-race.patch new file mode 100644 index 00000000000..e5ff378b5ac --- /dev/null +++ b/queue-6.2/memory-tegra30-emc-fix-interconnect-registration-race.patch @@ -0,0 +1,65 @@ +From 9db481c909dd6312ccfbdc7e343b50e41c727483 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Mon, 6 Mar 2023 08:56:48 +0100 +Subject: memory: tegra30-emc: fix interconnect registration race + +From: Johan Hovold + +commit 9db481c909dd6312ccfbdc7e343b50e41c727483 upstream. + +The current interconnect provider registration interface is inherently +racy as nodes are not added until the after adding the provider. This +can specifically cause racing DT lookups to fail. + +Switch to using the new API where the provider is not registered until +after it has been fully initialised. + +Fixes: d5ef16ba5fbe ("memory: tegra20: Support interconnect framework") +Cc: stable@vger.kernel.org # 5.11 +Cc: Dmitry Osipenko +Acked-by: Krzysztof Kozlowski +Signed-off-by: Johan Hovold +Link: https://lore.kernel.org/r/20230306075651.2449-21-johan+linaro@kernel.org +Signed-off-by: Georgi Djakov +Signed-off-by: Greg Kroah-Hartman +--- + drivers/memory/tegra/tegra30-emc.c | 12 ++++++------ + 1 file changed, 6 insertions(+), 6 deletions(-) + +--- a/drivers/memory/tegra/tegra30-emc.c ++++ b/drivers/memory/tegra/tegra30-emc.c +@@ -1533,15 +1533,13 @@ static int tegra_emc_interconnect_init(s + emc->provider.aggregate = soc->icc_ops->aggregate; + emc->provider.xlate_extended = emc_of_icc_xlate_extended; + +- err = icc_provider_add(&emc->provider); +- if (err) +- goto err_msg; ++ icc_provider_init(&emc->provider); + + /* create External Memory Controller node */ + node = icc_node_create(TEGRA_ICC_EMC); + if (IS_ERR(node)) { + err = PTR_ERR(node); +- goto del_provider; ++ goto err_msg; + } + + node->name = "External Memory Controller"; +@@ -1562,12 +1560,14 @@ static int tegra_emc_interconnect_init(s + node->name = "External Memory (DRAM)"; + icc_node_add(node, &emc->provider); + ++ err = icc_provider_register(&emc->provider); ++ if (err) ++ goto remove_nodes; ++ + return 0; + + remove_nodes: + icc_nodes_remove(&emc->provider); +-del_provider: +- icc_provider_del(&emc->provider); + err_msg: + dev_err(emc->dev, "failed to initialize ICC: %d\n", err); + diff --git a/queue-6.2/s390-ipl-add-missing-intersection-check-to-ipl_report-handling.patch b/queue-6.2/s390-ipl-add-missing-intersection-check-to-ipl_report-handling.patch new file mode 100644 index 00000000000..dc1dc9984f5 --- /dev/null +++ b/queue-6.2/s390-ipl-add-missing-intersection-check-to-ipl_report-handling.patch @@ -0,0 +1,50 @@ +From a52e5cdbe8016d4e3e6322fd93d71afddb9a5af9 Mon Sep 17 00:00:00 2001 +From: Sven Schnelle +Date: Tue, 7 Mar 2023 14:35:23 +0100 +Subject: s390/ipl: add missing intersection check to ipl_report handling + +From: Sven Schnelle + +commit a52e5cdbe8016d4e3e6322fd93d71afddb9a5af9 upstream. + +The code which handles the ipl report is searching for a free location +in memory where it could copy the component and certificate entries to. +It checks for intersection between the sections required for the kernel +and the component/certificate data area, but fails to check whether +the data structures linking these data areas together intersect. + +This might cause the iplreport copy code to overwrite the iplreport +itself. Fix this by adding two addtional intersection checks. + +Cc: +Fixes: 9641b8cc733f ("s390/ipl: read IPL report at early boot") +Signed-off-by: Sven Schnelle +Reviewed-by: Vasily Gorbik +Signed-off-by: Vasily Gorbik +Signed-off-by: Greg Kroah-Hartman +--- + arch/s390/boot/ipl_report.c | 8 ++++++++ + 1 file changed, 8 insertions(+) + +--- a/arch/s390/boot/ipl_report.c ++++ b/arch/s390/boot/ipl_report.c +@@ -57,11 +57,19 @@ repeat: + if (IS_ENABLED(CONFIG_BLK_DEV_INITRD) && initrd_data.start && initrd_data.size && + intersects(initrd_data.start, initrd_data.size, safe_addr, size)) + safe_addr = initrd_data.start + initrd_data.size; ++ if (intersects(safe_addr, size, (unsigned long)comps, comps->len)) { ++ safe_addr = (unsigned long)comps + comps->len; ++ goto repeat; ++ } + for_each_rb_entry(comp, comps) + if (intersects(safe_addr, size, comp->addr, comp->len)) { + safe_addr = comp->addr + comp->len; + goto repeat; + } ++ if (intersects(safe_addr, size, (unsigned long)certs, certs->len)) { ++ safe_addr = (unsigned long)certs + certs->len; ++ goto repeat; ++ } + for_each_rb_entry(cert, certs) + if (intersects(safe_addr, size, cert->addr, cert->len)) { + safe_addr = cert->addr + cert->len; diff --git a/queue-6.2/serial-qcom-geni-fix-console-shutdown-hang.patch b/queue-6.2/serial-qcom-geni-fix-console-shutdown-hang.patch new file mode 100644 index 00000000000..77e9d121ca0 --- /dev/null +++ b/queue-6.2/serial-qcom-geni-fix-console-shutdown-hang.patch @@ -0,0 +1,49 @@ +From 9aff74cc4e9eb841dde5fd009ed7ddca5db40e68 Mon Sep 17 00:00:00 2001 +From: Johan Hovold +Date: Tue, 7 Mar 2023 17:44:02 +0100 +Subject: serial: qcom-geni: fix console shutdown hang + +From: Johan Hovold + +commit 9aff74cc4e9eb841dde5fd009ed7ddca5db40e68 upstream. + +A recent commit added back the calls top stop tx and rx to shutdown() +which had previously been removed by commit e83766334f96 ("tty: serial: +qcom_geni_serial: No need to stop tx/rx on UART shutdown") in order to +be able to use kgdb after stopping the getty. + +Not only did this again break kgdb, but it also broke serial consoles +more generally by hanging TX when stopping the getty during reboot. + +The underlying problem has been there since the driver was first merged +and fixing it is going to be a bit involved so simply stop calling the +broken stop functions during shutdown for consoles for now. + +Fixes: d8aca2f96813 ("tty: serial: qcom-geni-serial: stop operations in progress at shutdown") +Cc: stable +Cc: Bartosz Golaszewski +Signed-off-by: Johan Hovold +Reviewed-by: Douglas Anderson +Reviewed-by: Srinivas Kandagatla +Tested-by: Srinivas Kandagatla +Reviewed-by: Andrew Halaney +Tested-by: Andrew Halaney # sa8540p-ride +Link: https://lore.kernel.org/r/20230307164405.14218-2-johan+linaro@kernel.org +Signed-off-by: Greg Kroah-Hartman +--- + drivers/tty/serial/qcom_geni_serial.c | 4 ++++ + 1 file changed, 4 insertions(+) + +--- a/drivers/tty/serial/qcom_geni_serial.c ++++ b/drivers/tty/serial/qcom_geni_serial.c +@@ -891,6 +891,10 @@ static int setup_fifos(struct qcom_geni_ + static void qcom_geni_serial_shutdown(struct uart_port *uport) + { + disable_irq(uport->irq); ++ ++ if (uart_console(uport)) ++ return; ++ + qcom_geni_serial_stop_tx(uport); + qcom_geni_serial_stop_rx(uport); + } diff --git a/queue-6.2/series b/queue-6.2/series index 24044b648f1..f282683273e 100644 --- a/queue-6.2/series +++ b/queue-6.2/series @@ -121,3 +121,25 @@ serial-8250_em-fix-uart-port-type.patch serial-8250_fsl-fix-handle_irq-locking.patch serial-8250-aspeed_vuart-select-regmap-instead-of-depending-on-it.patch tty-serial-qcom-geni-serial-stop-operations-in-progress-at-shutdown.patch +serial-qcom-geni-fix-console-shutdown-hang.patch +firmware-xilinx-don-t-make-a-sleepable-memory-allocation-from-an-atomic-context.patch +memory-tegra-fix-interconnect-registration-race.patch +memory-tegra20-emc-fix-interconnect-registration-race.patch +memory-tegra124-emc-fix-interconnect-registration-race.patch +memory-tegra30-emc-fix-interconnect-registration-race.patch +drm-ttm-fix-a-null-pointer-dereference.patch +s390-ipl-add-missing-intersection-check-to-ipl_report-handling.patch +interconnect-fix-icc_provider_del-error-handling.patch +interconnect-fix-provider-registration-api.patch +interconnect-imx-fix-registration-race.patch +interconnect-fix-mem-leak-when-freeing-nodes.patch +interconnect-qcom-osm-l3-fix-registration-race.patch +interconnect-qcom-rpm-fix-probe-child-node-error-handling.patch +interconnect-qcom-rpm-fix-registration-race.patch +interconnect-qcom-rpmh-fix-probe-child-node-error-handling.patch +interconnect-qcom-rpmh-fix-registration-race.patch +interconnect-qcom-msm8974-fix-registration-race.patch +interconnect-exynos-fix-node-leak-in-probe-pm-qos-error-path.patch +interconnect-exynos-fix-registration-race.patch +md-select-block_legacy_autoload.patch +cifs-generate-signkey-for-the-channel-that-s-reconnecting.patch