浏览代码

Merge tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux

Pull arm64 fixes from Catalin Marinas:
 "arm64 and arm/perf fixes:

   - arm64 fix: debug exception unmasking on the CPU resume path

   - ARM PMU fixes: memory leak on error path and NULL pointer
     dereference"

* tag 'arm64-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/arm64/linux:
  arm64: kernel: Fix unmasked debug exceptions when restoring mdscr_el1
  drivers/perf: arm_pmu: Fix NULL pointer dereference during probe
  drivers/perf: arm_pmu: Fix leak in error path
Linus Torvalds 9 年之前
父节点
当前提交
2bece1a010
共有 2 个文件被更改,包括 11 次插入1 次删除
  1. 9 0
      arch/arm64/mm/proc.S
  2. 2 1
      drivers/perf/arm_pmu.c

+ 9 - 0
arch/arm64/mm/proc.S

@@ -100,7 +100,16 @@ ENTRY(cpu_do_resume)
 
 
 	msr	tcr_el1, x8
 	msr	tcr_el1, x8
 	msr	vbar_el1, x9
 	msr	vbar_el1, x9
+
+	/*
+	 * __cpu_setup() cleared MDSCR_EL1.MDE and friends, before unmasking
+	 * debug exceptions. By restoring MDSCR_EL1 here, we may take a debug
+	 * exception. Mask them until local_dbg_restore() in cpu_suspend()
+	 * resets them.
+	 */
+	disable_dbg
 	msr	mdscr_el1, x10
 	msr	mdscr_el1, x10
+
 	msr	sctlr_el1, x12
 	msr	sctlr_el1, x12
 	/*
 	/*
 	 * Restore oslsr_el1 by writing oslar_el1
 	 * Restore oslsr_el1 by writing oslar_el1

+ 2 - 1
drivers/perf/arm_pmu.c

@@ -925,6 +925,7 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu)
 			if (i > 0 && spi != using_spi) {
 			if (i > 0 && spi != using_spi) {
 				pr_err("PPI/SPI IRQ type mismatch for %s!\n",
 				pr_err("PPI/SPI IRQ type mismatch for %s!\n",
 					dn->name);
 					dn->name);
+				of_node_put(dn);
 				kfree(irqs);
 				kfree(irqs);
 				return -EINVAL;
 				return -EINVAL;
 			}
 			}
@@ -969,7 +970,7 @@ static int of_pmu_irq_cfg(struct arm_pmu *pmu)
 	if (cpumask_weight(&pmu->supported_cpus) == 0) {
 	if (cpumask_weight(&pmu->supported_cpus) == 0) {
 		int irq = platform_get_irq(pdev, 0);
 		int irq = platform_get_irq(pdev, 0);
 
 
-		if (irq_is_percpu(irq)) {
+		if (irq >= 0 && irq_is_percpu(irq)) {
 			/* If using PPIs, check the affinity of the partition */
 			/* If using PPIs, check the affinity of the partition */
 			int ret;
 			int ret;