summaryrefslogtreecommitdiffstats
path: root/net/unix/garbage.c
diff options
context:
space:
mode:
authorIngo Molnar <mingo@elte.hu>2010-12-07 07:49:48 +0100
committerIngo Molnar <mingo@elte.hu>2010-12-07 07:49:51 +0100
commit10a18d7dc0d9f12483c95ffc234118e9b80edfeb (patch)
tree0f43620107d5231cab669bca4b3c923b721330c7 /net/unix/garbage.c
parentkprobes: Use text_poke_smp_batch for unoptimizing (diff)
parentLinux 2.6.37-rc5 (diff)
downloadlinux-10a18d7dc0d9f12483c95ffc234118e9b80edfeb.tar.xz
linux-10a18d7dc0d9f12483c95ffc234118e9b80edfeb.zip
Merge commit 'v2.6.37-rc5' into perf/core
Merge reason: Pick up the latest -rc. Signed-off-by: Ingo Molnar <mingo@elte.hu>
Diffstat (limited to 'net/unix/garbage.c')
-rw-r--r--net/unix/garbage.c9
1 files changed, 8 insertions, 1 deletions
diff --git a/net/unix/garbage.c b/net/unix/garbage.c
index c8df6fda0b1f..f89f83bf828e 100644
--- a/net/unix/garbage.c
+++ b/net/unix/garbage.c
@@ -96,7 +96,7 @@ static DECLARE_WAIT_QUEUE_HEAD(unix_gc_wait);
unsigned int unix_tot_inflight;
-static struct sock *unix_get_socket(struct file *filp)
+struct sock *unix_get_socket(struct file *filp)
{
struct sock *u_sock = NULL;
struct inode *inode = filp->f_path.dentry->d_inode;
@@ -259,9 +259,16 @@ static void inc_inflight_move_tail(struct unix_sock *u)
}
static bool gc_in_progress = false;
+#define UNIX_INFLIGHT_TRIGGER_GC 16000
void wait_for_unix_gc(void)
{
+ /*
+ * If number of inflight sockets is insane,
+ * force a garbage collect right now.
+ */
+ if (unix_tot_inflight > UNIX_INFLIGHT_TRIGGER_GC && !gc_in_progress)
+ unix_gc();
wait_event(unix_gc_wait, gc_in_progress == false);
}