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 1vrHBV-00C0Ij-1E for pgsql-hackers@arkaria.postgresql.org; Sat, 14 Feb 2026 15:03:49 +0000 Received: from localhost ([127.0.0.1] helo=malur.postgresql.org) by malur.postgresql.org with esmtp (Exim 4.96) (envelope-from ) id 1vrHAS-00HYBl-2U for pgsql-hackers@arkaria.postgresql.org; Sat, 14 Feb 2026 15:02:44 +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 1vrHAS-00HYBa-0a for pgsql-hackers@lists.postgresql.org; Sat, 14 Feb 2026 15:02:44 +0000 Received: from mail-ed1-x52f.google.com ([2a00:1450:4864:20::52f]) by makus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.98.2) (envelope-from ) id 1vrHAJ-00000000bsW-3dlD for pgsql-hackers@postgresql.org; Sat, 14 Feb 2026 15:02:37 +0000 Received: by mail-ed1-x52f.google.com with SMTP id 4fb4d7f45d1cf-65a196a735eso3396969a12.2 for ; Sat, 14 Feb 2026 07:02:36 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1771081353; cv=none; d=google.com; s=arc-20240605; b=WWeM6opmzXSFVSFWxbADyUe/0HI02jzDn5cVUEttCo5Z0ThLvACKfaMY225cbrbYFT l+v2yPSz382DxfJLiYiQWA/2f5KLP9WC0K7W4lgq9dKzd0p815z1LF7E/QVvTx56ApJG qxkrKQLJdYkj8KO9pWOjCQGQRvt8gSk9tvkmJ1e3c6VoJNnsSjGoOS987r1DdRmkm5SW L7pdk1LDkr5Dz5dpxZIJd6Ytyf8mtKF3ZCNNskbWw2F5nwpDgoZ9nyiaA4dIdycjci6H KMdL4dEtS9rYyx4vWFy44VcwI0RqsdcnDIuoopAgDPsPLjvCPVkxNtcm07XDznxjDesF qalA== 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=EOc7rinp/huojbCbYHTrk5PPMcxUoU9CKaISv+lKH/c=; fh=97zuiWec+swUAgDmTGTtVNF8dXOQGLVe9E5Bw0okdXY=; b=fcUK64x06pV3PrBePGsH2F9rCi02WsPLNCs3fzaxepZdybHbYv8dvJlUIRGH+0yXMG N5W5FJZ9Hp4O4AOLT77aHkpIy44lX1sZvlUl3uiqBKIBGowLtsj/5XMc9u6QmWNBgfrk NSQMQlwUb8PYAM1sx2OJ/C+plwK2ClcZc6MMSzfNOJS45qauvR3PiirbrzN1XJS8hsOC szK5igUH/Y5+XcNXKllYw406BRojWWZ0Npgso/uVxZrK0UR6OIhLQ6SSQeF63U+KpPd0 wmDlJEvaLxlkKE5ljL78ZbeRVe1pzTjy0mW+AGUECvfuMb6NH/dwBjD2QklzNqaXSSZ7 PRfw==; 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=1771081353; x=1771686153; 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=EOc7rinp/huojbCbYHTrk5PPMcxUoU9CKaISv+lKH/c=; b=CdQLqlU+xbiLTNAh4AXTIa6hJCFB7eHYVOr0Qz7QwXZIJO55//l3lxf2odPivVZZgB EtVnuR6dwCthRcwl8Uvsp4HiaTBGCs6nzahmiBh0IMzfk8b3Tlm76HxM1pOfBC/TZtrZ HnRdysrOuiKN0u8CY8K+x+iWo/zgW0IUTmE/0TIyfJgImU4cXCVA2jORiwXZFblGCIC7 Sz7tkH82YlSjQV2lqbzPpWLqLfCWLy5uZ/VH1M8f3UNhJ0L0DDom6gqiw/eJAcSvlZc1 t8xdHypb0IsTK3vlADakr2da4m8h5960ulry+d/x6TenaP0qcdPgmdbMTsf6CFCoD3xk O0TA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1771081353; x=1771686153; 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=EOc7rinp/huojbCbYHTrk5PPMcxUoU9CKaISv+lKH/c=; b=f/iwFI39Lz+tqGdhAc6SBnWBBzH6HbV184Zj6/1EDhYW86PYG2qd+90BT/JcHBCWgD f0V00n536rRiQ/19NK91xVK8+wd41yhWvz/gT5M5j2w5ytHHT5YibiaK9gfXgPN3CQvY h9g3CppmxBaFmITIN3HqQcA1wLG/NAoqGNlfJiWeeRkWqN96WZ9EmQMdp1GCkMZP8FJ8 bPulg5qcsVb2zQpCac0b8Z7XMMO1Gtaz/cHHw8JOVu+70zXU9uHH58M5laUxDB0IUJTA +Z7FaWOhNDN5+4POHTjyWiheyaRYc8tfbqyhdsBM4wuq8LPfsk2EEYd6roaSoiugO0VN gS5Q== X-Gm-Message-State: AOJu0YxmuwpdYwFua6oyUTJguScEL3Zb+UCPlSWRdLDsZOmJnGGOetox tsb0siCftotgVHfrkAoKUWvhygZumqXoJ8s3LMb0hv372N1DfEtJYDqlS0tDLS5Do4wNJcrfPrd Mp8z8YNMkuls4tw/q6q9DQFfN8puZM0nw47CQlOGa X-Gm-Gg: AZuq6aK9A+b+FCfJL/bAIUQ3BkK+wXa+MEy6MWoK+V4bsrm5d6wpvEpxFl3it6Gqtht uAzJReCNDAZ8S5/0Q+kX5sXHdmPKYOq/pDo0zU3seV0r07EV33ubJqzxiIgfU6cpgq6Zek5uWJz HjWZdf70DS5FJcuR46qxy3TeHunQmH81s/Kiyiw8sDR5/5BSI7AmbRsDQP/seB+qx5sFsaN0ptz RTjvLb3gWaw7LB1bqsBoUdw/bkpPVUwqkf3rzFih8y9PAPN7a3PKDWDwKF3NpVKQ90iCvEbUiOk ikAhNgZmIQVI1JISfrXbiRfB1dP5dYX2wcd7sOW/mAwQ8bLAimcjeTzCX6deqCzCIYNEmIhj0eS zxiA9oOeeVUGRYbtlD4/TuZzcFg== X-Received: by 2002:a05:6402:34c4:b0:65a:16fb:9615 with SMTP id 4fb4d7f45d1cf-65bc7a7bc99mr1134386a12.31.1771081353314; Sat, 14 Feb 2026 07:02:33 -0800 (PST) MIME-Version: 1.0 References: In-Reply-To: From: KAZAR Ayoub Date: Sat, 14 Feb 2026 16:02:21 +0100 X-Gm-Features: AaiRm50YagyR_utHNP2LkA1cFHXB9TnQFhOPJQNBG7TiWBl5AUgFvWzcScQRIME Message-ID: Subject: Re: Speed up COPY TO text/CSV parsing using SIMD To: Andres Freund Cc: Pg Hackers , Nathan Bossart , Neil Conway , Manni Wood , Andrew Dunstan , Shinya Kato , Mark Wong , Nazir Bilal Yavuz Content-Type: multipart/mixed; boundary="000000000000ef11a4064aca0276" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --000000000000ef11a4064aca0276 Content-Type: multipart/alternative; boundary="000000000000ef11a2064aca0274" --000000000000ef11a2064aca0274 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, On Thu, Feb 12, 2026 at 10:25=E2=80=AFPM Andres Freund = wrote: > Hi, > > On 2026-02-12 22:07:52 +0100, KAZAR Ayoub wrote: > > Currently optimizing COPY FROM using SIMD is still under review, but fo= r > > the case of COPY TO using the same ideas, we found that the problem is > > trivial, the attached patch gives very nice speedups as confirmed by > > Manni's benchmarks. > > I have a hard time believing that adding a strlen() to the handling of a > short > column won't be a measurable overhead with lots of short attributes. > Particularly because the patch afaict will call it repeatedly if there ar= e > any > to-be-escaped characters. > Thanks for pointing that out, so here's what i did: 1) In the previous patch, strlen was called twice if a CSV attribute needed to add a quote, the attached patch gets the length in the beginning and uses it for both SIMD paths, so basically one call. 2) If an attribute needs encoding we need to recalculate string length because it can grow. (so 2 calls at maximum in all cases) 3) Supposing the very worse cases, i benchmarked this against master for tables that have 100, 500, 1000 columns : all integers only, so one would want to process the whole thing in just a pass rather than calculating length of such short attributes: 1000 columns: TEXT: 17% regression CSV: 3.4% regression 500 columns: TEXT: 17.7% regression CSV: 3.1% regression 100 columns: TEXT: 17.3% regression CSV: 3% regression A bit unstable results, but yeah the overhead for worse cases like this is really significant, I can't argue whether this is worth it or not, so thoughts on this ? I also don't think it's good how much code this repeats. I think you'd have > to > start with preparatory moving the exiting code into static inline helper > functions and then introduce SIMD into those. > Done, yet i'm not too sure whether this is the right place to put it, let me know. Regards, Ayoub --000000000000ef11a2064aca0274 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: quoted-printable
Hi,

