proc: less memory for /proc/*/map_files readdir
PATCH 1/1 proc: less memory for /proc/*/map_files readdir
dentry name can be evaluated later, right before calling into VFS.
Also, spend less time under ->mmap_sem.
Signed-off-by Alexey Dobriyan <[email protected]>
---
fs/proc/base.c | 15 +++++++++------ 1 file changed, 9 insertions(+), 6 deletions(-)
fs/proc/base.c +9 -6
@@ -2001,9 +2001,9 @@ static int map_files_get_link(struct dentry *dentry, struct path *path) }struct map_files_info { +unsigned long start; +unsigned long end;fmode_t mode; -unsigned int len; -unsigned char name[4 *sizeof (long )+2 ];/* max: %lx-%lx\0 */ };/*
@@ -2173,10 +2173,9 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx)if (++pos <= ctx->pos)continue ; + info.start = vma->vm_start; + info.end = vma->vm_end; info.mode = vma->vm_file->f_mode; - info.len =snprintf (info.name, -sizeof (info.name),"%lx-%lx" , - vma->vm_start, vma->vm_end);if (flex_array_put (fa, i++, &info,GFP_KERNEL ))BUG (); }
@@ -2184,9 +2183,13 @@ proc_map_files_readdir(struct file *file, struct dir_context *ctx)up_read (&mm->mmap_sem);for (i =0 ; i < nr_files; i++) { +char buf[4 *sizeof (long ) +2 ];/* max: %lx-%lx\0 */ +unsigned int len; + p =flex_array_get (fa, i); + len =snprintf (buf,sizeof (buf),"%lx-%lx" , p->start, p->end);if (!proc_fill_cache (file, ctx, - p->name, p->len, + buf, len, proc_map_files_instantiate, task, (void *)(unsigned long )p->mode))