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 1v9OzM-00HTk6-MA for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Oct 2025 14:29:56 +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 1v9OzL-00DRHz-LJ for pgsql-hackers@arkaria.postgresql.org; Thu, 16 Oct 2025 14:29:54 +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 1v9OzL-00DRHB-6d for pgsql-hackers@lists.postgresql.org; Thu, 16 Oct 2025 14:29:54 +0000 Received: from mail-pl1-x62f.google.com ([2607:f8b0:4864:20::62f]) by magus.postgresql.org with esmtps (TLS1.3) tls TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256 (Exim 4.96) (envelope-from ) id 1v9OzI-002XU8-01 for pgsql-hackers@postgresql.org; Thu, 16 Oct 2025 14:29:53 +0000 Received: by mail-pl1-x62f.google.com with SMTP id d9443c01a7336-27c369f898fso11724745ad.3 for ; Thu, 16 Oct 2025 07:29:51 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1760624989; x=1761229789; 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=YOI5OxR45M2PikQnc9rbPAJNVSY849RqwduP2MTHXBw=; b=eInMl96cUlsS6S9bIopPz9Zq0HeyKIvdu45i+kU0diggyzHw/wbiVEeVZtf3oCdDrJ fTCaySwd3V4EqsLOtcR00bOpQY8lL4qC7Vgx8wZbnxlOGzaQ6Fe+B1emgjGliAajrC6G gVfkg8LAHl1PzY7RO/M3DZbSjwnaDjc/qTdo73GQyYkED7otNlo5fKgUwTC74xVAoQHV iCi8ZXN8OUE85fknjJ4+/fROHZcQfHVZazTMoGNaQVhb3IPhX/UmE35PYIDbMniDu9Eb sb3e5qhxQchxWTo/uQROb8qVFNO2kN+1UPbEHNkgw0yu3xeOs2npaip0VMs++LzfRP62 wR8g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1760624989; x=1761229789; 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=YOI5OxR45M2PikQnc9rbPAJNVSY849RqwduP2MTHXBw=; b=s7y8+QBLKccgwX/6lABohnHTpQ/oG28+MdMz148Z1y0BNms0fBDa0Zjwu6pNB1uns9 Jpsw02hicI3fU0v2ohZaRa64fqxjuy/LCpdnTUB/5rrHUo8nH/DrXRXLVgPmlp+qbpP7 Sp6j3Kjvp5JZCnRnJ6PArreKQmqtMzhmnNLKcowh0OFf0Y0MnIaEGmHsCiDWsZRHWbt1 ZYUuBf1e3QP3rzzsVIQ/IJN5yNI3htnHFvP74w+/yY839ZqiR4sY5eNGsHO8CqpeVFwC AF5yGrtqmv5ypvryveOAx0RNgc+AEgEEiIARLxMiw/W3mBZ0Jh3GutnbN8Z+kBlG9XdH oZfQ== X-Forwarded-Encrypted: i=1; AJvYcCV0QiBDho94RRuEuQTOLAGmlEaGyJ4U2E0k54XIovF2ijVkQivRCE28kLzg7LgKnDUqxUnhOFBQqjTr/FiF@postgresql.org X-Gm-Message-State: AOJu0YyX3wk2MjF7JhV/pYEcBRCUsvszFjrrbrgb1kt30/vxmPqavM6I qHDFNSWU1lqVeP9poIKm6pT26ghPIsjriDOGUjoiIAQeRO6gL5tyWmI38lfJNbAQTbAep6qcdyd nh8me1WjghaVi+ov7d38U5MDKq6tsub0= X-Gm-Gg: ASbGncv+21a8XJfXWRGuc0y63T0DMhvZrTxOndx0S8QzRiNaswQeyEQ5gzyLq1UKfd0 qKl3Zf7yBi/Y72mR8tp8GDdMfX5ZXqmSVweKJvJ+iKL9JoMfhKuiWghWUsmML8aaFFlv/f4V732 2JNGw/rvtbZbwM1ygDdx3ELWwgAgnod1mMwEiM3NMViQZ1jFuOQ/p7nBER2HjTobT5V/s6z6kP9 eLpam6tEQW4t7sqDeCxcYSuZUr9xiW2XcnP6JIM3rZX6bVr3Z+Jfdvv8afCxkseGE7ezWy4 X-Google-Smtp-Source: AGHT+IHu1Iif3KlcG3pWrlHxpd3Sw4+CqlBfLr4z6azhFWuPmLfEguka+2Uz6LEkaGFTsc5QjmkxgZ8Ct9ZTEE6vyDQ= X-Received: by 2002:a17:903:1746:b0:264:7bf5:c520 with SMTP id d9443c01a7336-290cb07cc27mr1850525ad.44.1760624989307; Thu, 16 Oct 2025 07:29:49 -0700 (PDT) MIME-Version: 1.0 References: <8615c983-1662-43b4-b0c9-49d194ac33aa@dunslane.net> In-Reply-To: <8615c983-1662-43b4-b0c9-49d194ac33aa@dunslane.net> From: Nazir Bilal Yavuz Date: Thu, 16 Oct 2025 17:29:36 +0300 X-Gm-Features: AS18NWDKQ6I8goBpZmvDedy-VE52SVeRmHCS01lT552UFhg53zdjmpGYejKgInM Message-ID: Subject: Re: Speed up COPY FROM text/CSV parsing using SIMD To: Andrew Dunstan Cc: KAZAR Ayoub , Shinya Kato , pgsql-hackers@postgresql.org Content-Type: multipart/mixed; boundary="0000000000001222d60641477348" List-Id: List-Help: List-Subscribe: List-Post: List-Owner: List-Archive: Archived-At: Precedence: bulk --0000000000001222d60641477348 Content-Type: text/plain; charset="UTF-8" Hi, On Thu, 21 Aug 2025 at 18:47, Andrew Dunstan wrote: > > > On 2025-08-19 Tu 10:14 AM, Nazir Bilal Yavuz wrote: > > Hi, > > > > On Tue, 19 Aug 2025 at 15:33, Nazir Bilal Yavuz wrote: > >> I am able to reproduce the regression you mentioned but both > >> regressions are %20 on my end. I found that (by experimenting) SIMD > >> causes a regression if it advances less than 5 characters. > >> > >> So, I implemented a small heuristic. It works like that: > >> > >> - If advance < 5 -> insert a sleep penalty (n cycles). > > 'sleep' might be a poor word choice here. I meant skipping SIMD for n > > number of times. > > > > I was thinking a bit about that this morning. I wonder if it might be > better instead of having a constantly applied heuristic like this, it > might be better to do a little extra accounting in the first, say, 1000 > lines of an input file, and if less than some portion of the input is > found to be special characters then switch to the SIMD code. What that > portion should be would need to be determined by some experimentation > with a variety of typical workloads, but given your findings 20% seems > like a good starting point. I implemented a heuristic something similar to this. It is a mix of previous heuristic and your idea, it works like that: Overall logic is that we will not run SIMD for the entire line and we decide if it is worth it to run SIMD for the next lines. 1 - We will try SIMD and decide if it is worth it to run SIMD. 1.1 - If it is worth it, we will continue to run SIMD and we will halve the simd_last_sleep_cycle variable. 1.2 - If it is not worth it, we will double the simd_last_sleep_cycle and we will not run SIMD for these many lines. 1.3 - After skipping simd_last_sleep_cycle lines, we will go back to the #1. Note: simd_last_sleep_cycle can not pass 1024, so we will run SIMD for each 1024 lines at max. With this heuristic the regression is limited by %2 in the worst case. Patches are attached, the first patch is v2-0001 from Shinya with the '-Werror=maybe-uninitialized' fixes and the pgindent changes. 0002 is the actual heuristic patch. -- Regards, Nazir Bilal Yavuz Microsoft --0000000000001222d60641477348 Content-Type: text/x-patch; charset="US-ASCII"; name="v3-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Disposition: attachment; filename="v3-0001-Speed-up-COPY-FROM-text-CSV-parsing-using-SIMD.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mgtid2wo0 RnJvbSAyZDIzNzJlOTAzMDVhODFjODBmZTE4MjAwMzkzMzAzOWJmMzJmOTdlIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBTaGlueWEgS2F0byA8c2hpbnlhMTEua2F0b0BnbWFpbC5jb20+ CkRhdGU6IE1vbiwgMjggSnVsIDIwMjUgMjI6MDg6MjAgKzA5MDAKU3ViamVjdDogW1BBVENIIHYz IDEvMl0gU3BlZWQgdXAgQ09QWSBGUk9NIHRleHQvQ1NWIHBhcnNpbmcgdXNpbmcgU0lNRAoKLS0t CiBzcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgfCA3MyArKysrKysrKysrKysr KysrKysrKysrKysrKysrCiAxIGZpbGUgY2hhbmdlZCwgNzMgaW5zZXJ0aW9ucygrKQoKZGlmZiAt LWdpdCBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYyBiL3NyYy9iYWNrZW5k L2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYwppbmRleCBiMWFlOTdiODMzZC4uOTk5NTlhNDBmYWIg MTAwNjQ0Ci0tLSBhL3NyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9tcGFyc2UuYworKysgYi9z cmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKQEAgLTcxLDcgKzcxLDkgQEAKICNp bmNsdWRlICJtYi9wZ193Y2hhci5oIgogI2luY2x1ZGUgIm1pc2NhZG1pbi5oIgogI2luY2x1ZGUg InBnc3RhdC5oIgorI2luY2x1ZGUgInBvcnQvcGdfYml0dXRpbHMuaCIKICNpbmNsdWRlICJwb3J0 L3BnX2Jzd2FwLmgiCisjaW5jbHVkZSAicG9ydC9zaW1kLmgiCiAjaW5jbHVkZSAidXRpbHMvYnVp bHRpbnMuaCIKICNpbmNsdWRlICJ1dGlscy9yZWwuaCIKIApAQCAtMTI1NSw2ICsxMjU3LDE0IEBA IENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQogCWNo YXIJCXF1b3RlYyA9ICdcMCc7CiAJY2hhcgkJZXNjYXBlYyA9ICdcMCc7CiAKKyNpZm5kZWYgVVNF X05PX1NJTUQKKwlWZWN0b3I4CQlubCA9IHZlY3RvcjhfYnJvYWRjYXN0KCdcbicpOworCVZlY3Rv cjgJCWNyID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xyJyk7CisJVmVjdG9yOAkJYnMgPSB2ZWN0b3I4 X2Jyb2FkY2FzdCgnXFwnKTsKKwlWZWN0b3I4CQlxdW90ZSA9IHZlY3RvcjhfYnJvYWRjYXN0KDAp OworCVZlY3RvcjgJCWVzY2FwZSA9IHZlY3RvcjhfYnJvYWRjYXN0KDApOworI2VuZGlmCisKIAlp ZiAoaXNfY3N2KQogCXsKIAkJcXVvdGVjID0gY3N0YXRlLT5vcHRzLnF1b3RlWzBdOwpAQCAtMTI2 Miw2ICsxMjcyLDEyIEBAIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJv b2wgaXNfY3N2KQogCQkvKiBpZ25vcmUgc3BlY2lhbCBlc2NhcGUgcHJvY2Vzc2luZyBpZiBpdCdz IHRoZSBzYW1lIGFzIHF1b3RlYyAqLwogCQlpZiAocXVvdGVjID09IGVzY2FwZWMpCiAJCQllc2Nh cGVjID0gJ1wwJzsKKworI2lmbmRlZiBVU0VfTk9fU0lNRAorCQlxdW90ZSA9IHZlY3RvcjhfYnJv YWRjYXN0KHF1b3RlYyk7CisJCWlmIChxdW90ZWMgIT0gZXNjYXBlYykKKwkJCWVzY2FwZSA9IHZl Y3RvcjhfYnJvYWRjYXN0KGVzY2FwZWMpOworI2VuZGlmCiAJfQogCiAJLyoKQEAgLTEzMjgsNiAr MTM0NCw2MyBAQCBDb3B5UmVhZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlz X2NzdikKIAkJCW5lZWRfZGF0YSA9IGZhbHNlOwogCQl9CiAKKyNpZm5kZWYgVVNFX05PX1NJTUQK KworCQkvKgorCQkgKiBVc2UgU0lNRCBpbnN0cnVjdGlvbnMgdG8gZWZmaWNpZW50bHkgc2NhbiB0 aGUgaW5wdXQgYnVmZmVyIGZvcgorCQkgKiBzcGVjaWFsIGNoYXJhY3RlcnMgKGUuZy4sIG5ld2xp bmUsIGNhcnJpYWdlIHJldHVybiwgcXVvdGUsIGFuZAorCQkgKiBlc2NhcGUpLiBUaGlzIGlzIGZh c3RlciB0aGFuIGJ5dGUtYnktYnl0ZSBpdGVyYXRpb24sIGVzcGVjaWFsbHkgb24KKwkJICogbGFy Z2UgYnVmZmVycy4KKwkJICoKKwkJICogV2UgZG8gbm90IGFwcGx5IHRoZSBTSU1EIGZhc3QgcGF0 aCBpbiBlaXRoZXIgb2YgdGhlIGZvbGxvd2luZworCQkgKiBjYXNlczogLSBXaGVuIHRoZSBwcmV2 aW91c2x5IHByb2Nlc3NlZCBjaGFyYWN0ZXIgd2FzIGFuIGVzY2FwZQorCQkgKiBjaGFyYWN0ZXIg KGxhc3Rfd2FzX2VzYyksIHNpbmNlIHRoZSBuZXh0IGJ5dGUgbXVzdCBiZSBleGFtaW5lZAorCQkg KiBzZXF1ZW50aWFsbHkuIC0gVGhlIHJlbWFpbmluZyBidWZmZXIgaXMgc21hbGxlciB0aGFuIG9u ZSB2ZWN0b3IKKwkJICogd2lkdGggKHNpemVvZihWZWN0b3I4KSk7IFNJTUQgb3BlcmF0ZXMgb24g Zml4ZWQtc2l6ZSBjaHVua3MuCisJCSAqLworCQlpZiAoIWxhc3Rfd2FzX2VzYyAmJiBjb3B5X2J1 Zl9sZW4gLSBpbnB1dF9idWZfcHRyID49IHNpemVvZihWZWN0b3I4KSkKKwkJeworCQkJVmVjdG9y OAkJY2h1bms7CisJCQlWZWN0b3I4CQltYXRjaCA9IHZlY3RvcjhfYnJvYWRjYXN0KDApOworCQkJ dWludDMyCQltYXNrOworCisJCQkvKiBMb2FkIGEgY2h1bmsgb2YgZGF0YSBpbnRvIGEgdmVjdG9y IHJlZ2lzdGVyICovCisJCQl2ZWN0b3I4X2xvYWQoJmNodW5rLCAoY29uc3QgdWludDggKikgJmNv cHlfaW5wdXRfYnVmW2lucHV0X2J1Zl9wdHJdKTsKKworCQkJLyogXG4gYW5kIFxyIGFyZSBub3Qg c3BlY2lhbCBpbnNpZGUgcXVvdGVzICovCisJCQlpZiAoIWluX3F1b3RlKQorCQkJCW1hdGNoID0g dmVjdG9yOF9vcih2ZWN0b3I4X2VxKGNodW5rLCBubCksIHZlY3RvcjhfZXEoY2h1bmssIGNyKSk7 CisKKwkJCWlmIChpc19jc3YpCisJCQl7CisJCQkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1hdGNoLCB2 ZWN0b3I4X2VxKGNodW5rLCBxdW90ZSkpOworCQkJCWlmIChlc2NhcGVjICE9ICdcMCcpCisJCQkJ CW1hdGNoID0gdmVjdG9yOF9vcihtYXRjaCwgdmVjdG9yOF9lcShjaHVuaywgZXNjYXBlKSk7CisJ CQl9CisJCQllbHNlCisJCQkJbWF0Y2ggPSB2ZWN0b3I4X29yKG1hdGNoLCB2ZWN0b3I4X2VxKGNo dW5rLCBicykpOworCisJCQkvKiBDaGVjayBpZiB3ZSBmb3VuZCBhbnkgc3BlY2lhbCBjaGFyYWN0 ZXJzICovCisJCQltYXNrID0gdmVjdG9yOF9oaWdoYml0X21hc2sobWF0Y2gpOworCQkJaWYgKG1h c2sgIT0gMCkKKwkJCXsKKwkJCQkvKgorCQkJCSAqIEZvdW5kIGEgc3BlY2lhbCBjaGFyYWN0ZXIu IEFkdmFuY2UgdXAgdG8gdGhhdCBwb2ludCBhbmQgbGV0CisJCQkJICogdGhlIHNjYWxhciBjb2Rl IGhhbmRsZSBpdC4KKwkJCQkgKi8KKwkJCQlpbnQJCQlhZHZhbmNlID0gcGdfcmlnaHRtb3N0X29u ZV9wb3MzMihtYXNrKTsKKworCQkJCWlucHV0X2J1Zl9wdHIgKz0gYWR2YW5jZTsKKwkJCX0KKwkJ CWVsc2UKKwkJCXsKKwkJCQkvKiBObyBzcGVjaWFsIGNoYXJhY3RlcnMgZm91bmQsIHNvIHNraXAg dGhlIGVudGlyZSBjaHVuayAqLworCQkJCWlucHV0X2J1Zl9wdHIgKz0gc2l6ZW9mKFZlY3Rvcjgp OworCQkJCWNvbnRpbnVlOworCQkJfQorCQl9CisjZW5kaWYKKwogCQkvKiBPSyB0byBmZXRjaCBh IGNoYXJhY3RlciAqLwogCQlwcmV2X3Jhd19wdHIgPSBpbnB1dF9idWZfcHRyOwogCQljID0gY29w eV9pbnB1dF9idWZbaW5wdXRfYnVmX3B0cisrXTsKLS0gCjIuNTEuMAoK --0000000000001222d60641477348 Content-Type: text/x-patch; charset="US-ASCII"; name="v3-0002-COPY-SIMD-per-line-heuristic.patch" Content-Disposition: attachment; filename="v3-0002-COPY-SIMD-per-line-heuristic.patch" Content-Transfer-Encoding: base64 Content-ID: X-Attachment-Id: f_mgtid4y61 RnJvbSBhZDA1MDU4M2QzYzE0YmRlYzQ0MjY2ZDhkMjExMGIzODRmYTlkN2RjIE1vbiBTZXAgMTcg MDA6MDA6MDAgMjAwMQpGcm9tOiBOYXppciBCaWxhbCBZYXZ1eiA8YnlhdnV6ODFAZ21haWwuY29t PgpEYXRlOiBUdWUsIDE0IE9jdCAyMDI1IDEzOjE4OjEzICswMzAwClN1YmplY3Q6IFtQQVRDSCB2 MyAyLzJdIENPUFkgU0lNRCBwZXItbGluZSBoZXVyaXN0aWMKCi0tLQogc3JjL2luY2x1ZGUvY29t bWFuZHMvY29weWZyb21faW50ZXJuYWwuaCB8ICA3ICsrCiBzcmMvYmFja2VuZC9jb21tYW5kcy9j b3B5ZnJvbS5jICAgICAgICAgIHwgIDYgKysKIHNyYy9iYWNrZW5kL2NvbW1hbmRzL2NvcHlmcm9t cGFyc2UuYyAgICAgfCA4MiArKysrKysrKysrKysrKysrKysrKysrLS0KIDMgZmlsZXMgY2hhbmdl ZCwgODkgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9zcmMvaW5j bHVkZS9jb21tYW5kcy9jb3B5ZnJvbV9pbnRlcm5hbC5oIGIvc3JjL2luY2x1ZGUvY29tbWFuZHMv Y29weWZyb21faW50ZXJuYWwuaAppbmRleCBjOGIyMmFmMjJkOC4uOWRkMzEzMjBmNTIgMTAwNjQ0 Ci0tLSBhL3NyYy9pbmNsdWRlL2NvbW1hbmRzL2NvcHlmcm9tX2ludGVybmFsLmgKKysrIGIvc3Jj L2luY2x1ZGUvY29tbWFuZHMvY29weWZyb21faW50ZXJuYWwuaApAQCAtODksNiArODksMTMgQEAg dHlwZWRlZiBzdHJ1Y3QgQ29weUZyb21TdGF0ZURhdGEKIAljb25zdCBjaGFyICpjdXJfYXR0dmFs OwkJLyogY3VycmVudCBhdHQgdmFsdWUgZm9yIGVycm9yIG1lc3NhZ2VzICovCiAJYm9vbAkJcmVs bmFtZV9vbmx5OwkvKiBkb24ndCBvdXRwdXQgbGluZSBudW1iZXIsIGF0dCwgZXRjLiAqLwogCisJ LyogU0lNRCB2YXJpYWJsZXMgKi8KKwlib29sCQlzaW1kX2NvbnRpbnVlOworCWJvb2wJCXNpbWRf aW5pdGlhbGl6ZWQ7CisJdWludDE2CQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGU7CisJdWludDE2CQlz aW1kX2N1cnJlbnRfc2xlZXBfY3ljbGU7CisKKwogCS8qCiAJICogV29ya2luZyBzdGF0ZQogCSAq LwpkaWZmIC0tZ2l0IGEvc3JjL2JhY2tlbmQvY29tbWFuZHMvY29weWZyb20uYyBiL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKaW5kZXggMTI3ODE5NjNiNGYuLjRiZGZkOTZjMjQ0IDEw MDY0NAotLS0gYS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbS5jCisrKyBiL3NyYy9iYWNr ZW5kL2NvbW1hbmRzL2NvcHlmcm9tLmMKQEAgLTE3MjEsNiArMTcyMSwxMiBAQCBCZWdpbkNvcHlG cm9tKFBhcnNlU3RhdGUgKnBzdGF0ZSwKIAljc3RhdGUtPmN1cl9hdHR2YWwgPSBOVUxMOwogCWNz dGF0ZS0+cmVsbmFtZV9vbmx5ID0gZmFsc2U7CiAKKwkvKiBJbml0aWFsaXplIFNJTUQgdmFyaWFi bGVzICovCisJY3N0YXRlLT5zaW1kX2NvbnRpbnVlID0gZmFsc2U7CisJY3N0YXRlLT5zaW1kX2lu aXRpYWxpemVkID0gZmFsc2U7CisJY3N0YXRlLT5zaW1kX2N1cnJlbnRfc2xlZXBfY3ljbGUgPSAw OworCWNzdGF0ZS0+c2ltZF9sYXN0X3NsZWVwX2N5Y2xlID0gMDsKKwogCS8qCiAJICogQWxsb2Nh dGUgYnVmZmVycyBmb3IgdGhlIGlucHV0IHBpcGVsaW5lLgogCSAqCmRpZmYgLS1naXQgYS9zcmMv YmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMgYi9zcmMvYmFja2VuZC9jb21tYW5kcy9j b3B5ZnJvbXBhcnNlLmMKaW5kZXggOTk5NTlhNDBmYWIuLjI0Y2VmNTRlNWU0IDEwMDY0NAotLS0g YS9zcmMvYmFja2VuZC9jb21tYW5kcy9jb3B5ZnJvbXBhcnNlLmMKKysrIGIvc3JjL2JhY2tlbmQv Y29tbWFuZHMvY29weWZyb21wYXJzZS5jCkBAIC0xNDMsMTIgKzE0MywxNCBAQCBzdGF0aWMgY29u c3QgY2hhciBCaW5hcnlTaWduYXR1cmVbMTFdID0gIlBHQ09QWVxuXDM3N1xyXG5cMCI7CiAKIC8q IG5vbi1leHBvcnQgZnVuY3Rpb24gcHJvdG90eXBlcyAqLwogc3RhdGljIGJvb2wgQ29weVJlYWRM aW5lKENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2Nzdik7Ci1zdGF0aWMgYm9vbCBDb3B5 UmVhZExpbmVUZXh0KENvcHlGcm9tU3RhdGUgY3N0YXRlLCBib29sIGlzX2Nzdik7CiBzdGF0aWMg aW50CUNvcHlSZWFkQXR0cmlidXRlc1RleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUpOwogc3RhdGlj IGludAlDb3B5UmVhZEF0dHJpYnV0ZXNDU1YoQ29weUZyb21TdGF0ZSBjc3RhdGUpOwogc3RhdGlj IERhdHVtIENvcHlSZWFkQmluYXJ5QXR0cmlidXRlKENvcHlGcm9tU3RhdGUgY3N0YXRlLCBGbWdy SW5mbyAqZmxpbmZvLAogCQkJCQkJCQkJIE9pZCB0eXBpb3BhcmFtLCBpbnQzMiB0eXBtb2QsCiAJ CQkJCQkJCQkgYm9vbCAqaXNudWxsKTsKK3N0YXRpYyBwZ19hdHRyaWJ1dGVfYWx3YXlzX2lubGlu ZSBib29sIENvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsCisJCQkJCQkJCQkJ CQkJCWJvb2wgaXNfY3N2LAorCQkJCQkJCQkJCQkJCQlib29sIHNpbWRfY29udGludWUpOwogc3Rh dGljIHBnX2F0dHJpYnV0ZV9hbHdheXNfaW5saW5lIGJvb2wgQ29weUZyb21UZXh0TGlrZU9uZVJv dyhDb3B5RnJvbVN0YXRlIGNzdGF0ZSwKIAkJCQkJCQkJCQkJCQkJCSAgRXhwckNvbnRleHQgKmVj b250ZXh0LAogCQkJCQkJCQkJCQkJCQkJICBEYXR1bSAqdmFsdWVzLApAQCAtMTE3Myw4ICsxMTc1 LDIzIEBAIENvcHlSZWFkTGluZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJ cmVzZXRTdHJpbmdJbmZvKCZjc3RhdGUtPmxpbmVfYnVmKTsKIAljc3RhdGUtPmxpbmVfYnVmX3Zh bGlkID0gZmFsc2U7CiAKLQkvKiBQYXJzZSBkYXRhIGFuZCB0cmFuc2ZlciBpbnRvIGxpbmVfYnVm ICovCi0JcmVzdWx0ID0gQ29weVJlYWRMaW5lVGV4dChjc3RhdGUsIGlzX2Nzdik7CisJLyogSWYg dGhhdCBpcyB0aGUgZmlyc3QgdGltZSB3ZSBkbyByZWFkLCBpbml0YWxpemUgdGhlIFNJTUQgKi8K KwlpZiAodW5saWtlbHkoIWNzdGF0ZS0+c2ltZF9pbml0aWFsaXplZCkpCisJeworCQljc3RhdGUt PnNpbWRfaW5pdGlhbGl6ZWQgPSB0cnVlOworCQljc3RhdGUtPnNpbWRfY29udGludWUgPSB0cnVl OworCQljc3RhdGUtPnNpbWRfY3VycmVudF9zbGVlcF9jeWNsZSA9IDA7CisJCWNzdGF0ZS0+c2lt ZF9sYXN0X3NsZWVwX2N5Y2xlID0gMDsKKwl9CisKKwkvKgorCSAqIFBhcnNlIGRhdGEgYW5kIHRy YW5zZmVyIGludG8gbGluZV9idWYuIFRvIGdldCBiZW5lZml0IGZyb20gaW5saW5pbmcsCisJICog Y2FsbCBDb3B5UmVhZExpbmVUZXh0KCkgd2l0aCB0aGUgY29uc3RhbnQgYm9vbGVhbiB2YXJpYWJs ZXMuCisJICovCisJaWYgKGNzdGF0ZS0+c2ltZF9jb250aW51ZSkKKwkJcmVzdWx0ID0gQ29weVJl YWRMaW5lVGV4dChjc3RhdGUsIGlzX2NzdiwgdHJ1ZSk7CisJZWxzZQorCQlyZXN1bHQgPSBDb3B5 UmVhZExpbmVUZXh0KGNzdGF0ZSwgaXNfY3N2LCBmYWxzZSk7CiAKIAlpZiAocmVzdWx0KQogCXsK QEAgLTEyNDEsOCArMTI1OCw4IEBAIENvcHlSZWFkTGluZShDb3B5RnJvbVN0YXRlIGNzdGF0ZSwg Ym9vbCBpc19jc3YpCiAvKgogICogQ29weVJlYWRMaW5lVGV4dCAtIGlubmVyIGxvb3Agb2YgQ29w eVJlYWRMaW5lIGZvciB0ZXh0IG1vZGUKICAqLwotc3RhdGljIGJvb2wKLUNvcHlSZWFkTGluZVRl eHQoQ29weUZyb21TdGF0ZSBjc3RhdGUsIGJvb2wgaXNfY3N2KQorc3RhdGljIHBnX2F0dHJpYnV0 ZV9hbHdheXNfaW5saW5lIGJvb2wKK0NvcHlSZWFkTGluZVRleHQoQ29weUZyb21TdGF0ZSBjc3Rh dGUsIGJvb2wgaXNfY3N2LCBib29sIHNpbWRfY29udGludWUpCiB7CiAJY2hhcgkgICAqY29weV9p bnB1dF9idWY7CiAJaW50CQkJaW5wdXRfYnVmX3B0cjsKQEAgLTEyNTgsMTEgKzEyNzUsMTYgQEAg Q29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJY2hh cgkJZXNjYXBlYyA9ICdcMCc7CiAKICNpZm5kZWYgVVNFX05PX1NJTUQKKyNkZWZpbmUgU0lNRF9T TEVFUF9NQVggMTAyNAorI2RlZmluZSBTSU1EX0FEVkFOQ0VfQVRfTEVBU1QgNQogCVZlY3RvcjgJ CW5sID0gdmVjdG9yOF9icm9hZGNhc3QoJ1xuJyk7CiAJVmVjdG9yOAkJY3IgPSB2ZWN0b3I4X2Jy b2FkY2FzdCgnXHInKTsKIAlWZWN0b3I4CQlicyA9IHZlY3RvcjhfYnJvYWRjYXN0KCdcXCcpOwog CVZlY3RvcjgJCXF1b3RlID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CiAJVmVjdG9yOAkJZXNjYXBl ID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CisKKwl1aW50NjQJCXNpbWRfdG90YWxfY3ljbGUgPSAw OworCXVpbnQ2NAkJc2ltZF90b3RhbF9hZHZhbmNlID0gMDsKICNlbmRpZgogCiAJaWYgKGlzX2Nz dikKQEAgLTEzNTgsMTIgKzEzODAsMTQgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRl IGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJCSAqIHNlcXVlbnRpYWxseS4gLSBUaGUgcmVtYWluaW5n IGJ1ZmZlciBpcyBzbWFsbGVyIHRoYW4gb25lIHZlY3RvcgogCQkgKiB3aWR0aCAoc2l6ZW9mKFZl Y3RvcjgpKTsgU0lNRCBvcGVyYXRlcyBvbiBmaXhlZC1zaXplIGNodW5rcy4KIAkJICovCi0JCWlm ICghbGFzdF93YXNfZXNjICYmIGNvcHlfYnVmX2xlbiAtIGlucHV0X2J1Zl9wdHIgPj0gc2l6ZW9m KFZlY3RvcjgpKQorCQlpZiAoc2ltZF9jb250aW51ZSAmJiAhbGFzdF93YXNfZXNjICYmIGNvcHlf YnVmX2xlbiAtIGlucHV0X2J1Zl9wdHIgPj0gc2l6ZW9mKFZlY3RvcjgpKQogCQl7CiAJCQlWZWN0 b3I4CQljaHVuazsKIAkJCVZlY3RvcjgJCW1hdGNoID0gdmVjdG9yOF9icm9hZGNhc3QoMCk7CiAJ CQl1aW50MzIJCW1hc2s7CiAKKwkJCXNpbWRfdG90YWxfY3ljbGUrKzsKKwogCQkJLyogTG9hZCBh IGNodW5rIG9mIGRhdGEgaW50byBhIHZlY3RvciByZWdpc3RlciAqLwogCQkJdmVjdG9yOF9sb2Fk KCZjaHVuaywgKGNvbnN0IHVpbnQ4ICopICZjb3B5X2lucHV0X2J1ZltpbnB1dF9idWZfcHRyXSk7 CiAKQEAgLTEzOTEsMTEgKzE0MTUsMTMgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRl IGNzdGF0ZSwgYm9vbCBpc19jc3YpCiAJCQkJaW50CQkJYWR2YW5jZSA9IHBnX3JpZ2h0bW9zdF9v bmVfcG9zMzIobWFzayk7CiAKIAkJCQlpbnB1dF9idWZfcHRyICs9IGFkdmFuY2U7CisJCQkJc2lt ZF90b3RhbF9hZHZhbmNlICs9IGFkdmFuY2U7CiAJCQl9CiAJCQllbHNlCiAJCQl7CiAJCQkJLyog Tm8gc3BlY2lhbCBjaGFyYWN0ZXJzIGZvdW5kLCBzbyBza2lwIHRoZSBlbnRpcmUgY2h1bmsgKi8K IAkJCQlpbnB1dF9idWZfcHRyICs9IHNpemVvZihWZWN0b3I4KTsKKwkJCQlzaW1kX3RvdGFsX2Fk dmFuY2UgKz0gc2l6ZW9mKFZlY3RvcjgpOwogCQkJCWNvbnRpbnVlOwogCQkJfQogCQl9CkBAIC0x NjAzLDYgKzE2MjksNTAgQEAgQ29weVJlYWRMaW5lVGV4dChDb3B5RnJvbVN0YXRlIGNzdGF0ZSwg Ym9vbCBpc19jc3YpCiAJCX0KIAl9CQkJCQkJCS8qIGVuZCBvZiBvdXRlciBsb29wICovCiAKKyNp Zm5kZWYgVVNFX05PX1NJTUQKKworCS8qIFNJTUQgd2FzIGVuYWJsZWQgKi8KKwlpZiAoc2ltZF9j b250aW51ZSkKKwl7CisJCS8qIFNJTUQgaXMgd29ydGggKi8KKwkJaWYgKHNpbWRfdG90YWxfY3lj bGUgJiYgc2ltZF90b3RhbF9hZHZhbmNlIC8gc2ltZF90b3RhbF9jeWNsZSA+PSBTSU1EX0FEVkFO Q0VfQVRfTEVBU1QpCisJCXsKKwkJCUFzc2VydChjc3RhdGUtPnNpbWRfY3VycmVudF9zbGVlcF9j eWNsZSA9PSAwKTsKKwkJCWNzdGF0ZS0+c2ltZF9sYXN0X3NsZWVwX2N5Y2xlID4+PSAxOworCQl9 CisJCS8qIFNJTUQgd2FzIGVuYWJsZWQgYnV0IGl0IGlzbid0IHdvcnRoICovCisJCWVsc2UKKwkJ eworCQkJdWludDE2CQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPSBjc3RhdGUtPnNpbWRfbGFzdF9z bGVlcF9jeWNsZTsKKworCQkJY3N0YXRlLT5zaW1kX2NvbnRpbnVlID0gZmFsc2U7CisKKwkJCWlm IChzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPT0gMCkKKwkJCQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGUg PSAxOworCQkJZWxzZSBpZiAoc2ltZF9sYXN0X3NsZWVwX2N5Y2xlID49IFNJTURfU0xFRVBfTUFY IC8gMikKKwkJCQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPSBTSU1EX1NMRUVQX01BWDsKKwkJCWVs c2UKKwkJCQlzaW1kX2xhc3Rfc2xlZXBfY3ljbGUgPDw9IDE7CisJCQljc3RhdGUtPnNpbWRfY3Vy cmVudF9zbGVlcF9jeWNsZSA9IHNpbWRfbGFzdF9zbGVlcF9jeWNsZTsKKwkJCWNzdGF0ZS0+c2lt ZF9sYXN0X3NsZWVwX2N5Y2xlID0gc2ltZF9sYXN0X3NsZWVwX2N5Y2xlOworCQl9CisJfQorCS8q IFNJTUQgd2FzIGRpc2FibGVkICovCisJZWxzZQorCXsKKwkJLyoKKwkJICogV2Ugc2hvdWxkIGNv bWUgaGVyZSB3aXRoIGRlY3JlbWVudGluZworCQkgKiBjc3RhdGUtPnNpbWRfY3VycmVudF9zbGVl cF9jeWNsZSBmcm9tIGEgcG9zaXRpdmUgbnVtYmVyLgorCQkgKi8KKwkJQXNzZXJ0KGNzdGF0ZS0+ c2ltZF9jdXJyZW50X3NsZWVwX2N5Y2xlICE9IDApOworCQljc3RhdGUtPnNpbWRfY3VycmVudF9z bGVlcF9jeWNsZS0tOworCisJCWlmIChjc3RhdGUtPnNpbWRfY3VycmVudF9zbGVlcF9jeWNsZSA9 PSAwKQorCQkJY3N0YXRlLT5zaW1kX2NvbnRpbnVlID0gdHJ1ZTsKKwl9CisKKyNlbmRpZgorCiAJ LyoKIAkgKiBUcmFuc2ZlciBhbnkgc3RpbGwtdW5jb3BpZWQgZGF0YSB0byBsaW5lX2J1Zi4KIAkg Ki8KLS0gCjIuNTEuMAoK --0000000000001222d60641477348--