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 1ulOGo-00ER0q-9O for pgsql-hackers@arkaria.postgresql.org; Mon, 11 Aug 2025 08:52:42 +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 1ulOGm-00B8gf-Rn for pgsql-hackers@arkaria.postgresql.org; Mon, 11 Aug 2025 08:52:40 +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.94.2) (envelope-from ) id 1ulOGm-00B8gX-A2 for pgsql-hackers@lists.postgresql.org; Mon, 11 Aug 2025 08:52:40 +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.96) (envelope-from ) id 1ulOGk-001quW-0z for pgsql-hackers@postgresql.org; Mon, 11 Aug 2025 08:52:39 +0000 Received: by mail-pg1-x531.google.com with SMTP id 41be03b00d2f7-b42254ea4d5so2648694a12.1 for ; Mon, 11 Aug 2025 01:52:38 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1754902357; x=1755507157; 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=LNCihebtAX6wP/dX9Id8tySXWy/pd9D8JHcx4FeFABo=; b=TQc+vrm14l9z/wVTy8kixVMsdww94/RHrgBwsG5o6UsNSRfzZXgOARWpm4oO76+3zg XU0Sl/t4DBAmokIk11EJ6QbrQxqqdcjCs7NKsBFPs4wlkQ0Y3i7UhGB/88GtHS9m9Ohr 2h6ibUP/kP+GTwhSbJXNmiFhVV6T6t27wJpGlwWT01y184R9Au8LKtNktUJ4DXtmaXEf zVynIr3i4ByRJ8w5J8eGKTA5almM6FwAm7vkpdSlCR3Tv7CHaEkhQ2m1v/hkuJDLzbT2 qHlRKmCrKsQBpLfRVWP8JidtU0Vw1Z3RaXStrDZp0iyahwnVgwabSJwV4y2nMwttjDAC vOFw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1754902357; x=1755507157; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=LNCihebtAX6wP/dX9Id8tySXWy/pd9D8JHcx4FeFABo=; b=TwbsLZAgY9M4Y8WeL4TqJZUgQatY97q5SjLauidfTvC6sSS4StaC0modhPy3dUWaTw 8DN2oONarL/WG2zPg8qkiZo2N00HFUKexepRlvYqRHG37q9E+UM1GUz/b+J+OjmL9uBQ ITbVS4EaFn+i1v3w9JmrlAaZSxZbDEF+7FzLYJ7Mff1/45hIM+y1ea6qi7Qe+C2p+PXi mNIBVHIelCjsFQMb2QRIUm97Vkwh8Vxd5SAhMS4m1t4OPVQNRt7iAg5VpUA4rudPVbP5 vSFw7yIj4of55hGo7DDKQsZyhjDeuZg+6Q5OEMDMxHVQwOeO1lk56ldFLDfOtgu++YDC 3/7Q== X-Gm-Message-State: AOJu0YzyUKIILwbN+xcrH3Gkzdpt1PtJkLL+U8gMls2+WGxM0E74zmJs ZfDv6kruki3e6O72eIhpzGsc4fFvgTHYMAFBzXSIYXQlXCWrS5GPK3t70PYpchfhwTIAvsiDP79 d7y6tiTsWQWz2n4GNNWWYIri7tMLiHYY= X-Gm-Gg: ASbGncsJznqWS1nWQTIVJ1394Bi258VT6T05e5sMq84DeqySvdspR0y1CRbm/QbQS6/ /sYg37SqjIl+TMf5sCZhnztzZBS3/Waw23zWr8JUYUWrLNd2G5qNRUwRtEK6GVPWIyMpJO08nyJ aa6GOGtRHGlXle6LWcT99hquXPr3myWyRJOM4TwCk5lAT6KiYnR2k0U8kmzXYhQKUEXcl61zg3W KYbmcz5rR9TS6e6Dw== X-Google-Smtp-Source: AGHT+IErnwi5SLp8y4Wkcr5Bm/g+OtU/ZsmXFPoeXeJYd3ChOjx3xLoJ9JYqaGL+5uwXpa6R13R3rKbOQGQ122/H28E= X-Received: by 2002:a17:902:f544:b0:240:6aad:1c43 with SMTP id d9443c01a7336-242c2262291mr184995545ad.48.1754902356961; Mon, 11 Aug 2025 01:52:36 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Nazir Bilal Yavuz Date: Mon, 11 Aug 2025 11:52:25 +0300 X-Gm-Features: Ac12FXxEZIMPCu6-WYNofaxzmichsCh9QXT_04PtOARvO6siz3P7-iFYOArYpL0 Message-ID: Subject: Re: Speed up COPY FROM text/CSV parsing using SIMD To: Shinya Kato Cc: pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000009b5194063c130bbd" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000009b5194063c130bbd Content-Type: text/plain; charset="UTF-8" Hi, On Thu, 7 Aug 2025 at 14:15, Nazir Bilal Yavuz wrote: > > On Thu, 7 Aug 2025 at 04:49, Shinya Kato wrote: > > > > I have implemented SIMD optimization for the COPY FROM (FORMAT {csv, > > text}) command and observed approximately a 5% performance > > improvement. Please see the detailed test results below. > > Also, I did a benchmark on text format. I created a benchmark for line > length in a table being from 1 byte to 1 megabyte.The peak improvement > is line length being 4096 and the improvement is more than 20% [1], I > saw no regression on your patch. I did the same benchmark for the CSV format. The peak improvement is line length being 4096 and the improvement is more than 25% [1]. I saw a 5% regression on the 1 byte benchmark, there are no other regressions. > What do you think about adding SIMD to CopyReadAttributesText() and > CopyReadAttributesCSV() functions? When I add your SIMD approach to > CopyReadAttributesText() function, the improvement on the 4096 byte > line length input [1] goes from 20% to 30%. I wanted to try using SIMD in CopyReadAttributesCSV() as well. The improvement on the 4096 byte line length input [1] goes from 25% to 35%, the regression on the 1 byte input is the same. CopyReadAttributesCSV() changes are attached as feedback v2. -- Regards, Nazir Bilal Yavuz Microsoft --0000000000009b5194063c130bbd Content-Type: text/plain; charset="US-ASCII"; name="v2-0001-Feedback.txt" Content-Disposition: attachment; filename="v2-0001-Feedback.txt" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_me6vgbh10 RnJvbSAyMDNkNjQ4YzRjZjY0YzZkNjI5ZjJhYmM3MTlhMzcxZGQwMzkzZTIyIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBUaHUsIDcgQXVnIDIwMjUgMTM6Mjc6MzQgKzAzMDAKU3ViamVjdDogW1BBVENIIHYy XSBGZWVkYmFjawoKLS0tCiBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgfCAx NzYgKysrKysrKysrKysrKysrKysrKysrKysrLS0tCiAxIGZpbGUgY2hhbmdlZCwgMTYwIGluc2Vy dGlvbnMoKyksIDE2IGRlbGV0aW9ucygtKQoKZGlmZiAtLWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1h bmRzL2NvcHlmcm9tcGFyc2UuYyBiL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2Uu YwppbmRleCA1YWJhMGZhNmNiNy4uN2I4M2U2NGUyM2IgMTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYworKysgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5 ZnJvbXBhcnNlLmMKQEAgLTY3MCw4ICs2NzAsMTIgQEAgQ29weUxvYWRJbnB1dEJ1ZihDb3B5RnJv bVN0YXRlIGNzdGF0ZSkKIAkJLyogSWYgd2Ugbm93IGhhdmUgc29tZSB1bmNvbnZlcnRlZCBkYXRh LCB0cnkgdG8gY29udmVydCBpdCAqLwogCQlDb3B5Q29udmVydEJ1Zihjc3RhdGUpOwogCi0JCS8q IElmIHdlIG5vdyBoYXZlIHNvbWUgbW9yZSBpbnB1dCBieXRlcyByZWFkeSwgcmV0dXJuIHRoZW0g Ki8KLQkJaWYgKElOUFVUX0JVRl9CWVRFUyhjc3RhdGUpID4gbmJ5dGVzKQorCQkvKgorCQkgKiBJ ZiB3ZSBub3cgaGF2ZSBhdCBsZWFzdCBzaXplb2YoVmVjdG9yOCkgaW5wdXQgYnl0ZXMgcmVhZHks IHJldHVybgorCQkgKiB0aGVtLiBUaGlzIGlzIGJlbmVmaWNpYWwgZm9yIFNJTUQgcHJvY2Vzc2lu ZyBpbiB0aGUKKwkJICogQ29weVJlYWRMaW5lVGV4dCgpIGZ1bmN0aW9uLgorCQkgKi8KKwkJaWYg KElOUFVUX0JVRl9CWVRFUyhjc3RhdGUpID4gbmJ5dGVzICsgc2l6ZW9mKFZlY3RvcjgpKQogCQkJ cmV0dXJuOwogCiAJCS8qCkBAIC0xMzIyLDcgKzEzMjYsNyBAQCBDb3B5UmVhZExpbmVUZXh0KENv cHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2NzdikKIAkJICogdW5zYWZlIHdpdGggdGhlIG9s ZCB2MiBDT1BZIHByb3RvY29sLCBidXQgd2UgZG9uJ3Qgc3VwcG9ydCB0aGF0CiAJCSAqIGFueW1v cmUuCiAJCSAqLwotCQlpZiAoaW5wdXRfYnVmX3B0ciA+PSBjb3B5X2J1Zl9sZW4gfHwgbmVlZF9k YXRhKQorCQlpZiAoaW5wdXRfYnVmX3B0ciArIHNpemVvZihWZWN0b3I4KSA+PSBjb3B5X2J1Zl9s ZW4gfHwgbmVlZF9kYXRhKQogCQl7CiAJCQlSRUZJTExfTElORUJVRjsKIApAQCAtMTM0NSwyMSAr MTM0OSwyMiBAQCBDb3B5UmVhZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlz X2NzdikKIAkJfQogCiAjaWZuZGVmIFVTRV9OT19TSU1ECisKIAkJLyoKLQkJICogU0lNRCBpbnN0 cnVjdGlvbnMgYXJlIHVzZWQgaGVyZSB0byBlZmZpY2llbnRseSBzY2FuIHRoZSBpbnB1dCBidWZm ZXIKLQkJICogZm9yIHNwZWNpYWwgY2hhcmFjdGVycyAoZS5nLiwgbmV3bGluZSwgY2FycmlhZ2Ug cmV0dXJuLCBxdW90ZXMsIG9yCi0JCSAqIGVzY2FwZSBjaGFyYWN0ZXJzKS4gVGhpcyBhcHByb2Fj aCBzaWduaWZpY2FudGx5IGltcHJvdmVzIHBlcmZvcm1hbmNlCi0JCSAqIGNvbXBhcmVkIHRvIGJ5 dGUtYnktYnl0ZSBpdGVyYXRpb24sIGVzcGVjaWFsbHkgZm9yIGxhcmdlIGlucHV0Ci0JCSAqIGJ1 ZmZlcnMuCisJCSAqIFNJTUQgaW5zdHJ1Y3Rpb25zIGFyZSB1c2VkIGhlcmUgdG8gZWZmaWNpZW50 bHkgc2NhbiB0aGUgaW5wdXQKKwkJICogYnVmZmVyIGZvciBzcGVjaWFsIGNoYXJhY3RlcnMgKGUu Zy4sIG5ld2xpbmUsIGNhcnJpYWdlIHJldHVybiwKKwkJICogcXVvdGVzLCBvciBlc2NhcGUgY2hh cmFjdGVycykuIFRoaXMgYXBwcm9hY2ggc2lnbmlmaWNhbnRseSBpbXByb3ZlcworCQkgKiBwZXJm b3JtYW5jZSBjb21wYXJlZCB0byBieXRlLWJ5LWJ5dGUgaXRlcmF0aW9uLCBlc3BlY2lhbGx5IGZv cgorCQkgKiBsYXJnZSBpbnB1dCBidWZmZXJzLgogCQkgKgotCQkgKiBIb3dldmVyLCBTSU1EIG9w dGltaXphdGlvbiBjYW5ub3QgYmUgYXBwbGllZCBpbiB0aGUgZm9sbG93aW5nIGNhc2VzOgotCQkg KiAtIEluc2lkZSBxdW90ZWQgZmllbGRzLCB3aGVyZSBlc2NhcGUgc2VxdWVuY2VzIGFuZCBjbG9z aW5nIHF1b3RlcwotCQkgKiAgIHJlcXVpcmUgc2VxdWVudGlhbCBwcm9jZXNzaW5nIHRvIGhhbmRs ZSBjb3JyZWN0bHkuCi0JCSAqIC0gV2hlbiB0aGUgcmVtYWluaW5nIGJ1ZmZlciBzaXplIGlzIHNt YWxsZXIgdGhhbiB0aGUgc2l6ZSBvZiBhIFNJTUQKLQkJICogICB2ZWN0b3IgcmVnaXN0ZXIsIGFz IFNJTUQgb3BlcmF0aW9ucyByZXF1aXJlIHByb2Nlc3NpbmcgZGF0YSBpbgotCQkgKiAgIGZpeGVk LXNpemUgY2h1bmtzLgorCQkgKiBIb3dldmVyLCBTSU1EIG9wdGltaXphdGlvbiBjYW5ub3QgYmUg YXBwbGllZCBpbiB0aGUgZm9sbG93aW5nCisJCSAqIGNhc2VzOiAtIEluc2lkZSBxdW90ZWQgZmll bGRzLCB3aGVyZSBlc2NhcGUgc2VxdWVuY2VzIGFuZCBjbG9zaW5nCisJCSAqIHF1b3RlcyByZXF1 aXJlIHNlcXVlbnRpYWwgcHJvY2Vzc2luZyB0byBoYW5kbGUgY29ycmVjdGx5LiAtIFdoZW4KKwkJ ICogdGhlIHJlbWFpbmluZyBidWZmZXIgc2l6ZSBpcyBzbWFsbGVyIHRoYW4gdGhlIHNpemUgb2Yg YSBTSU1EIHZlY3RvcgorCQkgKiByZWdpc3RlciwgYXMgU0lNRCBvcGVyYXRpb25zIHJlcXVpcmUg cHJvY2Vzc2luZyBkYXRhIGluIGZpeGVkLXNpemUKKwkJICogY2h1bmtzLgogCQkgKi8KLQkJaWYg KCFpbl9xdW90ZSAmJiBjb3B5X2J1Zl9sZW4gLSBpbnB1dF9idWZfcHRyID49IHNpemVvZihWZWN0 b3I4KSkKKwkJaWYgKGNvcHlfYnVmX2xlbiAtIGlucHV0X2J1Zl9wdHIgPj0gc2l6ZW9mKFZlY3Rv cjgpKQogCQl7CiAJCQlWZWN0b3I4CQljaHVuazsKIAkJCVZlY3RvcjgJCW1hdGNoOwpAQCAtMTM4 OCwxMyArMTM5MywxNSBAQCBDb3B5UmVhZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBi b29sIGlzX2NzdikKIAkJCQkgKiBGb3VuZCBhIHNwZWNpYWwgY2hhcmFjdGVyLiBBZHZhbmNlIHVw IHRvIHRoYXQgcG9pbnQgYW5kIGxldAogCQkJCSAqIHRoZSBzY2FsYXIgY29kZSBoYW5kbGUgaXQu CiAJCQkJICovCi0JCQkJaW50IGFkdmFuY2UgPSBwZ19yaWdodG1vc3Rfb25lX3BvczMyKG1hc2sp OworCQkJCWludAkJCWFkdmFuY2UgPSBwZ19yaWdodG1vc3Rfb25lX3BvczMyKG1hc2spOworCiAJ CQkJaW5wdXRfYnVmX3B0ciArPSBhZHZhbmNlOwogCQkJfQogCQkJZWxzZQogCQkJewogCQkJCS8q IE5vIHNwZWNpYWwgY2hhcmFjdGVycyBmb3VuZCwgc28gc2tpcCB0aGUgZW50aXJlIGNodW5rICov CiAJCQkJaW5wdXRfYnVmX3B0ciArPSBzaXplb2YoVmVjdG9yOCk7CisJCQkJbGFzdF93YXNfZXNj ID0gZmFsc2U7CiAJCQkJY29udGludWU7CiAJCQl9CiAJCX0KQEAgLTE2NTAsNiArMTY1NywxMSBA QCBDb3B5UmVhZEF0dHJpYnV0ZXNUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlKQogCWNoYXIJICAg KmN1cl9wdHI7CiAJY2hhcgkgICAqbGluZV9lbmRfcHRyOwogCisjaWZuZGVmIFVTRV9OT19TSU1E CisJVmVjdG9yOAkJYnMgPSB2ZWN0b3I4X2Jyb2FkY2FzdCgnXFwnKTsKKwlWZWN0b3I4CQlkZWxp bSA9IHZlY3RvcjhfYnJvYWRjYXN0KGRlbGltYyk7CisjZW5kaWYKKwogCS8qCiAJICogV2UgbmVl ZCBhIHNwZWNpYWwgY2FzZSBmb3IgemVyby1jb2x1bW4gdGFibGVzOiBjaGVjayB0aGF0IHRoZSBp bnB1dAogCSAqIGxpbmUgaXMgZW1wdHksIGFuZCByZXR1cm4uCkBAIC0xNzE3LDYgKzE3MjksNDQg QEAgQ29weVJlYWRBdHRyaWJ1dGVzVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSkKIAkJewogCQkJ Y2hhcgkJYzsKIAorI2lmbmRlZiBVU0VfTk9fU0lNRAorCQkJaWYgKGxpbmVfZW5kX3B0ciAtIGN1 cl9wdHIgPj0gc2l6ZW9mKFZlY3RvcjgpKQorCQkJeworCQkJCVZlY3RvcjgJCWNodW5rOworCQkJ CVZlY3RvcjgJCW1hdGNoOworCQkJCXVpbnQzMgkJbWFzazsKKworCQkJCS8qIExvYWQgYSBjaHVu ayBvZiBkYXRhIGludG8gYSB2ZWN0b3IgcmVnaXN0ZXIgKi8KKwkJCQl2ZWN0b3I4X2xvYWQoJmNo dW5rLCAoY29uc3QgdWludDggKikgY3VyX3B0cik7CisKKwkJCQkvKiBDcmVhdGUgYSBtYXNrIG9m IGFsbCBzcGVjaWFsIGNoYXJhY3RlcnMgd2UgbmVlZCB0byBzdG9wIGF0ICovCisJCQkJbWF0Y2gg PSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIGJzKSwgdmVjdG9yOF9lcShjaHVuaywgZGVs aW0pKTsKKworCQkJCS8qIENoZWNrIGlmIHdlIGZvdW5kIGFueSBzcGVjaWFsIGNoYXJhY3RlcnMg Ki8KKwkJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2sobWF0Y2gpOworCQkJCWlmIChtYXNr ICE9IDApCisJCQkJeworCQkJCQkvKgorCQkJCQkgKiBGb3VuZCBhIHNwZWNpYWwgY2hhcmFjdGVy LiBBZHZhbmNlIHVwIHRvIHRoYXQgcG9pbnQgYW5kCisJCQkJCSAqIGxldCB0aGUgc2NhbGFyIGNv ZGUgaGFuZGxlIGl0LgorCQkJCQkgKi8KKwkJCQkJaW50CQkJYWR2YW5jZSA9IHBnX3JpZ2h0bW9z dF9vbmVfcG9zMzIobWFzayk7CisKKwkJCQkJbWVtY3B5KG91dHB1dF9wdHIsIGN1cl9wdHIsIGFk dmFuY2UpOworCQkJCQlvdXRwdXRfcHRyICs9IGFkdmFuY2U7CisJCQkJCWN1cl9wdHIgKz0gYWR2 YW5jZTsKKwkJCQl9CisJCQkJZWxzZQorCQkJCXsKKwkJCQkJLyogTm8gc3BlY2lhbCBjaGFyYWN0 ZXJzIGZvdW5kLCBzbyBza2lwIHRoZSBlbnRpcmUgY2h1bmsgKi8KKwkJCQkJbWVtY3B5KG91dHB1 dF9wdHIsIGN1cl9wdHIsIHNpemVvZihWZWN0b3I4KSk7CisJCQkJCW91dHB1dF9wdHIgKz0gc2l6 ZW9mKFZlY3RvcjgpOworCQkJCQljdXJfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQkJY29u dGludWU7CisJCQkJfQorCQkJfQorI2VuZGlmCisKIAkJCWVuZF9wdHIgPSBjdXJfcHRyOwogCQkJ aWYgKGN1cl9wdHIgPj0gbGluZV9lbmRfcHRyKQogCQkJCWJyZWFrOwpAQCAtMTkwNiw2ICsxOTU2 LDEyIEBAIENvcHlSZWFkQXR0cmlidXRlc0NTVihDb3B5RnJvbVN0YXRlIGNzdGF0ZSkKIAljaGFy CSAgICpjdXJfcHRyOwogCWNoYXIJICAgKmxpbmVfZW5kX3B0cjsKIAorI2lmbmRlZiBVU0VfTk9f U0lNRAorCVZlY3RvcjgJCXF1b3RlID0gdmVjdG9yOF9icm9hZGNhc3QocXVvdGVjKTsKKwlWZWN0 b3I4CQlkZWxpbSA9IHZlY3RvcjhfYnJvYWRjYXN0KGRlbGltYyk7CisJVmVjdG9yOAkJZXNjYXBl ID0gdmVjdG9yOF9icm9hZGNhc3QoZXNjYXBlYyk7CisjZW5kaWYKKwogCS8qCiAJICogV2UgbmVl ZCBhIHNwZWNpYWwgY2FzZSBmb3IgemVyby1jb2x1bW4gdGFibGVzOiBjaGVjayB0aGF0IHRoZSBp bnB1dAogCSAqIGxpbmUgaXMgZW1wdHksIGFuZCByZXR1cm4uCkBAIC0xOTcyLDYgKzIwMjgsNTAg QEAgQ29weVJlYWRBdHRyaWJ1dGVzQ1NWKENvcHlGcm9tU3RhdGUgY3N0YXRlKQogCQkJLyogTm90 IGluIHF1b3RlICovCiAJCQlmb3IgKDs7KQogCQkJeworI2lmbmRlZiBVU0VfTk9fU0lNRAorCQkJ CWlmIChsaW5lX2VuZF9wdHIgLSBjdXJfcHRyID49IHNpemVvZihWZWN0b3I4KSkKKwkJCQl7CisJ CQkJCVZlY3RvcjgJCWNodW5rOworCQkJCQlWZWN0b3I4CQltYXRjaDsKKwkJCQkJdWludDMyCQlt YXNrOworCisJCQkJCS8qIExvYWQgYSBjaHVuayBvZiBkYXRhIGludG8gYSB2ZWN0b3IgcmVnaXN0 ZXIgKi8KKwkJCQkJdmVjdG9yOF9sb2FkKCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopIGN1cl9wdHIp OworCisJCQkJCS8qCisJCQkJCSAqIENyZWF0ZSBhIG1hc2sgb2YgYWxsIHNwZWNpYWwgY2hhcmFj dGVycyB3ZSBuZWVkIHRvIHN0b3AKKwkJCQkJICogYXQKKwkJCQkJICovCisJCQkJCW1hdGNoID0g dmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBxdW90ZSksIHZlY3RvcjhfZXEoY2h1bmssIGRl bGltKSk7CisKKwkJCQkJLyogQ2hlY2sgaWYgd2UgZm91bmQgYW55IHNwZWNpYWwgY2hhcmFjdGVy cyAqLworCQkJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2sobWF0Y2gpOworCQkJCQlpZiAo bWFzayAhPSAwKQorCQkJCQl7CisJCQkJCQkvKgorCQkJCQkJICogRm91bmQgYSBzcGVjaWFsIGNo YXJhY3Rlci4gQWR2YW5jZSB1cCB0byB0aGF0IHBvaW50CisJCQkJCQkgKiBhbmQgbGV0IHRoZSBz Y2FsYXIgY29kZSBoYW5kbGUgaXQuCisJCQkJCQkgKi8KKwkJCQkJCWludAkJCWFkdmFuY2UgPSBw Z19yaWdodG1vc3Rfb25lX3BvczMyKG1hc2spOworCisJCQkJCQltZW1jcHkob3V0cHV0X3B0ciwg Y3VyX3B0ciwgYWR2YW5jZSk7CisJCQkJCQlvdXRwdXRfcHRyICs9IGFkdmFuY2U7CisJCQkJCQlj dXJfcHRyICs9IGFkdmFuY2U7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJCQkvKgor CQkJCQkJICogTm8gc3BlY2lhbCBjaGFyYWN0ZXJzIGZvdW5kLCBzbyBza2lwIHRoZSBlbnRpcmUK KwkJCQkJCSAqIGNodW5rCisJCQkJCQkgKi8KKwkJCQkJCW1lbWNweShvdXRwdXRfcHRyLCBjdXJf cHRyLCBzaXplb2YoVmVjdG9yOCkpOworCQkJCQkJb3V0cHV0X3B0ciArPSBzaXplb2YoVmVjdG9y OCk7CisJCQkJCQljdXJfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQkJCWNvbnRpbnVlOwor CQkJCQl9CisJCQkJfQorI2VuZGlmCisKIAkJCQllbmRfcHRyID0gY3VyX3B0cjsKIAkJCQlpZiAo Y3VyX3B0ciA+PSBsaW5lX2VuZF9wdHIpCiAJCQkJCWdvdG8gZW5kZmllbGQ7CkBAIC0xOTk1LDYg KzIwOTUsNTAgQEAgQ29weVJlYWRBdHRyaWJ1dGVzQ1NWKENvcHlGcm9tU3RhdGUgY3N0YXRlKQog CQkJLyogSW4gcXVvdGUgKi8KIAkJCWZvciAoOzspCiAJCQl7CisjaWZuZGVmIFVTRV9OT19TSU1E CisJCQkJaWYgKGxpbmVfZW5kX3B0ciAtIGN1cl9wdHIgPj0gc2l6ZW9mKFZlY3RvcjgpKQorCQkJ CXsKKwkJCQkJVmVjdG9yOAkJY2h1bms7CisJCQkJCVZlY3RvcjgJCW1hdGNoOworCQkJCQl1aW50 MzIJCW1hc2s7CisKKwkJCQkJLyogTG9hZCBhIGNodW5rIG9mIGRhdGEgaW50byBhIHZlY3RvciBy ZWdpc3RlciAqLworCQkJCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgY3Vy X3B0cik7CisKKwkJCQkJLyoKKwkJCQkJICogQ3JlYXRlIGEgbWFzayBvZiBhbGwgc3BlY2lhbCBj aGFyYWN0ZXJzIHdlIG5lZWQgdG8gc3RvcAorCQkJCQkgKiBhdAorCQkJCQkgKi8KKwkJCQkJbWF0 Y2ggPSB2ZWN0b3I4X29yKHZlY3RvcjhfZXEoY2h1bmssIHF1b3RlKSwgdmVjdG9yOF9lcShjaHVu aywgZXNjYXBlKSk7CisKKwkJCQkJLyogQ2hlY2sgaWYgd2UgZm91bmQgYW55IHNwZWNpYWwgY2hh cmFjdGVycyAqLworCQkJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2sobWF0Y2gpOworCQkJ CQlpZiAobWFzayAhPSAwKQorCQkJCQl7CisJCQkJCQkvKgorCQkJCQkJICogRm91bmQgYSBzcGVj aWFsIGNoYXJhY3Rlci4gQWR2YW5jZSB1cCB0byB0aGF0IHBvaW50CisJCQkJCQkgKiBhbmQgbGV0 IHRoZSBzY2FsYXIgY29kZSBoYW5kbGUgaXQuCisJCQkJCQkgKi8KKwkJCQkJCWludAkJCWFkdmFu Y2UgPSBwZ19yaWdodG1vc3Rfb25lX3BvczMyKG1hc2spOworCisJCQkJCQltZW1jcHkob3V0cHV0 X3B0ciwgY3VyX3B0ciwgYWR2YW5jZSk7CisJCQkJCQlvdXRwdXRfcHRyICs9IGFkdmFuY2U7CisJ CQkJCQljdXJfcHRyICs9IGFkdmFuY2U7CisJCQkJCX0KKwkJCQkJZWxzZQorCQkJCQl7CisJCQkJ CQkvKgorCQkJCQkJICogTm8gc3BlY2lhbCBjaGFyYWN0ZXJzIGZvdW5kLCBzbyBza2lwIHRoZSBl bnRpcmUKKwkJCQkJCSAqIGNodW5rCisJCQkJCQkgKi8KKwkJCQkJCW1lbWNweShvdXRwdXRfcHRy LCBjdXJfcHRyLCBzaXplb2YoVmVjdG9yOCkpOworCQkJCQkJb3V0cHV0X3B0ciArPSBzaXplb2Yo VmVjdG9yOCk7CisJCQkJCQljdXJfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQkJCWNvbnRp bnVlOworCQkJCQl9CisJCQkJfQorI2VuZGlmCisKIAkJCQllbmRfcHRyID0gY3VyX3B0cjsKIAkJ CQlpZiAoY3VyX3B0ciA+PSBsaW5lX2VuZF9wdHIpCiAJCQkJCWVyZXBvcnQoRVJST1IsCi0tIAoy LjUwLjEKCg== --0000000000009b5194063c130bbd--