From: Sasha Levin Date: Wed, 22 Mar 2023 19:40:34 +0000 (-0400) Subject: Fixes for 5.15 X-Git-Tag: v5.15.105~83 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=bd44e392334c55d3d0396701db446d6c813fcae3;p=thirdparty%2Fkernel%2Fstable-queue.git Fixes for 5.15 Signed-off-by: Sasha Levin --- diff --git a/queue-5.15/interconnect-qcom-msm8974-fix-registration-race.patch b/queue-5.15/interconnect-qcom-msm8974-fix-registration-race.patch new file mode 100644 index 00000000000..bd9f2d5f328 --- /dev/null +++ b/queue-5.15/interconnect-qcom-msm8974-fix-registration-race.patch @@ -0,0 +1,99 @@ +From 92015aa453274281fe320010b17d87d74fb43b68 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Mar 2023 08:56:39 +0100 +Subject: interconnect: qcom: msm8974: fix registration race + +From: Johan Hovold + +[ 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 +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: Sasha Levin +--- + 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 + diff --git a/queue-5.15/interconnect-qcom-osm-l3-fix-icc_onecell_data-alloca.patch b/queue-5.15/interconnect-qcom-osm-l3-fix-icc_onecell_data-alloca.patch new file mode 100644 index 00000000000..e8bc821e66e --- /dev/null +++ b/queue-5.15/interconnect-qcom-osm-l3-fix-icc_onecell_data-alloca.patch @@ -0,0 +1,43 @@ +From a658ac43d186f542888c6c371d4d2c15bedfcb49 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 5 Jan 2023 02:22:19 +0200 +Subject: interconnect: qcom: osm-l3: fix icc_onecell_data allocation + +From: Dmitry Baryshkov + +[ 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 +Link: https://lore.kernel.org/r/20230105002221.1416479-2-dmitry.baryshkov@linaro.org +Signed-off-by: Georgi Djakov +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/interconnect-qcom-rpmh-fix-registration-race.patch b/queue-5.15/interconnect-qcom-rpmh-fix-registration-race.patch new file mode 100644 index 00000000000..c8612c885c3 --- /dev/null +++ b/queue-5.15/interconnect-qcom-rpmh-fix-registration-race.patch @@ -0,0 +1,99 @@ +From f2af30bfe98d839c192d36dfbebde92e99e297ed Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 6 Mar 2023 08:56:38 +0100 +Subject: interconnect: qcom: rpmh: fix registration race + +From: Johan Hovold + +[ 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 +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: Sasha Levin +--- + 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 + diff --git a/queue-5.15/kthread-add-the-helper-function-kthread_run_on_cpu.patch b/queue-5.15/kthread-add-the-helper-function-kthread_run_on_cpu.patch new file mode 100644 index 00000000000..9d5159196e4 --- /dev/null +++ b/queue-5.15/kthread-add-the-helper-function-kthread_run_on_cpu.patch @@ -0,0 +1,94 @@ +From d7ae8c0686c555176724e21eca4d3eb4624a803f Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Fri, 14 Jan 2022 14:02:52 -0800 +Subject: kthread: add the helper function kthread_run_on_cpu() + +From: Cai Huoqing + +[ 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 +Cc: Bernard Metzler +Cc: Cai Huoqing +Cc: Daniel Bristot de Oliveira +Cc: Davidlohr Bueso +Cc: Doug Ledford +Cc: Ingo Molnar +Cc: Jason Gunthorpe +Cc: Joel Fernandes (Google) +Cc: Josh Triplett +Cc: Lai Jiangshan +Cc: Mathieu Desnoyers +Cc: "Paul E . McKenney" +Cc: Steven Rostedt +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Stable-dep-of: 08697bca9bbb ("trace/hwlat: Do not start per-cpu thread if it is already running") +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/perf-core-fix-perf_output_begin-parameter-is-incorre.patch b/queue-5.15/perf-core-fix-perf_output_begin-parameter-is-incorre.patch new file mode 100644 index 00000000000..43579f8b2a8 --- /dev/null +++ b/queue-5.15/perf-core-fix-perf_output_begin-parameter-is-incorre.patch @@ -0,0 +1,64 @@ +From 8b2def2b2e241cf3e91186134572a5d7528cf0da Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Signed-off-by: Peter Zijlstra (Intel) +Link: https://lkml.kernel.org/r/20230314044735.56551-1-yangjihong1@huawei.com +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/perf-fix-perf_event_context-time.patch b/queue-5.15/perf-fix-perf_event_context-time.patch new file mode 100644 index 00000000000..cca3b3d1916 --- /dev/null +++ b/queue-5.15/perf-fix-perf_event_context-time.patch @@ -0,0 +1,42 @@ +From 4410e2118d057c34fd9fefe802c2dcbcb110741c Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 13 Mar 2023 10:16:08 -0700 +Subject: perf: fix perf_event_context->time + +From: Song Liu + +[ 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 +Signed-off-by: Peter Zijlstra (Intel) +Acked-by: Namhyung Kim +Link: https://lkml.kernel.org/r/20230313171608.298734-1-song@kernel.org +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/serial-8250-aspeed_vuart-select-regmap-instead-of-de.patch b/queue-5.15/serial-8250-aspeed_vuart-select-regmap-instead-of-de.patch new file mode 100644 index 00000000000..b39540454d6 --- /dev/null +++ b/queue-5.15/serial-8250-aspeed_vuart-select-regmap-instead-of-de.patch @@ -0,0 +1,49 @@ +From f003945d23af2500a6d11a433a786041f14382f9 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Sat, 25 Feb 2023 21:39:53 -0800 +Subject: serial: 8250: ASPEED_VUART: select REGMAP instead of depending on it + +From: Randy Dunlap + +[ 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 +Signed-off-by: Randy Dunlap +Cc: Greg Kroah-Hartman +Cc: Oskar Senft +Cc: linux-serial@vger.kernel.org +Link: https://lore.kernel.org/r/20230226053953.4681-9-rdunlap@infradead.org +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/serial-8250-serial_8250_aspeed_vuart-should-depend-o.patch b/queue-5.15/serial-8250-serial_8250_aspeed_vuart-should-depend-o.patch new file mode 100644 index 00000000000..6152e9bc5eb --- /dev/null +++ b/queue-5.15/serial-8250-serial_8250_aspeed_vuart-should-depend-o.patch @@ -0,0 +1,38 @@ +From 051507a311fac00409ddb431452c67fc0f3454d7 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Mon, 11 Jul 2022 10:42:52 +0200 +Subject: serial: 8250: SERIAL_8250_ASPEED_VUART should depend on ARCH_ASPEED + +From: Geert Uytterhoeven + +[ 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 +Signed-off-by: Geert Uytterhoeven +Link: https://lore.kernel.org/r/259138c372d433005b4871789ef9ee8d15320307.1657528861.git.geert+renesas@glider.be +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: f8086d1a65ac ("serial: 8250: ASPEED_VUART: select REGMAP instead of depending on it") +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/serial-fsl_lpuart-fix-comment-typo.patch b/queue-5.15/serial-fsl_lpuart-fix-comment-typo.patch new file mode 100644 index 00000000000..a6a95a074d5 --- /dev/null +++ b/queue-5.15/serial-fsl_lpuart-fix-comment-typo.patch @@ -0,0 +1,36 @@ +From 92f7e94d4975e9f81418ee6fbad9e1a0f099809e Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 3 Aug 2022 18:42:08 +0800 +Subject: serial: fsl_lpuart: Fix comment typo + +From: Jason Wang + +[ Upstream commit 374e01fa1304e1eabd2cd16f750da3ecaeab069b ] + +The double `as' is duplicated in the comment, remove one. + +Signed-off-by: Jason Wang +Link: https://lore.kernel.org/r/20220803104208.4127-1-wangborong@cdjrlc.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: 1be6f2b15f90 ("tty: serial: fsl_lpuart: fix race on RX DMA shutdown") +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/series b/queue-5.15/series new file mode 100644 index 00000000000..beeeaa88133 --- /dev/null +++ b/queue-5.15/series @@ -0,0 +1,14 @@ +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 diff --git a/queue-5.15/trace-hwlat-do-not-start-per-cpu-thread-if-it-is-alr.patch b/queue-5.15/trace-hwlat-do-not-start-per-cpu-thread-if-it-is-alr.patch new file mode 100644 index 00000000000..9b88c38a6e9 --- /dev/null +++ b/queue-5.15/trace-hwlat-do-not-start-per-cpu-thread-if-it-is-alr.patch @@ -0,0 +1,56 @@ +From 2044e259d126889af184d670b374ca8d6ae56c40 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Acked-by: Daniel Bristot de Oliveira +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/trace-hwlat-make-use-of-the-helper-function-kthread_.patch b/queue-5.15/trace-hwlat-make-use-of-the-helper-function-kthread_.patch new file mode 100644 index 00000000000..826930a72bd --- /dev/null +++ b/queue-5.15/trace-hwlat-make-use-of-the-helper-function-kthread_.patch @@ -0,0 +1,61 @@ +From 49db4db9d56fdb01c49514397b9d32fe2f51be13 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +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 + +[ 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 +Cc: Bernard Metzler +Cc: Daniel Bristot de Oliveira +Cc: Davidlohr Bueso +Cc: Doug Ledford +Cc: Ingo Molnar +Cc: Jason Gunthorpe +Cc: Joel Fernandes (Google) +Cc: Josh Triplett +Cc: Lai Jiangshan +Cc: Mathieu Desnoyers +Cc: "Paul E . McKenney" +Cc: Steven Rostedt +Signed-off-by: Andrew Morton +Signed-off-by: Linus Torvalds +Stable-dep-of: 08697bca9bbb ("trace/hwlat: Do not start per-cpu thread if it is already running") +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/tracing-hwlat-replace-sched_setaffinity-with-set_cpu.patch b/queue-5.15/tracing-hwlat-replace-sched_setaffinity-with-set_cpu.patch new file mode 100644 index 00000000000..5c49a0f29d0 --- /dev/null +++ b/queue-5.15/tracing-hwlat-replace-sched_setaffinity-with-set_cpu.patch @@ -0,0 +1,70 @@ +From d355159c20458aed159b8789555e755bbf8721a5 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 16 Mar 2023 16:45:35 +0200 +Subject: tracing/hwlat: Replace sched_setaffinity with set_cpus_allowed_ptr + +From: Costa Shulyupin + +[ 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 +Fixes: 0330f7aa8ee63 ("tracing: Have hwlat trace migrate across tracing_cpumask CPUs") +Signed-off-by: Costa Shulyupin +Acked-by: Daniel Bristot de Oliveira +Signed-off-by: Steven Rostedt (Google) +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/tty-serial-fsl_lpuart-fix-race-on-rx-dma-shutdown.patch b/queue-5.15/tty-serial-fsl_lpuart-fix-race-on-rx-dma-shutdown.patch new file mode 100644 index 00000000000..4798f877c1d --- /dev/null +++ b/queue-5.15/tty-serial-fsl_lpuart-fix-race-on-rx-dma-shutdown.patch @@ -0,0 +1,109 @@ +From 925a7fe212f094359a3de668d6eec38a67f58a02 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Thu, 9 Mar 2023 14:43:02 +0100 +Subject: tty: serial: fsl_lpuart: fix race on RX DMA shutdown + +From: Alexander Sverdlin + +[ Upstream commit 1be6f2b15f902c02e055ae0b419ca789200473c9 ] + +From time to time DMA completion can come in the middle of DMA shutdown: + +: : +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 +Signed-off-by: Alexander Sverdlin +Link: https://lore.kernel.org/r/20230309134302.74940-2-alexander.sverdlin@siemens.com +Signed-off-by: Greg Kroah-Hartman +Signed-off-by: Sasha Levin +--- + 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 + diff --git a/queue-5.15/tty-serial-fsl_lpuart-switch-to-new-dmaengine_termin.patch b/queue-5.15/tty-serial-fsl_lpuart-switch-to-new-dmaengine_termin.patch new file mode 100644 index 00000000000..06d9dc974f0 --- /dev/null +++ b/queue-5.15/tty-serial-fsl_lpuart-switch-to-new-dmaengine_termin.patch @@ -0,0 +1,55 @@ +From 4cd05a466e9b9dee72078838ce92a5c7d32d7082 Mon Sep 17 00:00:00 2001 +From: Sasha Levin +Date: Wed, 23 Nov 2022 10:36:19 +0800 +Subject: tty: serial: fsl_lpuart: switch to new dmaengine_terminate_* API + +From: Sherry Sun + +[ Upstream commit 8682ab0eea89c300ebb120c02ead3999ca5560a8 ] + +Convert dmaengine_terminate_all() calls to synchronous and asynchronous +versions where appropriate. + +Signed-off-by: Sherry Sun +Link: https://lore.kernel.org/r/20221123023619.30173-1-sherry.sun@nxp.com +Signed-off-by: Greg Kroah-Hartman +Stable-dep-of: 1be6f2b15f90 ("tty: serial: fsl_lpuart: fix race on RX DMA shutdown") +Signed-off-by: Sasha Levin +--- + 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 +