lkml.org 
[lkml]   [2011]   [Jul]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
Patch in this message
/
Date
From
Subjectvfsmount lock issues on very large ppc64 box

When compiling a kernel with make -j on a ppc64 box with 896
HW threads we spend a very large amount of time in vfsmount
lock code:

20.85% [k] .vfsmount_lock_local_lock
|
|--57.20%-- .mntput_no_expire
| |
| |--74.93%-- .fput
| | |
| | |--91.19%-- .filp_close
| | | |
| | | |--98.97%-- .sys_close

14.15% [k] .vfsmount_lock_global_lock_online
|
|--100.00%-- .mntput_no_expire
| .fput
| .filp_close
| |
| |--70.01%-- .put_files_struct
| | .do_exit
| | .do_group_exit
| | .sys_exit_group
| | syscall_exit
| |
| --29.99%-- .sys_close


Looking closer, all of these calls are in pipefs and sockfs.
Since we never mount either filesystem they never get a long term
reference and we always end up in the very slow write brlock path
that takes a lock for each online CPU.

Here is a quick hack that takes a long term reference on pipefs
and sockfs which fixes the problem. Any thoughts on how we should
fix it properly?

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

Index: linux-2.6-work/fs/pipe.c
===================================================================
--- linux-2.6-work.orig/fs/pipe.c 2011-07-17 10:21:54.695472158 +1000
+++ linux-2.6-work/fs/pipe.c 2011-07-17 10:33:31.127204731 +1000
@@ -20,6 +20,7 @@
#include <linux/audit.h>
#include <linux/syscalls.h>
#include <linux/fcntl.h>
+#include "internal.h"

#include <asm/uaccess.h>
#include <asm/ioctls.h>
@@ -1286,11 +1287,13 @@ static int __init init_pipe_fs(void)
unregister_filesystem(&pipe_fs_type);
}
}
+ mnt_make_longterm(pipe_mnt);
return err;
}

static void __exit exit_pipe_fs(void)
{
+ mnt_make_shortterm(pipe_mnt);
unregister_filesystem(&pipe_fs_type);
mntput(pipe_mnt);
}
Index: linux-2.6-work/net/socket.c
===================================================================
--- linux-2.6-work.orig/net/socket.c 2011-07-17 10:21:54.685471989 +1000
+++ linux-2.6-work/net/socket.c 2011-07-17 10:33:41.247375257 +1000
@@ -2500,6 +2500,8 @@ void sock_unregister(int family)
}
EXPORT_SYMBOL(sock_unregister);

+extern void mnt_make_longterm(struct vfsmount *);
+
static int __init sock_init(void)
{
int err;
@@ -2530,6 +2532,8 @@ static int __init sock_init(void)
goto out_mount;
}

+ mnt_make_longterm(sock_mnt);
+
/* The real protocol initialization is performed in later initcalls.
*/


\
 
 \ /
  Last update: 2011-07-17 02:53    [W:0.104 / U:1.044 seconds]
©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site