diff options
| author | Eric W. Biederman <ebiederm@xmission.com> | 2006-06-26 03:25:48 -0400 |
|---|---|---|
| committer | Linus Torvalds <torvalds@g5.osdl.org> | 2006-06-26 12:58:24 -0400 |
| commit | 48e6484d49020dba3578ad117b461e8a391e8f0f (patch) | |
| tree | 7824ca84bfe71c3fe2c09a1fedc31106fec4f500 /include/linux | |
| parent | 662795deb854b31501e0ffb42b7f0cce802c134a (diff) | |
[PATCH] proc: Rewrite the proc dentry flush on exit optimization
To keep the dcache from filling up with dead /proc entries we flush them on
process exit. However over the years that code has gotten hairy with a
dentry_pointer and a lock in task_struct and misdocumented as a correctness
feature.
I have rewritten this code to look and see if we have a corresponding entry in
the dcache and if so flush it on process exit. This removes the extra fields
in the task_struct and allows me to trivially handle the case of a
/proc/<tgid>/task/<pid> entry as well as the current /proc/<pid> entries.
Signed-off-by: Eric W. Biederman <ebiederm@xmission.com>
Signed-off-by: Andrew Morton <akpm@osdl.org>
Signed-off-by: Linus Torvalds <torvalds@osdl.org>
Diffstat (limited to 'include/linux')
| -rw-r--r-- | include/linux/init_task.h | 1 | ||||
| -rw-r--r-- | include/linux/proc_fs.h | 6 | ||||
| -rw-r--r-- | include/linux/sched.h | 3 |
3 files changed, 2 insertions, 8 deletions
diff --git a/include/linux/init_task.h b/include/linux/init_task.h index 41ecbb847f32..e127ef7e8da8 100644 --- a/include/linux/init_task.h +++ b/include/linux/init_task.h | |||
| @@ -119,7 +119,6 @@ extern struct group_info init_groups; | |||
| 119 | .signal = {{0}}}, \ | 119 | .signal = {{0}}}, \ |
| 120 | .blocked = {{0}}, \ | 120 | .blocked = {{0}}, \ |
| 121 | .alloc_lock = SPIN_LOCK_UNLOCKED, \ | 121 | .alloc_lock = SPIN_LOCK_UNLOCKED, \ |
| 122 | .proc_lock = SPIN_LOCK_UNLOCKED, \ | ||
| 123 | .journal_info = NULL, \ | 122 | .journal_info = NULL, \ |
| 124 | .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \ | 123 | .cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \ |
| 125 | .fs_excl = ATOMIC_INIT(0), \ | 124 | .fs_excl = ATOMIC_INIT(0), \ |
diff --git a/include/linux/proc_fs.h b/include/linux/proc_fs.h index 9dd84884abb1..d4d2081dbaf7 100644 --- a/include/linux/proc_fs.h +++ b/include/linux/proc_fs.h | |||
| @@ -99,9 +99,8 @@ extern void proc_misc_init(void); | |||
| 99 | 99 | ||
| 100 | struct mm_struct; | 100 | struct mm_struct; |
| 101 | 101 | ||
| 102 | void proc_flush_task(struct task_struct *task); | ||
| 102 | struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); | 103 | struct dentry *proc_pid_lookup(struct inode *dir, struct dentry * dentry, struct nameidata *); |
| 103 | struct dentry *proc_pid_unhash(struct task_struct *p); | ||
| 104 | void proc_pid_flush(struct dentry *proc_dentry); | ||
| 105 | int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); | 104 | int proc_pid_readdir(struct file * filp, void * dirent, filldir_t filldir); |
| 106 | unsigned long task_vsize(struct mm_struct *); | 105 | unsigned long task_vsize(struct mm_struct *); |
| 107 | int task_statm(struct mm_struct *, int *, int *, int *, int *); | 106 | int task_statm(struct mm_struct *, int *, int *, int *, int *); |
| @@ -211,8 +210,7 @@ static inline void proc_net_remove(const char *name) | |||
| 211 | #define proc_net_create(name, mode, info) ({ (void)(mode), NULL; }) | 210 | #define proc_net_create(name, mode, info) ({ (void)(mode), NULL; }) |
| 212 | static inline void proc_net_remove(const char *name) {} | 211 | static inline void proc_net_remove(const char *name) {} |
| 213 | 212 | ||
| 214 | static inline struct dentry *proc_pid_unhash(struct task_struct *p) { return NULL; } | 213 | static inline void proc_flush_task(struct task_struct *task) { } |
| 215 | static inline void proc_pid_flush(struct dentry *proc_dentry) { } | ||
| 216 | 214 | ||
| 217 | static inline struct proc_dir_entry *create_proc_entry(const char *name, | 215 | static inline struct proc_dir_entry *create_proc_entry(const char *name, |
| 218 | mode_t mode, struct proc_dir_entry *parent) { return NULL; } | 216 | mode_t mode, struct proc_dir_entry *parent) { return NULL; } |
diff --git a/include/linux/sched.h b/include/linux/sched.h index 8d11d9310db0..122a25c1b997 100644 --- a/include/linux/sched.h +++ b/include/linux/sched.h | |||
| @@ -842,8 +842,6 @@ struct task_struct { | |||
| 842 | u32 self_exec_id; | 842 | u32 self_exec_id; |
| 843 | /* Protection of (de-)allocation: mm, files, fs, tty, keyrings */ | 843 | /* Protection of (de-)allocation: mm, files, fs, tty, keyrings */ |
| 844 | spinlock_t alloc_lock; | 844 | spinlock_t alloc_lock; |
| 845 | /* Protection of proc_dentry: nesting proc_lock, dcache_lock, write_lock_irq(&tasklist_lock); */ | ||
| 846 | spinlock_t proc_lock; | ||
| 847 | 845 | ||
| 848 | #ifdef CONFIG_DEBUG_MUTEXES | 846 | #ifdef CONFIG_DEBUG_MUTEXES |
| 849 | /* mutex deadlock detection */ | 847 | /* mutex deadlock detection */ |
| @@ -856,7 +854,6 @@ struct task_struct { | |||
| 856 | /* VM state */ | 854 | /* VM state */ |
| 857 | struct reclaim_state *reclaim_state; | 855 | struct reclaim_state *reclaim_state; |
| 858 | 856 | ||
| 859 | struct dentry *proc_dentry; | ||
| 860 | struct backing_dev_info *backing_dev_info; | 857 | struct backing_dev_info *backing_dev_info; |
| 861 | 858 | ||
| 862 | struct io_context *io_context; | 859 | struct io_context *io_context; |
