From mboxrd@z Thu Jan 1 00:00:00 1970 From: alexander.shishckin@gmail.com Subject: [PATCH] [RFC] List per-process file descriptor consumption when hitting file-max Date: Mon, 8 Jun 2009 14:38:42 +0300 Message-ID: <1244461122-3303-1-git-send-email-alexander.shishckin@gmail.com> Cc: Alexander Shishkin To: linux-fsdevel@vger.kernel.org Return-path: Received: from smtp.nokia.com ([192.100.105.134]:21607 "EHLO mgw-mx09.nokia.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1754483AbZFHLjT (ORCPT ); Mon, 8 Jun 2009 07:39:19 -0400 Sender: linux-fsdevel-owner@vger.kernel.org List-ID: From: Alexander Shishkin When a file descriptor limit is hit, it might be useful to see all the users to be able to identify those that leak descriptors. Signed-off-by: Alexander Shishkin --- fs/file_table.c | 27 +++++++++++++++++++++++++++ 1 files changed, 27 insertions(+), 0 deletions(-) diff --git a/fs/file_table.c b/fs/file_table.c index 54018fe..9e53167 100644 --- a/fs/file_table.c +++ b/fs/file_table.c @@ -136,8 +136,35 @@ struct file *get_empty_filp(void) over: /* Ran out of filps - report that */ if (get_nr_files() > old_max) { + struct task_struct *p; + struct files_struct *files; + struct fdtable *fdt; + int i, count = 0; + printk(KERN_INFO "VFS: file-max limit %d reached\n", get_max_files()); + + read_lock(&tasklist_lock); + for_each_process(p) { + files = get_files_struct(p); + if (!files) + continue; + + spin_lock(&files->file_lock); + fdt = files_fdtable(files); + + /* we have to actually *count* the fds */ + for (count = i = 0; i < fdt->max_fds; i++) + count += !!fcheck_files(files, i); + + printk(KERN_INFO "=> %s [%d]: %d\n", p->comm, + p->pid, count); + + spin_unlock(&files->file_lock); + put_files_struct(files); + } + read_unlock(&tasklist_lock); + old_max = get_nr_files(); } goto fail; -- 1.6.1.3