From 384aabda4b2051245ce44df0ecb538617644e32e Mon Sep 17 00:00:00 2001 From: William Lee Irwin III Date: Thu, 26 Aug 2004 20:36:03 -0700 Subject: [PATCH] [PATCH] task_vsize() locking cleanup task_vsize() doesn't need mm->mmap_sem for the CONFIG_MMU case; the semaphore doesn't prevent mm->total_vm from going stale or getting inconsistent with other numbers regardless. Also, KSTK_EIP() and KSTK_ESP() don't want or need protection from mm->mmap_sem either. So this pushes mm->mmap_sem to task_vsize() in the CONFIG_MMU=n task_vsize(). Also, hoist the prototype of task_vsize() into proc_fs.h The net result of this is a small speedup of procps for CONFIG_MMU. Signed-off-by: Andrew Morton Signed-off-by: Linus Torvalds --- fs/proc/array.c | 3 --- fs/proc/task_nommu.c | 3 ++- include/linux/proc_fs.h | 3 +++ 3 files changed, 5 insertions(+), 4 deletions(-) diff --git a/fs/proc/array.c b/fs/proc/array.c index d41a679d13625..f2c9d22f773e1 100644 --- a/fs/proc/array.c +++ b/fs/proc/array.c @@ -299,7 +299,6 @@ int proc_pid_status(struct task_struct *task, char * buffer) return buffer - orig; } -extern unsigned long task_vsize(struct mm_struct *); int proc_pid_stat(struct task_struct *task, char * buffer) { unsigned long vsize, eip, esp, wchan; @@ -318,11 +317,9 @@ int proc_pid_stat(struct task_struct *task, char * buffer) vsize = eip = esp = 0; mm = get_task_mm(task); if (mm) { - down_read(&mm->mmap_sem); vsize = task_vsize(mm); eip = KSTK_EIP(task); esp = KSTK_ESP(task); - up_read(&mm->mmap_sem); } get_task_comm(tcomm, task); diff --git a/fs/proc/task_nommu.c b/fs/proc/task_nommu.c index 126db9797262c..32f01505530ef 100644 --- a/fs/proc/task_nommu.c +++ b/fs/proc/task_nommu.c @@ -68,11 +68,12 @@ unsigned long task_vsize(struct mm_struct *mm) struct mm_tblock_struct *tbp; unsigned long vsize = 0; + down_read(&mm->mmap_sem); for (tbp = &mm->context.tblock; tbp; tbp = tbp->next) { if (tbp->rblock) vsize += kobjsize(tbp->rblock->kblock); } - + up_read(&mm->mmap_sem); return vsize; } diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 2d439a8390c06..96a7db0537813 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h @@ -86,10 +86,13 @@ extern struct proc_dir_entry *proc_root_kcore; extern void proc_root_init(void); extern void proc_misc_init(void); +struct mm_struct; + struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); struct dentry *proc_pid_unhash(struct task_struct *p); void proc_pid_flush(struct dentry *proc_dentry); int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); +unsigned long task_vsize(struct mm_struct *); extern struct proc_dir_entry *create_proc_entry(const char *name, mode_t mode, struct proc_dir_entry *parent); -- 2.53.0