Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtp (Exim 4.84_2) (envelope-from ) id 1c6Rrp-00081d-05 for pgsql-hackers@arkaria.postgresql.org; Tue, 15 Nov 2016 00:44:54 +0000 Received: from localhost ([127.0.0.1] helo=postgresql.org) by malur.postgresql.org with smtp (Exim 4.84_2) (envelope-from ) id 1c6Rro-0002Ld-8L for pgsql-hackers@arkaria.postgresql.org; Tue, 15 Nov 2016 00:44:52 +0000 Received: from makus.postgresql.org ([2001:4800:1501:1::229]) by malur.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA384:256) (Exim 4.84_2) (envelope-from ) id 1c6Rrl-0002Ks-De for pgsql-hackers@postgresql.org; Tue, 15 Nov 2016 00:44:49 +0000 Received: from mail-wm0-x22a.google.com ([2a00:1450:400c:c09::22a]) by makus.postgresql.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_CBC_SHA1:256) (Exim 4.84_2) (envelope-from ) id 1c6Rrc-0004BI-Nn for pgsql-hackers@postgresql.org; Tue, 15 Nov 2016 00:44:47 +0000 Received: by mail-wm0-x22a.google.com with SMTP id g23so132887138wme.1 for ; Mon, 14 Nov 2016 16:44:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=2ndquadrant-com.20150623.gappssmtp.com; s=20150623; h=from:subject:to:references:cc:message-id:date:user-agent :mime-version:in-reply-to; bh=NWxuUsCxY7/sSL+9DMJPZuCq3oO2kdo5H7jho1zKeo0=; b=erWT3Ako3vondjWeFdVNsV8bxZRL6wooVtFh9NiQPguW7eRc2zQzfat/eXg7xdJyXb bHBBJB0ikKVwoOzbilMx2RPY4wg399pgsA6w8rIVuBLBSBqykVPKIoeXTGdtmVCsasuW 33r8FURBSXjY+gMZdAa3xcuZjBQOTWcJ073uVe5L5D0YF/8Gf9xpPK/BLfzoeIjVUY4x ssKo1pJmKNK/yWRGyHq6gwRI83YYle+GGu/1YlMlQWwRLgA7FfSRl3BkVViDl2OKhEwb fILsSDuHz7GZAOe92L71vQA6sKQva33WaAlBmW7AdqRHfZpPWFId1ycnEjJZarcL2Sp9 Zt6g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20130820; h=x-gm-message-state:from:subject:to:references:cc:message-id:date :user-agent:mime-version:in-reply-to; bh=NWxuUsCxY7/sSL+9DMJPZuCq3oO2kdo5H7jho1zKeo0=; b=msUwanv028lz8M9P9Z4nXVOkX3rTGUDtJ7zcYx3uha5qRKtzjaDWpM9+obJESaIX3x wTbU+vdMi0wlEyHC88kV4CulXUFddvjK0hJYL7qlRiv7+RUUaL6K/pk1pe8okhkvjLTv Kd+xo8+keOdqSrASYpBOevLeUTcwm9sppnbBZDrDHOFXzX+Cf8mHR0UVDVoLw8gj/ncx drzu4hv/ioAmw3nlJVGgHo4fTjtTUdeb3qyndG/PP4jWxS92fcnsw8SvWfzaw1ozCVhL 2sxjTwrocxKrvu5r1FmRdkp67RJeBTk4Q19pC+c2jYPd3DD5UDWF1BOh6szCLWkZfiVh 5qsQ== X-Gm-Message-State: ABUngvdfNB+oPwlFc8Fq4EOXwBGMLK+NirPVKBxgl8cV32SgidU81aMSYBfZCJRAU/+ShTI/G5WW0HkTjAJAdWftsxvIubg3TqvJ8uE9PVlc+w1Wsrk11RPiI9CVdwG4EVBDnoz3Ltelxj2PKzpxnfGOovFJjVSOg3M7XBwPud5THLp5qhbRg9JnS5qGveoFLOtSv4Mz2D85 X-Received: by 10.28.62.141 with SMTP id l135mr1093579wma.20.1479170678395; Mon, 14 Nov 2016 16:44:38 -0800 (PST) Received: from [10.137.2.17] (ip-89-177-44-58.net.upcbroadband.cz. [89.177.44.58]) by smtp.gmail.com with ESMTPSA id l67sm1115406wmf.20.2016.11.14.16.44.37 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Mon, 14 Nov 2016 16:44:37 -0800 (PST) From: Tomas Vondra Subject: Re: PATCH: two slab-like memory allocators To: Andres Freund References: <11821eb9-95a5-353e-ccba-13e8e9351e62@2ndquadrant.com> <9818b54a-fcb6-f018-0b16-96d6a1d1da27@2ndquadrant.com> <34a6d4ea-7f3d-a62c-fff1-7a9108c078d7@2ndquadrant.com> <4f176a6c-c197-165d-dee4-5de8f279f1f4@2ndquadrant.com> <20161112191257.3a4n6kzegvu637qn@alap3.anarazel.de> Cc: Petr Jelinek , Robert Haas , John Gorman , pgsql-hackers Message-ID: <0b14e90b-1985-bb04-0261-2fcdc28755ab@2ndquadrant.com> Date: Tue, 15 Nov 2016 01:44:35 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Thunderbird/46.0a2 MIME-Version: 1.0 In-Reply-To: Content-Type: multipart/mixed; boundary="------------7081E08E60E54CF8C53D9C96" X-Pg-Spam-Score: -2.6 (--) List-Archive: List-Help: List-ID: List-Owner: List-Post: List-Subscribe: List-Unsubscribe: X-Mailing-List: pgsql-hackers Precedence: bulk Sender: pgsql-hackers-owner@postgresql.org This is a multi-part message in MIME format. --------------7081E08E60E54CF8C53D9C96 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit Attached is v6 of the patch series, fixing most of the points: * common bits (valgrind/randomization/wipe) moved to memdebug.h/c Instead of introducing a new header file, I've added the prototypes to memdebug.h (which was already used for the valgrind stuff anyway), and the implementations to a new memdebug.c file. Not sure what you meant by "static inlines" though. So the patch series now has three parts - 0001 with memdebug stuff, 0002 with slab and 0003 with gen (still a poor name). * removing AllocSet references from both new memory contexts * using FLEXIBLE_ARRAY_ELEMENT in SlabContext * using dlist instead of the custom linked list I've however kept SlabContext->freelist as an array, because there may be many blocks with the same number of free chunks, in which case moving the block in the list would be expensive. This way it's simply dlist_delete + dlist_push. * use StandardChunkHeader instead of the common fields * removing pointer to context from block header for both contexts * fix format in FreeInfo/AllocInfo (including for AllocSet) * improved a bunch of comments (bitmap size, chunksPerBlock formula) * did a pgindent run on the patch * implement the missing methods in Gen (Stats/Check) * fix a few minor bugs in both contexts I haven't done anything with hiding pointers behind typedefs, because I don't know what's so wrong about that. I also haven't done anything with the bitmap access in SlabAlloc - I haven't found any reasonable case when it would be measurable, and I don't expect this to be even measurable in practice. regards -- Tomas Vondra http://www.2ndQuadrant.com PostgreSQL Development, 24x7 Support, Remote DBA, Training & Services --------------7081E08E60E54CF8C53D9C96 Content-Type: application/x-compressed-tar; name="slab-allocators-v6.tgz" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="slab-allocators-v6.tgz" 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 C+VQdazyKKYX7PzIceAKbF+oYSal0YCSEKUpTSpQdjj+3EvTl6Yz5h6c+6n/ gae1KRzMxtWUJWLrs69a2+zUD6ahHI5i2MLKrH542KngHQUTRkTxMBR3/3bJ PlIXFjh/Eq4fENmPYPxgA6WWyW7FEEZHKXsPnoQdINLnq1PuSkgNnuQZW0vM Nqe/9G9t2zAds6u2obHDtuE8/yvbhumw3bQNjR21DY1dtQ2NHbYNjR21DY3d tQ2N3bUNjd21DY3dtQ1fRuIr2obpxJ21DY3dtQ2N1W3DlO3dtQ2NXbYNjR22 DY1dtg2NnbYNjV22DY3Xtw1TL9hR29DYWdvQ2Gnb0Nhh2zDby35P21AT2Wl9 tl80isaf0vvAe4EqeKLqaG/+wiKEgC7jgNUNIgOLyVc1iAw61hgbO0PGb0Vj 65OHsboztIzI0s6Q8QVEVb2DmdCrOkNaiu1aQiTKli0hYxup6yTXXEtos5h1 LWPRoF6Q8YpekBLglb0gI98LWi7WEqGW9YK2lE3NznpBS+25phdErkzF+Q57 QcYue0HGLntBxi56QelxZne9IGN3vSBjZ70g4yt7QXdQNyz0gYyt+kBGLlNu 1wCiEF3ZADLWNICMfAMIg2ixAfSaNLyqAWQUkL+FBpCxpAFk5BtARuHL5tUX G0DGiwaQynrbt4BetHlWYuystZd1H+ewY7UtPqhWO6JVa9ZbLzFQKwnMejwr h9BNoLrZYgb831AIqPTm0Uxz51efb24uYf86vv54XtLtFxMPZWA9b2bDguOz 374wbcYa3Y+iFMr+oEqgUNhUCRzNjLfNxpyS3WprPlKbIY7edjNczs76fUVx tFUgH73OVbFAY/nhcOns/OThY/8TNTMrrNiotqvtYvH34n8RgF2JIKGlW6If 7gDx/WKN1fhviJp2o7mA/27Vuq3/x3//dzwI/91ugua7VqfuDGp2t33Q7LZa 9W69NmgOmi3r4MBxDmvcspxd4b/vE4i+RpvdwBGM8N+N5rtG4137gBm1xhL8 dwPx3+ikLHPSJYhvKL5cqQ6m+64/hJcufOaHcFi0EixwCIjNDhD/vRVYfP6x ETqODGro+OLMg1pzJfp7Hu/t+Y6gjYBepHjvdZzMz1wzTc+ss4Ul83qb19co P5Gw8CvA6fRiNbOHuGR3EaR+0GovgtQ7h1+NUVfaX4NP38Y9rNfOSPHQ/KBl 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 --------------7081E08E60E54CF8C53D9C96 Content-Type: text/plain Content-Disposition: inline Content-Transfer-Encoding: 8bit MIME-Version: 1.0 -- Sent via pgsql-hackers mailing list (pgsql-hackers@postgresql.org) To make changes to your subscription: http://www.postgresql.org/mailpref/pgsql-hackers --------------7081E08E60E54CF8C53D9C96--