From c9a7a065bb5ec09286fef8b52b4fd23a966a94a8 Mon Sep 17 00:00:00 2001 From: Ralph Boehme Date: Thu, 9 Mar 2017 19:49:56 +0100 Subject: lib/pthreadpool: fix a memory leak MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit When copying large files from the server to the client with aio enabled we noticed that smbd kept growing RSS and VSZ. valgrind was reporting: ==2503== 4,093,440 bytes in 6,560 blocks are possibly lost in loss record 460 of 460 ==2503== at 0x4C299CE: calloc (vg_replace_malloc.c:711) ==2503== by 0x4011C24: _dl_allocate_tls (in /usr/lib64/ld-2.17.so) ==2503== by 0x4E3C960: pthread_create@@GLIBC_2.2.5 (in /usr/lib64/libpthread-2.17.so) ==2503== by 0x9B298AE: pthreadpool_add_job (in /usr/lib64/samba/libmessages-dgm-samba4.so) ==2503== by 0x9B29FDC: pthreadpool_tevent_job_send (in /usr/lib64/samba/libmessages-dgm-samba4.so) ==2503== by 0x56A78EF: ??? (in /usr/lib64/samba/libsmbd-base-samba4.so) ==2503== by 0x55D86B7: smb_vfs_call_pread_send (in /usr/lib64/samba/libsmbd-base-samba4.so) ==2503== by 0x55F7543: schedule_smb2_aio_read (in /usr/lib64/samba/libsmbd-base-samba4.so) ==2503== by 0x5608F57: smbd_smb2_request_process_read (in /usr/lib64/samba/libsmbd-base-samba4.so) ==2503== by 0x55FCB6C: smbd_smb2_request_dispatch (in /usr/lib64/samba/libsmbd-base-samba4.so) ==2503== by 0x55FD7DC: ??? (in /usr/lib64/samba/libsmbd-base-samba4.so) ==2503== by 0x641B977: ??? (in /usr/lib64/samba/libtevent.so.0.9.31) The problem seems to be caused by worked threads that are not properly started in detached state and thus their tls is not reclaimed upon thread termination. In pthreadpool.c we prepare a pthread attribute with PTHREAD_CREATE_DETACHED, but we don't pass it to pthread_create(). Bug: https://bugzilla.samba.org/show_bug.cgi?id=12624 Signed-off-by: Ralph Boehme Reviewed-by: Volker Lendecke Reviewed-by: Stefan Metzmacher Autobuild-User(master): Ralph Böhme Autobuild-Date(master): Fri Mar 10 22:06:02 CET 2017 on sn-devel-144 --- lib/pthreadpool/pthreadpool.c | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'lib/pthreadpool') diff --git a/lib/pthreadpool/pthreadpool.c b/lib/pthreadpool/pthreadpool.c index eaddd4426d2..f97cdcc6c15 100644 --- a/lib/pthreadpool/pthreadpool.c +++ b/lib/pthreadpool/pthreadpool.c @@ -534,7 +534,7 @@ int pthreadpool_add_job(struct pthreadpool *pool, int job_id, return res; } - res = pthread_create(&thread_id, NULL, pthreadpool_server, + res = pthread_create(&thread_id, &thread_attr, pthreadpool_server, (void *)pool); if (res == 0) { pool->num_threads += 1; -- cgit v1.2.1