aboutsummaryrefslogtreecommitdiffstats
path: root/arch/powerpc
diff options
context:
space:
mode:
authorDavidlohr Bueso <dave@stgolabs.net>2015-04-16 15:49:15 -0400
committerLinus Torvalds <torvalds@linux-foundation.org>2015-04-17 09:04:11 -0400
commitfd89a65f155fa890c0130139dfb91684d6da4cfb (patch)
treec0bc5d80caeaa4f7863205acb59c43db66f57da9 /arch/powerpc
parent11163348a23cdbcdca5fb42485418e75f8566a5c (diff)
powerpc/oprofile: reduce mmap_sem hold for exe_file
In the future mm->exe_file will be done without mmap_sem serialization, thus isolate and reorganize the related code to make the transition easier. Good users will, make use of the more standard get_mm_exe_file(), requiring only holding the mmap_sem to read the value, and relying on reference counting to make sure that the exe file won't dissappear underneath us while getting the dcookie. Signed-off-by: Davidlohr Bueso <dbueso@suse.de> Cc: Arnd Bergmann <arnd@arndb.de> Cc: Robert Richter <rric@kernel.org> Cc: Benjamin Herrenschmidt <benh@kernel.crashing.org> Signed-off-by: Andrew Morton <akpm@linux-foundation.org> Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org>
Diffstat (limited to 'arch/powerpc')
-rw-r--r--arch/powerpc/oprofile/cell/spu_task_sync.c13
1 files changed, 8 insertions, 5 deletions
diff --git a/arch/powerpc/oprofile/cell/spu_task_sync.c b/arch/powerpc/oprofile/cell/spu_task_sync.c
index 1c27831df1ac..ed7b0977072a 100644
--- a/arch/powerpc/oprofile/cell/spu_task_sync.c
+++ b/arch/powerpc/oprofile/cell/spu_task_sync.c
@@ -22,6 +22,7 @@
22#include <linux/kref.h> 22#include <linux/kref.h>
23#include <linux/mm.h> 23#include <linux/mm.h>
24#include <linux/fs.h> 24#include <linux/fs.h>
25#include <linux/file.h>
25#include <linux/module.h> 26#include <linux/module.h>
26#include <linux/notifier.h> 27#include <linux/notifier.h>
27#include <linux/numa.h> 28#include <linux/numa.h>
@@ -322,18 +323,20 @@ get_exec_dcookie_and_offset(struct spu *spu, unsigned int *offsetp,
322 unsigned long app_cookie = 0; 323 unsigned long app_cookie = 0;
323 unsigned int my_offset = 0; 324 unsigned int my_offset = 0;
324 struct vm_area_struct *vma; 325 struct vm_area_struct *vma;
326 struct file *exe_file;
325 struct mm_struct *mm = spu->mm; 327 struct mm_struct *mm = spu->mm;
326 328
327 if (!mm) 329 if (!mm)
328 goto out; 330 goto out;
329 331
330 down_read(&mm->mmap_sem); 332 exe_file = get_mm_exe_file(mm);
331 333 if (exe_file) {
332 if (mm->exe_file) { 334 app_cookie = fast_get_dcookie(&exe_file->f_path);
333 app_cookie = fast_get_dcookie(&mm->exe_file->f_path); 335 pr_debug("got dcookie for %pD\n", exe_file);
334 pr_debug("got dcookie for %pD\n", mm->exe_file); 336 fput(exe_file);
335 } 337 }
336 338
339 down_read(&mm->mmap_sem);
337 for (vma = mm->mmap; vma; vma = vma->vm_next) { 340 for (vma = mm->mmap; vma; vma = vma->vm_next) {
338 if (vma->vm_start > spu_ref || vma->vm_end <= spu_ref) 341 if (vma->vm_start > spu_ref || vma->vm_end <= spu_ref)
339 continue; 342 continue;