summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRedick_Lin <redicklin@google.com>2023-05-05 12:08:10 +0800
committerWill McVicker <willmcvicker@google.com>2024-04-16 11:58:48 -0700
commitb1d4e0a643b88bc9283db33a4000287523be28b5 (patch)
treefeab3b3241afb80103b6f93502ec34e5fe7c6da8
parent77b5e2eb773a90ab3bca447dbfb03acb56ee7c4c (diff)
downloadraviole-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.c30
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;
}