From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from simark.ca by simark.ca with LMTP id YWHEK9212WLJPBgAWB0awg (envelope-from ) for ; Thu, 21 Jul 2022 16:23:57 -0400 Received: by simark.ca (Postfix, from userid 112) id A49F51E5EA; Thu, 21 Jul 2022 16:23:57 -0400 (EDT) Authentication-Results: simark.ca; dkim=pass (1024-bit key; secure) header.d=sourceware.org header.i=@sourceware.org header.a=rsa-sha256 header.s=default header.b=a3+mZi5D; dkim-atps=neutral X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on simark.ca X-Spam-Level: X-Spam-Status: No, score=-4.0 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,MAILING_LIST_MULTI,NICE_REPLY_A,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.6 Received: from sourceware.org (server2.sourceware.org [8.43.85.97]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (2048 bits) server-digest SHA256) (No client certificate requested) by simark.ca (Postfix) with ESMTPS id 9B0131E13B for ; Thu, 21 Jul 2022 16:23:56 -0400 (EDT) Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id BC868383568B for ; Thu, 21 Jul 2022 20:23:55 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org BC868383568B DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=sourceware.org; s=default; t=1658435035; bh=+5qJztFy5+GYAhVrVQc9NGtlJelrCEJBHynnQHMcR/8=; h=Date:Subject:To:References:In-Reply-To:List-Id:List-Unsubscribe: List-Archive:List-Post:List-Help:List-Subscribe:From:Reply-To:Cc: From; b=a3+mZi5DUx2dBGI1+YaSq78isJJKqofXxvlFoEoDomE7u4LUEQSBdHmu2edGHzDUx COLg2fqgBVCYnxdo8JJqoTri2CY+wpRgYhBhOINMh2+7LBXYU3hTJSumU8MPgYFQTN xKM42+SWXRmtMKF0pBXJOepAQtfqFS0qzWSAgAJg= Received: from smtp-out1.suse.de (smtp-out1.suse.de [195.135.220.28]) by sourceware.org (Postfix) with ESMTPS id B85A338356A1 for ; Thu, 21 Jul 2022 20:23:34 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org B85A338356A1 Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by smtp-out1.suse.de (Postfix) with ESMTPS id C8372375C3; Thu, 21 Jul 2022 20:23:33 +0000 (UTC) Received: from imap2.suse-dmz.suse.de (imap2.suse-dmz.suse.de [192.168.254.74]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature ECDSA (P-521) server-digest SHA512) (No client certificate requested) by imap2.suse-dmz.suse.de (Postfix) with ESMTPS id A8F7913A1B; Thu, 21 Jul 2022 20:23:33 +0000 (UTC) Received: from dovecot-director2.suse.de ([192.168.254.65]) by imap2.suse-dmz.suse.de with ESMTPSA id P2IXKMW12WKqTAAAMHmgww (envelope-from ); Thu, 21 Jul 2022 20:23:33 +0000 Content-Type: multipart/mixed; boundary="------------Or98yqFm4lDjw9MNkYd6eAit" Message-ID: <75931310-5dcd-059d-9221-6c94dbcd231f@suse.de> Date: Thu, 21 Jul 2022 22:23:33 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.0 Subject: Re: [PATCH][gdbsupport] Use task size in parallel_for_each Content-Language: en-US To: Pedro Alves , gdb-patches@sourceware.org References: <20220718194219.GA16823@delia.home> <4fc23fcd-c15d-7622-8b51-cc48cd3cba16@palves.net> In-Reply-To: <4fc23fcd-c15d-7622-8b51-cc48cd3cba16@palves.net> X-BeenThere: gdb-patches@sourceware.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gdb-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Tom de Vries via Gdb-patches Reply-To: Tom de Vries Cc: Tom Tromey Errors-To: gdb-patches-bounces+public-inbox=simark.ca@sourceware.org Sender: "Gdb-patches" This is a multi-part message in MIME format. --------------Or98yqFm4lDjw9MNkYd6eAit Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit On 7/21/22 19:35, Pedro Alves wrote: > On 2022-07-18 8:42 p.m., Tom de Vries via Gdb-patches wrote: >> Hi, >> >> Ensuring a fair distribution over the worker threads and main thread in terms >> of number of CUs might not be the most efficient way, given that CUs can vary >> in size. >> >> Fix this by: >> - adding a task_size_ptr parameter to parallel_for_each, >> defaulting to nullptr, >> - using per_cu->get_length () as the task size in the parallel_for_each >> in dwarf2_build_psymtabs_hard, and >> - using the task size in parallel_for_each to distribute similarly-sized tasks >> to the threads. >> >> I've used this experiment to verify the performance impact: >> ... >> $ for n in $(seq 1 10); do \ >> time gdb -q -batch ~/firefox/libxul.so-93.0-1.1.x86_64.debug \ >> 2>&1 \ >> | grep "real:"; \ >> done >> ... >> and without the patch got: >> ... >> real: 4.71 >> real: 4.88 >> real: 4.29 >> real: 4.30 >> real: 4.65 >> real: 4.27 >> real: 4.27 >> real: 4.27 >> real: 4.75 >> real: 4.41 >> ... >> and with the patch: >> ... >> real: 3.68 >> real: 3.81 >> real: 3.80 >> real: 3.68 >> real: 3.75 >> real: 3.69 >> real: 3.69 >> real: 3.74 >> real: 3.67 >> real: 3.74 >> ... >> so that seems a reasonable improvement. > > Nice. > :) >> >> With parallel_for_each_debug set to true, we get some more details about the >> difference in behaviour. Without the patch we have: >> ... >> Parallel for: n_elements: 2818 >> Parallel for: minimum elements per thread: 1 >> Parallel for: elts_per_thread: 704 >> Parallel for: elements on worker thread 0 : 705 >> Parallel for: elements on worker thread 1 : 705 >> Parallel for: elements on worker thread 2 : 704 >> Parallel for: elements on worker thread 3 : 0 >> Parallel for: elements on main thread : 704 >> ... >> and with the patch: >> ... >> Parallel for: n_elements: 2818 >> Parallel for: total_size: 1483674865 >> Parallel for: size_per_thread: 370918716 >> Parallel for: elements on worker thread 0 : 752 (size: 371811790) >> Parallel for: elements on worker thread 1 : 360 (size: 371509370) >> Parallel for: elements on worker thread 2 : 1130 (size: 372681710) >> Parallel for: elements on worker thread 3 : 0 (size: 0) >> Parallel for: elements on main thread : 576 (size: 367671995) >> ... >> >> Tested on x86_64-linux. >> >> Any comments? > > I'll defer to Tromey. Just a passerby comment, and a comment on the code itself > if we follow this approach, below. > > My passerby comment is that I wonder whether we should consider switching to a work > stealing implementation, so that threads that are done with their chunk would grab another > chunk from the work pool. I think this would spare us from having to worry about these > distribution heuristics. > I also though about a dynamic solution, but decided to try the simplest solution first. Anyway, with a dynamic solution you still might want to decide how big a chunck is, for which you could still need this type of heuristics. >> @@ -7059,6 +7059,13 @@ dwarf2_build_psymtabs_hard (dwarf2_per_objfile *per_objfile) >> >> using iter_type = decltype (per_bfd->all_comp_units.begin ()); >> >> + std::function task_size >> + = [=] (iter_type iter) >> + { >> + dwarf2_per_cu_data *per_cu = iter->get (); >> + return per_cu->length (); >> + }; >> + >> /* Each thread returns a pair holding a cooked index, and a vector >> of errors that should be printed. The latter is done because >> GDB's I/O system is not thread-safe. run_on_main_thread could be >> @@ -7087,7 +7094,7 @@ dwarf2_build_psymtabs_hard (dwarf2_per_objfile *per_objfile) >> } >> } >> return result_type (thread_storage.release (), std::move (errors)); >> - }); >> + }, &task_size); >> >> /* Only show a given exception a single time. */ >> std::unordered_set seen_exceptions; >> diff --git a/gdbsupport/parallel-for.h b/gdbsupport/parallel-for.h >> index bf40f125f0f..3c9269574df 100644 >> --- a/gdbsupport/parallel-for.h >> +++ b/gdbsupport/parallel-for.h >> @@ -134,7 +134,9 @@ typename gdb::detail::par_for_accumulator< >> typename std::result_of::type >> >::result_type >> parallel_for_each (unsigned n, RandomIt first, RandomIt last, >> - RangeFunction callback) >> + RangeFunction callback, >> + std::function *task_size_ptr >> + = (std::function *)nullptr) > > That use of a std::function pointer looks odd. AFAICT, TASK_SIZE_PTR is only ever called > as a callback by parallel_for_each, for setup, in the calling thread, and isn't stored > anywhere, right? If so, gdb::function_view instead should work, is lightweight, and is > nullable, meaning you don't need a pointer. > > And then, at the caller, just using a lambda instead of a std::function should work too: > > auto task_size = [=] (iter_type iter) > { > dwarf2_per_cu_data *per_cu = iter->get (); > return per_cu->length (); > }; I've tried that (attached) but ran into the usual template error mess, not sure how I could solve that yet. Thanks, - Tom --------------Or98yqFm4lDjw9MNkYd6eAit Content-Type: text/x-patch; charset=UTF-8; name="0001-gdbsupport-Use-task-size-in-parallel_for_each.patch" Content-Disposition: attachment; filename="0001-gdbsupport-Use-task-size-in-parallel_for_each.patch" Content-Transfer-Encoding: base64 W2dkYnN1cHBvcnRdIFVzZSB0YXNrIHNpemUgaW4gcGFyYWxsZWxfZm9yX2VhY2gKCkVuc3Vy aW5nIGEgZmFpciBkaXN0cmlidXRpb24gb3ZlciB0aGUgd29ya2VyIHRocmVhZHMgYW5kIG1h aW4gdGhyZWFkIGluIHRlcm1zCm9mIG51bWJlciBvZiBDVXMgbWlnaHQgbm90IGJlIHRoZSBt b3N0IGVmZmljaWVudCB3YXksIGdpdmVuIHRoYXQgQ1VzIGNhbiB2YXJ5CmluIHNpemUuCgpG aXggdGhpcyBieToKLSBhZGRpbmcgYSB0YXNrX3NpemVfcHRyIHBhcmFtZXRlciB0byBwYXJh bGxlbF9mb3JfZWFjaCwKICBkZWZhdWx0aW5nIHRvIG51bGxwdHIsCi0gdXNpbmcgcGVyX2N1 LT5nZXRfbGVuZ3RoICgpIGFzIHRoZSB0YXNrIHNpemUgaW4gdGhlIHBhcmFsbGVsX2Zvcl9l YWNoCiAgaW4gZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQsIGFuZAotIHVzaW5nIHRoZSB0 YXNrIHNpemUgaW4gcGFyYWxsZWxfZm9yX2VhY2ggdG8gZGlzdHJpYnV0ZSBzaW1pbGFybHkt c2l6ZWQgdGFza3MKICB0byB0aGUgdGhyZWFkcy4KCkkndmUgdXNlZCB0aGlzIGV4cGVyaW1l bnQgdG8gdmVyaWZ5IHRoZSBwZXJmb3JtYW5jZSBpbXBhY3Q6Ci4uLgokIGZvciBuIGluICQo c2VxIDEgMTApOyBkbyBcCiAgICB0aW1lIGdkYiAtcSAtYmF0Y2ggfi9maXJlZm94L2xpYnh1 bC5zby05My4wLTEuMS54ODZfNjQuZGVidWcgXAogICAgMj4mMSBcCiAgICB8IGdyZXAgInJl YWw6IjsgXAogIGRvbmUKLi4uCmFuZCB3aXRob3V0IHRoZSBwYXRjaCBnb3Q6Ci4uLgpyZWFs OiA0LjcxCnJlYWw6IDQuODgKcmVhbDogNC4yOQpyZWFsOiA0LjMwCnJlYWw6IDQuNjUKcmVh bDogNC4yNwpyZWFsOiA0LjI3CnJlYWw6IDQuMjcKcmVhbDogNC43NQpyZWFsOiA0LjQxCi4u LgphbmQgd2l0aCB0aGUgcGF0Y2g6Ci4uLgpyZWFsOiAzLjY4CnJlYWw6IDMuODEKcmVhbDog My44MApyZWFsOiAzLjY4CnJlYWw6IDMuNzUKcmVhbDogMy42OQpyZWFsOiAzLjY5CnJlYWw6 IDMuNzQKcmVhbDogMy42NwpyZWFsOiAzLjc0Ci4uLgpzbyB0aGF0IHNlZW1zIGEgcmVhc29u YWJsZSBpbXByb3ZlbWVudC4KCldpdGggcGFyYWxsZWxfZm9yX2VhY2hfZGVidWcgc2V0IHRv IHRydWUsIHdlIGdldCBzb21lIG1vcmUgZGV0YWlsIGFib3V0CnRoZSBkaWZmZXJlbmNlIGlu IGJlaGF2aW91ci4gIFdpdGhvdXQgdGhlIHBhdGNoIHdlIGhhdmU6Ci4uLgpQYXJhbGxlbCBm b3I6IG5fZWxlbWVudHM6IDI4MTgKUGFyYWxsZWwgZm9yOiBtaW5pbXVtIGVsZW1lbnRzIHBl ciB0aHJlYWQ6IDEKUGFyYWxsZWwgZm9yOiBlbHRzX3Blcl90aHJlYWQ6IDcwNApQYXJhbGxl bCBmb3I6IGVsZW1lbnRzIG9uIHdvcmtlciB0aHJlYWQgMCAgICAgICA6IDcwNQpQYXJhbGxl bCBmb3I6IGVsZW1lbnRzIG9uIHdvcmtlciB0aHJlYWQgMSAgICAgICA6IDcwNQpQYXJhbGxl bCBmb3I6IGVsZW1lbnRzIG9uIHdvcmtlciB0aHJlYWQgMiAgICAgICA6IDcwNApQYXJhbGxl bCBmb3I6IGVsZW1lbnRzIG9uIHdvcmtlciB0aHJlYWQgMyAgICAgICA6IDAKUGFyYWxsZWwg Zm9yOiBlbGVtZW50cyBvbiBtYWluIHRocmVhZCAgICAgICAgICAgOiA3MDQKLi4uCmFuZCB3 aXRoIHRoZSBwYXRjaDoKLi4uClBhcmFsbGVsIGZvcjogbl9lbGVtZW50czogMjgxOApQYXJh bGxlbCBmb3I6IHRvdGFsX3NpemU6IDE0ODM2NzQ4NjUKUGFyYWxsZWwgZm9yOiBzaXplX3Bl cl90aHJlYWQ6IDM3MDkxODcxNgpQYXJhbGxlbCBmb3I6IGVsZW1lbnRzIG9uIHdvcmtlciB0 aHJlYWQgMCAgICAgICA6IDc1MiAgIChzaXplOiAzNzE4MTE3OTApClBhcmFsbGVsIGZvcjog ZWxlbWVudHMgb24gd29ya2VyIHRocmVhZCAxICAgICAgIDogMzYwICAgKHNpemU6IDM3MTUw OTM3MCkKUGFyYWxsZWwgZm9yOiBlbGVtZW50cyBvbiB3b3JrZXIgdGhyZWFkIDIgICAgICAg OiAxMTMwICAoc2l6ZTogMzcyNjgxNzEwKQpQYXJhbGxlbCBmb3I6IGVsZW1lbnRzIG9uIHdv cmtlciB0aHJlYWQgMyAgICAgICA6IDAgICAgIChzaXplOiAwKQpQYXJhbGxlbCBmb3I6IGVs ZW1lbnRzIG9uIG1haW4gdGhyZWFkICAgICAgICAgICA6IDU3NiAgIChzaXplOiAzNjc2NzE5 OTUpCi4uLgoKVGVzdGVkIG9uIHg4Nl82NC1saW51eC4KCi0tLQogZ2RiL2R3YXJmMi9yZWFk LmMgICAgICAgICB8ICA4ICsrKy0KIGdkYnN1cHBvcnQvcGFyYWxsZWwtZm9yLmggfCA5NyAr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrLS0tLS0tLS0tLQogMiBmaWxl cyBjaGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspLCAyMiBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9nZGIvZHdhcmYyL3JlYWQuYyBiL2dkYi9kd2FyZjIvcmVhZC5jCmluZGV4IDQyMjMw NjA3ZmUwLi4yM2MzODczY2JhNiAxMDA2NDQKLS0tIGEvZ2RiL2R3YXJmMi9yZWFkLmMKKysr IGIvZ2RiL2R3YXJmMi9yZWFkLmMKQEAgLTcwNjcsNiArNzA2NywxMiBAQCBkd2FyZjJfYnVp bGRfcHN5bXRhYnNfaGFyZCAoZHdhcmYyX3Blcl9vYmpmaWxlICpwZXJfb2JqZmlsZSkKIAog ICAgIHVzaW5nIGl0ZXJfdHlwZSA9IGRlY2x0eXBlIChwZXJfYmZkLT5hbGxfY29tcF91bml0 cy5iZWdpbiAoKSk7CiAKKyAgICBhdXRvIHRhc2tfc2l6ZSA9IFs9XSAoaXRlcl90eXBlIGl0 ZXIpCisgICAgICB7CisJZHdhcmYyX3Blcl9jdV9kYXRhICpwZXJfY3UgPSBpdGVyLT5nZXQg KCk7CisJcmV0dXJuIHBlcl9jdS0+bGVuZ3RoICgpOworICAgICAgfTsKKwogICAgIC8qIEVh Y2ggdGhyZWFkIHJldHVybnMgYSBwYWlyIGhvbGRpbmcgYSBjb29rZWQgaW5kZXgsIGFuZCBh IHZlY3RvcgogICAgICAgIG9mIGVycm9ycyB0aGF0IHNob3VsZCBiZSBwcmludGVkLiAgVGhl IGxhdHRlciBpcyBkb25lIGJlY2F1c2UKICAgICAgICBHREIncyBJL08gc3lzdGVtIGlzIG5v dCB0aHJlYWQtc2FmZS4gIHJ1bl9vbl9tYWluX3RocmVhZCBjb3VsZCBiZQpAQCAtNzA5NSw3 ICs3MTAxLDcgQEAgZHdhcmYyX2J1aWxkX3BzeW10YWJzX2hhcmQgKGR3YXJmMl9wZXJfb2Jq ZmlsZSAqcGVyX29iamZpbGUpCiAJICAgICAgfQogCSAgfQogCXJldHVybiByZXN1bHRfdHlw ZSAodGhyZWFkX3N0b3JhZ2UucmVsZWFzZSAoKSwgc3RkOjptb3ZlIChlcnJvcnMpKTsKLSAg ICAgIH0pOworICAgICAgfSwgdGFza19zaXplKTsKIAogICAgIC8qIE9ubHkgc2hvdyBhIGdp dmVuIGV4Y2VwdGlvbiBhIHNpbmdsZSB0aW1lLiAgKi8KICAgICBzdGQ6OnVub3JkZXJlZF9z ZXQ8Z2RiX2V4Y2VwdGlvbj4gc2Vlbl9leGNlcHRpb25zOwpkaWZmIC0tZ2l0IGEvZ2Ric3Vw cG9ydC9wYXJhbGxlbC1mb3IuaCBiL2dkYnN1cHBvcnQvcGFyYWxsZWwtZm9yLmgKaW5kZXgg MDAzN2VlMjNmZjMuLmU2Zjc4NGVhZmQ1IDEwMDY0NAotLS0gYS9nZGJzdXBwb3J0L3BhcmFs bGVsLWZvci5oCisrKyBiL2dkYnN1cHBvcnQvcGFyYWxsZWwtZm9yLmgKQEAgLTIzLDYgKzIz LDcgQEAKICNpbmNsdWRlIDxhbGdvcml0aG0+CiAjaW5jbHVkZSA8dHlwZV90cmFpdHM+CiAj aW5jbHVkZSAiZ2Ric3VwcG9ydC90aHJlYWQtcG9vbC5oIgorI2luY2x1ZGUgImdkYnN1cHBv cnQvZnVuY3Rpb24tdmlldy5oIgogCiBuYW1lc3BhY2UgZ2RiCiB7CkBAIC0xMzQsNyArMTM1 LDkgQEAgdHlwZW5hbWUgZ2RiOjpkZXRhaWw6OnBhcl9mb3JfYWNjdW11bGF0b3I8CiAgICAg dHlwZW5hbWUgc3RkOjpyZXN1bHRfb2Y8UmFuZ2VGdW5jdGlvbiAoUmFuZG9tSXQsIFJhbmRv bUl0KT46OnR5cGUKICAgPjo6cmVzdWx0X3R5cGUKIHBhcmFsbGVsX2Zvcl9lYWNoICh1bnNp Z25lZCBuLCBSYW5kb21JdCBmaXJzdCwgUmFuZG9tSXQgbGFzdCwKLQkJICAgUmFuZ2VGdW5j dGlvbiBjYWxsYmFjaykKKwkJICAgUmFuZ2VGdW5jdGlvbiBjYWxsYmFjaywKKwkJICAgZ2Ri OjpmdW5jdGlvbl92aWV3PHVuc2lnbmVkIGludChSYW5kb21JdCk+IHRhc2tfc2l6ZQorCQkg ICAgID0gbnVsbHB0cikKIHsKICAgdXNpbmcgcmVzdWx0X3R5cGUKICAgICA9IHR5cGVuYW1l IHN0ZDo6cmVzdWx0X29mPFJhbmdlRnVuY3Rpb24gKFJhbmRvbUl0LCBSYW5kb21JdCk+Ojp0 eXBlOwpAQCAtMTQ4LDE3ICsxNTEsMzIgQEAgcGFyYWxsZWxfZm9yX2VhY2ggKHVuc2lnbmVk IG4sIFJhbmRvbUl0IGZpcnN0LCBSYW5kb21JdCBsYXN0LAogICBzaXplX3Qgbl9lbGVtZW50 cyA9IGxhc3QgLSBmaXJzdDsKICAgc2l6ZV90IGVsdHNfcGVyX3RocmVhZCA9IDA7CiAgIHNp emVfdCBlbHRzX2xlZnRfb3ZlciA9IDA7CisgIHNpemVfdCB0b3RhbF9zaXplID0gMDsKKyAg c2l6ZV90IHNpemVfcGVyX3RocmVhZCA9IDA7CiAKICAgaWYgKG5fdGhyZWFkcyA+IDEpCiAg ICAgewotICAgICAgLyogUmVxdWlyZSB0aGF0IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBO IGVsZW1lbnRzIGluIGEKLQkgdGhyZWFkLiAgKi8KLSAgICAgIGdkYl9hc3NlcnQgKG4gPiAw KTsKLSAgICAgIGlmIChuX2VsZW1lbnRzIC8gbl90aHJlYWRzIDwgbikKLQluX3RocmVhZHMg PSBzdGQ6Om1heCAobl9lbGVtZW50cyAvIG4sIChzaXplX3QpIDEpOwotICAgICAgZWx0c19w ZXJfdGhyZWFkID0gbl9lbGVtZW50cyAvIG5fdGhyZWFkczsKLSAgICAgIGVsdHNfbGVmdF9v dmVyID0gbl9lbGVtZW50cyAlIG5fdGhyZWFkczsKLSAgICAgIC8qIG5fZWxlbWVudHMgPT0g bl90aHJlYWRzICogZWx0c19wZXJfdGhyZWFkICsgZWx0c19sZWZ0X292ZXIuICovCisgICAg ICBpZiAodGFza19zaXplICE9IG51bGxwdHIpCisJeworCSAgZ2RiX2Fzc2VydCAobiA9PSAx KTsKKwkgIGZvciAoUmFuZG9tSXQgaSA9IGZpcnN0OyBpICE9IGxhc3Q7ICsraSkKKwkgICAg eworCSAgICAgIHNpemVfdCBzID0gKHNpemVfdCl0YXNrX3NpemUgKGkpOworCSAgICAgIHRv dGFsX3NpemUgKz0gczsKKwkgICAgfQorCSAgc2l6ZV9wZXJfdGhyZWFkID0gdG90YWxfc2l6 ZSAvIG5fdGhyZWFkczsKKwl9CisgICAgICBlbHNlCisJeworCSAgLyogUmVxdWlyZSB0aGF0 IHRoZXJlIHNob3VsZCBiZSBhdCBsZWFzdCBOIGVsZW1lbnRzIGluIGEKKwkgICAgIHRocmVh ZC4gICovCisJICBnZGJfYXNzZXJ0IChuID4gMCk7CisJICBpZiAobl9lbGVtZW50cyAvIG5f dGhyZWFkcyA8IG4pCisJICAgIG5fdGhyZWFkcyA9IHN0ZDo6bWF4IChuX2VsZW1lbnRzIC8g biwgKHNpemVfdCkgMSk7CisJICBlbHRzX3Blcl90aHJlYWQgPSBuX2VsZW1lbnRzIC8gbl90 aHJlYWRzOworCSAgZWx0c19sZWZ0X292ZXIgPSBuX2VsZW1lbnRzICUgbl90aHJlYWRzOwor CSAgLyogbl9lbGVtZW50cyA9PSBuX3RocmVhZHMgKiBlbHRzX3Blcl90aHJlYWQgKyBlbHRz X2xlZnRfb3Zlci4gKi8KKwl9CiAgICAgfQogCiAgIHNpemVfdCBjb3VudCA9IG5fdGhyZWFk cyA9PSAwID8gMCA6IG5fdGhyZWFkcyAtIDE7CkBAIC0xNjcsMjAgKzE4NSw0NyBAQCBwYXJh bGxlbF9mb3JfZWFjaCAodW5zaWduZWQgbiwgUmFuZG9tSXQgZmlyc3QsIFJhbmRvbUl0IGxh c3QsCiAgIGlmIChwYXJhbGxlbF9mb3JfZWFjaF9kZWJ1ZykKICAgICB7CiAgICAgICBkZWJ1 Z19wcmludGYgKF8oIlBhcmFsbGVsIGZvcjogbl9lbGVtZW50czogJXp1XG4iKSwgbl9lbGVt ZW50cyk7Ci0gICAgICBkZWJ1Z19wcmludGYgKF8oIlBhcmFsbGVsIGZvcjogbWluaW11bSBl bGVtZW50cyBwZXIgdGhyZWFkOiAldVxuIiksIG4pOwotICAgICAgZGVidWdfcHJpbnRmIChf KCJQYXJhbGxlbCBmb3I6IGVsdHNfcGVyX3RocmVhZDogJXp1XG4iKSwgZWx0c19wZXJfdGhy ZWFkKTsKKyAgICAgIGlmICh0YXNrX3NpemUgIT0gbnVsbHB0cikKKwl7CisJICBkZWJ1Z19w cmludGYgKF8oIlBhcmFsbGVsIGZvcjogdG90YWxfc2l6ZTogJXp1XG4iKSwgdG90YWxfc2l6 ZSk7CisJICBkZWJ1Z19wcmludGYgKF8oIlBhcmFsbGVsIGZvcjogc2l6ZV9wZXJfdGhyZWFk OiAlenVcbiIpLCBzaXplX3Blcl90aHJlYWQpOworCX0KKyAgICAgIGVsc2UKKwl7CisJICBk ZWJ1Z19wcmludGYgKF8oIlBhcmFsbGVsIGZvcjogbWluaW11bSBlbGVtZW50cyBwZXIgdGhy ZWFkOiAldVxuIiksIG4pOworCSAgZGVidWdfcHJpbnRmIChfKCJQYXJhbGxlbCBmb3I6IGVs dHNfcGVyX3RocmVhZDogJXp1XG4iKSwgZWx0c19wZXJfdGhyZWFkKTsKKwl9CiAgICAgfQog CisgIHNpemVfdCByZW1haW5pbmdfc2l6ZSA9IHRvdGFsX3NpemU7CiAgIGZvciAoaW50IGkg PSAwOyBpIDwgY291bnQ7ICsraSkKICAgICB7Ci0gICAgICBSYW5kb21JdCBlbmQgPSBmaXJz dCArIGVsdHNfcGVyX3RocmVhZDsKLSAgICAgIGlmIChpIDwgZWx0c19sZWZ0X292ZXIpCi0J LyogRGlzdHJpYnV0ZSB0aGUgbGVmdG92ZXJzIG92ZXIgdGhlIHdvcmtlciB0aHJlYWRzLCB0 byBhdm9pZCBoYXZpbmcKLQkgICB0byBoYW5kbGUgYWxsIG9mIHRoZW0gaW4gYSBzaW5nbGUg dGhyZWFkLiAgKi8KLQllbmQrKzsKKyAgICAgIFJhbmRvbUl0IGVuZDsKKyAgICAgIHNpemVf dCBzID0gMDsKKyAgICAgIGlmICh0YXNrX3NpemUgPT0gbnVsbHB0cikKKwl7CisJICBlbmQg PSBmaXJzdCArIGVsdHNfcGVyX3RocmVhZDsKKwkgIGlmIChpIDwgZWx0c19sZWZ0X292ZXIp CisJICAgIC8qIERpc3RyaWJ1dGUgdGhlIGxlZnRvdmVycyBvdmVyIHRoZSB3b3JrZXIgdGhy ZWFkcywgdG8gYXZvaWQgaGF2aW5nCisJICAgICAgIHRvIGhhbmRsZSBhbGwgb2YgdGhlbSBp biBhIHNpbmdsZSB0aHJlYWQuICAqLworCSAgICBlbmQrKzsKKwl9CisgICAgICBlbHNlCisJ eworCSAgUmFuZG9tSXQgajsKKwkgIGZvciAoaiA9IGZpcnN0OyBqIDwgbGFzdCAmJiBzIDwg c2l6ZV9wZXJfdGhyZWFkOyArK2opCisJICAgIHMgKz0gKHNpemVfdCkodGFza19zaXplKSAo aik7CisJICBlbmQgPSBqOworCSAgcmVtYWluaW5nX3NpemUgLT0gczsKKwl9CiAgICAgICBp ZiAocGFyYWxsZWxfZm9yX2VhY2hfZGVidWcpCi0JZGVidWdfcHJpbnRmIChfKCJQYXJhbGxl bCBmb3I6IGVsZW1lbnRzIG9uIHdvcmtlciB0aHJlYWQgJWlcdDogJXp1XG4iKSwKLQkJICAg ICAgaSwgKHNpemVfdCkoZW5kIC0gZmlyc3QpKTsKKwl7CisJICBkZWJ1Z19wcmludGYgKF8o IlBhcmFsbGVsIGZvcjogZWxlbWVudHMgb24gd29ya2VyIHRocmVhZCAlaVx0OiAlenUiKSwK KwkJCWksIChzaXplX3QpKGVuZCAtIGZpcnN0KSk7CisJICBpZiAodGFza19zaXplICE9IG51 bGxwdHIpCisJICAgIGRlYnVnX3ByaW50ZiAoXygiXHQoc2l6ZTogJXp1KSIpLCBzKTsKKwkg IGRlYnVnX3ByaW50ZiAoXygiXG4iKSk7CisJfQogICAgICAgcmVzdWx0cy5wb3N0IChpLCBb PV0gKCkKICAgICAgICAgewogCSAgcmV0dXJuIGNhbGxiYWNrIChmaXJzdCwgZW5kKTsKQEAg LTE5MCwxMiArMjM1LDIyIEBAIHBhcmFsbGVsX2Zvcl9lYWNoICh1bnNpZ25lZCBuLCBSYW5k b21JdCBmaXJzdCwgUmFuZG9tSXQgbGFzdCwKIAogICBmb3IgKGludCBpID0gY291bnQ7IGkg PCBuX3dvcmtlcl90aHJlYWRzOyArK2kpCiAgICAgaWYgKHBhcmFsbGVsX2Zvcl9lYWNoX2Rl YnVnKQotICAgICAgZGVidWdfcHJpbnRmIChfKCJQYXJhbGxlbCBmb3I6IGVsZW1lbnRzIG9u IHdvcmtlciB0aHJlYWQgJWlcdDogMFxuIiksIGkpOworICAgICAgeworCWRlYnVnX3ByaW50 ZiAoXygiUGFyYWxsZWwgZm9yOiBlbGVtZW50cyBvbiB3b3JrZXIgdGhyZWFkICVpXHQ6IDAi KSwgaSk7CisJaWYgKHRhc2tfc2l6ZSAhPSBudWxscHRyKQorCSAgZGVidWdfcHJpbnRmIChf KCJcdChzaXplOiAwKSIpKTsKKwlkZWJ1Z19wcmludGYgKF8oIlxuIikpOworICAgICAgfQog CiAgIC8qIFByb2Nlc3MgYWxsIHRoZSByZW1haW5pbmcgZWxlbWVudHMgaW4gdGhlIG1haW4g dGhyZWFkLiAgKi8KICAgaWYgKHBhcmFsbGVsX2Zvcl9lYWNoX2RlYnVnKQotICAgIGRlYnVn X3ByaW50ZiAoXygiUGFyYWxsZWwgZm9yOiBlbGVtZW50cyBvbiBtYWluIHRocmVhZFx0XHQ6 ICV6dVxuIiksCi0JCSAgKHNpemVfdCkobGFzdCAtIGZpcnN0KSk7CisgICAgeworICAgICAg ZGVidWdfcHJpbnRmIChfKCJQYXJhbGxlbCBmb3I6IGVsZW1lbnRzIG9uIG1haW4gdGhyZWFk XHRcdDogJXp1IiksCisJCSAgICAoc2l6ZV90KShsYXN0IC0gZmlyc3QpKTsKKyAgICAgIGlm ICh0YXNrX3NpemUgIT0gbnVsbHB0cikKKwlkZWJ1Z19wcmludGYgKF8oIlx0KHNpemU6ICV6 dSkiKSwgcmVtYWluaW5nX3NpemUpOworICAgICAgZGVidWdfcHJpbnRmIChfKCJcbiIpKTsK KyAgICB9CiAgIHJldHVybiByZXN1bHRzLmZpbmlzaCAoWz1dICgpCiAgICAgewogICAgICAg cmV0dXJuIGNhbGxiYWNrIChmaXJzdCwgbGFzdCk7Cg== --------------Or98yqFm4lDjw9MNkYd6eAit--