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 1vmDin-008ySJ-1c for pgsql-hackers@arkaria.postgresql.org; Sat, 31 Jan 2026 16:21:18 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vmDil-008bb9-16 for pgsql-hackers@arkaria.postgresql.org; Sat, 31 Jan 2026 16:21: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.96) (envelope-from ) id 1vmDik-008bb0-30 for pgsql-hackers@lists.postgresql.org; Sat, 31 Jan 2026 16:21:15 +0000 Received: from mail-ed1-x532.google.com ([2a00:1450:4864:20::532]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vmDii-00000000Nx2-48bx for pgsql-hackers@postgresql.org; Sat, 31 Jan 2026 16:21:15 +0000 Received: by mail-ed1-x532.google.com with SMTP id 4fb4d7f45d1cf-64b7318f1b0so4184775a12.2 for ; Sat, 31 Jan 2026 08:21:12 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1769876471; cv=none; d=google.com; s=arc-20240605; b=E7WngS2xMyWr1audADOZNY4Hpq0qDGH5YhGlhUciEK5EZzhXb7VbUVuTG5Bwo86MRO WkcycqOvogiMbjiJDv3TUz3dUrU1igc1nzedsbt9yvPt91g4l9Q5TIqkcvN/R15G1fEJ D+fzHQu8O3XC1oPeCPSIDn8p29WRJvjEpqn/zNcI0H5tZRxqEabIi7q12uzc8yvM97oN /JArGvqVrH2cPmaLjq+iAkpB/2wghCj/TYdnr6WI4WrZV21MUXX17oW1XUfmOvUH/7OF TwdRxHmdQGnX65eL1+t6DzDfSVXqzQVPLD8/w04f2IMtKz9PIFLBvTDKY1vQE7C4iBnY xQZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20240605; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:dkim-signature; bh=4GtbTZ2WOLMtdslYLt8jrAKyT16l3vqj+tZcOdBEssk=; fh=nnGbnBR7B+8ekLl0dkIFRGfK2S0vyVuKH1PUjqv+MoE=; b=aHp9bMLu8GluVGZpDAbWIJwjgfqMX/MZDhnvVOcYdzPIeePgnRUcNLQb7iFzJXsSGX rJpXqLdRisivU6dLerIWc2e3BWGMRV9IA7si3zam3sl0aGC8ErPvAkM0W8i6RVPBoag3 6kuO/iMBe/UBnBIISPpkEgtWWkIWY8zqontMx3g6SVV1sIW+W/ltBirv87DtMcMSaPW+ wE14qZUWR/C0dVoECg0+uWVDvBVUHHR1LpZ1IXxbVvNV4RNfKtb/ltNEgwY1VRJ5sE4O DEhLwSRQqyWf2SDAZ/Xbb8PauTxH5CAvyO43z7YaLrZx7k3QpYBCYD4uerCf4rc6t4Bi ebKA==; darn=postgresql.org ARC-Authentication-Results: i=1; mx.google.com; arc=none DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=esi.dz; s=google; t=1769876471; x=1770481271; darn=postgresql.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=4GtbTZ2WOLMtdslYLt8jrAKyT16l3vqj+tZcOdBEssk=; b=N1ThtvlM/NwC2TQmE4IPFXiGT6dHpjoKWjLvJRxBwpcDewvdnkKYkv/8Edx8SgPgBr 9hxUvyKPjfy/ms1Xj0q6DP6ccTmbCydkBhNb2UctBvYuujkM+16Kl15hFpxgUMRsg1Xr aYe5eVV+clenAUj2oNSz3VD6q8W1YpHlHchRYZLtqSVK6XBJkXONlMiajlg6N25gZLtf Z1Ltoc2g+LI52zUQy5pz28ZzXApIfiQL/0d+ePfNHtF3taEVVPDpR209PIhDP9F0kHMF mRAZKSmLpz1OAVXYsdNo++Dxr0VmieW9CoX6pMweJDG86p9CkQsUqTMh7qGpeqQ2Xf+B 6bTA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1769876471; x=1770481271; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-gg:x-gm-message-state:from:to:cc:subject:date :message-id:reply-to; bh=4GtbTZ2WOLMtdslYLt8jrAKyT16l3vqj+tZcOdBEssk=; b=ps6sruZVOEYxo71WKup+XGlQXB3UAzyFbFF/DBSnyFEaL7tDJGeADTr101TOc/jj98 2iWQGZP5Qy/jXgh5Li1M/anLm+KKKvAvy29NjLNzS3C5BWf1VjkcMsUPcbJDWhGW8j2V c9RiWvkG9JKHY5YU7n49S4iLZ17TKBtsTTnEPZ33jZ3vE5pkyEsGoWlqMkirUIQH3xHZ BXgZ4BME4zQlhjgbpgnsZlp1PT8SRMg76IdY46+WSeOx450/NzThg+KbWdxzMOXN+I7P dtzyrv7eNrlcSPE9zlEQA/XcUo8Q3ep7MqUhrGPPW5AEFurkMsz4i8warRVerHMzekG8 3e3Q== X-Forwarded-Encrypted: i=1; AJvYcCXNMuYuVtuEu3jEXkXxH7YjwfjhQQqQ1cY3/kFd8n2QyV2S2yB0A44CNBxjs0qow1+/fB6/q227Ekl1+AWJ@postgresql.org X-Gm-Message-State: AOJu0YwgAivOkk+pJPWKvU33oPdINyKsifFAY+0AfKGBmKXRkO/fwhzR BOJboLhR3ZV9plZevhPTxH3qnKXtxp3QjNI8hR5mJaZu5RgsLpcstdBk4ycLLC/0wHvTW0VuHsn 5to+x8sbeFwZnaxamyGlwK1F6iiO8da2aMyBZ9xW5 X-Gm-Gg: AZuq6aLxsCCF3FAiVX6zmZwX8D+BSSjWl+gJ8myxclUCnYPGsxVY2I0gCAEbZMgT4UP FDzH4J68NL84/GFtWwBGHrUJK5uTNlaMq1ysLhVyF67wRWxGesgJjgOUoX7mCxPfAVB6Z672L0X OucFyhryZhdV3n1kgcyivkD9uYDzACb0qdZDEHHyV2sVMW6oGUTI8Ap7AdoEb/2EAPLG7oVyI3c sXH/yu4T1nlSeHbhFvB0xvWMrRvAKmP88s4KKk5nRrZ7Uu4knKdgfKZJMb+ZSdBbgIAFwi6yhFS tmQhE8awbJCsM2NxCyYexsQKxe0ytA== X-Received: by 2002:a05:6402:26c5:b0:658:c1d2:baab with SMTP id 4fb4d7f45d1cf-658de5518c1mr4176235a12.10.1769876470976; Sat, 31 Jan 2026 08:21:10 -0800 (PST) MIME-Version: 1.0 References: <5d81fbbb-7609-4445-9bc4-8af211fb7674@dunslane.net> <8e226753-57af-489a-bfbe-caa23dd71286@dunslane.net> In-Reply-To: From: KAZAR Ayoub Date: Sat, 31 Jan 2026 17:20:58 +0100 X-Gm-Features: AZwV_Qi94xXNQ_CMC4UmRx3FgAv8RrcK2wxhTyb5JPgXLp2aDQ9oo1PqB-fGhwI Message-ID: Subject: Re: Speed up COPY FROM text/CSV parsing using SIMD To: Neil Conway Cc: Nazir Bilal Yavuz , Manni Wood , Nathan Bossart , Andrew Dunstan , Shinya Kato , PostgreSQL-development Content-Type: multipart/mixed; boundary="0000000000005992d00649b17a25" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000005992d00649b17a25 Content-Type: multipart/alternative; boundary="0000000000005992ce0649b17a23" --0000000000005992ce0649b17a23 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hello, On Wed, Jan 21, 2026 at 9:50=E2=80=AFPM Neil Conway = wrote: > A few suggestions: > > * I'm curious if we'll see better performance on large inputs if we flush > to `line_buf` periodically (e.g., at least every few thousand bytes or so= ). > Otherwise we might see poor data cache behavior if large inputs with no > control characters get evicted before we've copied them over. See the > approach taken in escape_json_with_len() in utils/adt/json.c > > So i gave this a try, attached is the small patch that has v3 + the suggestion added, here are the results with different threshold for line_buf refill: Execution time compared to master: Workload v3 v3.1 (2k) v3.1 (4k) v3.1 (8k) v3.1 (16k) v3.1 (20k) v3.1 (28k) text/none -16.5% -17.4% -14.3% -12.6% -13.6% -10.5% -16.3% text/esc +5.6% +11.1% +3.1% +7.6% +3.0% +4.9% +4.2% csv/none -31.0% -29.9% -26.7% -30.1% -27.9% -30.2% -29.6% csv/quote +0.2% -0.6% -0.4% -1.0% +0.1% +2.5% -1.0% L1d cache miss rates: Workload Master v3 v3.1 (2k) v3.1 (4k) v3.1 (8k) v3.1 (16k) v3.1 (20k) v3.1 (28k) text/none 0.20% 0.23% 0.21% 0.22% 0.21% 0.21% 0.21% 0.22% text/esc 0.21% 0.22% 0.22% 0.22% 0.22% 0.21% 0.22% 0.22% csv/none 0.17% 0.22% 0.21% 0.22% 0.21% 0.21% 0.22% 0.22% csv/quote 0.18% 0.22% 0.19% 0.20% 0.20% 0.19% 0.20% 0.20% On my laptop I have 32KB L1 cache per core. Results are super close, it is hard to see in the cache misses numbers but execution times are saying other things, doing the periodic filling of line_buf seems good to do. If Manni can rerun the benchmarks on these too, it would be nice to confirm this. Regards, Ayoub --0000000000005992ce0649b17a23 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hello,

On Wed, Jan 21, 2026 at 9:50= =E2=80=AFPM Neil Conway <neil.conway@gmail.com> wrote:
A few suggestions:
* I'm curious if we'll see better performance on large inputs if w= e flush to `line_buf` periodically (e.g., at least every few thousand bytes= or so). Otherwise we might see poor data cache behavior if large inputs wi= th no control characters get evicted before we've copied them over. See= the approach taken in=C2=A0escape_json_with_len() in utils/adt/json.c
=
So i gave this a try, attached is the sma= ll patch that has v3 + the suggestion added, here are the results with diff= erent threshold for line_buf refill:

Execution tim= e compared to master:=
Workloadv3v3.1= (2k)v3.1 (4k)v3.1 (8k)v3.1 (16k)v3.1 (= 20k)v3.1 (28k)
text/none-= 16.5%-17.4%-14.3%-12.6%-13.6%-= 10.5%-16.3%
text/esc+5.6%+11.1%= +3.1%+7.6%+3.0%+4.9%+4.2%
csv/none-31.0%-29.9%-26.7%= -30.1%-27.9%-30.2%-29.6%
csv/qu= ote+0.2%-0.6%-0.4%-1.0%+0.1%+2.5%-1.0%

L1d cache miss rates:
= = 0.20%
WorkloadM= asterv3v3.1 (2k)v3.1 (4k)v3.1 (8k)v3.1 (16k)v3.1 (20k)v3.1 (28k)
text/none0.20%0.23%0.21%0.22%= 0.21%0.21%0.21%0.22%
t= ext/esc0.21%0.22%0.22%0.22%0.2= 2%0.21%0.22%0.22%
csv/none0.17%0.22%0.21%0.22%0.21%0= .21%0.22%0.22%
csv/quote0.18%0.22%0.19%0.20%0.20%0.19%0.20%

On my=C2=A0la= ptop I have=C2=A032KB L1 cache per core.
Results are super close,= it is hard to see in the cache misses=C2=A0numbers but execution times are= saying other things, doing the periodic filling of line_buf seems good to = do.
If Manni can rerun the benchmarks on these too, it would be nice to = confirm this.


Regards,
Ayoub
--0000000000005992ce0649b17a23-- --0000000000005992d00649b17a25 Content-Type: application/x-patch; name="0001-COPY-from-SIMD-v3-with-line_buf-periodic-refill.patch" Content-Disposition: attachment; filename="0001-COPY-from-SIMD-v3-with-line_buf-periodic-refill.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_ml2gqzu40 RnJvbSA0MDIzMDI1OWI5Yzg2NzM1MjA5NGQ4NjhmMGYzNGNjNmZkNDE4YzE1IE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBTYXQsIDMxIEphbiAyMDI2IDE2OjIzOjM1ICswMTAwClN1YmplY3Q6IFtQQVRDSF0gQ09Q WSBmcm9tIFNJTUQgdjMgd2l0aCBsaW5lX2J1ZiBwZXJpb2RpYyByZWZpbGwKCi0tLQogc3JjL2Jh Y2tlbmQvY29tbWFuZHMvY29weWZyb20uYyAgICAgICAgICB8ICAgNiArCiBzcmMvYmFja2VuZC9j b21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgICAgIHwgMTYyICsrKysrKysrKysrKysrKysrKysrKyst CiBzcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9pbnRlcm5hbC5oIHwgICA3ICsKIDMgZmls ZXMgY2hhbmdlZCwgMTcwIGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20uYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRz L2NvcHlmcm9tLmMKaW5kZXggMjVlZTIwYjIzZGIuLjNlZjgxMjAxMDA4IDEwMDY0NAotLS0gYS9z cmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbS5jCisrKyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRz L2NvcHlmcm9tLmMKQEAgLTE3MjEsNiArMTcyMSwxMiBAQCBCZWdpbkNvcHlGcm9tKFBhcnNlU3Rh dGUgKnBzdGF0ZSwKIAljc3RhdGUtPmN1cl9hdHR2YWwgPSBOVUxMOwogCWNzdGF0ZS0+cmVsbmFt ZV9vbmx5ID0gZmFsc2U7CiAKKwkvKiBJbml0aWFsaXplIFNJTUQgdmFyaWFibGVzICovCisJY3N0 YXRlLT5zaW1kX2NvbnRpbnVlID0gZmFsc2U7CisJY3N0YXRlLT5zaW1kX2luaXRpYWxpemVkID0g ZmFsc2U7CisJY3N0YXRlLT5zaW1kX2N1cnJlbnRfc2xlZXBfY3ljbGUgPSAwOworCWNzdGF0ZS0+ c2ltZF9sYXN0X3NsZWVwX2N5Y2xlID0gMDsKKwogCS8qCiAJICogQWxsb2NhdGUgYnVmZmVycyBm b3IgdGhlIGlucHV0IHBpcGVsaW5lLgogCSAqCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21t YW5kcy9jb3B5ZnJvbXBhcnNlLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNl LmMKaW5kZXggNTg2OGE3ZmExMWYuLjM2OTRiODE0YTg1IDEwMDY0NAotLS0gYS9zcmMvYmFja2Vu ZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKKysrIGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29w eWZyb21wYXJzZS5jCkBAIC03MSw3ICs3MSw5IEBACiAjaW5jbHVkZSAibWIvcGdfd2NoYXIuaCIK ICNpbmNsdWRlICJtaXNjYWRtaW4uaCIKICNpbmNsdWRlICJwZ3N0YXQuaCIKKyNpbmNsdWRlICJw b3J0L3BnX2JpdHV0aWxzLmgiCiAjaW5jbHVkZSAicG9ydC9wZ19ic3dhcC5oIgorI2luY2x1ZGUg InBvcnQvc2ltZC5oIgogI2luY2x1ZGUgInV0aWxzL2J1aWx0aW5zLmgiCiAjaW5jbHVkZSAidXRp bHMvcmVsLmgiCiAKQEAgLTEzNSwxOCArMTM3LDIyIEBAIGlmICgxKSBcCiAJfSBcCiB9IGVsc2Ug KCh2b2lkKSAwKQogCisjZGVmaW5lIExJTkVfQlVGX0ZMVVNIX0FGVEVSIDQwOTYKKwogLyogTk9U RTogdGhlcmUncyBhIGNvcHkgb2YgdGhpcyBpbiBjb3B5dG8uYyAqLwogc3RhdGljIGNvbnN0IGNo YXIgQmluYXJ5U2lnbmF0dXJlWzExXSA9ICJQR0NPUFlcblwzNzdcclxuXDAiOwogCiAKIC8qIG5v bi1leHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogc3RhdGljIGJvb2wgQ29weVJlYWRMaW5l KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2Nzdik7Ci1zdGF0aWMgYm9vbCBDb3B5UmVh ZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2Nzdik7CiBzdGF0aWMgaW50 CUNvcHlSZWFkQXR0cmlidXRlc1RleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUpOwogc3RhdGljIGlu dAlDb3B5UmVhZEF0dHJpYnV0ZXNDU1YoQ29weUZyb21TdGF0ZSBjc3RhdGUpOwogc3RhdGljIERh dHVtIENvcHlSZWFkQmluYXJ5QXR0cmlidXRlKENvcHlGcm9tU3RhdGUgY3N0YXRlLCBGbWdySW5m byAqZmxpbmZvLAogCQkJCQkJCQkJIE9pZCB0eXBpb3BhcmFtLCBpbnQzMiB0eXBtb2QsCiAJCQkJ CQkJCQkgYm9vbCAqaXNudWxsKTsKK3N0YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGluZSBi b29sIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsCisJCQkJCQkJCQkJCQkJ CWJvb2wgaXNfY3N2LAorCQkJCQkJCQkJCQkJCQlib29sIHNpbWRfY29udGludWUpOwogc3RhdGlj IHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5lIGJvb2wgQ29weUZyb21UZXh0TGlrZU9uZVJvdyhD b3B5RnJvbVN0YXRlIGNzdGF0ZSwKIAkJCQkJCQkJCQkJCQkJCSAgRXhwckNvbnRleHQgKmVjb250 ZXh0LAogCQkJCQkJCQkJCQkJCQkJICBEYXR1bSAqdmFsdWVzLApAQCAtMTE3MSw4ICsxMTc3LDIz IEBAIENvcHlSZWFkTGluZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJcmVz ZXRTdHJpbmdJbmZvKCZjc3RhdGUtPmxpbmVfYnVmKTsKIAljc3RhdGUtPmxpbmVfYnVmX3ZhbGlk ID0gZmFsc2U7CiAKLQkvKiBQYXJzZSBkYXRhIGFuZCB0cmFuc2ZlciBpbnRvIGxpbmVfYnVmICov Ci0JcmVzdWx0ID0gQ29weVJlYWRMaW5lVGV4dChjc3RhdGUsIGlzX2Nzdik7CisJLyogSWYgdGhh dCBpcyB0aGUgZmlyc3QgdGltZSB3ZSBkbyByZWFkLCBpbml0YWxpemUgdGhlIFNJTUQgKi8KKwlp ZiAodW5saWtlbHkoIWNzdGF0ZS0+c2ltZF9pbml0aWFsaXplZCkpCisJeworCQljc3RhdGUtPnNp bWRfaW5pdGlhbGl6ZWQgPSB0cnVlOworCQljc3RhdGUtPnNpbWRfY29udGludWUgPSB0cnVlOwor CQljc3RhdGUtPnNpbWRfY3VycmVudF9zbGVlcF9jeWNsZSA9IDA7CisJCWNzdGF0ZS0+c2ltZF9s YXN0X3NsZWVwX2N5Y2xlID0gMDsKKwl9CisKKwkvKgorCSAqIFBhcnNlIGRhdGEgYW5kIHRyYW5z ZmVyIGludG8gbGluZV9idWYuIFRvIGdldCBiZW5lZml0IGZyb20gaW5saW5pbmcsCisJICogY2Fs bCBDb3B5UmVhZExpbmVUZXh0KCkgd2l0aCB0aGUgY29uc3RhbnQgYm9vbGVhbiB2YXJpYWJsZXMu CisJICovCisJaWYgKGNzdGF0ZS0+c2ltZF9jb250aW51ZSkKKwkJcmVzdWx0ID0gQ29weVJlYWRM aW5lVGV4dChjc3RhdGUsIGlzX2NzdiwgdHJ1ZSk7CisJZWxzZQorCQlyZXN1bHQgPSBDb3B5UmVh ZExpbmVUZXh0KGNzdGF0ZSwgaXNfY3N2LCBmYWxzZSk7CiAKIAlpZiAocmVzdWx0KQogCXsKQEAg LTEyMzksOCArMTI2MCw4IEBAIENvcHlSZWFkTGluZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9v bCBpc19jc3YpCiAvKgogICogQ29weVJlYWRMaW5lVGV4dCAtIGlubmVyIGxvb3Agb2YgQ29weVJl YWRMaW5lIGZvciB0ZXh0IG1vZGUKICAqLwotc3RhdGljIGJvb2wKLUNvcHlSZWFkTGluZVRleHQo Q29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQorc3RhdGljIHBnX2F0dHJpYnV0ZV9h bHdheXNfaW5saW5lIGJvb2wKK0NvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUs IGJvb2wgaXNfY3N2LCBib29sIHNpbWRfY29udGludWUpCiB7CiAJY2hhcgkgICAqY29weV9pbnB1 dF9idWY7CiAJaW50CQkJaW5wdXRfYnVmX3B0cjsKQEAgLTEyNTUsNiArMTI3NiwxOSBAQCBDb3B5 UmVhZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2NzdikKIAljaGFyCQlx dW90ZWMgPSAnXDAnOwogCWNoYXIJCWVzY2FwZWMgPSAnXDAnOwogCisjaWZuZGVmIFVTRV9OT19T SU1ECisjZGVmaW5lIFNJTURfU0xFRVBfTUFYIDEwMjQKKyNkZWZpbmUgU0lNRF9BRFZBTkNFX0FU X0xFQVNUIDUKKwlWZWN0b3I4CQlubCA9IHZlY3RvcjhfYnJvYWRjYXN0KCdcbicpOworCVZlY3Rv cjgJCWNyID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xyJyk7CisJVmVjdG9yOAkJYnMgPSB2ZWN0b3I4 X2Jyb2FkY2FzdCgnXFwnKTsKKwlWZWN0b3I4CQlxdW90ZSA9IHZlY3RvcjhfYnJvYWRjYXN0KDAp OworCVZlY3RvcjgJCWVzY2FwZSA9IHZlY3RvcjhfYnJvYWRjYXN0KDApOworCisJdWludDY0CQlz aW1kX3RvdGFsX2N5Y2xlID0gMDsKKwl1aW50NjQJCXNpbWRfdG90YWxfYWR2YW5jZSA9IDA7Cisj ZW5kaWYKKwogCWlmIChpc19jc3YpCiAJewogCQlxdW90ZWMgPSBjc3RhdGUtPm9wdHMucXVvdGVb MF07CkBAIC0xMjYyLDYgKzEyOTYsMTIgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRl IGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJCS8qIGlnbm9yZSBzcGVjaWFsIGVzY2FwZSBwcm9jZXNz aW5nIGlmIGl0J3MgdGhlIHNhbWUgYXMgcXVvdGVjICovCiAJCWlmIChxdW90ZWMgPT0gZXNjYXBl YykKIAkJCWVzY2FwZWMgPSAnXDAnOworCisjaWZuZGVmIFVTRV9OT19TSU1ECisJCXF1b3RlID0g dmVjdG9yOF9icm9hZGNhc3QocXVvdGVjKTsKKwkJaWYgKHF1b3RlYyAhPSBlc2NhcGVjKQorCQkJ ZXNjYXBlID0gdmVjdG9yOF9icm9hZGNhc3QoZXNjYXBlYyk7CisjZW5kaWYKIAl9CiAKIAkvKgpA QCAtMTMyOCw2ICsxMzY4LDc0IEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3Rh dGUsIGJvb2wgaXNfY3N2KQogCQkJbmVlZF9kYXRhID0gZmFsc2U7CiAJCX0KIAorI2lmbmRlZiBV U0VfTk9fU0lNRAorCisJCS8qCisJCSAqIFVzZSBTSU1EIGluc3RydWN0aW9ucyB0byBlZmZpY2ll bnRseSBzY2FuIHRoZSBpbnB1dCBidWZmZXIgZm9yCisJCSAqIHNwZWNpYWwgY2hhcmFjdGVycyAo ZS5nLiwgbmV3bGluZSwgY2FycmlhZ2UgcmV0dXJuLCBxdW90ZSwgYW5kCisJCSAqIGVzY2FwZSku IFRoaXMgaXMgZmFzdGVyIHRoYW4gYnl0ZS1ieS1ieXRlIGl0ZXJhdGlvbiwgZXNwZWNpYWxseSBv bgorCQkgKiBsYXJnZSBidWZmZXJzLgorCQkgKgorCQkgKiBXZSBkbyBub3QgYXBwbHkgdGhlIFNJ TUQgZmFzdCBwYXRoIGluIGVpdGhlciBvZiB0aGUgZm9sbG93aW5nCisJCSAqIGNhc2VzOiAtIFdo ZW4gdGhlIHByZXZpb3VzbHkgcHJvY2Vzc2VkIGNoYXJhY3RlciB3YXMgYW4gZXNjYXBlCisJCSAq IGNoYXJhY3RlciAobGFzdF93YXNfZXNjKSwgc2luY2UgdGhlIG5leHQgYnl0ZSBtdXN0IGJlIGV4 YW1pbmVkCisJCSAqIHNlcXVlbnRpYWxseS4gLSBUaGUgcmVtYWluaW5nIGJ1ZmZlciBpcyBzbWFs bGVyIHRoYW4gb25lIHZlY3RvcgorCQkgKiB3aWR0aCAoc2l6ZW9mKFZlY3RvcjgpKTsgU0lNRCBv cGVyYXRlcyBvbiBmaXhlZC1zaXplIGNodW5rcy4KKwkJICovCisJCWlmIChzaW1kX2NvbnRpbnVl ICYmICFsYXN0X3dhc19lc2MgJiYgY29weV9idWZfbGVuIC0gaW5wdXRfYnVmX3B0ciA+PSBzaXpl b2YoVmVjdG9yOCkpCisJCXsKKwkJCVZlY3RvcjgJCWNodW5rOworCQkJVmVjdG9yOAkJbWF0Y2gg PSB2ZWN0b3I4X2Jyb2FkY2FzdCgwKTsKKwkJCXVpbnQzMgkJbWFzazsKKworCQkJc2ltZF90b3Rh bF9jeWNsZSsrOworCisJCQkvKiBMb2FkIGEgY2h1bmsgb2YgZGF0YSBpbnRvIGEgdmVjdG9yIHJl Z2lzdGVyICovCisJCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgJmNvcHlf aW5wdXRfYnVmW2lucHV0X2J1Zl9wdHJdKTsKKworCQkJLyogXG4gYW5kIFxyIGFyZSBub3Qgc3Bl Y2lhbCBpbnNpZGUgcXVvdGVzICovCisJCQlpZiAoIWluX3F1b3RlKQorCQkJCW1hdGNoID0gdmVj dG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBubCksIHZlY3RvcjhfZXEoY2h1bmssIGNyKSk7CisK KwkJCWlmIChpc19jc3YpCisJCQl7CisJCQkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1hdGNoLCB2ZWN0 b3I4X2VxKGNodW5rLCBxdW90ZSkpOworCQkJCWlmIChlc2NhcGVjICE9ICdcMCcpCisJCQkJCW1h dGNoID0gdmVjdG9yOF9vcihtYXRjaCwgdmVjdG9yOF9lcShjaHVuaywgZXNjYXBlKSk7CisJCQl9 CisJCQllbHNlCisJCQkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1hdGNoLCB2ZWN0b3I4X2VxKGNodW5r LCBicykpOworCisJCQkvKiBDaGVjayBpZiB3ZSBmb3VuZCBhbnkgc3BlY2lhbCBjaGFyYWN0ZXJz ICovCisJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2sobWF0Y2gpOworCQkJaWYgKG1hc2sg IT0gMCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgc3BlY2lhbCBjaGFyYWN0ZXIuIEFk dmFuY2UgdXAgdG8gdGhhdCBwb2ludCBhbmQgbGV0CisJCQkJICogdGhlIHNjYWxhciBjb2RlIGhh bmRsZSBpdC4KKwkJCQkgKi8KKwkJCQlpbnQJCQlhZHZhbmNlID0gcGdfcmlnaHRtb3N0X29uZV9w b3MzMihtYXNrKTsKKworCQkJCWlucHV0X2J1Zl9wdHIgKz0gYWR2YW5jZTsKKwkJCQlzaW1kX3Rv dGFsX2FkdmFuY2UgKz0gYWR2YW5jZTsKKwkJCX0KKwkJCWVsc2UKKwkJCXsKKwkJCQkvKiBObyBz cGVjaWFsIGNoYXJhY3RlcnMgZm91bmQsIHNvIHNraXAgdGhlIGVudGlyZSBjaHVuayAqLworCQkJ CWlucHV0X2J1Zl9wdHIgKz0gc2l6ZW9mKFZlY3RvcjgpOworCQkJCXNpbWRfdG90YWxfYWR2YW5j ZSArPSBzaXplb2YoVmVjdG9yOCk7CisKKwkJCQkvLyAvKiBQZXJpb2RpY2FsbHkgZmx1c2ggdG8g bGluZV9idWYgdG8gYXZvaWQgTDFEIGNhY2hlIG1pc3NlcyAqLworCQkJCWlmIChpbnB1dF9idWZf cHRyIC0gY3N0YXRlLT5pbnB1dF9idWZfaW5kZXggPj0gTElORV9CVUZfRkxVU0hfQUZURVIpCisJ CQkJeworCQkJCQlSRUZJTExfTElORUJVRjsKKwkJCQl9CisKKwkJCQljb250aW51ZTsKKwkJCX0K KwkJfQorI2VuZGlmCisKIAkJLyogT0sgdG8gZmV0Y2ggYSBjaGFyYWN0ZXIgKi8KIAkJcHJldl9y YXdfcHRyID0gaW5wdXRfYnVmX3B0cjsKIAkJYyA9IGNvcHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9w dHIrK107CkBAIC0xNTMwLDYgKzE2MzgsNTAgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0 YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJCX0KIAl9CQkJCQkJCS8qIGVuZCBvZiBvdXRlciBs b29wICovCiAKKyNpZm5kZWYgVVNFX05PX1NJTUQKKworCS8qIFNJTUQgd2FzIGVuYWJsZWQgKi8K KwlpZiAoc2ltZF9jb250aW51ZSkKKwl7CisJCS8qIFNJTUQgaXMgd29ydGggKi8KKwkJaWYgKHNp bWRfdG90YWxfY3ljbGUgJiYgc2ltZF90b3RhbF9hZHZhbmNlIC8gc2ltZF90b3RhbF9jeWNsZSA+ PSBTSU1EX0FEVkFOQ0VfQVRfTEVBU1QpCisJCXsKKwkJCUFzc2VydChjc3RhdGUtPnNpbWRfY3Vy cmVudF9zbGVlcF9jeWNsZSA9PSAwKTsKKwkJCWNzdGF0ZS0+c2ltZF9sYXN0X3NsZWVwX2N5Y2xl ID4+PSAxOworCQl9CisJCS8qIFNJTUQgd2FzIGVuYWJsZWQgYnV0IGl0IGlzbid0IHdvcnRoICov CisJCWVsc2UKKwkJeworCQkJdWludDE2CQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPSBjc3RhdGUt PnNpbWRfbGFzdF9zbGVlcF9jeWNsZTsKKworCQkJY3N0YXRlLT5zaW1kX2NvbnRpbnVlID0gZmFs c2U7CisKKwkJCWlmIChzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPT0gMCkKKwkJCQlzaW1kX2xhc3Rf c2xlZXBfY3ljbGUgPSAxOworCQkJZWxzZSBpZiAoc2ltZF9sYXN0X3NsZWVwX2N5Y2xlID49IFNJ TURfU0xFRVBfTUFYIC8gMikKKwkJCQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPSBTSU1EX1NMRUVQ X01BWDsKKwkJCWVsc2UKKwkJCQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPDw9IDE7CisJCQljc3Rh dGUtPnNpbWRfY3VycmVudF9zbGVlcF9jeWNsZSA9IHNpbWRfbGFzdF9zbGVlcF9jeWNsZTsKKwkJ CWNzdGF0ZS0+c2ltZF9sYXN0X3NsZWVwX2N5Y2xlID0gc2ltZF9sYXN0X3NsZWVwX2N5Y2xlOwor CQl9CisJfQorCS8qIFNJTUQgd2FzIGRpc2FibGVkICovCisJZWxzZQorCXsKKwkJLyoKKwkJICog V2Ugc2hvdWxkIGNvbWUgaGVyZSB3aXRoIGRlY3JlbWVudGluZworCQkgKiBjc3RhdGUtPnNpbWRf Y3VycmVudF9zbGVlcF9jeWNsZSBmcm9tIGEgcG9zaXRpdmUgbnVtYmVyLgorCQkgKi8KKwkJQXNz ZXJ0KGNzdGF0ZS0+c2ltZF9jdXJyZW50X3NsZWVwX2N5Y2xlICE9IDApOworCQljc3RhdGUtPnNp bWRfY3VycmVudF9zbGVlcF9jeWNsZS0tOworCisJCWlmIChjc3RhdGUtPnNpbWRfY3VycmVudF9z bGVlcF9jeWNsZSA9PSAwKQorCQkJY3N0YXRlLT5zaW1kX2NvbnRpbnVlID0gdHJ1ZTsKKwl9CisK KyNlbmRpZgorCiAJLyoKIAkgKiBUcmFuc2ZlciBhbnkgc3RpbGwtdW5jb3BpZWQgZGF0YSB0byBs aW5lX2J1Zi4KIAkgKi8KZGlmZiAtLWdpdCBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9t X2ludGVybmFsLmggYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9pbnRlcm5hbC5oCmlu ZGV4IDgyMmVmMzNjZjY5Li4wZDcyZTAzYzk5OSAxMDA2NDQKLS0tIGEvc3JjL2luY2x1ZGUvY29t bWFuZHMvY29weWZyb21faW50ZXJuYWwuaAorKysgYi9zcmMvaW5jbHVkZS9jb21tYW5kcy9jb3B5 ZnJvbV9pbnRlcm5hbC5oCkBAIC04OSw2ICs4OSwxMyBAQCB0eXBlZGVmIHN0cnVjdCBDb3B5RnJv bVN0YXRlRGF0YQogCWNvbnN0IGNoYXIgKmN1cl9hdHR2YWw7CQkvKiBjdXJyZW50IGF0dCB2YWx1 ZSBmb3IgZXJyb3IgbWVzc2FnZXMgKi8KIAlib29sCQlyZWxuYW1lX29ubHk7CS8qIGRvbid0IG91 dHB1dCBsaW5lIG51bWJlciwgYXR0LCBldGMuICovCiAKKwkvKiBTSU1EIHZhcmlhYmxlcyAqLwor CWJvb2wJCXNpbWRfY29udGludWU7CisJYm9vbAkJc2ltZF9pbml0aWFsaXplZDsKKwl1aW50MTYJ CXNpbWRfbGFzdF9zbGVlcF9jeWNsZTsKKwl1aW50MTYJCXNpbWRfY3VycmVudF9zbGVlcF9jeWNs ZTsKKworCiAJLyoKIAkgKiBXb3JraW5nIHN0YXRlCiAJICovCi0tIAoyLjM0LjEKCg== --0000000000005992d00649b17a25--