diff options
author | Redick_Lin <redicklin@google.com> | 2023-05-05 12:08:10 +0800 |
---|---|---|
committer | Will McVicker <willmcvicker@google.com> | 2024-04-16 11:58:48 -0700 |
commit | b1d4e0a643b88bc9283db33a4000287523be28b5 (patch) | |
tree | feab3b3241afb80103b6f93502ec34e5fe7c6da8 | |
parent | 77b5e2eb773a90ab3bca447dbfb03acb56ee7c4c (diff) | |
download | raviole-device-b1d4e0a643b88bc9283db33a4000287523be28b5.tar.gz |
acpm: dynamically alloc irq_info to avoid invalid-access
Bug: 290072490
Change-Id: Ia06107e3ae9fd1c43f916bb3e854974997bac3cd
Signed-off-by: Redick_Lin <redicklin@google.com>
(cherry picked from commit 81bce3c715316e27e2aa79e6ae9b1ee5fe09724c)
Signed-off-by: Will McVicker <willmcvicker@google.com>
-rw-r--r-- | drivers/soc/google/acpm/acpm_ipc.c | 30 |
1 files changed, 23 insertions, 7 deletions
diff --git a/drivers/soc/google/acpm/acpm_ipc.c b/drivers/soc/google/acpm/acpm_ipc.c index 3373e28ef..555ec26b2 100644 --- a/drivers/soc/google/acpm/acpm_ipc.c +++ b/drivers/soc/google/acpm/acpm_ipc.c @@ -594,19 +594,33 @@ EXPORT_SYMBOL_GPL(acpm_ipc_send_data_sync); extern int nr_irqs; +static void acpm_alloc_irq_info(bool usage) +{ + kfree(irq_info); + if (usage) + irq_info = kcalloc(nr_irqs, sizeof(struct cpu_irq_info), GFP_KERNEL); + else + irq_info = NULL; +} + static void cpu_irq_info_dump(u32 retry) { int i, cpu; u64 sum = 0; + unsigned long flags; + + spin_lock_irqsave(&acpm_debug->lock, flags); + + if (retry == 1) + acpm_alloc_irq_info(true); + else if (retry == 5) + pr_info("<Dump delta of irq counts>\n"); for_each_possible_cpu(cpu) sum += kstat_cpu_irqs_sum(cpu); sum += arch_irq_stat(); - if (retry == 5) - pr_info("<Dump delta of irq counts>\n"); - for_each_irq_nr(i) { struct irq_data *data; struct irq_desc *desc; @@ -632,12 +646,12 @@ static void cpu_irq_info_dump(u32 retry) else name = "???"; - if (retry == 1) { + if (irq_info && retry == 1) { irq_info[i].irq_num = i; irq_info[i].hwirq_num = desc->irq_data.hwirq; irq_info[i].irq_stat = irq_stat; irq_info[i].name = name; - } else if (retry == 5) { + } else if (irq_info && retry == 5) { delta = irq_stat - irq_info[i].irq_stat; if (delta > 0) { pr_info("irq-%-4d(hwirq-%-3d) delta of irqs: %8u %s\n", @@ -645,6 +659,7 @@ static void cpu_irq_info_dump(u32 retry) } } } + spin_unlock_irqrestore(&acpm_debug->lock, flags); } static void acpm_ktop_release(void) @@ -849,6 +864,9 @@ retry: dbg_snapshot_do_dpm_policy(acpm_ipc->panic_action, "acpm_ipc timeout"); } acpm_ktop_release(); + spin_lock_irqsave(&acpm_debug->lock, flags); + acpm_alloc_irq_info(false); + spin_unlock_irqrestore(&acpm_debug->lock, flags); } return 0; @@ -1133,8 +1151,6 @@ int acpm_ipc_probe(struct platform_device *pdev) ret = plugins_init(node); - irq_info = kcalloc(nr_irqs, sizeof(struct cpu_irq_info), GFP_KERNEL); - dev_info(&pdev->dev, "acpm_ipc probe done.\n"); return ret; } |