Date: Thu, 20 Feb 2014 16:06:30 +0800 From: David Xu <davidxu@freebsd.org> To: Erich Dollansky <erichsfreebsdlist@alogt.com> Cc: freebsd-hackers@freebsd.org, Andre Albsmeier <mail@ma17.ata.myota.org> Subject: Re: pthread programming eats up resources (My or FreeBSD's fault?) Message-ID: <5305B786.8020708@freebsd.org> In-Reply-To: <20140220140644.7b1e0074@X220.alogt.com> References: <20140218180646.GA67861@schlappy> <53059574.8090605@freebsd.org> <20140220140644.7b1e0074@X220.alogt.com>
next in thread | previous in thread | raw e-mail | index | archive | help
This is a multi-part message in MIME format. --------------060006050809000708040202 Content-Type: text/plain; charset=ISO-8859-1; format=flowed Content-Transfer-Encoding: 7bit On 2014/02/20 14:06, Erich Dollansky wrote: > Hi, > > On Thu, 20 Feb 2014 13:41:08 +0800 > David Xu <davidxu@freebsd.org> wrote: > >> On 2014/02/19 02:06, Andre Albsmeier wrote: >> >> please compile it as static binary and run it, check if the >> problem still exists, I am hunting the bug, it is not necessary in >> the libthr because I have not changed its code for a long time. > > I just compiled is a static program. The behaviour is now different. > The size still grows but much slower while 'res' stays below some 10MB. > > Size also got stagnant after some 2 min CPU time hanging around 126MB. > > I am running it on: > > FreeBSD X220.alogt.com 10.0-STABLE FreeBSD 10.0-STABLE #15 r261342: Sat > Feb 1 14:52:39 WITA 2014 > erich@X220.alogt.com:/usr/obj/usr/src/sys/X220 amd64 > > Erich > I have found the bug, it is in rtld, where malloc_aligned() is misfunctioning, memory can be corrupted by the function. libthr calls _rtld_allocate_tls to allocate tls control block, the function is in rtld, its uses malloc_aligned() which is not working correctly. Patch is attached. Regards, David Xu --------------060006050809000708040202 Content-Type: text/plain; charset=gbk; name="rtld_align_malloc.diff" Content-Transfer-Encoding: 7bit Content-Disposition: attachment; filename="rtld_align_malloc.diff" Index: libexec/rtld-elf/xmalloc.c =================================================================== --- libexec/rtld-elf/xmalloc.c (revision 260700) +++ libexec/rtld-elf/xmalloc.c (working copy) @@ -72,14 +72,10 @@ malloc_aligned(size_t size, size_t align) { void *mem, *res; - uintptr_t x; - size_t asize, r; - r = round(sizeof(void *), align); - asize = round(size, align) + r; - mem = xmalloc(asize); - x = (uintptr_t)mem; - res = (void *)round(x, align); + mem = xmalloc(size + sizeof(void *) + align - 1); + res =(void*)(((uintptr_t)mem + sizeof(void *) + align - 1) & + ~(align - 1)); *(void **)((uintptr_t)res - sizeof(void *)) = mem; return (res); } --------------060006050809000708040202--
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?5305B786.8020708>