On Thu, Feb 12, 2026 at 10:2= 5=E2=80=AFPM Andres Freund <andres= @anarazel.de> wrote:
Hi,

On 2026-02-12 22:07:52 +0100, KAZAR Ayoub wrote:
> Currently optimizing COPY FROM using SIMD is still under review, but f= or
> the case of COPY TO using the same ideas, we found that the problem is=
> trivial, the attached patch gives very nice speedups as confirmed by > Manni's benchmarks.

I have a hard time believing that adding a strlen() to the handling of a sh= ort
column won't be a measurable overhead with lots of short attributes. Particularly because the patch afaict will call it repeatedly if there are = any
to-be-escaped characters.
Thanks for pointing that out= , so here's what i did:
1) In the previous patch, strlen = was called twice if a CSV attribute needed to add a quote, the attached pat= ch gets the length in the beginning and uses it for both SIMD paths, so bas= ically one call.
2) If an attribute needs encoding we need to rec= alculate string length because it can grow. (so 2 calls at maximum in all c= ases)
3) Supposing the very worse cases, i benchmarked this again= st master for tables that have 100, 500, 1000 columns : all integers only, = so one would want to process the whole thing in just a pass rather than cal= culating length of such short attributes:
1000 columns:
TEXT: 17% regression
CSV: 3.4% regression

