Track maximum number of files for the process, present current maximum in /proc/self/limits. Signed-off-by: Topi Miettinen <toiwoton@xxxxxxxxx> --- fs/file.c | 4 ++++ fs/proc/base.c | 10 ++++++---- include/linux/sched.h | 7 +++++++ 3 files changed, 17 insertions(+), 4 deletions(-) diff --git a/fs/file.c b/fs/file.c index 6b1acdf..2d0d206 100644 --- a/fs/file.c +++ b/fs/file.c @@ -547,6 +547,8 @@ repeat: } #endif + bump_rlimit(RLIMIT_NOFILE, fd); + out: spin_unlock(&files->file_lock); return error; @@ -857,6 +859,8 @@ __releases(&files->file_lock) if (tofree) filp_close(tofree, files); + bump_rlimit(RLIMIT_NOFILE, fd); + return fd; Ebusy: diff --git a/fs/proc/base.c b/fs/proc/base.c index a11eb71..227997b 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -630,8 +630,8 @@ static int proc_pid_limits(struct seq_file *m, struct pid_namespace *ns, /* * print the file header */ - seq_printf(m, "%-25s %-20s %-20s %-10s\n", - "Limit", "Soft Limit", "Hard Limit", "Units"); + seq_printf(m, "%-25s %-20s %-20s %-10s %-20s\n", + "Limit", "Soft Limit", "Hard Limit", "Units", "Max"); for (i = 0; i < RLIM_NLIMITS; i++) { if (rlim[i].rlim_cur == RLIM_INFINITY) @@ -647,9 +647,11 @@ static int proc_pid_limits(struct seq_file *m, struct pid_namespace *ns, seq_printf(m, "%-20lu ", rlim[i].rlim_max); if (lnames[i].unit) - seq_printf(m, "%-10s\n", lnames[i].unit); + seq_printf(m, "%-10s", lnames[i].unit); else - seq_putc(m, '\n'); + seq_printf(m, "%-10s", ""); + seq_printf(m, "%-20lu\n", + task->signal->rlim_curmax[i]); } return 0; diff --git a/include/linux/sched.h b/include/linux/sched.h index 9c48a08..0150380 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h @@ -782,6 +782,7 @@ struct signal_struct { * have no need to disable irqs. */ struct rlimit rlim[RLIM_NLIMITS]; + unsigned long rlim_curmax[RLIM_NLIMITS]; #ifdef CONFIG_BSD_PROCESS_ACCT struct pacct_struct pacct; /* per-process accounting information */ @@ -3376,6 +3377,12 @@ static inline unsigned long rlimit_max(unsigned int limit) return task_rlimit_max(current, limit); } +static inline void bump_rlimit(unsigned int limit, unsigned long r) +{ + if (READ_ONCE(current->signal->rlim_curmax[limit]) < r) + current->signal->rlim_curmax[limit] = r; +} + #ifdef CONFIG_CPU_FREQ struct update_util_data { void (*func)(struct update_util_data *data, -- 2.8.1 -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html