Received: from malur.postgresql.org ([217.196.149.56]) by arkaria.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wCkb4-002H5L-17 for pgsql-performance@arkaria.postgresql.org; Tue, 14 Apr 2026 20:42:59 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1wCkb1-00D7Ob-1d for pgsql-performance@arkaria.postgresql.org; Tue, 14 Apr 2026 20:42:56 +0000 Received: from makus.postgresql.org ([2001:4800:3e1:1::229]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.96) (envelope-from ) id 1wCkb0-00D7OR-2j for pgsql-performance@lists.postgresql.org; Tue, 14 Apr 2026 20:42:56 +0000 Received: from mail-pg1-x531.google.com ([2607:f8b0:4864:20::531]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1wCkax-000000011vo-2kIr for pgsql-performance@lists.postgresql.org; Tue, 14 Apr 2026 20:42:54 +0000 Received: by mail-pg1-x531.google.com with SMTP id 41be03b00d2f7-c736261ee8dso2282762a12.1 for ; Tue, 14 Apr 2026 13:42:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=j-davis-com.20251104.gappssmtp.com; s=20251104; t=1776199371; x=1776804171; darn=lists.postgresql.org; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:from:to:cc:subject:date:message-id:reply-to; bh=V/BogXvhv+zJ6iHtsa/Y3o0WkN1jWPGs8KOtXBzreIY=; b=pD7VHqRJvhYfhUE7uMYQAMDCIQYOthP0IjFfebAbYhRfoll2AAKPTOrZA/MiRiDRye u3yGwPDkep29XvytNEVHnId8V9/Oa/x7HEgUJLT8Kjh6773t7led+fyXQeDOnD4XGzc/ VfBVfBfr7op0MMA62TRr3Hkfdg4eDZyXB9iI2vJt1bEZ6YuCL85b+Kg1PuxfLf1o8T9t BnXKtIh4ATYJAw/H0pGGC5CQOny6BmcIjh2p821eZZSSDGh5NBnuu6mk1ukC6IUt1/+Z pA+0vAa82bDHEV4jfbN6xWV7rusd7HgiDNaFfmNC+qZTHR+eOKGH4hZTEkq66ztt3RFN 1l9Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20251104; t=1776199371; x=1776804171; h=mime-version:user-agent:references:in-reply-to:date:cc:to:from :subject:message-id:x-gm-gg:x-gm-message-state:from:to:cc:subject :date:message-id:reply-to; bh=V/BogXvhv+zJ6iHtsa/Y3o0WkN1jWPGs8KOtXBzreIY=; b=Lrod2EzMvIP7Nk/Ga4G0zWGeK6RqB7eeymba+J3fdmPOJNkdoSzvUtRKX38biVhKXL bwtXwqMxmYtl3jrCCOst0v1BHmCvkp/KJ4Br1fbrzZ+mUxUsc93qf3wHiz1+dpUT4FmY HOr1U4NpNCwBtcsHWP+OA+b738UxiPDDfyAaWK6+D3holIBoGu0YJiDjRLbmTG0P/lGV /50c+LqgrdeelTcrp8KHLY4wq0mW8LLal5zSzIjM7VnEoxF5IoDVcfm9PEnKL0IUPBba 6GGko90QAjjjZxQrt1+79l+r4OAISnNyKYXwgsDr+IajXyLvZrvLxXxNls42HBi/nSeX CnPA== X-Forwarded-Encrypted: i=1; AFNElJ+14NpwVDdC/k5pd5WL/lmNGMr6O3rQG2zo6w8Nowd1+tO2upkz5r48twtSScWzSGNP/0pThEVOqQh6P25j/6DWvw==@lists.postgresql.org X-Gm-Message-State: AOJu0Yy0ZteOCsc7ImQhs7Uvaca0s5DD2pRI5l9oLYQckf4C/Sxy5mL5 wv76Ekrddx280jY+sLMKBAu5ZrrbqTlUsyMi7a9/uwoY4TvbcVma3H1sjXsTJjqcDw== X-Gm-Gg: AeBDietddF92DfnyXNmzktXAHRrxBhJY+KQqJpw9P1X9BRhhoBBi2xWW7wR3Ue5NC0K 3DtZvum2sc6uDP4Avb9M8Z2IritgstbjTQrP5JWesOdskP26C3HRxpOcKdEiDxAIGpCPE5iSykT vaoFus7RWo+46x4XgHM8JKp/UfLJ72o06ZaEyZpInj9Q+1dEnAXTpE1CZzS3JbcgMLFfUUCdm8i ltDNKqbPcbAWbTVonXFRor4cv5uffh+PPKo96h55J3EkBhzPw8mh79Y+ECpFUfRrTcRHItAuj15 1/uu9GtXE7ulu/RJN8dqXaz7LUryQCSDcrJKB6bvJqiBrFWwLOz2+suIg5CtECsprDiVLc+3N6e mHhMFRlChY/wvVW6vMA9jQfdSOXdLW7YVhf30Zi18Ue296qFjqThPfxLBsBCwGhf4dG7dk3UG3L SWA/25DKfTS/nwH4RptWKtEAtWlfJa/ecS6vcmgs5uaZrwdvh1Ajf3b1kgAIgMHA== X-Received: by 2002:a05:6a20:a12c:b0:39f:3559:7525 with SMTP id adf61e73a8af0-39fe3f18cb5mr20497645637.31.1776199371014; Tue, 14 Apr 2026 13:42:51 -0700 (PDT) Received: from jeff-laptop.lan (c-24-7-19-3.hsd1.ca.comcast.net. [24.7.19.3]) by smtp.gmail.com with ESMTPSA id 41be03b00d2f7-c79219f55c4sm14779253a12.22.2026.04.14.13.42.48 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 14 Apr 2026 13:42:49 -0700 (PDT) Message-ID: Subject: Re: Significant performance issues with array_agg() + HashAggregate plans on Postgres 17 From: Jeff Davis To: David Rowley Cc: Tom Lane , Scott Carey , pgsql-performance@lists.postgresql.org Date: Tue, 14 Apr 2026 13:42:47 -0700 In-Reply-To: References: <2764544.1774985169@sss.pgh.pa.us> <2897039.1775051081@sss.pgh.pa.us> <3579239.1775151498@sss.pgh.pa.us> <3671092.1775167393@sss.pgh.pa.us> <3825075.1775244255@sss.pgh.pa.us> <3b569609adc36db30aacbf05e487b472fa8edc84.camel@j-davis.com> <3829071.1775246182@sss.pgh.pa.us> Content-Type: multipart/mixed; boundary="=-2FUd6BDj2AJq+3/qqfjc" User-Agent: Evolution 3.52.3-0ubuntu1.1 MIME-Version: 1.0 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --=-2FUd6BDj2AJq+3/qqfjc Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable On Sat, 2026-04-11 at 14:42 +1200, David Rowley wrote: > I had imagined we'd have an Assert to ensure there's no other > MemoryPool in the context hierarchy. I guess it would be possible for > a MemoryPool to have a MemoryPool *next field and chain them, but > since we've no need for that right now, I imagine it's fine to > disallow that. The thread started with a user-defined aggregate making a memory context per group. If it was doing some more complex things with MemoryContextSetParent, are we sure we can just disallow it? It's hard for me to say for sure what a user-defined aggregate might want to do.=20 > Since we won't want to add a MemoryPool to the parent of > those contexts, we might need some way to have an existing context > "join" an existing MemoryPool. That would mean an API more like: > MemoryPool *MemoryPoolCreate(size_t bytes_limit); then void > MemoryContextJoinPool(MemoryContext ctx, MemoryPool *pool); Right. > All the code that currently does "+=3D mem_allocated" or "-=3D > mem_allocated" would need extra code to do "if (context->memory_pool > !=3D NULL) context->memory_pool->memory_allocated (+/-)=3D blksize;". > I.e., no looping up the hierarchy. OK. > I imagined we'd document that a MemoryPool is designed to more easily > keep track of malloc'd memory for a given (or group of) MemoryContext > and all of its child contexts so that the total memory allocated can > easily be checked without recursively visiting the memory_used fields > in all child contexts. Also, that it is intended for short-lived > contexts. Any longer-lived usages would mean we'd have MemoryPools in > contexts that live longer than the query, or an executor node and > that > would mean we'd have to code up the ability to have multiple > MemoryPools in the hierarchy, which seems more complex than what we > need today. Yeah, I hope we don't need to go that far. > Maybe in the future there'd be some need to have MemoryPools with a > hard limit that ERRORs when it goes above a threshold, but that's not > what we need for nodeAgg.c. That seems to be more along the lines of > what Tomas was mentioning in regards to the "Add the ability to limit > the amount of memory that can be allocated to backends" thread. Agreed. Attached v2-0001 simply tracks the totals for all contexts, and works across MemoryContextSetParent(). I was (and still am) slightly worried that it will cause a regression, but some basic pgbench runs didn't show any slowdown. Can you suggest some settings that might focus more on allocation performance? Assuming we only want to track for a subtree, then the two approaches suggested are: 1. Have some "invalid" marker that only tracks the memory upward as far as it's needed/enabled, then stops. This adds a bit of complexity because: a. to enable it after the context is created, we need a new memory context method to give the current allocated total so we can properly initialize the size b. when doing MemoryContextSetParent(), we need to subtract from the old subtree and add to the new subtree, and if the current subtree isn't already tracked, then we need to recalculate 2. The memory pools as you suggest. The complexity here is: a. in MemoryContextSetParent() for the same reason as above b. mixing subtrees gets messy, and I'm not sure we can just disallow that. Does that mean MemoryContextSetParent() would just fail? c. joining in to an existing pool -- not terribly complex, but adds to the API I think if we are taking on the complexity with memory pools, we should do so with the idea that they'll be useful beyond just optimizing the size calculation. For instance, carrying around information that it's part of a "work mem" context, which can do things like limit the max block size. Regards, Jeff Davis --=-2FUd6BDj2AJq+3/qqfjc Content-Disposition: attachment; filename*0=v2-0001-Account-for-memory-context-totals-at-the-time-of-.pat; filename*1=ch Content-Type: text/x-patch; name="v2-0001-Account-for-memory-context-totals-at-the-time-of-.patch"; charset="UTF-8" Content-Transfer-Encoding: base64 RnJvbSAwZDU2NzNlMTU2NTU0YzlkOTVhNzJjNmM3OTQ5YmU5YjJkNWFkYjNlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBKZWZmIERhdmlzIDxqZWZmQGotZGF2aXMuY29tPgpEYXRlOiBU dWUsIDcgQXByIDIwMjYgMTU6NDc6MzIgLTA3MDAKU3ViamVjdDogW1BBVENIIHYyXSBBY2NvdW50 IGZvciBtZW1vcnkgY29udGV4dCB0b3RhbHMgYXQgdGhlIHRpbWUgb2YKIGFsbG9jYXRpb24uCgpX aGVuIGEgbmV3IGJsb2NrIGlzIGFsbG9jYXRlZCBieSB0aGUgdW5kZXJseWluZyBhbGxvY2F0b3Is IGFkZCBpdCB0bwp0aGUgY3VycmVudCBjb250ZXh0IGFzIHdlbGwgYXMgdGhlIHRvdGFscyBmb3Ig YWxsIGFuY2VzdG9ycy4KClByZXZpb3VzbHksIHdlIHRyYWNrZWQgb25seSB0aGUgbWVtb3J5IGZv ciB0aGUgY3VycmVudCBjb250ZXh0LCBhbmQKY2FsY3VsYXRlZCB0aGUgdG90YWwgcmVjdXJzaXZl bHkgd2hlbiBuZWVkZWQuIFRoYXQgbGVkIHRvIE5eMiBiZWhhdmlvcgppbiBIYXNoQWdnIHdoZW4g ZWFjaCBncm91cCBjcmVhdGVkIGl0cyBvd24gc3ViY29udGV4dC4KCkRpc2N1c3Npb246IGh0dHBz Oi8vcG9zdGdyLmVzL20vMzU3OTE5Ny4xNzc1MTUxNDY4LjBAc3NzLnBnaC5wYS51cwotLS0KIHNy Yy9iYWNrZW5kL3V0aWxzL21tZ3IvYXNldC5jICAgICAgIHwgMjQgKysrKysrKysrKysrKy0tLS0t LS0tLS0tCiBzcmMvYmFja2VuZC91dGlscy9tbWdyL2J1bXAuYyAgICAgICB8ICA5ICsrKysrLS0t LQogc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9nZW5lcmF0aW9uLmMgfCAgOSArKysrKy0tLS0KIHNy Yy9iYWNrZW5kL3V0aWxzL21tZ3IvbWN4dC5jICAgICAgIHwgMjcgKysrKysrKysrKysrKysrLS0t LS0tLS0tLS0tCiBzcmMvYmFja2VuZC91dGlscy9tbWdyL3NsYWIuYyAgICAgICB8IDEwICsrKysr Ky0tLS0KIHNyYy9pbmNsdWRlL25vZGVzL21lbW5vZGVzLmggICAgICAgIHwgMTMgKysrKysrKysr KysrKwogNiBmaWxlcyBjaGFuZ2VkLCA1NyBpbnNlcnRpb25zKCspLCAzNSBkZWxldGlvbnMoLSkK CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9tbWdyL2FzZXQuYyBiL3NyYy9iYWNrZW5k L3V0aWxzL21tZ3IvYXNldC5jCmluZGV4IDZhOWVhMzY3MTA3Li4wZjI4MDA4OWJjMyAxMDA2NDQK LS0tIGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9hc2V0LmMKKysrIGIvc3JjL2JhY2tlbmQvdXRp bHMvbW1nci9hc2V0LmMKQEAgLTQyMiw4ICs0MjIsOCBAQCBBbGxvY1NldENvbnRleHRDcmVhdGVJ bnRlcm5hbChNZW1vcnlDb250ZXh0IHBhcmVudCwKIAkJCQkJCQkJcGFyZW50LAogCQkJCQkJCQlu YW1lKTsKIAotCQkJKChNZW1vcnlDb250ZXh0KSBzZXQpLT5tZW1fYWxsb2NhdGVkID0KLQkJCQlL ZWVwZXJCbG9jayhzZXQpLT5lbmRwdHIgLSAoKGNoYXIgKikgc2V0KTsKKwkJCU1lbW9yeUNvbnRl eHRVcGRhdGVBbGxvY2F0aW9uKChNZW1vcnlDb250ZXh0KSBzZXQsCisJCQkJS2VlcGVyQmxvY2so c2V0KS0+ZW5kcHRyIC0gKChjaGFyICopIHNldCkpOwogCiAJCQlyZXR1cm4gKE1lbW9yeUNvbnRl eHQpIHNldDsKIAkJfQpAQCAtNTI1LDcgKzUyNSw3IEBAIEFsbG9jU2V0Q29udGV4dENyZWF0ZUlu dGVybmFsKE1lbW9yeUNvbnRleHQgcGFyZW50LAogCQkJCQkJcGFyZW50LAogCQkJCQkJbmFtZSk7 CiAKLQkoKE1lbW9yeUNvbnRleHQpIHNldCktPm1lbV9hbGxvY2F0ZWQgPSBmaXJzdEJsb2NrU2l6 ZTsKKwlNZW1vcnlDb250ZXh0VXBkYXRlQWxsb2NhdGlvbigoTWVtb3J5Q29udGV4dCkgc2V0LCBm aXJzdEJsb2NrU2l6ZSk7CiAKIAlyZXR1cm4gKE1lbW9yeUNvbnRleHQpIHNldDsKIH0KQEAgLTU4 OSw3ICs1ODksOCBAQCBBbGxvY1NldFJlc2V0KE1lbW9yeUNvbnRleHQgY29udGV4dCkKIAkJZWxz ZQogCQl7CiAJCQkvKiBOb3JtYWwgY2FzZSwgcmVsZWFzZSB0aGUgYmxvY2sgKi8KLQkJCWNvbnRl eHQtPm1lbV9hbGxvY2F0ZWQgLT0gYmxvY2stPmVuZHB0ciAtICgoY2hhciAqKSBibG9jayk7CisJ CQlNZW1vcnlDb250ZXh0VXBkYXRlQWxsb2NhdGlvbihjb250ZXh0LAorCQkJCS0oYmxvY2stPmVu ZHB0ciAtICgoY2hhciAqKSBibG9jaykpKTsKIAogI2lmZGVmIENMT0JCRVJfRlJFRURfTUVNT1JZ CiAJCQl3aXBlX21lbShibG9jaywgYmxvY2stPmZyZWVwdHIgLSAoKGNoYXIgKikgYmxvY2spKTsK QEAgLTY5Niw3ICs2OTcsOCBAQCBBbGxvY1NldERlbGV0ZShNZW1vcnlDb250ZXh0IGNvbnRleHQp CiAJCUFsbG9jQmxvY2sJbmV4dCA9IGJsb2NrLT5uZXh0OwogCiAJCWlmICghSXNLZWVwZXJCbG9j ayhzZXQsIGJsb2NrKSkKLQkJCWNvbnRleHQtPm1lbV9hbGxvY2F0ZWQgLT0gYmxvY2stPmVuZHB0 ciAtICgoY2hhciAqKSBibG9jayk7CisJCQlNZW1vcnlDb250ZXh0VXBkYXRlQWxsb2NhdGlvbihj b250ZXh0LAorCQkJCS0oYmxvY2stPmVuZHB0ciAtICgoY2hhciAqKSBibG9jaykpKTsKIAogI2lm ZGVmIENMT0JCRVJfRlJFRURfTUVNT1JZCiAJCXdpcGVfbWVtKGJsb2NrLCBibG9jay0+ZnJlZXB0 ciAtICgoY2hhciAqKSBibG9jaykpOwpAQCAtNzU4LDcgKzc2MCw3IEBAIEFsbG9jU2V0QWxsb2NM YXJnZShNZW1vcnlDb250ZXh0IGNvbnRleHQsIFNpemUgc2l6ZSwgaW50IGZsYWdzKQogCS8qIE1h a2UgYSB2Y2h1bmsgY292ZXJpbmcgdGhlIG5ldyBibG9jaydzIGhlYWRlciAqLwogCVZBTEdSSU5E X01FTVBPT0xfQUxMT0Moc2V0LCBibG9jaywgQUxMT0NfQkxPQ0tIRFJTWik7CiAKLQljb250ZXh0 LT5tZW1fYWxsb2NhdGVkICs9IGJsa3NpemU7CisJTWVtb3J5Q29udGV4dFVwZGF0ZUFsbG9jYXRp b24oY29udGV4dCwgYmxrc2l6ZSk7CiAKIAlibG9jay0+YXNldCA9IHNldDsKIAlibG9jay0+ZnJl ZXB0ciA9IGJsb2NrLT5lbmRwdHIgPSAoKGNoYXIgKikgYmxvY2spICsgYmxrc2l6ZTsKQEAgLTk2 Nyw3ICs5NjksNyBAQCBBbGxvY1NldEFsbG9jRnJvbU5ld0Jsb2NrKE1lbW9yeUNvbnRleHQgY29u dGV4dCwgU2l6ZSBzaXplLCBpbnQgZmxhZ3MsCiAJLyogTWFrZSBhIHZjaHVuayBjb3ZlcmluZyB0 aGUgbmV3IGJsb2NrJ3MgaGVhZGVyICovCiAJVkFMR1JJTkRfTUVNUE9PTF9BTExPQyhzZXQsIGJs b2NrLCBBTExPQ19CTE9DS0hEUlNaKTsKIAotCWNvbnRleHQtPm1lbV9hbGxvY2F0ZWQgKz0gYmxr c2l6ZTsKKwlNZW1vcnlDb250ZXh0VXBkYXRlQWxsb2NhdGlvbihjb250ZXh0LCBibGtzaXplKTsK IAogCWJsb2NrLT5hc2V0ID0gc2V0OwogCWJsb2NrLT5mcmVlcHRyID0gKChjaGFyICopIGJsb2Nr KSArIEFMTE9DX0JMT0NLSERSU1o7CkBAIC0xMTQ0LDcgKzExNDYsOCBAQCBBbGxvY1NldEZyZWUo dm9pZCAqcG9pbnRlcikKIAkJaWYgKGJsb2NrLT5uZXh0KQogCQkJYmxvY2stPm5leHQtPnByZXYg PSBibG9jay0+cHJldjsKIAotCQlzZXQtPmhlYWRlci5tZW1fYWxsb2NhdGVkIC09IGJsb2NrLT5l bmRwdHIgLSAoKGNoYXIgKikgYmxvY2spOworCQlNZW1vcnlDb250ZXh0VXBkYXRlQWxsb2NhdGlv bigoTWVtb3J5Q29udGV4dCkgc2V0LAorCQkJLShibG9jay0+ZW5kcHRyIC0gKChjaGFyICopIGJs b2NrKSkpOwogCiAjaWZkZWYgQ0xPQkJFUl9GUkVFRF9NRU1PUlkKIAkJd2lwZV9tZW0oYmxvY2ss IGJsb2NrLT5mcmVlcHRyIC0gKChjaGFyICopIGJsb2NrKSk7CkBAIC0xMzA3LDkgKzEzMTAsOCBA QCBBbGxvY1NldFJlYWxsb2Modm9pZCAqcG9pbnRlciwgU2l6ZSBzaXplLCBpbnQgZmxhZ3MpCiAJ CVZBTEdSSU5EX01FTVBPT0xfQ0hBTkdFKHNldCwgYmxvY2ssIG5ld2Jsb2NrLCBBTExPQ19CTE9D S0hEUlNaKTsKIAkJYmxvY2sgPSBuZXdibG9jazsKIAotCQkvKiB1cGRhdGVkIHNlcGFyYXRlbHks IG5vdCB0byB1bmRlcmZsb3cgd2hlbiAob2xkYmxrc2l6ZSA+IGJsa3NpemUpICovCi0JCXNldC0+ aGVhZGVyLm1lbV9hbGxvY2F0ZWQgLT0gb2xkYmxrc2l6ZTsKLQkJc2V0LT5oZWFkZXIubWVtX2Fs bG9jYXRlZCArPSBibGtzaXplOworCQlNZW1vcnlDb250ZXh0VXBkYXRlQWxsb2NhdGlvbigoTWVt b3J5Q29udGV4dCkgc2V0LAorCQkJKHNzaXplX3QpIGJsa3NpemUgLSAoc3NpemVfdCkgb2xkYmxr c2l6ZSk7CiAKIAkJYmxvY2stPmZyZWVwdHIgPSBibG9jay0+ZW5kcHRyID0gKChjaGFyICopIGJs b2NrKSArIGJsa3NpemU7CiAKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvYnVt cC5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9idW1wLmMKaW5kZXggYmZiNWExMTQxNDcuLjFh ZjNhNjI3NTViIDEwMDY0NAotLS0gYS9zcmMvYmFja2VuZC91dGlscy9tbWdyL2J1bXAuYworKysg Yi9zcmMvYmFja2VuZC91dGlscy9tbWdyL2J1bXAuYwpAQCAtMjM1LDcgKzIzNSw3IEBAIEJ1bXBD b250ZXh0Q3JlYXRlKE1lbW9yeUNvbnRleHQgcGFyZW50LCBjb25zdCBjaGFyICpuYW1lLCBTaXpl IG1pbkNvbnRleHRTaXplLAogCU1lbW9yeUNvbnRleHRDcmVhdGUoKE1lbW9yeUNvbnRleHQpIHNl dCwgVF9CdW1wQ29udGV4dCwgTUNUWF9CVU1QX0lELAogCQkJCQkJcGFyZW50LCBuYW1lKTsKIAot CSgoTWVtb3J5Q29udGV4dCkgc2V0KS0+bWVtX2FsbG9jYXRlZCA9IGFsbG9jU2l6ZTsKKwlNZW1v cnlDb250ZXh0VXBkYXRlQWxsb2NhdGlvbigoTWVtb3J5Q29udGV4dCkgc2V0LCBhbGxvY1NpemUp OwogCiAJcmV0dXJuIChNZW1vcnlDb250ZXh0KSBzZXQ7CiB9CkBAIC0zNDEsNyArMzQxLDcgQEAg QnVtcEFsbG9jTGFyZ2UoTWVtb3J5Q29udGV4dCBjb250ZXh0LCBTaXplIHNpemUsIGludCBmbGFn cykKIAkvKiBNYWtlIGEgdmNodW5rIGNvdmVyaW5nIHRoZSBuZXcgYmxvY2sncyBoZWFkZXIgKi8K IAlWQUxHUklORF9NRU1QT09MX0FMTE9DKHNldCwgYmxvY2ssIEJ1bXBfQkxPQ0tIRFJTWik7CiAK LQljb250ZXh0LT5tZW1fYWxsb2NhdGVkICs9IGJsa3NpemU7CisJTWVtb3J5Q29udGV4dFVwZGF0 ZUFsbG9jYXRpb24oY29udGV4dCwgYmxrc2l6ZSk7CiAKIAkvKiB0aGUgYmxvY2sgaXMgY29tcGxl dGVseSBmdWxsICovCiAJYmxvY2stPmZyZWVwdHIgPSBibG9jay0+ZW5kcHRyID0gKChjaGFyICop IGJsb2NrKSArIGJsa3NpemU7CkBAIC00ODEsNyArNDgxLDcgQEAgQnVtcEFsbG9jRnJvbU5ld0Js b2NrKE1lbW9yeUNvbnRleHQgY29udGV4dCwgU2l6ZSBzaXplLCBpbnQgZmxhZ3MsCiAJLyogTWFr ZSBhIHZjaHVuayBjb3ZlcmluZyB0aGUgbmV3IGJsb2NrJ3MgaGVhZGVyICovCiAJVkFMR1JJTkRf TUVNUE9PTF9BTExPQyhzZXQsIGJsb2NrLCBCdW1wX0JMT0NLSERSU1opOwogCi0JY29udGV4dC0+ bWVtX2FsbG9jYXRlZCArPSBibGtzaXplOworCU1lbW9yeUNvbnRleHRVcGRhdGVBbGxvY2F0aW9u KGNvbnRleHQsIGJsa3NpemUpOwogCiAJLyogaW5pdGlhbGl6ZSB0aGUgbmV3IGJsb2NrICovCiAJ QnVtcEJsb2NrSW5pdChzZXQsIGJsb2NrLCBibGtzaXplKTsKQEAgLTYyNiw3ICs2MjYsOCBAQCBC dW1wQmxvY2tGcmVlKEJ1bXBDb250ZXh0ICpzZXQsIEJ1bXBCbG9jayAqYmxvY2spCiAJLyogcmVs ZWFzZSB0aGUgYmxvY2sgZnJvbSB0aGUgbGlzdCBvZiBibG9ja3MgKi8KIAlkbGlzdF9kZWxldGUo JmJsb2NrLT5ub2RlKTsKIAotCSgoTWVtb3J5Q29udGV4dCkgc2V0KS0+bWVtX2FsbG9jYXRlZCAt PSAoKGNoYXIgKikgYmxvY2stPmVuZHB0ciAtIChjaGFyICopIGJsb2NrKTsKKwlNZW1vcnlDb250 ZXh0VXBkYXRlQWxsb2NhdGlvbigoTWVtb3J5Q29udGV4dCkgc2V0LAorCQktKChjaGFyICopIGJs b2NrLT5lbmRwdHIgLSAoY2hhciAqKSBibG9jaykpOwogCiAjaWZkZWYgQ0xPQkJFUl9GUkVFRF9N RU1PUlkKIAl3aXBlX21lbShibG9jaywgKChjaGFyICopIGJsb2NrLT5lbmRwdHIgLSAoY2hhciAq KSBibG9jaykpOwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9nZW5lcmF0aW9u LmMgYi9zcmMvYmFja2VuZC91dGlscy9tbWdyL2dlbmVyYXRpb24uYwppbmRleCA2MDljOWJkYzlh Ni4uMmU4NGE0ZmJhOTMgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvZ2VuZXJh dGlvbi5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvZ2VuZXJhdGlvbi5jCkBAIC0yNzMs NyArMjczLDcgQEAgR2VuZXJhdGlvbkNvbnRleHRDcmVhdGUoTWVtb3J5Q29udGV4dCBwYXJlbnQs CiAJCQkJCQlwYXJlbnQsCiAJCQkJCQluYW1lKTsKIAotCSgoTWVtb3J5Q29udGV4dCkgc2V0KS0+ bWVtX2FsbG9jYXRlZCA9IGZpcnN0QmxvY2tTaXplOworCU1lbW9yeUNvbnRleHRVcGRhdGVBbGxv Y2F0aW9uKChNZW1vcnlDb250ZXh0KSBzZXQsIGZpcnN0QmxvY2tTaXplKTsKIAogCXJldHVybiAo TWVtb3J5Q29udGV4dCkgc2V0OwogfQpAQCAtMzg4LDcgKzM4OCw3IEBAIEdlbmVyYXRpb25BbGxv Y0xhcmdlKE1lbW9yeUNvbnRleHQgY29udGV4dCwgU2l6ZSBzaXplLCBpbnQgZmxhZ3MpCiAJLyog TWFrZSBhIHZjaHVuayBjb3ZlcmluZyB0aGUgbmV3IGJsb2NrJ3MgaGVhZGVyICovCiAJVkFMR1JJ TkRfTUVNUE9PTF9BTExPQyhzZXQsIGJsb2NrLCBHZW5lcmF0aW9uX0JMT0NLSERSU1opOwogCi0J Y29udGV4dC0+bWVtX2FsbG9jYXRlZCArPSBibGtzaXplOworCU1lbW9yeUNvbnRleHRVcGRhdGVB bGxvY2F0aW9uKGNvbnRleHQsIGJsa3NpemUpOwogCiAJLyogYmxvY2sgd2l0aCBhIHNpbmdsZSAo dXNlZCkgY2h1bmsgKi8KIAlibG9jay0+Y29udGV4dCA9IHNldDsKQEAgLTUxMyw3ICs1MTMsNyBA QCBHZW5lcmF0aW9uQWxsb2NGcm9tTmV3QmxvY2soTWVtb3J5Q29udGV4dCBjb250ZXh0LCBTaXpl IHNpemUsIGludCBmbGFncywKIAkvKiBNYWtlIGEgdmNodW5rIGNvdmVyaW5nIHRoZSBuZXcgYmxv Y2sncyBoZWFkZXIgKi8KIAlWQUxHUklORF9NRU1QT09MX0FMTE9DKHNldCwgYmxvY2ssIEdlbmVy YXRpb25fQkxPQ0tIRFJTWik7CiAKLQljb250ZXh0LT5tZW1fYWxsb2NhdGVkICs9IGJsa3NpemU7 CisJTWVtb3J5Q29udGV4dFVwZGF0ZUFsbG9jYXRpb24oY29udGV4dCwgYmxrc2l6ZSk7CiAKIAkv KiBpbml0aWFsaXplIHRoZSBuZXcgYmxvY2sgKi8KIAlHZW5lcmF0aW9uQmxvY2tJbml0KHNldCwg YmxvY2ssIGJsa3NpemUpOwpAQCAtNjk3LDcgKzY5Nyw4IEBAIEdlbmVyYXRpb25CbG9ja0ZyZWUo R2VuZXJhdGlvbkNvbnRleHQgKnNldCwgR2VuZXJhdGlvbkJsb2NrICpibG9jaykKIAkvKiByZWxl YXNlIHRoZSBibG9jayBmcm9tIHRoZSBsaXN0IG9mIGJsb2NrcyAqLwogCWRsaXN0X2RlbGV0ZSgm YmxvY2stPm5vZGUpOwogCi0JKChNZW1vcnlDb250ZXh0KSBzZXQpLT5tZW1fYWxsb2NhdGVkIC09 IGJsb2NrLT5ibGtzaXplOworCU1lbW9yeUNvbnRleHRVcGRhdGVBbGxvY2F0aW9uKChNZW1vcnlD b250ZXh0KSBzZXQsCisJCS0oc3NpemVfdCkgYmxvY2stPmJsa3NpemUpOwogCiAjaWZkZWYgQ0xP QkJFUl9GUkVFRF9NRU1PUlkKIAl3aXBlX21lbShibG9jaywgYmxvY2stPmJsa3NpemUpOwpkaWZm IC0tZ2l0IGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9tY3h0LmMgYi9zcmMvYmFja2VuZC91dGls cy9tbWdyL21jeHQuYwppbmRleCAwNzNiZGIzNWQyYS4uNjViNDUxNGQ3N2UgMTAwNjQ0Ci0tLSBh L3NyYy9iYWNrZW5kL3V0aWxzL21tZ3IvbWN4dC5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21t Z3IvbWN4dC5jCkBAIC02OTYsNiArNjk2LDcgQEAgTWVtb3J5Q29udGV4dFNldFBhcmVudChNZW1v cnlDb250ZXh0IGNvbnRleHQsIE1lbW9yeUNvbnRleHQgbmV3X3BhcmVudCkKIAlpZiAoY29udGV4 dC0+cGFyZW50KQogCXsKIAkJTWVtb3J5Q29udGV4dCBwYXJlbnQgPSBjb250ZXh0LT5wYXJlbnQ7 CisJCU1lbW9yeUNvbnRleHQgYW5jZXN0b3I7CiAKIAkJaWYgKGNvbnRleHQtPnByZXZjaGlsZCAh PSBOVUxMKQogCQkJY29udGV4dC0+cHJldmNoaWxkLT5uZXh0Y2hpbGQgPSBjb250ZXh0LT5uZXh0 Y2hpbGQ7CkBAIC03MDcsMTEgKzcwOCwxNyBAQCBNZW1vcnlDb250ZXh0U2V0UGFyZW50KE1lbW9y eUNvbnRleHQgY29udGV4dCwgTWVtb3J5Q29udGV4dCBuZXdfcGFyZW50KQogCiAJCWlmIChjb250 ZXh0LT5uZXh0Y2hpbGQgIT0gTlVMTCkKIAkJCWNvbnRleHQtPm5leHRjaGlsZC0+cHJldmNoaWxk ID0gY29udGV4dC0+cHJldmNoaWxkOworCisJCS8qIHN1YnRyYWN0IHRoaXMgY29udGV4dCdzIHRv dGFsIGZyb20gb2xkIHBhcmVudCBjaGFpbiAqLworCQlmb3IgKGFuY2VzdG9yID0gcGFyZW50OyBh bmNlc3RvciAhPSBOVUxMOyBhbmNlc3RvciA9IGFuY2VzdG9yLT5wYXJlbnQpCisJCQlhbmNlc3Rv ci0+dG90YWxfYWxsb2NhdGVkIC09IGNvbnRleHQtPnRvdGFsX2FsbG9jYXRlZDsKIAl9CiAKIAkv KiBBbmQgcmVsaW5rICovCiAJaWYgKG5ld19wYXJlbnQpCiAJeworCQlNZW1vcnlDb250ZXh0IGFu Y2VzdG9yOworCiAJCUFzc2VydChNZW1vcnlDb250ZXh0SXNWYWxpZChuZXdfcGFyZW50KSk7CiAJ CWNvbnRleHQtPnBhcmVudCA9IG5ld19wYXJlbnQ7CiAJCWNvbnRleHQtPnByZXZjaGlsZCA9IE5V TEw7CkBAIC03MTksNiArNzI2LDEwIEBAIE1lbW9yeUNvbnRleHRTZXRQYXJlbnQoTWVtb3J5Q29u dGV4dCBjb250ZXh0LCBNZW1vcnlDb250ZXh0IG5ld19wYXJlbnQpCiAJCWlmIChuZXdfcGFyZW50 LT5maXJzdGNoaWxkICE9IE5VTEwpCiAJCQluZXdfcGFyZW50LT5maXJzdGNoaWxkLT5wcmV2Y2hp bGQgPSBjb250ZXh0OwogCQluZXdfcGFyZW50LT5maXJzdGNoaWxkID0gY29udGV4dDsKKworCQkv KiBhZGQgdGhpcyBjb250ZXh0J3MgdG90YWwgdG8gbmV3IHBhcmVudCBjaGFpbiAqLworCQlmb3Ig KGFuY2VzdG9yID0gbmV3X3BhcmVudDsgYW5jZXN0b3IgIT0gTlVMTDsgYW5jZXN0b3IgPSBhbmNl c3Rvci0+cGFyZW50KQorCQkJYW5jZXN0b3ItPnRvdGFsX2FsbG9jYXRlZCArPSBjb250ZXh0LT50 b3RhbF9hbGxvY2F0ZWQ7CiAJfQogCWVsc2UKIAl7CkBAIC04MTAsMjEgKzgyMSwxMiBAQCBNZW1v cnlDb250ZXh0SXNFbXB0eShNZW1vcnlDb250ZXh0IGNvbnRleHQpCiBTaXplCiBNZW1vcnlDb250 ZXh0TWVtQWxsb2NhdGVkKE1lbW9yeUNvbnRleHQgY29udGV4dCwgYm9vbCByZWN1cnNlKQogewot CVNpemUJCXRvdGFsID0gY29udGV4dC0+bWVtX2FsbG9jYXRlZDsKLQogCUFzc2VydChNZW1vcnlD b250ZXh0SXNWYWxpZChjb250ZXh0KSk7CiAKIAlpZiAocmVjdXJzZSkKLQl7Ci0JCWZvciAoTWVt b3J5Q29udGV4dCBjdXJyID0gY29udGV4dC0+Zmlyc3RjaGlsZDsKLQkJCSBjdXJyICE9IE5VTEw7 Ci0JCQkgY3VyciA9IE1lbW9yeUNvbnRleHRUcmF2ZXJzZU5leHQoY3VyciwgY29udGV4dCkpCi0J CXsKLQkJCXRvdGFsICs9IGN1cnItPm1lbV9hbGxvY2F0ZWQ7Ci0JCX0KLQl9Ci0KLQlyZXR1cm4g dG90YWw7CisJCXJldHVybiBjb250ZXh0LT50b3RhbF9hbGxvY2F0ZWQ7CisJZWxzZQorCQlyZXR1 cm4gY29udGV4dC0+bWVtX2FsbG9jYXRlZDsKIH0KIAogLyoKQEAgLTExNjYsNiArMTE2OCw3IEBA IE1lbW9yeUNvbnRleHRDcmVhdGUoTWVtb3J5Q29udGV4dCBub2RlLAogCW5vZGUtPnBhcmVudCA9 IHBhcmVudDsKIAlub2RlLT5maXJzdGNoaWxkID0gTlVMTDsKIAlub2RlLT5tZW1fYWxsb2NhdGVk ID0gMDsKKwlub2RlLT50b3RhbF9hbGxvY2F0ZWQgPSAwOwogCW5vZGUtPnByZXZjaGlsZCA9IE5V TEw7CiAJbm9kZS0+bmFtZSA9IG5hbWU7CiAJbm9kZS0+aWRlbnQgPSBOVUxMOwpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvdXRpbHMvbW1nci9zbGFiLmMgYi9zcmMvYmFja2VuZC91dGlscy9tbWdy L3NsYWIuYwppbmRleCBkZDFkYjk1NjZkMS4uYTM4ODYwZmJjMjggMTAwNjQ0Ci0tLSBhL3NyYy9i YWNrZW5kL3V0aWxzL21tZ3Ivc2xhYi5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21tZ3Ivc2xh Yi5jCkBAIC00NjEsNyArNDYxLDcgQEAgU2xhYlJlc2V0KE1lbW9yeUNvbnRleHQgY29udGV4dCkK IAkJVkFMR1JJTkRfTUVNUE9PTF9GUkVFKHNsYWIsIGJsb2NrKTsKIAogCQlmcmVlKGJsb2NrKTsK LQkJY29udGV4dC0+bWVtX2FsbG9jYXRlZCAtPSBzbGFiLT5ibG9ja1NpemU7CisJCU1lbW9yeUNv bnRleHRVcGRhdGVBbGxvY2F0aW9uKGNvbnRleHQsIC0oc3NpemVfdCkgc2xhYi0+YmxvY2tTaXpl KTsKIAl9CiAKIAkvKiB3YWxrIG92ZXIgYmxvY2tsaXN0IGFuZCBmcmVlIHRoZSBibG9ja3MgKi8K QEAgLTQ4MSw3ICs0ODEsOCBAQCBTbGFiUmVzZXQoTWVtb3J5Q29udGV4dCBjb250ZXh0KQogCQkJ VkFMR1JJTkRfTUVNUE9PTF9GUkVFKHNsYWIsIGJsb2NrKTsKIAogCQkJZnJlZShibG9jayk7Ci0J CQljb250ZXh0LT5tZW1fYWxsb2NhdGVkIC09IHNsYWItPmJsb2NrU2l6ZTsKKwkJCU1lbW9yeUNv bnRleHRVcGRhdGVBbGxvY2F0aW9uKGNvbnRleHQsCisJCQkJLShzc2l6ZV90KSBzbGFiLT5ibG9j a1NpemUpOwogCQl9CiAJfQogCkBAIC01OTcsNyArNTk4LDcgQEAgU2xhYkFsbG9jRnJvbU5ld0Js b2NrKE1lbW9yeUNvbnRleHQgY29udGV4dCwgU2l6ZSBzaXplLCBpbnQgZmxhZ3MpCiAJCVZBTEdS SU5EX01FTVBPT0xfQUxMT0Moc2xhYiwgYmxvY2ssIFNsYWJfQkxPQ0tIRFJTWik7CiAKIAkJYmxv Y2stPnNsYWIgPSBzbGFiOwotCQljb250ZXh0LT5tZW1fYWxsb2NhdGVkICs9IHNsYWItPmJsb2Nr U2l6ZTsKKwkJTWVtb3J5Q29udGV4dFVwZGF0ZUFsbG9jYXRpb24oY29udGV4dCwgc2xhYi0+Ymxv Y2tTaXplKTsKIAogCQkvKiB1c2UgdGhlIGZpcnN0IGNodW5rIGluIHRoZSBuZXcgYmxvY2sgKi8K IAkJY2h1bmsgPSBTbGFiQmxvY2tHZXRDaHVuayhzbGFiLCBibG9jaywgMCk7CkBAIC04MzYsNyAr ODM3LDggQEAgU2xhYkZyZWUodm9pZCAqcG9pbnRlcikKIAkJCVZBTEdSSU5EX01FTVBPT0xfRlJF RShzbGFiLCBibG9jayk7CiAKIAkJCWZyZWUoYmxvY2spOwotCQkJc2xhYi0+aGVhZGVyLm1lbV9h bGxvY2F0ZWQgLT0gc2xhYi0+YmxvY2tTaXplOworCQkJTWVtb3J5Q29udGV4dFVwZGF0ZUFsbG9j YXRpb24oKE1lbW9yeUNvbnRleHQpIHNsYWIsCisJCQkJLShzc2l6ZV90KSBzbGFiLT5ibG9ja1Np emUpOwogCQl9CiAKIAkJLyoKZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL25vZGVzL21lbW5vZGVz LmggYi9zcmMvaW5jbHVkZS9ub2Rlcy9tZW1ub2Rlcy5oCmluZGV4IDRiMjQ3NzhmZTFlLi5jYTVi NjNiMDdkOCAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvbm9kZXMvbWVtbm9kZXMuaAorKysgYi9z cmMvaW5jbHVkZS9ub2Rlcy9tZW1ub2Rlcy5oCkBAIC0xMjMsNiArMTIzLDcgQEAgdHlwZWRlZiBz dHJ1Y3QgTWVtb3J5Q29udGV4dERhdGEKIAlib29sCQlpc1Jlc2V0OwkJLyogVCA9IG5vIHNwYWNl IGFsbG9jYXRlZCBzaW5jZSBsYXN0IHJlc2V0ICovCiAJYm9vbAkJYWxsb3dJbkNyaXRTZWN0aW9u OyAvKiBhbGxvdyBwYWxsb2MgaW4gY3JpdGljYWwgc2VjdGlvbiAqLwogCVNpemUJCW1lbV9hbGxv Y2F0ZWQ7CS8qIHRyYWNrIG1lbW9yeSBhbGxvY2F0ZWQgZm9yIHRoaXMgY29udGV4dCAqLworCVNp emUJCXRvdGFsX2FsbG9jYXRlZDsJLyogbWVtb3J5IGluY2x1ZGluZyBjaGlsZCBjb250ZXh0cyAq LwogCWNvbnN0IE1lbW9yeUNvbnRleHRNZXRob2RzICptZXRob2RzOwkvKiB2aXJ0dWFsIGZ1bmN0 aW9uIHRhYmxlICovCiAJTWVtb3J5Q29udGV4dCBwYXJlbnQ7CQkvKiBOVUxMIGlmIG5vIHBhcmVu dCAodG9wbGV2ZWwgY29udGV4dCkgKi8KIAlNZW1vcnlDb250ZXh0IGZpcnN0Y2hpbGQ7CS8qIGhl YWQgb2YgbGlua2VkIGxpc3Qgb2YgY2hpbGRyZW4gKi8KQEAgLTEzNiw2ICsxMzcsMTggQEAgdHlw ZWRlZiBzdHJ1Y3QgTWVtb3J5Q29udGV4dERhdGEKIC8qIHV0aWxzL3BhbGxvYy5oIGNvbnRhaW5z IHR5cGVkZWYgc3RydWN0IE1lbW9yeUNvbnRleHREYXRhICpNZW1vcnlDb250ZXh0ICovCiAKIAor LyoKKyAqIEFkZCBhbGxvY2F0aW9uIHRvIHRoZSBnaXZlbiBjb250ZXh0IGFuZCBhbGwgYW5jZXN0 b3JzLgorICovCitzdGF0aWMgaW5saW5lIHZvaWQKK01lbW9yeUNvbnRleHRVcGRhdGVBbGxvY2F0 aW9uKE1lbW9yeUNvbnRleHQgY29udGV4dCwgc3NpemVfdCBhbW91bnQpCit7CisJY29udGV4dC0+ bWVtX2FsbG9jYXRlZCArPSBhbW91bnQ7CisKKwlmb3IgKE1lbW9yeUNvbnRleHQgY3VyciA9IGNv bnRleHQ7IGN1cnIgIT0gTlVMTDsgY3VyciA9IGN1cnItPnBhcmVudCkKKwkJY3Vyci0+dG90YWxf YWxsb2NhdGVkICs9IGFtb3VudDsKK30KKwogLyoKICAqIE1lbW9yeUNvbnRleHRJc1ZhbGlkCiAg KgkJVHJ1ZSBpZmYgbWVtb3J5IGNvbnRleHQgaXMgdmFsaWQuCi0tIAoyLjQzLjAKCg== --=-2FUd6BDj2AJq+3/qqfjc--