• O
    proc_flush_task: flush /proc/tid/task/pid when a sub-thread exits · 9b4d1cbe
    Oleg Nesterov 提交于
    The exiting sub-thread flushes /proc/pid only, but this doesn't buy too
    much: ps and friends mostly use /proc/tid/task/pid.
    
    Remove "if (thread_group_leader())" checks from proc_flush_task() path,
    this means we always remove /proc/tid/task/pid dentry on exit, and this
    actually matches the comment above proc_flush_task().
    
    The test-case:
    
    	static void* tfunc(void *arg)
    	{
    		char name[256];
    
    		sprintf(name, "/proc/%d/task/%ld/status", getpid(), gettid());
    		close(open(name, O_RDONLY));
    
    		return NULL;
    	}
    
    	int main(void)
    	{
    		pthread_t t;
    
    		for (;;) {
    			if (!pthread_create(&t, NULL, &tfunc, NULL))
    				pthread_join(t, NULL);
    		}
    	}
    
    slabtop shows that pid/proc_inode_cache/etc grow quickly and
    "indefinitely" until the task is killed or shrink_slab() is called, not
    good.  And the main thread needs a lot of time to exit.
    
    The same can happen if something like "ps -efL" runs continuously, while
    some application spawns short-living threads.
    Reported-by: N"James M. Leddy" <jleddy@redhat.com>
    Signed-off-by: NOleg Nesterov <oleg@redhat.com>
    Cc: Alexey Dobriyan <adobriyan@gmail.com>
    Cc: "Eric W. Biederman" <ebiederm@xmission.com>
    Cc: Dominic Duval <dduval@redhat.com>
    Cc: Frank Hirtz <fhirtz@redhat.com>
    Cc: "Fuller, Johnray" <Johnray.Fuller@gs.com>
    Cc: Larry Woodman <lwoodman@redhat.com>
    Cc: Paul Batkowski <pbatkowski@redhat.com>
    Cc: Roland McGrath <roland@redhat.com>
    Signed-off-by: NAndrew Morton <akpm@linux-foundation.org>
    Signed-off-by: NLinus Torvalds <torvalds@linux-foundation.org>
    9b4d1cbe
base.c 74.6 KB