<= div>500 columns:
TEXT: 17.7% regression
CSV: 3.= 1% regression

100 columns:=C2=A0
TEXT: 17.3% regressio= n
CSV: 3% regression

A bit unstable = results, but yeah the overhead for worse cases like this is really signific= ant, I can't argue whether this is worth it or not, so thoughts on this= ?

I also don't think it's good how much code this repeats. I think yo= u'd have to
start with preparatory moving the exiting code into static inline helper functions and then introduce SIMD into those.
Done, ye= t i'm not too sure whether this is the right place to put it, let me kn= ow.


Regards,
Ayoub
<= /div>
--000000000000ef11a2064aca0274-- --000000000000ef11a4064aca0276 Content-Type: text/x-patch; charset="US-ASCII"; name="v2-0001-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Disposition: attachment; filename="v2-0001-Speed-up-COPY-TO-text-CSV-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mlmefnxz0 RnJvbSAyMDYwZjc5YmQzZWUyOTgwOTc4OGE0NjY3MDBhOWRjNDk0NTljYThlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBBeW91YktBWiA8a2F6YXJheW91YjIwMDRAZ21haWwuY29tPgpE YXRlOiBTYXQsIDE0IEZlYiAyMDI2IDE1OjEyOjQyICswMTAwClN1YmplY3Q6IFtQQVRDSF0gU3Bl ZWQgdXAgQ09QWSBUTyB0ZXh0L0NTViB1c2luZyBTSU1ECgpVc2UgU0lNRCB0byBzY2FuIGZvciBz cGVjaWFsIGNoYXJhY3RlcnMgaW4gQ09QWSBUTywgcHJvY2Vzc2luZyAxNisgYnl0ZXMKYXQgYSB0 aW1lIGluc3RlYWQgb2YgYnl0ZS1ieS1ieXRlLiBUaGlzIHNwZWVkcyB1cCBleHBvcnQgb2YgZmll bGRzIHRoYXQKY29udGFpbiBmZXcgY2hhcmFjdGVycyByZXF1aXJpbmcgZXNjYXBpbmcsIHNvIHRo ZSBjb2RlIGZhbGxzIGJhY2sgdG8gc2NhbGFyIHBhdGggd2hlbiB3ZSBmaW5kIGEgc3BlY2lhbCBj aGFyLgotLS0KIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jIHwgMTU5ICsrKysrKysrKysr KysrKysrKysrKysrKysrKysrKysrKy0KIDEgZmlsZSBjaGFuZ2VkLCAxNTcgaW5zZXJ0aW9ucygr KSwgMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 dG8uYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHl0by5jCmluZGV4IDljZWVmZjZkOTllLi40 OTE5ODEzNzUzMSAxMDA2NDQKLS0tIGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKKysr IGIvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weXRvLmMKQEAgLTMxLDYgKzMxLDggQEAKICNpbmNs dWRlICJtYi9wZ193Y2hhci5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUgInBn c3RhdC5oIgorI2luY2x1ZGUgInBvcnQvcGdfYml0dXRpbHMuaCIKKyNpbmNsdWRlICJwb3J0L3Np bWQuaCIKICNpbmNsdWRlICJzdG9yYWdlL2ZkLmgiCiAjaW5jbHVkZSAidGNvcC90Y29wcHJvdC5o IgogI2luY2x1ZGUgInV0aWxzL2xzeXNjYWNoZS5oIgpAQCAtMTIxLDYgKzEyMywxNDIgQEAgc3Rh dGljIHZvaWQgQ29weUF0dHJpYnV0ZU91dENTVihDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNo YXIgKnN0cmluZywKIAkJCQkJCQkJYm9vbCB1c2VfcXVvdGUpOwogc3RhdGljIHZvaWQgQ29weVJl bGF0aW9uVG8oQ29weVRvU3RhdGUgY3N0YXRlLCBSZWxhdGlvbiByZWwsIFJlbGF0aW9uIHJvb3Rf cmVsLAogCQkJCQkJICAgdWludDY0ICpwcm9jZXNzZWQpOworc3RhdGljIHBnX2F0dHJpYnV0ZV9h bHdheXNfaW5saW5lIHZvaWQgQ29weVNraXBUZXh0U0lNRChjb25zdCBjaGFyICoqcHRyLCAKKwkJ CQkJCQkgc2l6ZV90IGxlbiwgY2hhciBkZWxpbWMpOworCitzdGF0aWMgcGdfYXR0cmlidXRlX2Fs d2F5c19pbmxpbmUgdm9pZCBDb3B5Q2hlY2tDU1ZRdW90ZU5lZWRTSU1EKGNvbnN0IGNoYXIgKipw dHIsCisJCQkJCQkJIHNpemVfdCBsZW4sIGNoYXIgZGVsaW1jLCBjaGFyIHF1b3RlYyk7CisKK3N0 YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGluZSB2b2lkIENvcHlTa2lwQ1NWRXNjYXBlU0lN RChjb25zdCBjaGFyICoqcHRyLAorCQkJCQkJCSBzaXplX3QgbGVuLCBjaGFyIGVzY2FwZWMsIGNo YXIgcXVvdGVjKTsKKworLyoKKyAqIENvcHlTa2lwVGV4dFNJTUQgLSBTa2lwIGZvcndhcmQgcGFz dCBzYWZlIGNoYXJhY3RlcnMgaW4gVEVYVCBtb2RlIHVzaW5nIFNJTUQKKyAqCisgKiBBZHZhbmNl cyBwdHIgYXMgZmFyIGFzIHBvc3NpYmxlLCBzdG9wcGluZyBhdCBmaXJzdCBzcGVjaWFsIGNoYXJh Y3Rlci4KKyAqLworc3RhdGljIHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5lIHZvaWQKK0NvcHlT a2lwVGV4dFNJTUQoY29uc3QgY2hhciAqKnB0ciwgc2l6ZV90IGxlbiwgY2hhciBkZWxpbWMpCit7 CisjaWZuZGVmIFVTRV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpwdHI7CisKKwljb25zdCBj aGFyICplbmQgPSBwICsgbGVuOworCisJd2hpbGUgKHAgKyBzaXplb2YoVmVjdG9yOCkgPD0gZW5k KQorCXsKKwkJVmVjdG9yOCBjaHVuazsKKwkJVmVjdG9yOCBjb250cm9sX21hc2s7CisJCVZlY3Rv cjggYmFja3NsYXNoX21hc2s7CisJCVZlY3RvcjggZGVsaW1fbWFzazsKKwkJVmVjdG9yOCBzcGVj aWFsX21hc2s7CisJCXVpbnQzMiBtYXNrOworCisJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25z dCB1aW50OCAqKSBwKTsKKwkJY29udHJvbF9tYXNrID0gdmVjdG9yOF9ndCh2ZWN0b3I4X2Jyb2Fk Y2FzdCgweDIwKSwgY2h1bmspOworCQliYWNrc2xhc2hfbWFzayA9IHZlY3RvcjhfZXEodmVjdG9y OF9icm9hZGNhc3QoJ1xcJyksIGNodW5rKTsKKwkJZGVsaW1fbWFzayA9IHZlY3RvcjhfZXEodmVj dG9yOF9icm9hZGNhc3QoZGVsaW1jKSwgY2h1bmspOworCisJCXNwZWNpYWxfbWFzayA9IHZlY3Rv cjhfb3IoY29udHJvbF9tYXNrLAorCQkJCQkJCQkgIHZlY3Rvcjhfb3IoYmFja3NsYXNoX21hc2ss IGRlbGltX21hc2spKTsKKworCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2soc3BlY2lhbF9t YXNrKTsKKwkJaWYgKG1hc2sgIT0gMCkKKwkJeworCQkJKnB0ciA9IHAgKyBwZ19yaWdodG1vc3Rf b25lX3BvczMyKG1hc2spOworCQkJcmV0dXJuOworCQl9CisKKwkJcCArPSBzaXplb2YoVmVjdG9y OCk7CisJfQorCisJKnB0ciA9IHA7CisjZW5kaWYKK30KKworLyoKKyAqIENvcHlDaGVja0NTVlF1 b3RlTmVlZFNJTUQgLSBDaGVjayBpZiBDU1YgZmllbGQgbmVlZHMgcXVvdGluZyB1c2luZyBTSU1E CisgKgorICogQWR2YW5jZXMgcHRyIGFzIGZhciBhcyBwb3NzaWJsZSwgc3RvcHBpbmcgYXQgZmly c3Qgc3BlY2lhbCBjaGFyYWN0ZXIuCisgKi8KK3N0YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lu bGluZSB2b2lkCitDb3B5Q2hlY2tDU1ZRdW90ZU5lZWRTSU1EKGNvbnN0IGNoYXIgKipwdHIsIHNp emVfdCBsZW4sIGNoYXIgZGVsaW1jLCBjaGFyIHF1b3RlYykKK3sKKyNpZm5kZWYgVVNFX05PX1NJ TUQKKwljb25zdCBjaGFyICpwID0gKnB0cjsKKwljb25zdCBjaGFyICplbmQgPSBwICsgbGVuOwor CisJVmVjdG9yOCBkZWxpbV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QoZGVsaW1jKTsKKwlWZWN0 b3I4IHF1b3RlX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChxdW90ZWMpOworCVZlY3RvcjggbmV3 bGluZV9tYXNrID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xuJyk7CisJVmVjdG9yOCBjYXJyaWFnZV9y ZXR1cm5fbWFzayA9IHZlY3RvcjhfYnJvYWRjYXN0KCdccicpOworCisJd2hpbGUgKHAgKyBzaXpl b2YoVmVjdG9yOCkgPD0gZW5kKQorCXsKKwkJVmVjdG9yOCBjaHVuazsKKwkJVmVjdG9yOCBzcGVj aWFsX21hc2s7CisJCXVpbnQzMiBtYXNrOworCisJCXZlY3RvcjhfbG9hZCgmY2h1bmssIChjb25z dCB1aW50OCAqKSBwKTsKKwkJc3BlY2lhbF9tYXNrID0gdmVjdG9yOF9vcigKKwkJCXZlY3Rvcjhf b3IodmVjdG9yOF9lcShjaHVuaywgZGVsaW1fbWFzayksCisJCQkJCSAgIHZlY3RvcjhfZXEoY2h1 bmssIHF1b3RlX21hc2spKSwKKwkJCXZlY3Rvcjhfb3IodmVjdG9yOF9lcShjaHVuaywgbmV3bGlu ZV9tYXNrKSwKKwkJCQkJICAgdmVjdG9yOF9lcShjaHVuaywgY2FycmlhZ2VfcmV0dXJuX21hc2sp KQorCQkpOworCisJCW1hc2sgPSB2ZWN0b3I4X2hpZ2hiaXRfbWFzayhzcGVjaWFsX21hc2spOwor CQlpZiAobWFzayAhPSAwKQorCQl7CisJCQkqcHRyID0gcCArIHBnX3JpZ2h0bW9zdF9vbmVfcG9z MzIobWFzayk7CisJCQlyZXR1cm47CisJCX0KKworCQlwICs9IHNpemVvZihWZWN0b3I4KTsKKwl9 CisKKwkqcHRyID0gcDsKKyNlbmRpZgorfQorCisvKgorICogQ29weVNraXBDU1ZFc2NhcGVTSU1E IC0gU2tpcCBmb3J3YXJkIHBhc3Qgc2FmZSBjaGFyYWN0ZXJzIGluIENTViBtb2RlIHVzaW5nIFNJ TUQKKyAqCisgKiBBZHZhbmNlcyBwdHIgYXMgZmFyIGFzIHBvc3NpYmxlLCBzdG9wcGluZyBhdCBm aXJzdCBxdW90ZSBvciBlc2NhcGUgY2hhcmFjdGVyLgorICovCitzdGF0aWMgcGdfYXR0cmlidXRl X2Fsd2F5c19pbmxpbmUgdm9pZAorQ29weVNraXBDU1ZFc2NhcGVTSU1EKGNvbnN0IGNoYXIgKipw dHIsIHNpemVfdCBsZW4sIGNoYXIgZXNjYXBlYywgY2hhciBxdW90ZWMpCit7CisjaWZuZGVmIFVT RV9OT19TSU1ECisJY29uc3QgY2hhciAqcCA9ICpwdHI7CisJY29uc3QgY2hhciAqZW5kID0gcCAr IGxlbjsKKworCVZlY3RvcjggZXNjYXBlX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChlc2NhcGVj KTsKKwlWZWN0b3I4IHF1b3RlX21hc2sgPSB2ZWN0b3I4X2Jyb2FkY2FzdChxdW90ZWMpOworCisJ d2hpbGUgKHAgKyBzaXplb2YoVmVjdG9yOCkgPD0gZW5kKQorCXsKKwkJVmVjdG9yOCBjaHVuazsK KwkJVmVjdG9yOCBzcGVjaWFsX21hc2s7CisJCXVpbnQzMiBtYXNrOworCisJCXZlY3RvcjhfbG9h ZCgmY2h1bmssIChjb25zdCB1aW50OCAqKSBwKTsKKwkJc3BlY2lhbF9tYXNrID0gdmVjdG9yOF9v cih2ZWN0b3I4X2VxKGNodW5rLCBlc2NhcGVfbWFzayksCisJCQkJCQkJCSAgdmVjdG9yOF9lcShj aHVuaywgcXVvdGVfbWFzaykpOworCisJCW1hc2sgPSB2ZWN0b3I4X2hpZ2hiaXRfbWFzayhzcGVj aWFsX21hc2spOworCQlpZiAobWFzayAhPSAwKQorCQl7CisJCQkqcHRyID0gcCArIHBnX3JpZ2h0 bW9zdF9vbmVfcG9zMzIobWFzayk7CisJCQlyZXR1cm47CisJCX0KKworCQlwICs9IHNpemVvZihW ZWN0b3I4KTsKKwl9CisKKwkqcHRyID0gcDsKKyNlbmRpZgorfQogCiAvKiBidWlsdC1pbiBmb3Jt YXQtc3BlY2lmaWMgcm91dGluZXMgKi8KIHN0YXRpYyB2b2lkIENvcHlUb1RleHRMaWtlU3RhcnQo Q29weVRvU3RhdGUgY3N0YXRlLCBUdXBsZURlc2MgdHVwRGVzYyk7CkBAIC0xMjQ1LDkgKzEzODMs MTQgQEAgQ29weUF0dHJpYnV0ZU91dFRleHQoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFy ICpzdHJpbmcpCiAJY29uc3QgY2hhciAqc3RhcnQ7CiAJY2hhcgkJYzsKIAljaGFyCQlkZWxpbWMg PSBjc3RhdGUtPm9wdHMuZGVsaW1bMF07CisJc2l6ZV90IGxlbiA9IHN0cmxlbihzdHJpbmcpOwog CiAJaWYgKGNzdGF0ZS0+bmVlZF90cmFuc2NvZGluZykKLQkJcHRyID0gcGdfc2VydmVyX3RvX2Fu eShzdHJpbmcsIHN0cmxlbihzdHJpbmcpLCBjc3RhdGUtPmZpbGVfZW5jb2RpbmcpOworCXsKKwkJ cHRyID0gcGdfc2VydmVyX3RvX2FueShzdHJpbmcsIGxlbiwgY3N0YXRlLT5maWxlX2VuY29kaW5n KTsKKwkJLyogV2UgaGF2ZSB0byByZWNhbGN1bGF0ZSB0aGUgbGVuZ3RoIGFmdGVyIHRyYW5zY29k aW5nLCBiZWNhdXNlIGl0IGNhbiBjaGFuZ2UgdGhlIHN0cmluZyBsZW5ndGggKi8KKwkJbGVuID0g c3RybGVuKHB0cik7CisJfQogCWVsc2UKIAkJcHRyID0gc3RyaW5nOwogCkBAIC0xMjY4LDYgKzE0 MTEsOCBAQCBDb3B5QXR0cmlidXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNo YXIgKnN0cmluZykKIAlpZiAoY3N0YXRlLT5lbmNvZGluZ19lbWJlZHNfYXNjaWkpCiAJewogCQlz dGFydCA9IHB0cjsKKwkJQ29weVNraXBUZXh0U0lNRCgmcHRyLCBsZW4sIGRlbGltYyk7CisKIAkJ d2hpbGUgKChjID0gKnB0cikgIT0gJ1wwJykKIAkJewogCQkJaWYgKCh1bnNpZ25lZCBjaGFyKSBj IDwgKHVuc2lnbmVkIGNoYXIpIDB4MjApCkBAIC0xMzI4LDYgKzE0NzMsOCBAQCBDb3B5QXR0cmli dXRlT3V0VGV4dChDb3B5VG9TdGF0ZSBjc3RhdGUsIGNvbnN0IGNoYXIgKnN0cmluZykKIAllbHNl CiAJewogCQlzdGFydCA9IHB0cjsKKwkJQ29weVNraXBUZXh0U0lNRCgmcHRyLCBsZW4sIGRlbGlt Yyk7CisKIAkJd2hpbGUgKChjID0gKnB0cikgIT0gJ1wwJykKIAkJewogCQkJaWYgKCh1bnNpZ25l ZCBjaGFyKSBjIDwgKHVuc2lnbmVkIGNoYXIpIDB4MjApCkBAIC0xNDAyLDEzICsxNTQ5LDE4IEBA IENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJp bmcsCiAJY2hhcgkJcXVvdGVjID0gY3N0YXRlLT5vcHRzLnF1b3RlWzBdOwogCWNoYXIJCWVzY2Fw ZWMgPSBjc3RhdGUtPm9wdHMuZXNjYXBlWzBdOwogCWJvb2wJCXNpbmdsZV9hdHRyID0gKGxpc3Rf bGVuZ3RoKGNzdGF0ZS0+YXR0bnVtbGlzdCkgPT0gMSk7CisJc2l6ZV90IAlsZW4gPSBzdHJsZW4o c3RyaW5nKTsKIAogCS8qIGZvcmNlIHF1b3RpbmcgaWYgaXQgbWF0Y2hlcyBudWxsX3ByaW50IChi ZWZvcmUgY29udmVyc2lvbiEpICovCiAJaWYgKCF1c2VfcXVvdGUgJiYgc3RyY21wKHN0cmluZywg Y3N0YXRlLT5vcHRzLm51bGxfcHJpbnQpID09IDApCiAJCXVzZV9xdW90ZSA9IHRydWU7CiAKIAlp ZiAoY3N0YXRlLT5uZWVkX3RyYW5zY29kaW5nKQotCQlwdHIgPSBwZ19zZXJ2ZXJfdG9fYW55KHN0 cmluZywgc3RybGVuKHN0cmluZyksIGNzdGF0ZS0+ZmlsZV9lbmNvZGluZyk7CisJeworCQlwdHIg PSBwZ19zZXJ2ZXJfdG9fYW55KHN0cmluZywgbGVuLCBjc3RhdGUtPmZpbGVfZW5jb2RpbmcpOwor CQkvKiBXZSBoYXZlIHRvIHJlY2FsY3VsYXRlIHRoZSBsZW5ndGggYWZ0ZXIgdHJhbnNjb2Rpbmcs IGJlY2F1c2UgaXQgY2FuIGNoYW5nZSB0aGUgc3RyaW5nIGxlbmd0aCAqLworCQlsZW4gPSBzdHJs ZW4ocHRyKTsKKwl9CiAJZWxzZQogCQlwdHIgPSBzdHJpbmc7CiAKQEAgLTE0MjksNiArMTU4MSw3 IEBAIENvcHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpz dHJpbmcsCiAJCWVsc2UKIAkJewogCQkJY29uc3QgY2hhciAqdHB0ciA9IHB0cjsKKwkJCUNvcHlD aGVja0NTVlF1b3RlTmVlZFNJTUQoJnRwdHIsIGxlbiwgZGVsaW1jLCBxdW90ZWMpOwogCiAJCQl3 aGlsZSAoKGMgPSAqdHB0cikgIT0gJ1wwJykKIAkJCXsKQEAgLTE0NTMsNiArMTYwNiw4IEBAIENv cHlBdHRyaWJ1dGVPdXRDU1YoQ29weVRvU3RhdGUgY3N0YXRlLCBjb25zdCBjaGFyICpzdHJpbmcs CiAJCSAqIFdlIGFkb3B0IHRoZSBzYW1lIG9wdGltaXphdGlvbiBzdHJhdGVneSBhcyBpbiBDb3B5 QXR0cmlidXRlT3V0VGV4dAogCQkgKi8KIAkJc3RhcnQgPSBwdHI7CisJCUNvcHlTa2lwQ1NWRXNj YXBlU0lNRCgmcHRyLCBsZW4sIGVzY2FwZWMsIHF1b3RlYyk7CisKIAkJd2hpbGUgKChjID0gKnB0 cikgIT0gJ1wwJykKIAkJewogCQkJaWYgKGMgPT0gcXVvdGVjIHx8IGMgPT0gZXNjYXBlYykKLS0g CjIuMzQuMQoK --000000000000ef11a4064aca0276--