From owner-freebsd-hackers@FreeBSD.ORG Thu Feb 20 12:16:29 2014 Return-Path: Delivered-To: freebsd-hackers@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) (using TLSv1 with cipher ADH-AES256-SHA (256/256 bits)) (No client certificate requested) by hub.freebsd.org (Postfix) with ESMTPS id E7BA7923; Thu, 20 Feb 2014 12:16:29 +0000 (UTC) Received: from mail.myota.org (mail.myota.org [85.10.206.105]) by mx1.freebsd.org (Postfix) with ESMTP id 56D4E1903; Thu, 20 Feb 2014 12:16:28 +0000 (UTC) Received: from mobile.client (177.189.166.190.f.sta.codetel.net.do [190.166.189.177] (may be forged)) (authenticated bits=128) by mail.myota.org (8.14.7/8.14.7) with ESMTP id s1KCGBWq071281; Thu, 20 Feb 2014 13:16:16 +0100 (CET) (envelope-from mail@ma17.ata.myota.org) Received: from submit.client ([127.0.0.1]) by schlappy.local (8.14.7/8.14.7) with ESMTP id s1KCG5vO002181; Thu, 20 Feb 2014 13:16:05 +0100 (CET) (envelope-from mail@ma17.ata.myota.org) Received: (from mu@schlappy.local) by schlappy.local (8.14.7/8.14.7/Submit) id s1KCG5qQ002180; Thu, 20 Feb 2014 13:16:05 +0100 (CET) (envelope-from mail@ma17.ata.myota.org) Date: Thu, 20 Feb 2014 13:16:05 +0100 From: Andre Albsmeier To: David Xu Subject: Re: pthread programming eats up resources (My or FreeBSD's fault?) Message-ID: <20140220121605.GA2156@schlappy> References: <20140218180646.GA67861@schlappy> <53059574.8090605@freebsd.org> <20140220140644.7b1e0074@X220.alogt.com> <5305B786.8020708@freebsd.org> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <5305B786.8020708@freebsd.org> X-Echelon: Espionage, Osama, codes, AA, eavesdropping X-Advice: Drop that crappy M$-Outlook, I'm tired of your viruses! User-Agent: Mutt/1.5.21 (2010-09-15) X-Greylist: Not delayed on 85.10.206.105, ACL: AUTH(59), Origin: DO, OS: FreeBSD 9.x X-Virus-Scanned: clamav-milter 0.98.1 at colo X-Virus-Status: Clean Cc: freebsd-hackers@freebsd.org, Erich Dollansky , Andre Albsmeier X-BeenThere: freebsd-hackers@freebsd.org X-Mailman-Version: 2.1.17 Precedence: list List-Id: Technical Discussions relating to FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Thu, 20 Feb 2014 12:16:30 -0000 On Thu, 20-Feb-2014 at 16:06:30 +0800, David Xu wrote: > On 2014/02/20 14:06, Erich Dollansky wrote: > > Hi, > > > > On Thu, 20 Feb 2014 13:41:08 +0800 > > David Xu 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. Your patch seems to have fixed it here on 9.2-STABLE as well. Memory consumption stays at around 9MB RES and 130 MB SIZE for pth2. Thanks! -Andre > > Regards, > David Xu > > 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); > } -- My other computer is your windows box.