Patchwork powerpc/perf_counter: Fix vdso detection

login
register
mail settings
Submitter Anton Blanchard
Date Sept. 22, 2009, 2:57 a.m.
Message ID <20090922025740.GF31801@kryten>
Download mbox | patch
Permalink /patch/34033/
State Accepted, archived
Commit f2053f1a7bf6005b4e81826b1ac8d0b4117c4cf0
Delegated to: Benjamin Herrenschmidt
Headers show

Comments

Anton Blanchard - Sept. 22, 2009, 2:57 a.m.
perf_counter uses arch_vma_name() to detect a vdso region which in turn uses
current->mm->context.vdso_base. We need to initialise this before doing
the mmap or else we fail to detect the vdso.

Signed-off-by: Anton Blanchard <anton@samba.org>
---

Patch

Index: linux.trees.git/arch/powerpc/kernel/vdso.c
===================================================================
--- linux.trees.git.orig/arch/powerpc/kernel/vdso.c	2009-07-15 10:00:41.000000000 +1000
+++ linux.trees.git/arch/powerpc/kernel/vdso.c	2009-07-15 10:01:40.000000000 +1000
@@ -240,6 +240,13 @@ 
 	}
 
 	/*
+	 * Put vDSO base into mm struct. We need to do this before calling
+	 * install_special_mapping or the perf counter mmap tracking code
+	 * will fail to recognise it as a vDSO (since arch_vma_name fails).
+	 */
+	current->mm->context.vdso_base = vdso_base;
+
+	/*
 	 * our vma flags don't have VM_WRITE so by default, the process isn't
 	 * allowed to write those pages.
 	 * gdb can break that with ptrace interface, and thus trigger COW on
@@ -259,11 +266,10 @@ 
 				     VM_MAYREAD|VM_MAYWRITE|VM_MAYEXEC|
 				     VM_ALWAYSDUMP,
 				     vdso_pagelist);
-	if (rc)
+	if (rc) {
+		current->mm->context.vdso_base = 0;
 		goto fail_mmapsem;
-
-	/* Put vDSO base into mm struct */
-	current->mm->context.vdso_base = vdso_base;
+	}
 
 	up_write(&mm->mmap_sem);
 	return 0;