--- /dev/null
+From 92015aa453274281fe320010b17d87d74fb43b68 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 6 Mar 2023 08:56:39 +0100
+Subject: interconnect: qcom: msm8974: fix registration race
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+[ Upstream commit bfe7bcd2b9f5215de2144f097f39971180e7ea54 ]
+
+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 <bmasney@redhat.com>
+Reviewed-by: Konrad Dybcio <konrad.dybcio@linaro.org>
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20230306075651.2449-12-johan+linaro@kernel.org
+Signed-off-by: Georgi Djakov <djakov@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/interconnect/qcom/msm8974.c | 22 ++++++++++------------
+ 1 file changed, 10 insertions(+), 12 deletions(-)
+
+diff --git a/drivers/interconnect/qcom/msm8974.c b/drivers/interconnect/qcom/msm8974.c
+index da68ce375a89d..e1489930191d2 100644
+--- a/drivers/interconnect/qcom/msm8974.c
++++ b/drivers/interconnect/qcom/msm8974.c
+@@ -692,7 +692,6 @@ static int msm8974_icc_probe(struct platform_device *pdev)
+ 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 platform_device *pdev)
+ 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 platform_device *pdev)
+ 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 platform_device *pdev)
+ }
+ 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,11 @@ static int msm8974_icc_remove(struct platform_device *pdev)
+ {
+ 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);
+- return icc_provider_del(&qp->provider);
++
++ return 0;
+ }
+
+ static const struct of_device_id msm8974_noc_of_match[] = {
+--
+2.39.2
+
--- /dev/null
+From a658ac43d186f542888c6c371d4d2c15bedfcb49 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 5 Jan 2023 02:22:19 +0200
+Subject: interconnect: qcom: osm-l3: fix icc_onecell_data allocation
+
+From: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+
+[ Upstream commit f77ebdda0ee652124061c2ac42399bb6c367e729 ]
+
+This is a struct with a trailing zero-length array of icc_node pointers
+but it's allocated as if it were a single array of icc_nodes instead.
+
+Fortunately this overallocates memory rather then allocating less memory
+than required.
+
+Fix by replacing devm_kcalloc() with devm_kzalloc() and struct_size()
+macro.
+
+Fixes: 5bc9900addaf ("interconnect: qcom: Add OSM L3 interconnect provider support")
+Signed-off-by: Dmitry Baryshkov <dmitry.baryshkov@linaro.org>
+Link: https://lore.kernel.org/r/20230105002221.1416479-2-dmitry.baryshkov@linaro.org
+Signed-off-by: Georgi Djakov <djakov@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/interconnect/qcom/osm-l3.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/interconnect/qcom/osm-l3.c b/drivers/interconnect/qcom/osm-l3.c
+index c7af143980de4..87edab1bf987b 100644
+--- a/drivers/interconnect/qcom/osm-l3.c
++++ b/drivers/interconnect/qcom/osm-l3.c
+@@ -275,7 +275,7 @@ static int qcom_osm_l3_probe(struct platform_device *pdev)
+ qnodes = desc->nodes;
+ num_nodes = desc->num_nodes;
+
+- data = devm_kcalloc(&pdev->dev, num_nodes, sizeof(*node), GFP_KERNEL);
++ data = devm_kzalloc(&pdev->dev, struct_size(data, nodes, num_nodes), GFP_KERNEL);
+ if (!data)
+ return -ENOMEM;
+
+--
+2.39.2
+
--- /dev/null
+From f2af30bfe98d839c192d36dfbebde92e99e297ed Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 6 Mar 2023 08:56:38 +0100
+Subject: interconnect: qcom: rpmh: fix registration race
+
+From: Johan Hovold <johan+linaro@kernel.org>
+
+[ Upstream commit 74240a5bebd48d8b843c6d0f1acfaa722a5abeb7 ]
+
+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 <konrad.dybcio@linaro.org>
+Signed-off-by: Johan Hovold <johan+linaro@kernel.org>
+Link: https://lore.kernel.org/r/20230306075651.2449-11-johan+linaro@kernel.org
+Signed-off-by: Georgi Djakov <djakov@kernel.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/interconnect/qcom/icc-rpmh.c | 23 ++++++++++++++---------
+ 1 file changed, 14 insertions(+), 9 deletions(-)
+
+diff --git a/drivers/interconnect/qcom/icc-rpmh.c b/drivers/interconnect/qcom/icc-rpmh.c
+index 2c8e12549804b..c51c39754f4b1 100644
+--- a/drivers/interconnect/qcom/icc-rpmh.c
++++ b/drivers/interconnect/qcom/icc-rpmh.c
+@@ -216,9 +216,10 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
+ 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;
+@@ -227,10 +228,6 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
+ 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);
+
+@@ -242,7 +239,7 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
+ node = icc_node_create(qn->id);
+ if (IS_ERR(node)) {
+ ret = PTR_ERR(node);
+- goto err;
++ goto err_remove_nodes;
+ }
+
+ node->name = qn->name;
+@@ -256,12 +253,18 @@ int qcom_icc_rpmh_probe(struct platform_device *pdev)
+ }
+
+ data->num_nodes = num_nodes;
++
++ ret = icc_provider_register(provider);
++ if (ret)
++ goto err_remove_nodes;
++
+ platform_set_drvdata(pdev, qp);
+
+ return 0;
+-err:
++
++err_remove_nodes:
+ icc_nodes_remove(provider);
+- icc_provider_del(provider);
++
+ return ret;
+ }
+ EXPORT_SYMBOL_GPL(qcom_icc_rpmh_probe);
+@@ -270,8 +273,10 @@ int qcom_icc_rpmh_remove(struct platform_device *pdev)
+ {
+ struct qcom_icc_provider *qp = platform_get_drvdata(pdev);
+
++ icc_provider_deregister(&qp->provider);
+ icc_nodes_remove(&qp->provider);
+- return icc_provider_del(&qp->provider);
++
++ return 0;
+ }
+ EXPORT_SYMBOL_GPL(qcom_icc_rpmh_remove);
+
+--
+2.39.2
+
--- /dev/null
+From d7ae8c0686c555176724e21eca4d3eb4624a803f Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 14 Jan 2022 14:02:52 -0800
+Subject: kthread: add the helper function kthread_run_on_cpu()
+
+From: Cai Huoqing <caihuoqing@baidu.com>
+
+[ Upstream commit 800977f6f32e452cba6b04ef21d2f5383ca29209 ]
+
+Add a new helper function kthread_run_on_cpu(), which includes
+kthread_create_on_cpu/wake_up_process().
+
+In some cases, use kthread_run_on_cpu() directly instead of
+kthread_create_on_node/kthread_bind/wake_up_process() or
+kthread_create_on_cpu/wake_up_process() or
+kthreadd_create/kthread_bind/wake_up_process() to simplify the code.
+
+[akpm@linux-foundation.org: export kthread_create_on_cpu to modules]
+
+Link: https://lkml.kernel.org/r/20211022025711.3673-2-caihuoqing@baidu.com
+Signed-off-by: Cai Huoqing <caihuoqing@baidu.com>
+Cc: Bernard Metzler <bmt@zurich.ibm.com>
+Cc: Cai Huoqing <caihuoqing@baidu.com>
+Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
+Cc: Davidlohr Bueso <dave@stgolabs.net>
+Cc: Doug Ledford <dledford@redhat.com>
+Cc: Ingo Molnar <mingo@redhat.com>
+Cc: Jason Gunthorpe <jgg@ziepe.ca>
+Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
+Cc: Josh Triplett <josh@joshtriplett.org>
+Cc: Lai Jiangshan <jiangshanlai@gmail.com>
+Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+Cc: "Paul E . McKenney" <paulmck@kernel.org>
+Cc: Steven Rostedt <rostedt@goodmis.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Stable-dep-of: 08697bca9bbb ("trace/hwlat: Do not start per-cpu thread if it is already running")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ include/linux/kthread.h | 25 +++++++++++++++++++++++++
+ kernel/kthread.c | 1 +
+ 2 files changed, 26 insertions(+)
+
+diff --git a/include/linux/kthread.h b/include/linux/kthread.h
+index 346b0f269161a..db47aae7c481b 100644
+--- a/include/linux/kthread.h
++++ b/include/linux/kthread.h
+@@ -56,6 +56,31 @@ bool kthread_is_per_cpu(struct task_struct *k);
+ __k; \
+ })
+
++/**
++ * kthread_run_on_cpu - create and wake a cpu bound thread.
++ * @threadfn: the function to run until signal_pending(current).
++ * @data: data ptr for @threadfn.
++ * @cpu: The cpu on which the thread should be bound,
++ * @namefmt: printf-style name for the thread. Format is restricted
++ * to "name.*%u". Code fills in cpu number.
++ *
++ * Description: Convenient wrapper for kthread_create_on_cpu()
++ * followed by wake_up_process(). Returns the kthread or
++ * ERR_PTR(-ENOMEM).
++ */
++static inline struct task_struct *
++kthread_run_on_cpu(int (*threadfn)(void *data), void *data,
++ unsigned int cpu, const char *namefmt)
++{
++ struct task_struct *p;
++
++ p = kthread_create_on_cpu(threadfn, data, cpu, namefmt);
++ if (!IS_ERR(p))
++ wake_up_process(p);
++
++ return p;
++}
++
+ void free_kthread_struct(struct task_struct *k);
+ void kthread_bind(struct task_struct *k, unsigned int cpu);
+ void kthread_bind_mask(struct task_struct *k, const struct cpumask *mask);
+diff --git a/kernel/kthread.c b/kernel/kthread.c
+index 5b37a8567168b..e319a1b62586e 100644
+--- a/kernel/kthread.c
++++ b/kernel/kthread.c
+@@ -523,6 +523,7 @@ struct task_struct *kthread_create_on_cpu(int (*threadfn)(void *data),
+ to_kthread(p)->cpu = cpu;
+ return p;
+ }
++EXPORT_SYMBOL(kthread_create_on_cpu);
+
+ void kthread_set_per_cpu(struct task_struct *k, int cpu)
+ {
+--
+2.39.2
+
--- /dev/null
+From 8b2def2b2e241cf3e91186134572a5d7528cf0da Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Tue, 14 Mar 2023 04:47:35 +0000
+Subject: perf/core: Fix perf_output_begin parameter is incorrectly invoked in
+ perf_event_bpf_output
+
+From: Yang Jihong <yangjihong1@huawei.com>
+
+[ Upstream commit eb81a2ed4f52be831c9fb879752d89645a312c13 ]
+
+syzkaller reportes a KASAN issue with stack-out-of-bounds.
+The call trace is as follows:
+ dump_stack+0x9c/0xd3
+ print_address_description.constprop.0+0x19/0x170
+ __kasan_report.cold+0x6c/0x84
+ kasan_report+0x3a/0x50
+ __perf_event_header__init_id+0x34/0x290
+ perf_event_header__init_id+0x48/0x60
+ perf_output_begin+0x4a4/0x560
+ perf_event_bpf_output+0x161/0x1e0
+ perf_iterate_sb_cpu+0x29e/0x340
+ perf_iterate_sb+0x4c/0xc0
+ perf_event_bpf_event+0x194/0x2c0
+ __bpf_prog_put.constprop.0+0x55/0xf0
+ __cls_bpf_delete_prog+0xea/0x120 [cls_bpf]
+ cls_bpf_delete_prog_work+0x1c/0x30 [cls_bpf]
+ process_one_work+0x3c2/0x730
+ worker_thread+0x93/0x650
+ kthread+0x1b8/0x210
+ ret_from_fork+0x1f/0x30
+
+commit 267fb27352b6 ("perf: Reduce stack usage of perf_output_begin()")
+use on-stack struct perf_sample_data of the caller function.
+
+However, perf_event_bpf_output uses incorrect parameter to convert
+small-sized data (struct perf_bpf_event) into large-sized data
+(struct perf_sample_data), which causes memory overwriting occurs in
+__perf_event_header__init_id.
+
+Fixes: 267fb27352b6 ("perf: Reduce stack usage of perf_output_begin()")
+Signed-off-by: Yang Jihong <yangjihong1@huawei.com>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Link: https://lkml.kernel.org/r/20230314044735.56551-1-yangjihong1@huawei.com
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/events/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kernel/events/core.c b/kernel/events/core.c
+index d2b415820183d..3a17a68cf41ad 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -9056,7 +9056,7 @@ static void perf_event_bpf_output(struct perf_event *event, void *data)
+
+ perf_event_header__init_id(&bpf_event->event_id.header,
+ &sample, event);
+- ret = perf_output_begin(&handle, data, event,
++ ret = perf_output_begin(&handle, &sample, event,
+ bpf_event->event_id.header.size);
+ if (ret)
+ return;
+--
+2.39.2
+
--- /dev/null
+From 4410e2118d057c34fd9fefe802c2dcbcb110741c Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 13 Mar 2023 10:16:08 -0700
+Subject: perf: fix perf_event_context->time
+
+From: Song Liu <song@kernel.org>
+
+[ Upstream commit baf1b12a67f5b24f395baca03e442ce27cab0c18 ]
+
+Time readers rely on perf_event_context->[time|timestamp|timeoffset] to get
+accurate time_enabled and time_running for an event. The difference between
+ctx->timestamp and ctx->time is the among of time when the context is not
+enabled. __update_context_time(ctx, false) is used to increase timestamp,
+but not time. Therefore, it should only be called in ctx_sched_in() when
+EVENT_TIME was not enabled.
+
+Fixes: 09f5e7dc7ad7 ("perf: Fix perf_event_read_local() time")
+Signed-off-by: Song Liu <song@kernel.org>
+Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
+Acked-by: Namhyung Kim <namhyung@kernel.org>
+Link: https://lkml.kernel.org/r/20230313171608.298734-1-song@kernel.org
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/events/core.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/kernel/events/core.c b/kernel/events/core.c
+index 3a17a68cf41ad..2cdee62c3de73 100644
+--- a/kernel/events/core.c
++++ b/kernel/events/core.c
+@@ -3909,7 +3909,7 @@ ctx_sched_in(struct perf_event_context *ctx,
+ if (likely(!ctx->nr_events))
+ return;
+
+- if (is_active ^ EVENT_TIME) {
++ if (!(is_active & EVENT_TIME)) {
+ /* start ctx time */
+ __update_context_time(ctx, false);
+ perf_cgroup_set_timestamp(task, ctx);
+--
+2.39.2
+
--- /dev/null
+From f003945d23af2500a6d11a433a786041f14382f9 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Sat, 25 Feb 2023 21:39:53 -0800
+Subject: serial: 8250: ASPEED_VUART: select REGMAP instead of depending on it
+
+From: Randy Dunlap <rdunlap@infradead.org>
+
+[ Upstream commit f8086d1a65ac693e3fd863128352b4b11ee7324d ]
+
+REGMAP is a hidden (not user visible) symbol. Users cannot set it
+directly thru "make *config", so drivers should select it instead of
+depending on it if they need it.
+
+Consistently using "select" or "depends on" can also help reduce
+Kconfig circular dependency issues.
+
+Therefore, change the use of "depends on REGMAP" to "select REGMAP".
+
+Fixes: 8d310c9107a2 ("drivers/tty/serial/8250: Make Aspeed VUART SIRQ polarity configurable")
+Cc: stable <stable@kernel.org>
+Signed-off-by: Randy Dunlap <rdunlap@infradead.org>
+Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Cc: Oskar Senft <osk@google.com>
+Cc: linux-serial@vger.kernel.org
+Link: https://lore.kernel.org/r/20230226053953.4681-9-rdunlap@infradead.org
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/8250/Kconfig | 3 ++-
+ 1 file changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig
+index 7cd61565c1351..6ccadfa0caf06 100644
+--- a/drivers/tty/serial/8250/Kconfig
++++ b/drivers/tty/serial/8250/Kconfig
+@@ -253,8 +253,9 @@ config SERIAL_8250_ASPEED_VUART
+ tristate "Aspeed Virtual UART"
+ depends on SERIAL_8250
+ depends on OF
+- depends on REGMAP && MFD_SYSCON
++ depends on MFD_SYSCON
+ depends on ARCH_ASPEED || COMPILE_TEST
++ select REGMAP
+ help
+ If you want to use the virtual UART (VUART) device on Aspeed
+ BMC platforms, enable this option. This enables the 16550A-
+--
+2.39.2
+
--- /dev/null
+From 051507a311fac00409ddb431452c67fc0f3454d7 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Mon, 11 Jul 2022 10:42:52 +0200
+Subject: serial: 8250: SERIAL_8250_ASPEED_VUART should depend on ARCH_ASPEED
+
+From: Geert Uytterhoeven <geert+renesas@glider.be>
+
+[ Upstream commit 806a449725cbd679a7f52c394d3c87b451d66bd5 ]
+
+The Aspeed Virtual UART is only present on Aspeed BMC platforms. Hence
+add a dependency on ARCH_ASPEED, to prevent asking the user about this
+driver when configuring a kernel without Aspeed BMC support.
+
+Reviewed-by: Jeremy Kerr <jk@ozlabs.org>
+Signed-off-by: Geert Uytterhoeven <geert+renesas@glider.be>
+Link: https://lore.kernel.org/r/259138c372d433005b4871789ef9ee8d15320307.1657528861.git.geert+renesas@glider.be
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: f8086d1a65ac ("serial: 8250: ASPEED_VUART: select REGMAP instead of depending on it")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/8250/Kconfig | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/drivers/tty/serial/8250/Kconfig b/drivers/tty/serial/8250/Kconfig
+index da63e76c7530c..7cd61565c1351 100644
+--- a/drivers/tty/serial/8250/Kconfig
++++ b/drivers/tty/serial/8250/Kconfig
+@@ -254,6 +254,7 @@ config SERIAL_8250_ASPEED_VUART
+ depends on SERIAL_8250
+ depends on OF
+ depends on REGMAP && MFD_SYSCON
++ depends on ARCH_ASPEED || COMPILE_TEST
+ help
+ If you want to use the virtual UART (VUART) device on Aspeed
+ BMC platforms, enable this option. This enables the 16550A-
+--
+2.39.2
+
--- /dev/null
+From 92f7e94d4975e9f81418ee6fbad9e1a0f099809e Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 3 Aug 2022 18:42:08 +0800
+Subject: serial: fsl_lpuart: Fix comment typo
+
+From: Jason Wang <wangborong@cdjrlc.com>
+
+[ Upstream commit 374e01fa1304e1eabd2cd16f750da3ecaeab069b ]
+
+The double `as' is duplicated in the comment, remove one.
+
+Signed-off-by: Jason Wang <wangborong@cdjrlc.com>
+Link: https://lore.kernel.org/r/20220803104208.4127-1-wangborong@cdjrlc.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: 1be6f2b15f90 ("tty: serial: fsl_lpuart: fix race on RX DMA shutdown")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/fsl_lpuart.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
+index e1ff109d7a14b..892c3cd83705b 100644
+--- a/drivers/tty/serial/fsl_lpuart.c
++++ b/drivers/tty/serial/fsl_lpuart.c
+@@ -2866,7 +2866,7 @@ static int __maybe_unused lpuart_suspend(struct device *dev)
+ * EDMA driver during suspend will forcefully release any
+ * non-idle DMA channels. If port wakeup is enabled or if port
+ * is console port or 'no_console_suspend' is set the Rx DMA
+- * cannot resume as as expected, hence gracefully release the
++ * cannot resume as expected, hence gracefully release the
+ * Rx DMA path before suspend and start Rx DMA path on resume.
+ */
+ if (irq_wake) {
+--
+2.39.2
+
--- /dev/null
+interconnect-qcom-osm-l3-fix-icc_onecell_data-alloca.patch
+perf-core-fix-perf_output_begin-parameter-is-incorre.patch
+perf-fix-perf_event_context-time.patch
+tracing-hwlat-replace-sched_setaffinity-with-set_cpu.patch
+serial-fsl_lpuart-fix-comment-typo.patch
+tty-serial-fsl_lpuart-switch-to-new-dmaengine_termin.patch
+tty-serial-fsl_lpuart-fix-race-on-rx-dma-shutdown.patch
+serial-8250-serial_8250_aspeed_vuart-should-depend-o.patch
+serial-8250-aspeed_vuart-select-regmap-instead-of-de.patch
+interconnect-qcom-rpmh-fix-registration-race.patch
+interconnect-qcom-msm8974-fix-registration-race.patch
+kthread-add-the-helper-function-kthread_run_on_cpu.patch
+trace-hwlat-make-use-of-the-helper-function-kthread_.patch
+trace-hwlat-do-not-start-per-cpu-thread-if-it-is-alr.patch
--- /dev/null
+From 2044e259d126889af184d670b374ca8d6ae56c40 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 10 Mar 2023 12:04:51 +0200
+Subject: trace/hwlat: Do not start per-cpu thread if it is already running
+
+From: Tero Kristo <tero.kristo@linux.intel.com>
+
+[ Upstream commit 08697bca9bbba15f2058fdbd9f970bd5f6a8a2e8 ]
+
+The hwlatd tracer will end up starting multiple per-cpu threads with
+the following script:
+
+ #!/bin/sh
+ cd /sys/kernel/debug/tracing
+ echo 0 > tracing_on
+ echo hwlat > current_tracer
+ echo per-cpu > hwlat_detector/mode
+ echo 100000 > hwlat_detector/width
+ echo 200000 > hwlat_detector/window
+ echo 1 > tracing_on
+
+To fix the issue, check if the hwlatd thread for the cpu is already
+running, before starting a new one. Along with the previous patch, this
+avoids running multiple instances of the same CPU thread on the system.
+
+Link: https://lore.kernel.org/all/20230302113654.2984709-1-tero.kristo@linux.intel.com/
+Link: https://lkml.kernel.org/r/20230310100451.3948583-3-tero.kristo@linux.intel.com
+
+Cc: stable@vger.kernel.org
+Fixes: f46b16520a087 ("trace/hwlat: Implement the per-cpu mode")
+Signed-off-by: Tero Kristo <tero.kristo@linux.intel.com>
+Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org>
+Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/trace_hwlat.c | 4 ++++
+ 1 file changed, 4 insertions(+)
+
+diff --git a/kernel/trace/trace_hwlat.c b/kernel/trace/trace_hwlat.c
+index 72eeab938f1de..9ec032f22531c 100644
+--- a/kernel/trace/trace_hwlat.c
++++ b/kernel/trace/trace_hwlat.c
+@@ -492,6 +492,10 @@ static int start_cpu_kthread(unsigned int cpu)
+ {
+ struct task_struct *kthread;
+
++ /* Do not start a new hwlatd thread if it is already running */
++ if (per_cpu(hwlat_per_cpu_data, cpu).kthread)
++ return 0;
++
+ kthread = kthread_run_on_cpu(kthread_fn, NULL, cpu, "hwlatd/%u");
+ if (IS_ERR(kthread)) {
+ pr_err(BANNER "could not start sampling thread\n");
+--
+2.39.2
+
--- /dev/null
+From 49db4db9d56fdb01c49514397b9d32fe2f51be13 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Fri, 14 Jan 2022 14:03:10 -0800
+Subject: trace/hwlat: make use of the helper function kthread_run_on_cpu()
+
+From: Cai Huoqing <caihuoqing@baidu.com>
+
+[ Upstream commit ff78f6679d2e223e073fcbdc8f70b6bc0abadf99 ]
+
+Replace kthread_create_on_cpu/wake_up_process() with kthread_run_on_cpu()
+to simplify the code.
+
+Link: https://lkml.kernel.org/r/20211022025711.3673-7-caihuoqing@baidu.com
+Signed-off-by: Cai Huoqing <caihuoqing@baidu.com>
+Cc: Bernard Metzler <bmt@zurich.ibm.com>
+Cc: Daniel Bristot de Oliveira <bristot@kernel.org>
+Cc: Davidlohr Bueso <dave@stgolabs.net>
+Cc: Doug Ledford <dledford@redhat.com>
+Cc: Ingo Molnar <mingo@redhat.com>
+Cc: Jason Gunthorpe <jgg@ziepe.ca>
+Cc: Joel Fernandes (Google) <joel@joelfernandes.org>
+Cc: Josh Triplett <josh@joshtriplett.org>
+Cc: Lai Jiangshan <jiangshanlai@gmail.com>
+Cc: Mathieu Desnoyers <mathieu.desnoyers@efficios.com>
+Cc: "Paul E . McKenney" <paulmck@kernel.org>
+Cc: Steven Rostedt <rostedt@goodmis.org>
+Signed-off-by: Andrew Morton <akpm@linux-foundation.org>
+Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
+Stable-dep-of: 08697bca9bbb ("trace/hwlat: Do not start per-cpu thread if it is already running")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/trace_hwlat.c | 6 +-----
+ 1 file changed, 1 insertion(+), 5 deletions(-)
+
+diff --git a/kernel/trace/trace_hwlat.c b/kernel/trace/trace_hwlat.c
+index 455f5edf008b8..72eeab938f1de 100644
+--- a/kernel/trace/trace_hwlat.c
++++ b/kernel/trace/trace_hwlat.c
+@@ -491,18 +491,14 @@ static void stop_per_cpu_kthreads(void)
+ static int start_cpu_kthread(unsigned int cpu)
+ {
+ struct task_struct *kthread;
+- char comm[24];
+
+- snprintf(comm, 24, "hwlatd/%d", cpu);
+-
+- kthread = kthread_create_on_cpu(kthread_fn, NULL, cpu, comm);
++ kthread = kthread_run_on_cpu(kthread_fn, NULL, cpu, "hwlatd/%u");
+ if (IS_ERR(kthread)) {
+ pr_err(BANNER "could not start sampling thread\n");
+ return -ENOMEM;
+ }
+
+ per_cpu(hwlat_per_cpu_data, cpu).kthread = kthread;
+- wake_up_process(kthread);
+
+ return 0;
+ }
+--
+2.39.2
+
--- /dev/null
+From d355159c20458aed159b8789555e755bbf8721a5 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 16 Mar 2023 16:45:35 +0200
+Subject: tracing/hwlat: Replace sched_setaffinity with set_cpus_allowed_ptr
+
+From: Costa Shulyupin <costa.shul@redhat.com>
+
+[ Upstream commit 71c7a30442b724717a30d5e7d1662ba4904eb3d4 ]
+
+There is a problem with the behavior of hwlat in a container,
+resulting in incorrect output. A warning message is generated:
+"cpumask changed while in round-robin mode, switching to mode none",
+and the tracing_cpumask is ignored. This issue arises because
+the kernel thread, hwlatd, is not a part of the container, and
+the function sched_setaffinity is unable to locate it using its PID.
+Additionally, the task_struct of hwlatd is already known.
+Ultimately, the function set_cpus_allowed_ptr achieves
+the same outcome as sched_setaffinity, but employs task_struct
+instead of PID.
+
+Test case:
+
+ # cd /sys/kernel/tracing
+ # echo 0 > tracing_on
+ # echo round-robin > hwlat_detector/mode
+ # echo hwlat > current_tracer
+ # unshare --fork --pid bash -c 'echo 1 > tracing_on'
+ # dmesg -c
+
+Actual behavior:
+
+[573502.809060] hwlat_detector: cpumask changed while in round-robin mode, switching to mode none
+
+Link: https://lore.kernel.org/linux-trace-kernel/20230316144535.1004952-1-costa.shul@redhat.com
+
+Cc: Masami Hiramatsu <mhiramat@kernel.org>
+Fixes: 0330f7aa8ee63 ("tracing: Have hwlat trace migrate across tracing_cpumask CPUs")
+Signed-off-by: Costa Shulyupin <costa.shul@redhat.com>
+Acked-by: Daniel Bristot de Oliveira <bristot@kernel.org>
+Signed-off-by: Steven Rostedt (Google) <rostedt@goodmis.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ kernel/trace/trace_hwlat.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/kernel/trace/trace_hwlat.c b/kernel/trace/trace_hwlat.c
+index 11f32e947c452..455f5edf008b8 100644
+--- a/kernel/trace/trace_hwlat.c
++++ b/kernel/trace/trace_hwlat.c
+@@ -339,7 +339,7 @@ static void move_to_next_cpu(void)
+ cpumask_clear(current_mask);
+ cpumask_set_cpu(next_cpu, current_mask);
+
+- sched_setaffinity(0, current_mask);
++ set_cpus_allowed_ptr(current, current_mask);
+ return;
+
+ change_mode:
+@@ -446,7 +446,7 @@ static int start_single_kthread(struct trace_array *tr)
+
+ }
+
+- sched_setaffinity(kthread->pid, current_mask);
++ set_cpus_allowed_ptr(kthread, current_mask);
+
+ kdata->kthread = kthread;
+ wake_up_process(kthread);
+--
+2.39.2
+
--- /dev/null
+From 925a7fe212f094359a3de668d6eec38a67f58a02 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Thu, 9 Mar 2023 14:43:02 +0100
+Subject: tty: serial: fsl_lpuart: fix race on RX DMA shutdown
+
+From: Alexander Sverdlin <alexander.sverdlin@siemens.com>
+
+[ Upstream commit 1be6f2b15f902c02e055ae0b419ca789200473c9 ]
+
+From time to time DMA completion can come in the middle of DMA shutdown:
+
+<process ctx>: <IRQ>:
+lpuart32_shutdown()
+ lpuart_dma_shutdown()
+ del_timer_sync()
+ lpuart_dma_rx_complete()
+ lpuart_copy_rx_to_tty()
+ mod_timer()
+ lpuart_dma_rx_free()
+
+When the timer fires a bit later, sport->dma_rx_desc is NULL:
+
+Unable to handle kernel NULL pointer dereference at virtual address 0000000000000004
+pc : lpuart_copy_rx_to_tty+0xcc/0x5bc
+lr : lpuart_timer_func+0x1c/0x2c
+Call trace:
+ lpuart_copy_rx_to_tty
+ lpuart_timer_func
+ call_timer_fn
+ __run_timers.part.0
+ run_timer_softirq
+ __do_softirq
+ __irq_exit_rcu
+ irq_exit
+ handle_domain_irq
+ gic_handle_irq
+ call_on_irq_stack
+ do_interrupt_handler
+ ...
+
+To fix this fold del_timer_sync() into lpuart_dma_rx_free() after
+dmaengine_terminate_sync() to make sure timer will not be re-started in
+lpuart_copy_rx_to_tty() <= lpuart_dma_rx_complete().
+
+Fixes: 4a8588a1cf86 ("serial: fsl_lpuart: delete timer on shutdown")
+Cc: stable <stable@kernel.org>
+Signed-off-by: Alexander Sverdlin <alexander.sverdlin@siemens.com>
+Link: https://lore.kernel.org/r/20230309134302.74940-2-alexander.sverdlin@siemens.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/fsl_lpuart.c | 11 +++--------
+ 1 file changed, 3 insertions(+), 8 deletions(-)
+
+diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
+index 47097002a6427..ac3c6c1e80ccc 100644
+--- a/drivers/tty/serial/fsl_lpuart.c
++++ b/drivers/tty/serial/fsl_lpuart.c
+@@ -1308,6 +1308,7 @@ static void lpuart_dma_rx_free(struct uart_port *port)
+ struct dma_chan *chan = sport->dma_rx_chan;
+
+ dmaengine_terminate_sync(chan);
++ del_timer_sync(&sport->lpuart_timer);
+ dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
+ kfree(sport->rx_ring.buf);
+ sport->rx_ring.tail = 0;
+@@ -1773,7 +1774,6 @@ static int lpuart32_startup(struct uart_port *port)
+ static void lpuart_dma_shutdown(struct lpuart_port *sport)
+ {
+ if (sport->lpuart_dma_rx_use) {
+- del_timer_sync(&sport->lpuart_timer);
+ lpuart_dma_rx_free(&sport->port);
+ sport->lpuart_dma_rx_use = false;
+ }
+@@ -1933,10 +1933,8 @@ lpuart_set_termios(struct uart_port *port, struct ktermios *termios,
+ * Since timer function acqures sport->port.lock, need to stop before
+ * acquring same lock because otherwise del_timer_sync() can deadlock.
+ */
+- if (old && sport->lpuart_dma_rx_use) {
+- del_timer_sync(&sport->lpuart_timer);
++ if (old && sport->lpuart_dma_rx_use)
+ lpuart_dma_rx_free(&sport->port);
+- }
+
+ spin_lock_irqsave(&sport->port.lock, flags);
+
+@@ -2171,10 +2169,8 @@ lpuart32_set_termios(struct uart_port *port, struct ktermios *termios,
+ * Since timer function acqures sport->port.lock, need to stop before
+ * acquring same lock because otherwise del_timer_sync() can deadlock.
+ */
+- if (old && sport->lpuart_dma_rx_use) {
+- del_timer_sync(&sport->lpuart_timer);
++ if (old && sport->lpuart_dma_rx_use)
+ lpuart_dma_rx_free(&sport->port);
+- }
+
+ spin_lock_irqsave(&sport->port.lock, flags);
+
+@@ -2870,7 +2866,6 @@ static int __maybe_unused lpuart_suspend(struct device *dev)
+ * Rx DMA path before suspend and start Rx DMA path on resume.
+ */
+ if (irq_wake) {
+- del_timer_sync(&sport->lpuart_timer);
+ lpuart_dma_rx_free(&sport->port);
+ }
+
+--
+2.39.2
+
--- /dev/null
+From 4cd05a466e9b9dee72078838ce92a5c7d32d7082 Mon Sep 17 00:00:00 2001
+From: Sasha Levin <sashal@kernel.org>
+Date: Wed, 23 Nov 2022 10:36:19 +0800
+Subject: tty: serial: fsl_lpuart: switch to new dmaengine_terminate_* API
+
+From: Sherry Sun <sherry.sun@nxp.com>
+
+[ Upstream commit 8682ab0eea89c300ebb120c02ead3999ca5560a8 ]
+
+Convert dmaengine_terminate_all() calls to synchronous and asynchronous
+versions where appropriate.
+
+Signed-off-by: Sherry Sun <sherry.sun@nxp.com>
+Link: https://lore.kernel.org/r/20221123023619.30173-1-sherry.sun@nxp.com
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+Stable-dep-of: 1be6f2b15f90 ("tty: serial: fsl_lpuart: fix race on RX DMA shutdown")
+Signed-off-by: Sasha Levin <sashal@kernel.org>
+---
+ drivers/tty/serial/fsl_lpuart.c | 6 +++---
+ 1 file changed, 3 insertions(+), 3 deletions(-)
+
+diff --git a/drivers/tty/serial/fsl_lpuart.c b/drivers/tty/serial/fsl_lpuart.c
+index 892c3cd83705b..47097002a6427 100644
+--- a/drivers/tty/serial/fsl_lpuart.c
++++ b/drivers/tty/serial/fsl_lpuart.c
+@@ -573,7 +573,7 @@ static void lpuart_flush_buffer(struct uart_port *port)
+ sport->dma_tx_nents, DMA_TO_DEVICE);
+ sport->dma_tx_in_progress = false;
+ }
+- dmaengine_terminate_all(chan);
++ dmaengine_terminate_async(chan);
+ }
+
+ if (lpuart_is_32(sport)) {
+@@ -1307,7 +1307,7 @@ static void lpuart_dma_rx_free(struct uart_port *port)
+ struct lpuart_port, port);
+ struct dma_chan *chan = sport->dma_rx_chan;
+
+- dmaengine_terminate_all(chan);
++ dmaengine_terminate_sync(chan);
+ dma_unmap_sg(chan->device->dev, &sport->rx_sgl, 1, DMA_FROM_DEVICE);
+ kfree(sport->rx_ring.buf);
+ sport->rx_ring.tail = 0;
+@@ -1782,7 +1782,7 @@ static void lpuart_dma_shutdown(struct lpuart_port *sport)
+ if (wait_event_interruptible(sport->dma_wait,
+ !sport->dma_tx_in_progress) != false) {
+ sport->dma_tx_in_progress = false;
+- dmaengine_terminate_all(sport->dma_tx_chan);
++ dmaengine_terminate_sync(sport->dma_tx_chan);
+ }
+ sport->lpuart_dma_tx_use = false;
+ }
+--
+2.39.2
+