[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>
This commit is contained in:
committed by
Linus Torvalds
parent
662795deb8
commit
48e6484d49
@@ -119,7 +119,6 @@ extern struct group_info init_groups;
|
||||
.signal = {{0}}}, \
|
||||
.blocked = {{0}}, \
|
||||
.alloc_lock = SPIN_LOCK_UNLOCKED, \
|
||||
.proc_lock = SPIN_LOCK_UNLOCKED, \
|
||||
.journal_info = NULL, \
|
||||
.cpu_timers = INIT_CPU_TIMERS(tsk.cpu_timers), \
|
||||
.fs_excl = ATOMIC_INIT(0), \
|
||||
|
||||
@@ -99,9 +99,8 @@ extern void proc_misc_init(void);
|
||||
|
||||
struct mm_struct;
|
||||
|
||||
void proc_flush_task(struct task_struct *task);
|
||||
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 *);
|
||||
int task_statm(struct mm_struct *, int *, int *, int *, int *);
|
||||
@@ -211,8 +210,7 @@ static inline void proc_net_remove(const char *name)
|
||||
#define proc_net_create(name, mode, info) ({ (void)(mode), NULL; })
|
||||
static inline void proc_net_remove(const char *name) {}
|
||||
|
||||
static inline struct dentry *proc_pid_unhash(struct task_struct *p) { return NULL; }
|
||||
static inline void proc_pid_flush(struct dentry *proc_dentry) { }
|
||||
static inline void proc_flush_task(struct task_struct *task) { }
|
||||
|
||||
static inline struct proc_dir_entry *create_proc_entry(const char *name,
|
||||
mode_t mode, struct proc_dir_entry *parent) { return NULL; }
|
||||
|
||||
@@ -842,8 +842,6 @@ struct task_struct {
|
||||
u32 self_exec_id;
|
||||
/* Protection of (de-)allocation: mm, files, fs, tty, keyrings */
|
||||
spinlock_t alloc_lock;
|
||||
/* Protection of proc_dentry: nesting proc_lock, dcache_lock, write_lock_irq(&tasklist_lock); */
|
||||
spinlock_t proc_lock;
|
||||
|
||||
#ifdef CONFIG_DEBUG_MUTEXES
|
||||
/* mutex deadlock detection */
|
||||
@@ -856,7 +854,6 @@ struct task_struct {
|
||||
/* VM state */
|
||||
struct reclaim_state *reclaim_state;
|
||||
|
||||
struct dentry *proc_dentry;
|
||||
struct backing_dev_info *backing_dev_info;
|
||||
|
||||
struct io_context *io_context;
|
||||
|
||||
Reference in New Issue
Block a user