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.94.2) (envelope-from ) id 1rbyeM-000Gkt-8E for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Feb 2024 08:05:19 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rbyeK-00Dqh1-7V for pgsql-hackers@arkaria.postgresql.org; Mon, 19 Feb 2024 08:05:16 +0000 Received: from magus.postgresql.org ([2a02:c0:301:0:ffff::29]) by malur.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384 (Exim 4.94.2) (envelope-from ) id 1rbyeJ-00Dqgt-Dm for pgsql-hackers@lists.postgresql.org; Mon, 19 Feb 2024 08:05:15 +0000 Received: from mail-178177.yeah.net ([123.58.178.177]) by magus.postgresql.org with esmtp (Exim 4.94.2) (envelope-from ) id 1rbyeD-007xKm-V1 for pgsql-hackers@lists.postgresql.org; Mon, 19 Feb 2024 08:05:14 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=yeah.net; s=s110527; h=Content-Type:Message-ID:Date:MIME-Version:Subject: From; bh=0FpifKERmuMqbv8cOY9zhVxDrzcdMj9Gd85wgbCbADU=; b=NVR+PZ+ MFRG8ThGbvzWrWZnnl25FO2KAHHj3fBlF5idyZEhyue/RxsP3ywRTNcyqO6gLFV0 pPyRiUFc2AfapBHXZTwvHCCTX7QUydRvWWpIEjsUGJI97fnf6j3uNqv9G0mFmkJW i4kWXALaO4WwrKYykGwdl3A2qjW5nTYbcBXY= Received: from [IPV6:2408:8210:2410:aeb0:14d5:c781:675f:31e3] (unknown [2408:8210:2410:aeb0:14d5:c781:675f:31e3]) by smtp3 (Coremail) with SMTP id sVUQrAD3X+CwC9NlyLYnAA--.21026S2; Mon, 19 Feb 2024 16:05:05 +0800 (CST) Content-Type: multipart/mixed; boundary="------------7M36k9GznDZS0krRnfX2iwou" Message-ID: Date: Mon, 19 Feb 2024 16:05:03 +0800 MIME-Version: 1.0 User-Agent: Mozilla Thunderbird Subject: Re: Improvement discussion of custom and generic plans To: pgsql-hackers@lists.postgresql.org References: <9365b39d-a748-4e61-9396-466689ea0aa5@yeah.net> Content-Language: en-US From: Quan Zongliang In-Reply-To: X-CM-TRANSID:sVUQrAD3X+CwC9NlyLYnAA--.21026S2 X-Coremail-Antispam: 1Uf129KBjvJXoWxCr1DGFyxGF1DCF1UWF45Jrb_yoW7Jw4fpr WvkF17KF97Jr4rAryUJr48try5Kr1rJa1rJF1kJFy0yr4UGr1YqF4UXr4a9rW7Kr48Xr1U Xr1jqrsxur1YyrJanT9S1TB71UUUUU7qnTZGkaVYY2UrUUUUjbIjqfuFe4nvWSU5nxnvy2 9KBjDUYxBIdaVFxhVjvjDU0xZFpf9x07UEdgAUUUUU= X-Originating-IP: [2408:8210:2410:aeb0:14d5:c781:675f:31e3] X-CM-SenderInfo: htxd06xrqjzxxdqjq5hhdkh0dhw/1tbiDxGJJFnxceB2iwAAs3 List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk This is a multi-part message in MIME format. --------------7M36k9GznDZS0krRnfX2iwou Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Add the GUC parameter. On 2024/1/30 21:25, Quan Zongliang wrote: > > > On 2023/11/3 15:27, Quan Zongliang wrote: >> Hi >> >> We have one such problem. A table field has skewed data. Statistics: >> n_distinct             | -0.4481973 >> most_common_vals       | {5f006ca25b52ed78e457b150ee95a30c} >> most_common_freqs      | {0.5518474} >> >> >> Data generation: >> >> CREATE TABLE s_user ( >>       user_id varchar(32) NOT NULL, >>       corp_id varchar(32), >>       status int NOT NULL >>   ); >> >> insert into s_user >> select md5('user_id ' || a), md5('corp_id ' || a), >>       case random()<0.877675 when true then 1 else -1 end >>    FROM generate_series(1,10031) a; >> >> insert into s_user >> select md5('user_id ' || a), md5('corp_id 10032'), >>       case random()<0.877675 when true then 1 else -1 end >>    FROM generate_series(10031,22383) a; >> >> CREATE INDEX s_user_corp_id_idx ON s_user USING btree (corp_id); >> >> analyze s_user; >> >> >> 1. First, define a PREPARE statement >> prepare stmt as select count(*) from s_user where status=1 and corp_id >> = $1; >> >> 2. Run it five times. Choose the custom plan. >> explain (analyze,buffers) execute >> stmt('5f006ca25b52ed78e457b150ee95a30c'); >> >> Here's the plan: >>   Aggregate  (cost=639.84..639.85 rows=1 width=8) (actual >> time=4.653..4.654 rows=1 loops=1) >>     Buffers: shared hit=277 >>     ->  Seq Scan on s_user  (cost=0.00..612.76 rows=10830 width=0) >> (actual time=1.402..3.747 rows=10836 loops=1) >>           Filter: ((status = 1) AND ((corp_id)::text = >> '5f006ca25b52ed78e457b150ee95a30c'::text)) >>           Rows Removed by Filter: 11548 >>           Buffers: shared hit=277 >>   Planning Time: 0.100 ms >>   Execution Time: 4.674 ms >> (8 rows) >> >> 3.From the sixth time. Choose generic plan. >> We can see that there is a huge deviation between the estimate and the >> actual value: >>   Aggregate  (cost=11.83..11.84 rows=1 width=8) (actual >> time=4.424..4.425 rows=1 loops=1) >>     Buffers: shared hit=154 read=13 >>     ->  Bitmap Heap Scan on s_user  (cost=4.30..11.82 rows=2 width=0) >> (actual time=0.664..3.371 rows=10836 loops=1) >>           Recheck Cond: ((corp_id)::text = $1) >>           Filter: (status = 1) >>           Rows Removed by Filter: 1517 >>           Heap Blocks: exact=154 >>           Buffers: shared hit=154 read=13 >>           ->  Bitmap Index Scan on s_user_corp_id_idx >> (cost=0.00..4.30 rows=2 width=0) (actual time=0.635..0.635 rows=12353 >> loops=1) >>                 Index Cond: ((corp_id)::text = $1) >>                 Buffers: shared read=13 >>   Planning Time: 0.246 ms >>   Execution Time: 4.490 ms >> (13 rows) >> >> This is because in the choose_custom_plan function, the generic plan >> is attempted after executing the custom plan five times. >> >>      if (plansource->num_custom_plans < 5) >>          return true; >> >> The generic plan uses var_eq_non_const to estimate the average >> selectivity. >> >> These are facts that many people already know. So a brief introduction. >> >> >> Our users actually use such parameter conditions in very complex >> PREPARE statements. Once they use the generic plan for the sixth time. >> The execution time will change from 5 milliseconds to 5 minutes. >> >> >> To improve this problem. The following approaches can be considered: >> >> 1. Determine whether data skew exists in the PREPARE statement >> parameter conditions based on the statistics. >> However, there is no way to know if the user will use the skewed >> parameter. >> >> 2.When comparing the cost of the generic plan with the average cost of >> the custom plan(function choose_custom_plan). Consider whether the >> maximum cost of a custom plan executed is an order of magnitude >> different from the cost of a generic plan. >> If the first five use a small selectivity condition. And after the >> sixth use a high selectivity condition. Problems will still arise. >> >> 3.Trace the execution time of the PREPARE statement. When an execution >> time is found to be much longer than the average execution time, the >> custom plan is forced to run. >> >> >> Is there any better idea? >> > I tried to do a demo. Add a member paramid to Const. When Const is > generated by Param, the Const is identified as coming from Param. Then > check in var_eq_const to see if the field in the condition using this > parameter is skewed. If so, choose_custom_plan returns true every time, > forcing custom_plan to be used. > Only conditional expressions such as var eq param or param eq var can be > supported. > If it makes sense. Continue to improve this patch. > >> -- >> Quan Zongliang >> >> --------------7M36k9GznDZS0krRnfX2iwou Content-Type: text/plain; charset=UTF-8; name="skewedparam-v2.patch" Content-Disposition: attachment; filename="skewedparam-v2.patch" Content-Transfer-Encoding: base64 ZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nvc3RzaXplLmMgYi9z cmMvYmFja2VuZC9vcHRpbWl6ZXIvcGF0aC9jb3N0c2l6ZS5jCmluZGV4IDhiNzZlOTg1Mjku LjE0YjhiZWM2ZmYgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL29wdGltaXplci9wYXRoL2Nv c3RzaXplLmMKKysrIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3BhdGgvY29zdHNpemUuYwpA QCAtMTU0LDYgKzE1NCw4IEBAIGJvb2wJCWVuYWJsZV9wYXJ0aXRpb25fcHJ1bmluZyA9IHRy dWU7CiBib29sCQllbmFibGVfcHJlc29ydGVkX2FnZ3JlZ2F0ZSA9IHRydWU7CiBib29sCQll bmFibGVfYXN5bmNfYXBwZW5kID0gdHJ1ZTsKIAorZG91YmxlCQlza2V3ZWRfcGFyYW1fZmFj dG9yID0gREVGQVVMVF9TS0VXRURfUEFSQU1fRkFDVE9SOworCiB0eXBlZGVmIHN0cnVjdAog ewogCVBsYW5uZXJJbmZvICpyb290OwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvb3B0aW1p emVyL3V0aWwvY2xhdXNlcy5jIGIvc3JjL2JhY2tlbmQvb3B0aW1pemVyL3V0aWwvY2xhdXNl cy5jCmluZGV4IGVkYzI1ZDcxMmUuLjhiOTIyYzBjOTUgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNr ZW5kL29wdGltaXplci91dGlsL2NsYXVzZXMuYworKysgYi9zcmMvYmFja2VuZC9vcHRpbWl6 ZXIvdXRpbC9jbGF1c2VzLmMKQEAgLTI0OTMsNiArMjQ5Myw4IEBAIGV2YWxfY29uc3RfZXhw cmVzc2lvbnNfbXV0YXRvcihOb2RlICpub2RlLAogCQkJCQkJCQkJCQlwdmFsLAogCQkJCQkJ CQkJCQlwcm0tPmlzbnVsbCwKIAkJCQkJCQkJCQkJdHlwQnlWYWwpOworCQkJCQkJCWlmIChw YXJhbUxJLT5wYXJhbUZldGNoID09IE5VTEwpCisJCQkJCQkJCWNvbi0+cGFyYW1pZCA9IHBh cmFtLT5wYXJhbWlkOwogCQkJCQkJCWNvbi0+bG9jYXRpb24gPSBwYXJhbS0+bG9jYXRpb247 CiAJCQkJCQkJcmV0dXJuIChOb2RlICopIGNvbjsKIAkJCQkJCX0KZGlmZiAtLWdpdCBhL3Ny Yy9iYWNrZW5kL3V0aWxzL2FkdC9zZWxmdW5jcy5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvYWR0 L3NlbGZ1bmNzLmMKaW5kZXggY2VhNzc3ZTlkNC4uOWZhNjU0OGQyMyAxMDA2NDQKLS0tIGEv c3JjL2JhY2tlbmQvdXRpbHMvYWR0L3NlbGZ1bmNzLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRp bHMvYWR0L3NlbGZ1bmNzLmMKQEAgLTI3MywxMCArMjczLDMyIEBAIGVxc2VsX2ludGVybmFs KFBHX0ZVTkNUSU9OX0FSR1MsIGJvb2wgbmVnYXRlKQogCSAqIGluIHRoZSBxdWVyeS4pCiAJ ICovCiAJaWYgKElzQShvdGhlciwgQ29uc3QpKQotCQlzZWxlYyA9IHZhcl9lcV9jb25zdCgm dmFyZGF0YSwgb3BlcmF0b3IsIGNvbGxhdGlvbiwKLQkJCQkJCQkgKChDb25zdCAqKSBvdGhl ciktPmNvbnN0dmFsdWUsCi0JCQkJCQkJICgoQ29uc3QgKikgb3RoZXIpLT5jb25zdGlzbnVs bCwKLQkJCQkJCQkgdmFyb25sZWZ0LCBuZWdhdGUpOworCXsKKwkJQ29uc3QgKiBjb24gPSAo Q29uc3QgKikgb3RoZXI7CisKKwkJaWYgKGNvbi0+cGFyYW1pZCA+IDApCisJCXsKKwkJCWJv b2wJc2tld2VkX3N0YXQgPSBmYWxzZTsKKworCQkJc2VsZWMgPSB2YXJfZXFfY29uc3RfZXh0 KCZ2YXJkYXRhLCBvcGVyYXRvciwgY29sbGF0aW9uLAorCQkJCQkJCQkoKENvbnN0ICopIG90 aGVyKS0+Y29uc3R2YWx1ZSwKKwkJCQkJCQkJKChDb25zdCAqKSBvdGhlciktPmNvbnN0aXNu dWxsLAorCQkJCQkJCQl2YXJvbmxlZnQsIG5lZ2F0ZSwgJnNrZXdlZF9zdGF0KTsKKworCQkJ aWYgKHNrZXdlZF9zdGF0KQorCQkJeworCQkJCVBhcmFtRXh0ZXJuRGF0YSAqcHJtOworCisJ CQkJcHJtID0gJnJvb3QtPmdsb2ItPmJvdW5kUGFyYW1zLT5wYXJhbXNbY29uLT5wYXJhbWlk IC0gMV07CisJCQkJcHJtLT5wZmxhZ3MgfD0gUEFSQU1fRkxBR19TS0VXRURTVEFUOworCQkJ fQorCQl9CisJCWVsc2UKKwkJCXNlbGVjID0gdmFyX2VxX2NvbnN0KCZ2YXJkYXRhLCBvcGVy YXRvciwgY29sbGF0aW9uLAorCQkJCQkJCQkoKENvbnN0ICopIG90aGVyKS0+Y29uc3R2YWx1 ZSwKKwkJCQkJCQkJKChDb25zdCAqKSBvdGhlciktPmNvbnN0aXNudWxsLAorCQkJCQkJCQl2 YXJvbmxlZnQsIG5lZ2F0ZSk7CisJfQogCWVsc2UKIAkJc2VsZWMgPSB2YXJfZXFfbm9uX2Nv bnN0KCZ2YXJkYXRhLCBvcGVyYXRvciwgY29sbGF0aW9uLCBvdGhlciwKIAkJCQkJCQkJIHZh cm9ubGVmdCwgbmVnYXRlKTsKQEAgLTI5NSw2ICszMTcsMTYgQEAgZG91YmxlCiB2YXJfZXFf Y29uc3QoVmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSwgT2lkIG9wcm9pZCwgT2lkIGNvbGxh dGlvbiwKIAkJCSBEYXR1bSBjb25zdHZhbCwgYm9vbCBjb25zdGlzbnVsbCwKIAkJCSBib29s IHZhcm9ubGVmdCwgYm9vbCBuZWdhdGUpCit7CisJcmV0dXJuIHZhcl9lcV9jb25zdF9leHQo dmFyZGF0YSwgb3Byb2lkLCBjb2xsYXRpb24sCisJCQkgY29uc3R2YWwsIGNvbnN0aXNudWxs LAorCQkJIHZhcm9ubGVmdCwgbmVnYXRlLCBOVUxMKTsKK30KKworZG91YmxlCit2YXJfZXFf Y29uc3RfZXh0KFZhcmlhYmxlU3RhdERhdGEgKnZhcmRhdGEsIE9pZCBvcHJvaWQsIE9pZCBj b2xsYXRpb24sCisJCQkgRGF0dW0gY29uc3R2YWwsIGJvb2wgY29uc3Rpc251bGwsCisJCQkg Ym9vbCB2YXJvbmxlZnQsIGJvb2wgbmVnYXRlLCBib29sICpza2V3ZWRfc3RhdCkKIHsKIAlk b3VibGUJCXNlbGVjOwogCWRvdWJsZQkJbnVsbGZyYWMgPSAwLjA7CkBAIC0zODcsNiArNDE5 LDM5IEBAIHZhcl9lcV9jb25zdChWYXJpYWJsZVN0YXREYXRhICp2YXJkYXRhLCBPaWQgb3By b2lkLCBPaWQgY29sbGF0aW9uLAogCQkJCQlicmVhazsKIAkJCQl9CiAJCQl9CisKKwkJCUFz c2VydChzc2xvdC5udmFsdWVzID4gMCk7CisJCQlpZiAoc2tld2VkX3N0YXQpCisJCQl7CisJ CQkJLyogQ2hlY2sgd2hldGhlciB0aGUgdmFsdWVzIG9mIHRoZSBmaWVsZCBpcyBza2V3ZWQg YWNjb3JkaW5nIHRvIHRoZSBNQ1ZzLiAqLworCQkJCWlmIChzc2xvdC5udmFsdWVzID4gMSAm JgorCQkJCQkJc3Nsb3QubnVtYmVyc1swXSA+IHNzbG90Lm51bWJlcnNbc3Nsb3QubnZhbHVl cyAtIDFdICogc2tld2VkX3BhcmFtX2ZhY3RvcikKKwkJCQkJLyogQ29tcGFyZSB0aGUgbWF4 aW11bSBhbmQgbWluaW11bSBxdWFudGl0aWVzIGluIHRoZSBNQ1ZzLiAqLworCQkJCQkqc2tl d2VkX3N0YXQgPSB0cnVlOworCQkJCWVsc2UKKwkJCQl7CisJCQkJCS8qCisJCQkJCSAqIENv bXBhcmUgdGhlIG1heGltdW0gbnVtYmVyIGluIHRoZSBNQ1ZzIHdpdGggdGhlIGF2ZXJhZ2Ug bnVtYmVyIG9mCisJCQkJCSAqIG90aGVyIHZhbHVlcyhub3QgaW4gdGhlIE1DVnMpLgorCQkJ CQkgKi8KKwkJCQkJaW50CQkJajsKKwkJCQkJZG91YmxlCQlzdW1jb21tb24gPSAwLjA7CisJ CQkJCWRvdWJsZQkJb3RoZXJkaXN0aW5jdCwgYXZnc2VsZWM7CisKKwkJCQkJZm9yIChqID0g MDsgaiA8IHNzbG90Lm5udW1iZXJzOyBqKyspCisJCQkJCQlzdW1jb21tb24gKz0gc3Nsb3Qu bnVtYmVyc1tqXTsKKworCQkJCQlvdGhlcmRpc3RpbmN0ID0gZ2V0X3ZhcmlhYmxlX251bWRp c3RpbmN0KHZhcmRhdGEsICZpc2RlZmF1bHQpIC0KKwkJCQkJCXNzbG90Lm5udW1iZXJzOwor CisJCQkJCWlmIChvdGhlcmRpc3RpbmN0ID4gMCkKKwkJCQkJeworCQkJCQkJYXZnc2VsZWMg PSAoMS4wIC0gc3VtY29tbW9uIC0gbnVsbGZyYWMpIC8gb3RoZXJkaXN0aW5jdDsKKwkJCQkJ CWlmIChzc2xvdC5udW1iZXJzWzBdID4gKGF2Z3NlbGVjICogc2tld2VkX3BhcmFtX2ZhY3Rv cikpCisJCQkJCQkJKnNrZXdlZF9zdGF0ID0gdHJ1ZTsKKwkJCQkJfQorCQkJCX0KKwkJCX0K IAkJfQogCQllbHNlCiAJCXsKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL3V0aWxzL2NhY2hl L3BsYW5jYWNoZS5jIGIvc3JjL2JhY2tlbmQvdXRpbHMvY2FjaGUvcGxhbmNhY2hlLmMKaW5k ZXggNTE5NGNiZjJjYy4uZDFlZTAwMTM5ZSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvdXRp bHMvY2FjaGUvcGxhbmNhY2hlLmMKKysrIGIvc3JjL2JhY2tlbmQvdXRpbHMvY2FjaGUvcGxh bmNhY2hlLmMKQEAgLTk5MSw2ICs5OTEsMjAgQEAgQnVpbGRDYWNoZWRQbGFuKENhY2hlZFBs YW5Tb3VyY2UgKnBsYW5zb3VyY2UsIExpc3QgKnFsaXN0LAogCWVsc2UKIAkJcGxhbl9jb250 ZXh0ID0gQ3VycmVudE1lbW9yeUNvbnRleHQ7CiAKKwlpZiAoYm91bmRQYXJhbXMpCisJewor CQlpbnQgaTsKKworCQlmb3IgKGkgPTA7IGkgPCBib3VuZFBhcmFtcy0+bnVtUGFyYW1zOyBp KyspCisJCXsKKwkJCWlmIChib3VuZFBhcmFtcy0+cGFyYW1zW2ldLnBmbGFncyAmIFBBUkFN X0ZMQUdfU0tFV0VEU1RBVCkKKwkJCXsKKwkJCQlwbGFuc291cmNlLT5oYXNTa2V3ZWRwYXJh bSA9IHRydWU7CisJCQkJYnJlYWs7CisJCQl9CisJCX0KKwl9CisKIAkvKgogCSAqIENyZWF0 ZSBhbmQgZmlsbCB0aGUgQ2FjaGVkUGxhbiBzdHJ1Y3Qgd2l0aGluIHRoZSBuZXcgY29udGV4 dC4KIAkgKi8KQEAgLTEwNjYsNiArMTA4MCwxMiBAQCBjaG9vc2VfY3VzdG9tX3BsYW4oQ2Fj aGVkUGxhblNvdXJjZSAqcGxhbnNvdXJjZSwgUGFyYW1MaXN0SW5mbyBib3VuZFBhcmFtcykK IAlpZiAocGxhbl9jYWNoZV9tb2RlID09IFBMQU5fQ0FDSEVfTU9ERV9GT1JDRV9DVVNUT01f UExBTikKIAkJcmV0dXJuIHRydWU7CiAKKwlpZiAocGxhbl9jYWNoZV9tb2RlID09IFBMQU5f Q0FDSEVfTU9ERV9TVEFUX0FEQVBUSVZFX1BMQU4pCisJeworCQlpZiAocGxhbnNvdXJjZS0+ aGFzU2tld2VkcGFyYW0pCisJCQlyZXR1cm4gdHJ1ZTsKKwl9CisKIAkvKiBTZWUgaWYgY2Fs bGVyIHdhbnRzIHRvIGZvcmNlIHRoZSBkZWNpc2lvbiAqLwogCWlmIChwbGFuc291cmNlLT5j dXJzb3Jfb3B0aW9ucyAmIENVUlNPUl9PUFRfR0VORVJJQ19QTEFOKQogCQlyZXR1cm4gZmFs c2U7CmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC91dGlscy9taXNjL2d1Y190YWJsZXMuYyBi L3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCmluZGV4IDcwNjUyZjBhM2Yu LjkzZjg1YmFlZGIgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3Rh Ymxlcy5jCisrKyBiL3NyYy9iYWNrZW5kL3V0aWxzL21pc2MvZ3VjX3RhYmxlcy5jCkBAIC00 MDMsNiArNDAzLDcgQEAgc3RhdGljIGNvbnN0IHN0cnVjdCBjb25maWdfZW51bV9lbnRyeSBk ZWJ1Z19wYXJhbGxlbF9xdWVyeV9vcHRpb25zW10gPSB7CiAKIHN0YXRpYyBjb25zdCBzdHJ1 Y3QgY29uZmlnX2VudW1fZW50cnkgcGxhbl9jYWNoZV9tb2RlX29wdGlvbnNbXSA9IHsKIAl7 ImF1dG8iLCBQTEFOX0NBQ0hFX01PREVfQVVUTywgZmFsc2V9LAorCXsic3RhdF9hZGFwdGl2 ZV9wbGFuIiwgUExBTl9DQUNIRV9NT0RFX1NUQVRfQURBUFRJVkVfUExBTiwgZmFsc2V9LAog CXsiZm9yY2VfZ2VuZXJpY19wbGFuIiwgUExBTl9DQUNIRV9NT0RFX0ZPUkNFX0dFTkVSSUNf UExBTiwgZmFsc2V9LAogCXsiZm9yY2VfY3VzdG9tX3BsYW4iLCBQTEFOX0NBQ0hFX01PREVf Rk9SQ0VfQ1VTVE9NX1BMQU4sIGZhbHNlfSwKIAl7TlVMTCwgMCwgZmFsc2V9CkBAIC0zODY2 LDYgKzM4NjcsMTcgQEAgc3RydWN0IGNvbmZpZ19yZWFsIENvbmZpZ3VyZU5hbWVzUmVhbFtd ID0KIAkJTlVMTCwgTlVMTCwgTlVMTAogCX0sCiAKKwl7CisJCXsic2tld2VkX3BhcmFtX2Zh Y3RvciIsIFBHQ19TVVNFVCwgTE9HR0lOR19XSEVOLAorCQkJZ2V0dGV4dF9ub29wKCJTZXRz IHRoZSBza2V3ZWQgZmFjdG9yIGZvciBwYXJhbWV0ZXJzIG9mIHRoZSBwcmVwYXJlIHN0YXRl bWVudC4iKSwKKwkJCWdldHRleHRfbm9vcCgiVXNlIGEgdGhyZWRob2xkIHRvIGRldGVybWlu ZSB3aGV0aGVyIGEgc2tld2VkIHBhcmFtZXRlciBleGlzdHMuIgorCQkJCQkJICJJZiB0cnVl LCB1c2UgdGhlIGN1c3RvbSBwbGFuLiIpCisJCX0sCisJCSZza2V3ZWRfcGFyYW1fZmFjdG9y LAorCQlERUZBVUxUX1NLRVdFRF9QQVJBTV9GQUNUT1IsIDIuMCwgMTAwMDAuMCwKKwkJTlVM TCwgTlVMTCwgTlVMTAorCX0sCisKIAkvKiBFbmQtb2YtbGlzdCBtYXJrZXIgKi8KIAl7CiAJ CXtOVUxMLCAwLCAwLCBOVUxMLCBOVUxMfSwgTlVMTCwgMC4wLCAwLjAsIDAuMCwgTlVMTCwg TlVMTCwgTlVMTApkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcGFyYW1zLmggYi9z cmMvaW5jbHVkZS9ub2Rlcy9wYXJhbXMuaAppbmRleCAxMGM5ZmM1NDEzLi4wNTFhMTJiYjFk IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wYXJhbXMuaAorKysgYi9zcmMvaW5j bHVkZS9ub2Rlcy9wYXJhbXMuaApAQCAtODUsNyArODUsMTMgQEAgc3RydWN0IFBhcnNlU3Rh dGU7CiAgKgkgIGFuZCBwYXJhbUNvbXBpbGVBcmcgaXMgcmF0aGVyIGFyYml0cmFyeS4KICAq LwogCi0jZGVmaW5lIFBBUkFNX0ZMQUdfQ09OU1QJMHgwMDAxCS8qIHBhcmFtZXRlciBpcyBj b25zdGFudCAqLworLyogcGFyYW1ldGVyIGlzIGNvbnN0YW50ICovCisjZGVmaW5lIFBBUkFN X0ZMQUdfQ09OU1QJCQkweDAwMDEKKy8qCisgKiBUaGUgdmFyIHNpZGUgb2YgJ3ZhciBlcSBw YXJhbScgb3IgJ3BhcmFtIGVxIHZhcicgZXhwcmVzc2lvbgorICogY29ycmVzcG9uZGluZyB0 byB0aGUgcGFyYW1ldGVyIGNvbnRhaW5zIHNrZXdlZCBkYXRhLgorICovCisjZGVmaW5lIFBB UkFNX0ZMQUdfU0tFV0VEU1RBVAkJMHgwMDAyCiAKIHR5cGVkZWYgc3RydWN0IFBhcmFtRXh0 ZXJuRGF0YQogewpkaWZmIC0tZ2l0IGEvc3JjL2luY2x1ZGUvbm9kZXMvcHJpbW5vZGVzLmgg Yi9zcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMuaAppbmRleCA0YTE1NDYwNmQyLi43ZTY3 NjJkZTQ3IDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMuaAorKysg Yi9zcmMvaW5jbHVkZS9ub2Rlcy9wcmltbm9kZXMuaApAQCAtMzE0LDYgKzMxNCwxMiBAQCB0 eXBlZGVmIHN0cnVjdCBDb25zdAogCSAqLwogCWJvb2wJCWNvbnN0Ynl2YWwgcGdfbm9kZV9h dHRyKHF1ZXJ5X2p1bWJsZV9pZ25vcmUpOwogCisJLyoKKwkgKiA+MCBpbmRpY2F0ZXMgdGhh dCB0aGUgY29uc3RhbnQgaXMgZXh0cmFjdGVkIGZyb20gUGFyYW0uCisJICogSXRzIHZhbHVl IGlzIHBhcmFtaWQgb2YgdGhlIFBhcmFtIHN0cnVjdC4KKwkgKi8KKwlpbnQJCQlwYXJhbWlk IHBnX25vZGVfYXR0cihxdWVyeV9qdW1ibGVfaWdub3JlKTsKKwogCS8qCiAJICogdG9rZW4g bG9jYXRpb24sIG9yIC0xIGlmIHVua25vd24uICBBbGwgY29uc3RhbnRzIGFyZSB0cmFja2Vk IGFzCiAJICogbG9jYXRpb25zIGluIHF1ZXJ5IGp1bWJsaW5nLCB0byBiZSBtYXJrZWQgYXMg cGFyYW1ldGVycy4KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL29wdGltaXplci9jb3N0Lmgg Yi9zcmMvaW5jbHVkZS9vcHRpbWl6ZXIvY29zdC5oCmluZGV4IGIxYzUxYTRlNzAuLjM2MDZl NDc2ODEgMTAwNjQ0Ci0tLSBhL3NyYy9pbmNsdWRlL29wdGltaXplci9jb3N0LmgKKysrIGIv c3JjL2luY2x1ZGUvb3B0aW1pemVyL2Nvc3QuaApAQCAtMjgsNiArMjgsNyBAQAogI2RlZmlu ZSBERUZBVUxUX0NQVV9PUEVSQVRPUl9DT1NUICAwLjAwMjUKICNkZWZpbmUgREVGQVVMVF9Q QVJBTExFTF9UVVBMRV9DT1NUIDAuMQogI2RlZmluZSBERUZBVUxUX1BBUkFMTEVMX1NFVFVQ X0NPU1QgIDEwMDAuMAorI2RlZmluZSBERUZBVUxUX1NLRVdFRF9QQVJBTV9GQUNUT1IgIDEw LjAKIAogLyogZGVmYXVsdHMgZm9yIG5vbi1Db3N0IHBhcmFtZXRlcnMgKi8KICNkZWZpbmUg REVGQVVMVF9SRUNVUlNJVkVfV09SS1RBQkxFX0ZBQ1RPUiAgMTAuMApAQCAtNzEsNiArNzIs NyBAQCBleHRlcm4gUEdETExJTVBPUlQgYm9vbCBlbmFibGVfcGFydGl0aW9uX3BydW5pbmc7 CiBleHRlcm4gUEdETExJTVBPUlQgYm9vbCBlbmFibGVfcHJlc29ydGVkX2FnZ3JlZ2F0ZTsK IGV4dGVybiBQR0RMTElNUE9SVCBib29sIGVuYWJsZV9hc3luY19hcHBlbmQ7CiBleHRlcm4g UEdETExJTVBPUlQgaW50IGNvbnN0cmFpbnRfZXhjbHVzaW9uOworZXh0ZXJuIFBHRExMSU1Q T1JUIGRvdWJsZSBza2V3ZWRfcGFyYW1fZmFjdG9yOwogCiBleHRlcm4gZG91YmxlIGluZGV4 X3BhZ2VzX2ZldGNoZWQoZG91YmxlIHR1cGxlc19mZXRjaGVkLCBCbG9ja051bWJlciBwYWdl cywKIAkJCQkJCQkJICBkb3VibGUgaW5kZXhfcGFnZXMsIFBsYW5uZXJJbmZvICpyb290KTsK ZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL3V0aWxzL3BsYW5jYWNoZS5oIGIvc3JjL2luY2x1 ZGUvdXRpbHMvcGxhbmNhY2hlLmgKaW5kZXggYTkwZGZkZjkwNi4uYzc0MmM2NDQ5YyAxMDA2 NDQKLS0tIGEvc3JjL2luY2x1ZGUvdXRpbHMvcGxhbmNhY2hlLmgKKysrIGIvc3JjL2luY2x1 ZGUvdXRpbHMvcGxhbmNhY2hlLmgKQEAgLTMwLDYgKzMwLDcgQEAgc3RydWN0IFJhd1N0bXQ7 CiB0eXBlZGVmIGVudW0KIHsKIAlQTEFOX0NBQ0hFX01PREVfQVVUTywKKwlQTEFOX0NBQ0hF X01PREVfU1RBVF9BREFQVElWRV9QTEFOLAogCVBMQU5fQ0FDSEVfTU9ERV9GT1JDRV9HRU5F UklDX1BMQU4sCiAJUExBTl9DQUNIRV9NT0RFX0ZPUkNFX0NVU1RPTV9QTEFOLAogfQkJCVBs YW5DYWNoZU1vZGU7CkBAIC0xMjQsNiArMTI1LDcgQEAgdHlwZWRlZiBzdHJ1Y3QgQ2FjaGVk UGxhblNvdXJjZQogCWJvb2wJCWlzX2NvbXBsZXRlOwkvKiBoYXMgQ29tcGxldGVDYWNoZWRQ bGFuIGJlZW4gZG9uZT8gKi8KIAlib29sCQlpc19zYXZlZDsJCS8qIGhhcyBDYWNoZWRQbGFu U291cmNlIGJlZW4gInNhdmVkIj8gKi8KIAlib29sCQlpc192YWxpZDsJCS8qIGlzIHRoZSBx dWVyeV9saXN0IGN1cnJlbnRseSB2YWxpZD8gKi8KKwlib29sCQloYXNTa2V3ZWRwYXJhbTsg Lyogc2VlIHRoZSBkZWZpbml0aW9uIG9mIFBBUkFNIEZMQUcgU0tFV0VEU1RBVCAqLwogCWlu dAkJCWdlbmVyYXRpb247CQkvKiBpbmNyZW1lbnRzIGVhY2ggdGltZSB3ZSBjcmVhdGUgYSBw bGFuICovCiAJLyogSWYgQ2FjaGVkUGxhblNvdXJjZSBoYXMgYmVlbiBzYXZlZCwgaXQgaXMg YSBtZW1iZXIgb2YgYSBnbG9iYWwgbGlzdCAqLwogCWRsaXN0X25vZGUJbm9kZTsJCQkvKiBs aXN0IGxpbmssIGlmIGlzX3NhdmVkICovCmRpZmYgLS1naXQgYS9zcmMvaW5jbHVkZS91dGls cy9zZWxmdW5jcy5oIGIvc3JjL2luY2x1ZGUvdXRpbHMvc2VsZnVuY3MuaAppbmRleCAyZmE0 YzRmYzFiLi5hNzUzMmI4ZDdiIDEwMDY0NAotLS0gYS9zcmMvaW5jbHVkZS91dGlscy9zZWxm dW5jcy5oCisrKyBiL3NyYy9pbmNsdWRlL3V0aWxzL3NlbGZ1bmNzLmgKQEAgLTE4NCw2ICsx ODQsMTAgQEAgZXh0ZXJuIGRvdWJsZSB2YXJfZXFfY29uc3QoVmFyaWFibGVTdGF0RGF0YSAq dmFyZGF0YSwKIAkJCQkJCSAgIE9pZCBvcHJvaWQsIE9pZCBjb2xsYXRpb24sCiAJCQkJCQkg ICBEYXR1bSBjb25zdHZhbCwgYm9vbCBjb25zdGlzbnVsbCwKIAkJCQkJCSAgIGJvb2wgdmFy b25sZWZ0LCBib29sIG5lZ2F0ZSk7CitleHRlcm4gZG91YmxlIHZhcl9lcV9jb25zdF9leHQo VmFyaWFibGVTdGF0RGF0YSAqdmFyZGF0YSwKKwkJCQkJCSAgIE9pZCBvcHJvaWQsIE9pZCBj b2xsYXRpb24sCisJCQkJCQkgICBEYXR1bSBjb25zdHZhbCwgYm9vbCBjb25zdGlzbnVsbCwK KwkJCQkJCSAgIGJvb2wgdmFyb25sZWZ0LCBib29sIG5lZ2F0ZSwgYm9vbCAqc2tld2VkX3N0 YXQpOwogZXh0ZXJuIGRvdWJsZSB2YXJfZXFfbm9uX2NvbnN0KFZhcmlhYmxlU3RhdERhdGEg KnZhcmRhdGEsCiAJCQkJCQkJICAgT2lkIG9wcm9pZCwgT2lkIGNvbGxhdGlvbiwKIAkJCQkJ CQkgICBOb2RlICpvdGhlciwK --------------7M36k9GznDZS0krRnfX2iwou--