From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 8DC08C43334 for ; Tue, 28 Jun 2022 14:15:32 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1345827AbiF1OPb (ORCPT ); Tue, 28 Jun 2022 10:15:31 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:55114 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1345249AbiF1OP2 (ORCPT ); Tue, 28 Jun 2022 10:15:28 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id 2F7F92EA0C for ; Tue, 28 Jun 2022 07:15:25 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1656425724; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YKpvy+ys5Io23rSSPdIQF7QGBfeppNwRyDdDVCI8M4k=; b=UKqw/evQvnMwX8MBzhLRgh4s8NidKPN8h3qEuh/T2rBojX/ci8FtFzfIBy9KtgTRmezv0y iGBefmxceQAXzTiUdHp9PtHyo+991Z0ogr0WG77rl0RECValJyZC/tnqtl19bui2RLzVuv cE5vpj+iNdoyWyarRwWVNdb7BA/eslY= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-365-RapeBXjPNjO2KnlgZm8wiw-1; Tue, 28 Jun 2022 10:15:21 -0400 X-MC-Unique: RapeBXjPNjO2KnlgZm8wiw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8C91E811E76; Tue, 28 Jun 2022 14:15:07 +0000 (UTC) Received: from [10.22.34.187] (unknown [10.22.34.187]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7EA61C28118; Tue, 28 Jun 2022 14:15:06 +0000 (UTC) Message-ID: <588a3276-5481-0a9f-9eac-fed09eede4f2@redhat.com> Date: Tue, 28 Jun 2022 10:15:06 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH v6] x86/paravirt: useless assignment instructions cause Unixbench full core performance degradation Content-Language: en-US To: Guo Hui , peterz@infradead.org Cc: jgross@suse.com, srivatsa@csail.mit.edu, amakhalov@vmware.com, pv-drivers@vmware.com, tglx@linutronix.de, mingo@redhat.com, bp@alien8.de, dave.hansen@linux.intel.com, x86@kernel.org, hpa@zytor.com, will@kernel.org, boqun.feng@gmail.com, virtualization@lists.linux-foundation.org, wangxiaohua@uniontech.com, linux-kernel@vger.kernel.org References: <20220628125421.12364-1-guohui@uniontech.com> From: Waiman Long In-Reply-To: <20220628125421.12364-1-guohui@uniontech.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 6/28/22 08:54, Guo Hui wrote: > The instructions assigned to the vcpu_is_preempted function parameter > in the X86 architecture physical machine are redundant instructions, > causing the multi-core performance of Unixbench to drop by about 4% to 5%. > The C function is as follows: > static bool vcpu_is_preempted(long vcpu); > > The parameter 'vcpu' in the function osq_lock > that calls the function vcpu_is_preempted is assigned as follows: > > The C code is in the function node_cpu: > cpu = node->cpu - 1; > > The instructions corresponding to the C code are: > mov 0x14(%rax),%edi > sub $0x1,%edi > > The above instructions are unnecessary > in the X86 Native operating environment, > causing high cache-misses and degrading performance. > > This patch uses static_key to not execute this instruction > in the Native runtime environment. > > The patch effect is as follows two machines, > Unixbench runs with full core score: > > 1. Machine configuration: > Intel(R) Xeon(R) Silver 4210 CPU @ 2.20GHz > CPU core: 40 > Memory: 256G > OS Kernel: 5.19-rc3 > > Before using the patch: > System Benchmarks Index Values BASELINE RESULT INDEX > Dhrystone 2 using register variables 116700.0 948326591.2 81261.9 > Double-Precision Whetstone 55.0 211986.3 38543.0 > Execl Throughput 43.0 43453.2 10105.4 > File Copy 1024 bufsize 2000 maxblocks 3960.0 438936.2 1108.4 > File Copy 256 bufsize 500 maxblocks 1655.0 118197.4 714.2 > File Copy 4096 bufsize 8000 maxblocks 5800.0 1534674.7 2646.0 > Pipe Throughput 12440.0 46482107.6 37365.0 > Pipe-based Context Switching 4000.0 1915094.2 4787.7 > Process Creation 126.0 85442.2 6781.1 > Shell Scripts (1 concurrent) 42.4 69400.7 16368.1 > Shell Scripts (8 concurrent) 6.0 8877.2 14795.3 > System Call Overhead 15000.0 4714906.1 3143.3 > ======== > System Benchmarks Index Score 7923.3 > > After using the patch: > System Benchmarks Index Values BASELINE RESULT INDEX > Dhrystone 2 using register variables 116700.0 947032915.5 81151.1 > Double-Precision Whetstone 55.0 211971.2 38540.2 > Execl Throughput 43.0 45054.8 10477.9 > File Copy 1024 bufsize 2000 maxblocks 3960.0 515024.9 1300.6 > File Copy 256 bufsize 500 maxblocks 1655.0 146354.6 884.3 > File Copy 4096 bufsize 8000 maxblocks 5800.0 1679995.9 2896.5 > Pipe Throughput 12440.0 46466394.2 37352.4 > Pipe-based Context Switching 4000.0 1898221.4 4745.6 > Process Creation 126.0 85653.1 6797.9 > Shell Scripts (1 concurrent) 42.4 69437.3 16376.7 > Shell Scripts (8 concurrent) 6.0 8898.9 14831.4 > System Call Overhead 15000.0 4658746.7 3105.8 > ======== > System Benchmarks Index Score 8248.8 > > 2. Machine configuration: > Hygon C86 7185 32-core Processor > CPU core: 128 > Memory: 256G > OS Kernel: 5.19-rc3 > > Before using the patch: > System Benchmarks Index Values BASELINE RESULT INDEX > Dhrystone 2 using register variables 116700.0 2256644068.3 193371.4 > Double-Precision Whetstone 55.0 438969.9 79812.7 > Execl Throughput 43.0 10108.6 2350.8 > File Copy 1024 bufsize 2000 maxblocks 3960.0 275892.8 696.7 > File Copy 256 bufsize 500 maxblocks 1655.0 72082.7 435.5 > File Copy 4096 bufsize 8000 maxblocks 5800.0 925043.4 1594.9 > Pipe Throughput 12440.0 118905512.5 95583.2 > Pipe-based Context Switching 4000.0 7820945.7 19552.4 > Process Creation 126.0 31233.3 2478.8 > Shell Scripts (1 concurrent) 42.4 49042.8 11566.7 > Shell Scripts (8 concurrent) 6.0 6656.0 11093.3 > System Call Overhead 15000.0 6816047.5 4544.0 > ======== > System Benchmarks Index Score 7756.6 > > After using the patch: > System Benchmarks Index Values BASELINE RESULT INDEX > Dhrystone 2 using register variables 116700.0 2252272929.4 192996.8 > Double-Precision Whetstone 55.0 451847.2 82154.0 > Execl Throughput 43.0 10595.1 2464.0 > File Copy 1024 bufsize 2000 maxblocks 3960.0 301279.3 760.8 > File Copy 256 bufsize 500 maxblocks 1655.0 79291.3 479.1 > File Copy 4096 bufsize 8000 maxblocks 5800.0 1039755.2 1792.7 > Pipe Throughput 12440.0 118701468.1 95419.2 > Pipe-based Context Switching 4000.0 8073453.3 20183.6 > Process Creation 126.0 33440.9 2654.0 > Shell Scripts (1 concurrent) 42.4 52722.6 12434.6 > Shell Scripts (8 concurrent) 6.0 7050.4 11750.6 > System Call Overhead 15000.0 6834371.5 4556.2 > ======== > System Benchmarks Index Score 8157.8 > > Signed-off-by: Guo Hui > --- > arch/x86/kernel/paravirt-spinlocks.c | 4 ++++ > kernel/locking/osq_lock.c | 12 +++++++++++- > 2 files changed, 15 insertions(+), 1 deletion(-) > > diff --git a/arch/x86/kernel/paravirt-spinlocks.c b/arch/x86/kernel/paravirt-spinlocks.c > index 9e1ea99..a2eb375 100644 > --- a/arch/x86/kernel/paravirt-spinlocks.c > +++ b/arch/x86/kernel/paravirt-spinlocks.c > @@ -33,6 +33,8 @@ bool pv_is_native_vcpu_is_preempted(void) > __raw_callee_save___native_vcpu_is_preempted; > } > > +DECLARE_STATIC_KEY_TRUE(vcpu_has_preemption); > + > void __init paravirt_set_cap(void) > { > if (!pv_is_native_spin_unlock()) > @@ -40,4 +42,6 @@ void __init paravirt_set_cap(void) > > if (!pv_is_native_vcpu_is_preempted()) > setup_force_cpu_cap(X86_FEATURE_VCPUPREEMPT); > + else > + static_branch_disable(&vcpu_has_preemption); > } > diff --git a/kernel/locking/osq_lock.c b/kernel/locking/osq_lock.c > index d5610ad..883e815 100644 > --- a/kernel/locking/osq_lock.c > +++ b/kernel/locking/osq_lock.c > @@ -27,6 +27,16 @@ static inline int node_cpu(struct optimistic_spin_node *node) > return node->cpu - 1; > } > > +DEFINE_STATIC_KEY_TRUE(vcpu_has_preemption); > + > +static inline bool vcpu_is_preempted_node(struct optimistic_spin_node *node) > +{ > + if (static_branch_likely(&vcpu_has_preemption)) > + return vcpu_is_preempted(node_cpu(node->prev)); > + > + return false; > +} > + > static inline struct optimistic_spin_node *decode_cpu(int encoded_cpu_val) > { > int cpu_nr = encoded_cpu_val - 1; > @@ -141,7 +151,7 @@ bool osq_lock(struct optimistic_spin_queue *lock) > * polling, be careful. > */ > if (smp_cond_load_relaxed(&node->locked, VAL || need_resched() || > - vcpu_is_preempted(node_cpu(node->prev)))) > + vcpu_is_preempted_node(node))) > return true; > > /* unqueue */ How about a further improvement on configurations that don't use vcpu_is_preempted() at all? +#ifdef vcpu_is_preempted +DEFINE_STATIC_KEY_TRUE(vcpu_has_preemption); +  static inline int node_cpu(struct optimistic_spin_node *node)  {         return node->cpu - 1;  } +static inline bool vcpu_is_preempted_node(struct optimistic_spin_node *node) +{ +       if (static_branch_likely(&vcpu_has_preemption)) +               return vcpu_is_preempted(node_cpu(node->prev)); + +       return false; +} +#else +static inline bool vcpu_is_preempted_node(struct optimistic_spin_node *node) +{ +       return false; +} +#endif +  static inline struct optimistic_spin_node *decode_cpu(int encoded_cpu_val)  {         int cpu_nr = encoded_cpu_val - 1; @@ -141,7 +158,7 @@ bool osq_lock(struct optimistic_spin_queue *lock)          * polling, be careful.          */         if (smp_cond_load_relaxed(&node->locked, VAL || need_resched() || - vcpu_is_preempted(node_cpu(node->prev)))) +                                 vcpu_is_preempted_node(node)))                 return true;         /* unqueue */ For those configurations, vcpu_is_preempted_node() will just get compiled out. Cheers, Longman From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org Received: from smtp4.osuosl.org (smtp4.osuosl.org [140.211.166.137]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 59362C433EF for ; Tue, 28 Jun 2022 14:15:32 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp4.osuosl.org (Postfix) with ESMTP id C6ED2409BC; Tue, 28 Jun 2022 14:15:31 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org C6ED2409BC Authentication-Results: smtp4.osuosl.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=UKqw/evQ X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp4.osuosl.org ([127.0.0.1]) by localhost (smtp4.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id SN4IpMdrezA2; Tue, 28 Jun 2022 14:15:30 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [IPv6:2605:bc80:3010:104::8cd3:938]) by smtp4.osuosl.org (Postfix) with ESMTPS id 59B0B409B0; Tue, 28 Jun 2022 14:15:29 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp4.osuosl.org 59B0B409B0 Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id 2B3B3C0039; Tue, 28 Jun 2022 14:15:29 +0000 (UTC) Received: from smtp3.osuosl.org (smtp3.osuosl.org [IPv6:2605:bc80:3010::136]) by lists.linuxfoundation.org (Postfix) with ESMTP id 36F49C002D for ; Tue, 28 Jun 2022 14:15:27 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp3.osuosl.org (Postfix) with ESMTP id 02D2B60B95 for ; Tue, 28 Jun 2022 14:15:27 +0000 (UTC) DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org 02D2B60B95 Authentication-Results: smtp3.osuosl.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.a=rsa-sha256 header.s=mimecast20190719 header.b=UKqw/evQ X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp3.osuosl.org ([127.0.0.1]) by localhost (smtp3.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id RNsJGIof3bMb for ; Tue, 28 Jun 2022 14:15:25 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp3.osuosl.org A08C6606C6 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by smtp3.osuosl.org (Postfix) with ESMTPS id A08C6606C6 for ; Tue, 28 Jun 2022 14:15:25 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1656425724; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=YKpvy+ys5Io23rSSPdIQF7QGBfeppNwRyDdDVCI8M4k=; b=UKqw/evQvnMwX8MBzhLRgh4s8NidKPN8h3qEuh/T2rBojX/ci8FtFzfIBy9KtgTRmezv0y iGBefmxceQAXzTiUdHp9PtHyo+991Z0ogr0WG77rl0RECValJyZC/tnqtl19bui2RLzVuv cE5vpj+iNdoyWyarRwWVNdb7BA/eslY= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-365-RapeBXjPNjO2KnlgZm8wiw-1; Tue, 28 Jun 2022 10:15:21 -0400 X-MC-Unique: RapeBXjPNjO2KnlgZm8wiw-1 Received: from smtp.corp.redhat.com (int-mx08.intmail.prod.int.rdu2.redhat.com [10.11.54.8]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 8C91E811E76; Tue, 28 Jun 2022 14:15:07 +0000 (UTC) Received: from [10.22.34.187] (unknown [10.22.34.187]) by smtp.corp.redhat.com (Postfix) with ESMTP id 7EA61C28118; Tue, 28 Jun 2022 14:15:06 +0000 (UTC) Message-ID: <588a3276-5481-0a9f-9eac-fed09eede4f2@redhat.com> Date: Tue, 28 Jun 2022 10:15:06 -0400 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Thunderbird/91.9.1 Subject: Re: [PATCH v6] x86/paravirt: useless assignment instructions cause Unixbench full core performance degradation Content-Language: en-US To: Guo Hui , peterz@infradead.org References: <20220628125421.12364-1-guohui@uniontech.com> From: Waiman Long In-Reply-To: <20220628125421.12364-1-guohui@uniontech.com> X-Scanned-By: MIMEDefang 2.85 on 10.11.54.8 Cc: jgross@suse.com, x86@kernel.org, hpa@zytor.com, pv-drivers@vmware.com, boqun.feng@gmail.com, dave.hansen@linux.intel.com, linux-kernel@vger.kernel.org, virtualization@lists.linux-foundation.org, mingo@redhat.com, bp@alien8.de, amakhalov@vmware.com, tglx@linutronix.de, will@kernel.org, wangxiaohua@uniontech.com X-BeenThere: virtualization@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Linux virtualization List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: virtualization-bounces@lists.linux-foundation.org Sender: "Virtualization" T24gNi8yOC8yMiAwODo1NCwgR3VvIEh1aSB3cm90ZToKPiBUaGUgaW5zdHJ1Y3Rpb25zIGFzc2ln bmVkIHRvIHRoZSB2Y3B1X2lzX3ByZWVtcHRlZCBmdW5jdGlvbiBwYXJhbWV0ZXIKPiBpbiB0aGUg WDg2IGFyY2hpdGVjdHVyZSBwaHlzaWNhbCBtYWNoaW5lIGFyZSByZWR1bmRhbnQgaW5zdHJ1Y3Rp b25zLAo+IGNhdXNpbmcgdGhlIG11bHRpLWNvcmUgcGVyZm9ybWFuY2Ugb2YgVW5peGJlbmNoIHRv IGRyb3AgYnkgYWJvdXQgNCUgdG8gNSUuCj4gVGhlIEMgZnVuY3Rpb24gaXMgYXMgZm9sbG93czoK PiBzdGF0aWMgYm9vbCB2Y3B1X2lzX3ByZWVtcHRlZChsb25nIHZjcHUpOwo+Cj4gVGhlIHBhcmFt ZXRlciAndmNwdScgaW4gdGhlIGZ1bmN0aW9uIG9zcV9sb2NrCj4gdGhhdCBjYWxscyB0aGUgZnVu Y3Rpb24gdmNwdV9pc19wcmVlbXB0ZWQgaXMgYXNzaWduZWQgYXMgZm9sbG93czoKPgo+IFRoZSBD IGNvZGUgaXMgaW4gdGhlIGZ1bmN0aW9uIG5vZGVfY3B1Ogo+IGNwdSA9IG5vZGUtPmNwdSAtIDE7 Cj4KPiBUaGUgaW5zdHJ1Y3Rpb25zIGNvcnJlc3BvbmRpbmcgdG8gdGhlIEMgY29kZSBhcmU6Cj4g bW92IDB4MTQoJXJheCksJWVkaQo+IHN1YiAkMHgxLCVlZGkKPgo+IFRoZSBhYm92ZSBpbnN0cnVj dGlvbnMgYXJlIHVubmVjZXNzYXJ5Cj4gaW4gdGhlIFg4NiBOYXRpdmUgb3BlcmF0aW5nIGVudmly b25tZW50LAo+IGNhdXNpbmcgaGlnaCBjYWNoZS1taXNzZXMgYW5kIGRlZ3JhZGluZyBwZXJmb3Jt YW5jZS4KPgo+IFRoaXMgcGF0Y2ggdXNlcyBzdGF0aWNfa2V5IHRvIG5vdCBleGVjdXRlIHRoaXMg aW5zdHJ1Y3Rpb24KPiBpbiB0aGUgTmF0aXZlIHJ1bnRpbWUgZW52aXJvbm1lbnQuCj4KPiBUaGUg cGF0Y2ggZWZmZWN0IGlzIGFzIGZvbGxvd3MgdHdvIG1hY2hpbmVzLAo+IFVuaXhiZW5jaCBydW5z IHdpdGggZnVsbCBjb3JlIHNjb3JlOgo+Cj4gMS4gTWFjaGluZSBjb25maWd1cmF0aW9uOgo+IElu dGVsKFIpIFhlb24oUikgU2lsdmVyIDQyMTAgQ1BVIEAgMi4yMEdIego+IENQVSBjb3JlOiA0MAo+ IE1lbW9yeTogMjU2Rwo+IE9TIEtlcm5lbDogNS4xOS1yYzMKPgo+IEJlZm9yZSB1c2luZyB0aGUg cGF0Y2g6Cj4gU3lzdGVtIEJlbmNobWFya3MgSW5kZXggVmFsdWVzICAgICAgICAgICAgICAgQkFT RUxJTkUgICAgICAgUkVTVUxUICAgIElOREVYCj4gRGhyeXN0b25lIDIgdXNpbmcgcmVnaXN0ZXIg dmFyaWFibGVzICAgICAgICAgMTE2NzAwLjAgIDk0ODMyNjU5MS4yICA4MTI2MS45Cj4gRG91Ymxl LVByZWNpc2lvbiBXaGV0c3RvbmUgICAgICAgICAgICAgICAgICAgICAgIDU1LjAgICAgIDIxMTk4 Ni4zICAzODU0My4wCj4gRXhlY2wgVGhyb3VnaHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgIDQzLjAgICAgICA0MzQ1My4yICAxMDEwNS40Cj4gRmlsZSBDb3B5IDEwMjQgYnVmc2l6 ZSAyMDAwIG1heGJsb2NrcyAgICAgICAgICAzOTYwLjAgICAgIDQzODkzNi4yICAgMTEwOC40Cj4g RmlsZSBDb3B5IDI1NiBidWZzaXplIDUwMCBtYXhibG9ja3MgICAgICAgICAgICAxNjU1LjAgICAg IDExODE5Ny40ICAgIDcxNC4yCj4gRmlsZSBDb3B5IDQwOTYgYnVmc2l6ZSA4MDAwIG1heGJsb2Nr cyAgICAgICAgICA1ODAwLjAgICAgMTUzNDY3NC43ICAgMjY0Ni4wCj4gUGlwZSBUaHJvdWdocHV0 ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDEyNDQwLjAgICA0NjQ4MjEwNy42ICAzNzM2 NS4wCj4gUGlwZS1iYXNlZCBDb250ZXh0IFN3aXRjaGluZyAgICAgICAgICAgICAgICAgICA0MDAw LjAgICAgMTkxNTA5NC4yICAgNDc4Ny43Cj4gUHJvY2VzcyBDcmVhdGlvbiAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgMTI2LjAgICAgICA4NTQ0Mi4yICAgNjc4MS4xCj4gU2hlbGwgU2Ny aXB0cyAoMSBjb25jdXJyZW50KSAgICAgICAgICAgICAgICAgICAgIDQyLjQgICAgICA2OTQwMC43 ICAxNjM2OC4xCj4gU2hlbGwgU2NyaXB0cyAoOCBjb25jdXJyZW50KSAgICAgICAgICAgICAgICAg ICAgICA2LjAgICAgICAgODg3Ny4yICAxNDc5NS4zCj4gU3lzdGVtIENhbGwgT3ZlcmhlYWQgICAg ICAgICAgICAgICAgICAgICAgICAgIDE1MDAwLjAgICAgNDcxNDkwNi4xICAgMzE0My4zCj4gICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA9PT09PT09PQo+IFN5c3RlbSBCZW5jaG1hcmtzIEluZGV4IFNjb3JlICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIDc5MjMuMwo+Cj4gQWZ0ZXIgdXNpbmcgdGhl IHBhdGNoOgo+IFN5c3RlbSBCZW5jaG1hcmtzIEluZGV4IFZhbHVlcyAgICAgICAgICAgICAgIEJB U0VMSU5FICAgICAgIFJFU1VMVCAgICBJTkRFWAo+IERocnlzdG9uZSAyIHVzaW5nIHJlZ2lzdGVy IHZhcmlhYmxlcyAgICAgICAgIDExNjcwMC4wICA5NDcwMzI5MTUuNSAgODExNTEuMQo+IERvdWJs ZS1QcmVjaXNpb24gV2hldHN0b25lICAgICAgICAgICAgICAgICAgICAgICA1NS4wICAgICAyMTE5 NzEuMiAgMzg1NDAuMgo+IEV4ZWNsIFRocm91Z2hwdXQgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICA0My4wICAgICAgNDUwNTQuOCAgMTA0NzcuOQo+IEZpbGUgQ29weSAxMDI0IGJ1ZnNp emUgMjAwMCBtYXhibG9ja3MgICAgICAgICAgMzk2MC4wICAgICA1MTUwMjQuOSAgIDEzMDAuNgo+ IEZpbGUgQ29weSAyNTYgYnVmc2l6ZSA1MDAgbWF4YmxvY2tzICAgICAgICAgICAgMTY1NS4wICAg ICAxNDYzNTQuNiAgICA4ODQuMwo+IEZpbGUgQ29weSA0MDk2IGJ1ZnNpemUgODAwMCBtYXhibG9j a3MgICAgICAgICAgNTgwMC4wICAgIDE2Nzk5OTUuOSAgIDI4OTYuNQo+IFBpcGUgVGhyb3VnaHB1 dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjQ0MC4wICAgNDY0NjYzOTQuMiAgMzcz NTIuNAo+IFBpcGUtYmFzZWQgQ29udGV4dCBTd2l0Y2hpbmcgICAgICAgICAgICAgICAgICAgNDAw MC4wICAgIDE4OTgyMjEuNCAgIDQ3NDUuNgo+IFByb2Nlc3MgQ3JlYXRpb24gICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgIDEyNi4wICAgICAgODU2NTMuMSAgIDY3OTcuOQo+IFNoZWxsIFNj cmlwdHMgKDEgY29uY3VycmVudCkgICAgICAgICAgICAgICAgICAgICA0Mi40ICAgICAgNjk0Mzcu MyAgMTYzNzYuNwo+IFNoZWxsIFNjcmlwdHMgKDggY29uY3VycmVudCkgICAgICAgICAgICAgICAg ICAgICAgNi4wICAgICAgIDg4OTguOSAgMTQ4MzEuNAo+IFN5c3RlbSBDYWxsIE92ZXJoZWFkICAg ICAgICAgICAgICAgICAgICAgICAgICAxNTAwMC4wICAgIDQ2NTg3NDYuNyAgIDMxMDUuOAo+ICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgPT09PT09PT0KPiBTeXN0ZW0gQmVuY2htYXJrcyBJbmRleCBTY29yZSAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA4MjQ4LjgKPgo+IDIuIE1hY2hpbmUgY29u ZmlndXJhdGlvbjoKPiBIeWdvbiBDODYgNzE4NSAzMi1jb3JlIFByb2Nlc3Nvcgo+IENQVSBjb3Jl OiAxMjgKPiBNZW1vcnk6IDI1NkcKPiBPUyBLZXJuZWw6IDUuMTktcmMzCj4KPiBCZWZvcmUgdXNp bmcgdGhlIHBhdGNoOgo+IFN5c3RlbSBCZW5jaG1hcmtzIEluZGV4IFZhbHVlcyAgICAgICAgICAg ICAgIEJBU0VMSU5FICAgICAgIFJFU1VMVCAgICBJTkRFWAo+IERocnlzdG9uZSAyIHVzaW5nIHJl Z2lzdGVyIHZhcmlhYmxlcyAgICAgICAgIDExNjcwMC4wIDIyNTY2NDQwNjguMyAxOTMzNzEuNAo+ IERvdWJsZS1QcmVjaXNpb24gV2hldHN0b25lICAgICAgICAgICAgICAgICAgICAgICA1NS4wICAg ICA0Mzg5NjkuOSAgNzk4MTIuNwo+IEV4ZWNsIFRocm91Z2hwdXQgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICA0My4wICAgICAgMTAxMDguNiAgIDIzNTAuOAo+IEZpbGUgQ29weSAxMDI0 IGJ1ZnNpemUgMjAwMCBtYXhibG9ja3MgICAgICAgICAgMzk2MC4wICAgICAyNzU4OTIuOCAgICA2 OTYuNwo+IEZpbGUgQ29weSAyNTYgYnVmc2l6ZSA1MDAgbWF4YmxvY2tzICAgICAgICAgICAgMTY1 NS4wICAgICAgNzIwODIuNyAgICA0MzUuNQo+IEZpbGUgQ29weSA0MDk2IGJ1ZnNpemUgODAwMCBt YXhibG9ja3MgICAgICAgICAgNTgwMC4wICAgICA5MjUwNDMuNCAgIDE1OTQuOQo+IFBpcGUgVGhy b3VnaHB1dCAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAxMjQ0MC4wICAxMTg5MDU1MTIu NSAgOTU1ODMuMgo+IFBpcGUtYmFzZWQgQ29udGV4dCBTd2l0Y2hpbmcgICAgICAgICAgICAgICAg ICAgNDAwMC4wICAgIDc4MjA5NDUuNyAgMTk1NTIuNAo+IFByb2Nlc3MgQ3JlYXRpb24gICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgIDEyNi4wICAgICAgMzEyMzMuMyAgIDI0NzguOAo+IFNo ZWxsIFNjcmlwdHMgKDEgY29uY3VycmVudCkgICAgICAgICAgICAgICAgICAgICA0Mi40ICAgICAg NDkwNDIuOCAgMTE1NjYuNwo+IFNoZWxsIFNjcmlwdHMgKDggY29uY3VycmVudCkgICAgICAgICAg ICAgICAgICAgICAgNi4wICAgICAgIDY2NTYuMCAgMTEwOTMuMwo+IFN5c3RlbSBDYWxsIE92ZXJo ZWFkICAgICAgICAgICAgICAgICAgICAgICAgICAxNTAwMC4wICAgIDY4MTYwNDcuNSAgIDQ1NDQu MAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgPT09PT09PT0KPiBTeXN0ZW0gQmVuY2htYXJrcyBJbmRleCBTY29yZSAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICA3NzU2LjYKPgo+IEFmdGVyIHVz aW5nIHRoZSBwYXRjaDoKPiBTeXN0ZW0gQmVuY2htYXJrcyBJbmRleCBWYWx1ZXMgICAgICAgICAg ICAgICBCQVNFTElORSAgICAgICBSRVNVTFQgICAgSU5ERVgKPiBEaHJ5c3RvbmUgMiB1c2luZyBy ZWdpc3RlciB2YXJpYWJsZXMgICAgICAgICAxMTY3MDAuMCAyMjUyMjcyOTI5LjQgMTkyOTk2LjgK PiBEb3VibGUtUHJlY2lzaW9uIFdoZXRzdG9uZSAgICAgICAgICAgICAgICAgICAgICAgNTUuMCAg ICAgNDUxODQ3LjIgIDgyMTU0LjAKPiBFeGVjbCBUaHJvdWdocHV0ICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgNDMuMCAgICAgIDEwNTk1LjEgICAyNDY0LjAKPiBGaWxlIENvcHkgMTAy NCBidWZzaXplIDIwMDAgbWF4YmxvY2tzICAgICAgICAgIDM5NjAuMCAgICAgMzAxMjc5LjMgICAg NzYwLjgKPiBGaWxlIENvcHkgMjU2IGJ1ZnNpemUgNTAwIG1heGJsb2NrcyAgICAgICAgICAgIDE2 NTUuMCAgICAgIDc5MjkxLjMgICAgNDc5LjEKPiBGaWxlIENvcHkgNDA5NiBidWZzaXplIDgwMDAg bWF4YmxvY2tzICAgICAgICAgIDU4MDAuMCAgICAxMDM5NzU1LjIgICAxNzkyLjcKPiBQaXBlIFRo cm91Z2hwdXQgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgMTI0NDAuMCAgMTE4NzAxNDY4 LjEgIDk1NDE5LjIKPiBQaXBlLWJhc2VkIENvbnRleHQgU3dpdGNoaW5nICAgICAgICAgICAgICAg ICAgIDQwMDAuMCAgICA4MDczNDUzLjMgIDIwMTgzLjYKPiBQcm9jZXNzIENyZWF0aW9uICAgICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAxMjYuMCAgICAgIDMzNDQwLjkgICAyNjU0LjAKPiBT aGVsbCBTY3JpcHRzICgxIGNvbmN1cnJlbnQpICAgICAgICAgICAgICAgICAgICAgNDIuNCAgICAg IDUyNzIyLjYgIDEyNDM0LjYKPiBTaGVsbCBTY3JpcHRzICg4IGNvbmN1cnJlbnQpICAgICAgICAg ICAgICAgICAgICAgIDYuMCAgICAgICA3MDUwLjQgIDExNzUwLjYKPiBTeXN0ZW0gQ2FsbCBPdmVy aGVhZCAgICAgICAgICAgICAgICAgICAgICAgICAgMTUwMDAuMCAgICA2ODM0MzcxLjUgICA0NTU2 LjIKPiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgID09PT09PT09Cj4gU3lzdGVtIEJlbmNobWFya3MgSW5kZXggU2NvcmUg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgODE1Ny44Cj4KPiBTaWduZWQt b2ZmLWJ5OiBHdW8gSHVpIDxndW9odWlAdW5pb250ZWNoLmNvbT4KPiAtLS0KPiAgIGFyY2gveDg2 L2tlcm5lbC9wYXJhdmlydC1zcGlubG9ja3MuYyB8ICA0ICsrKysKPiAgIGtlcm5lbC9sb2NraW5n L29zcV9sb2NrLmMgICAgICAgICAgICB8IDEyICsrKysrKysrKysrLQo+ICAgMiBmaWxlcyBjaGFu Z2VkLCAxNSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9uKC0pCj4KPiBkaWZmIC0tZ2l0IGEvYXJj aC94ODYva2VybmVsL3BhcmF2aXJ0LXNwaW5sb2Nrcy5jIGIvYXJjaC94ODYva2VybmVsL3BhcmF2 aXJ0LXNwaW5sb2Nrcy5jCj4gaW5kZXggOWUxZWE5OS4uYTJlYjM3NSAxMDA2NDQKPiAtLS0gYS9h cmNoL3g4Ni9rZXJuZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMKPiArKysgYi9hcmNoL3g4Ni9rZXJu ZWwvcGFyYXZpcnQtc3BpbmxvY2tzLmMKPiBAQCAtMzMsNiArMzMsOCBAQCBib29sIHB2X2lzX25h dGl2ZV92Y3B1X2lzX3ByZWVtcHRlZCh2b2lkKQo+ICAgCQlfX3Jhd19jYWxsZWVfc2F2ZV9fX25h dGl2ZV92Y3B1X2lzX3ByZWVtcHRlZDsKPiAgIH0KPiAgIAo+ICtERUNMQVJFX1NUQVRJQ19LRVlf VFJVRSh2Y3B1X2hhc19wcmVlbXB0aW9uKTsKPiArCj4gICB2b2lkIF9faW5pdCBwYXJhdmlydF9z ZXRfY2FwKHZvaWQpCj4gICB7Cj4gICAJaWYgKCFwdl9pc19uYXRpdmVfc3Bpbl91bmxvY2soKSkK PiBAQCAtNDAsNCArNDIsNiBAQCB2b2lkIF9faW5pdCBwYXJhdmlydF9zZXRfY2FwKHZvaWQpCj4g ICAKPiAgIAlpZiAoIXB2X2lzX25hdGl2ZV92Y3B1X2lzX3ByZWVtcHRlZCgpKQo+ICAgCQlzZXR1 cF9mb3JjZV9jcHVfY2FwKFg4Nl9GRUFUVVJFX1ZDUFVQUkVFTVBUKTsKPiArCWVsc2UKPiArCQlz dGF0aWNfYnJhbmNoX2Rpc2FibGUoJnZjcHVfaGFzX3ByZWVtcHRpb24pOwo+ICAgfQo+IGRpZmYg LS1naXQgYS9rZXJuZWwvbG9ja2luZy9vc3FfbG9jay5jIGIva2VybmVsL2xvY2tpbmcvb3NxX2xv Y2suYwo+IGluZGV4IGQ1NjEwYWQuLjg4M2U4MTUgMTAwNjQ0Cj4gLS0tIGEva2VybmVsL2xvY2tp bmcvb3NxX2xvY2suYwo+ICsrKyBiL2tlcm5lbC9sb2NraW5nL29zcV9sb2NrLmMKPiBAQCAtMjcs NiArMjcsMTYgQEAgc3RhdGljIGlubGluZSBpbnQgbm9kZV9jcHUoc3RydWN0IG9wdGltaXN0aWNf c3Bpbl9ub2RlICpub2RlKQo+ICAgCXJldHVybiBub2RlLT5jcHUgLSAxOwo+ICAgfQo+ICAgCj4g K0RFRklORV9TVEFUSUNfS0VZX1RSVUUodmNwdV9oYXNfcHJlZW1wdGlvbik7Cj4gKwo+ICtzdGF0 aWMgaW5saW5lIGJvb2wgdmNwdV9pc19wcmVlbXB0ZWRfbm9kZShzdHJ1Y3Qgb3B0aW1pc3RpY19z cGluX25vZGUgKm5vZGUpCj4gK3sKPiArCWlmIChzdGF0aWNfYnJhbmNoX2xpa2VseSgmdmNwdV9o YXNfcHJlZW1wdGlvbikpCj4gKwkJcmV0dXJuIHZjcHVfaXNfcHJlZW1wdGVkKG5vZGVfY3B1KG5v ZGUtPnByZXYpKTsKPiArCj4gKwlyZXR1cm4gZmFsc2U7Cj4gK30KPiArCj4gICBzdGF0aWMgaW5s aW5lIHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fbm9kZSAqZGVjb2RlX2NwdShpbnQgZW5jb2RlZF9j cHVfdmFsKQo+ICAgewo+ICAgCWludCBjcHVfbnIgPSBlbmNvZGVkX2NwdV92YWwgLSAxOwo+IEBA IC0xNDEsNyArMTUxLDcgQEAgYm9vbCBvc3FfbG9jayhzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX3F1 ZXVlICpsb2NrKQo+ICAgCSAqIHBvbGxpbmcsIGJlIGNhcmVmdWwuCj4gICAJICovCj4gICAJaWYg KHNtcF9jb25kX2xvYWRfcmVsYXhlZCgmbm9kZS0+bG9ja2VkLCBWQUwgfHwgbmVlZF9yZXNjaGVk KCkgfHwKPiAtCQkJCSAgdmNwdV9pc19wcmVlbXB0ZWQobm9kZV9jcHUobm9kZS0+cHJldikpKSkK PiArCQkJCQkJdmNwdV9pc19wcmVlbXB0ZWRfbm9kZShub2RlKSkpCj4gICAJCXJldHVybiB0cnVl Owo+ICAgCj4gICAJLyogdW5xdWV1ZSAqLwoKSG93IGFib3V0IGEgZnVydGhlciBpbXByb3ZlbWVu dCBvbiBjb25maWd1cmF0aW9ucyB0aGF0IGRvbid0IHVzZSAKdmNwdV9pc19wcmVlbXB0ZWQoKSBh dCBhbGw/CgorI2lmZGVmIHZjcHVfaXNfcHJlZW1wdGVkCitERUZJTkVfU1RBVElDX0tFWV9UUlVF KHZjcHVfaGFzX3ByZWVtcHRpb24pOworCiDCoHN0YXRpYyBpbmxpbmUgaW50IG5vZGVfY3B1KHN0 cnVjdCBvcHRpbWlzdGljX3NwaW5fbm9kZSAqbm9kZSkKIMKgewogwqDCoMKgwqDCoMKgwqAgcmV0 dXJuIG5vZGUtPmNwdSAtIDE7CiDCoH0KCitzdGF0aWMgaW5saW5lIGJvb2wgdmNwdV9pc19wcmVl bXB0ZWRfbm9kZShzdHJ1Y3Qgb3B0aW1pc3RpY19zcGluX25vZGUgCipub2RlKQoreworwqDCoMKg wqDCoMKgIGlmIChzdGF0aWNfYnJhbmNoX2xpa2VseSgmdmNwdV9oYXNfcHJlZW1wdGlvbikpCivC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiB2Y3B1X2lzX3ByZWVtcHRlZChub2Rl X2NwdShub2RlLT5wcmV2KSk7CisKK8KgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cit9CisjZWxz ZQorc3RhdGljIGlubGluZSBib29sIHZjcHVfaXNfcHJlZW1wdGVkX25vZGUoc3RydWN0IG9wdGlt aXN0aWNfc3Bpbl9ub2RlIAoqbm9kZSkKK3sKK8KgwqDCoMKgwqDCoCByZXR1cm4gZmFsc2U7Cit9 CisjZW5kaWYKKwogwqBzdGF0aWMgaW5saW5lIHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fbm9kZSAq ZGVjb2RlX2NwdShpbnQgZW5jb2RlZF9jcHVfdmFsKQogwqB7CiDCoMKgwqDCoMKgwqDCoCBpbnQg Y3B1X25yID0gZW5jb2RlZF9jcHVfdmFsIC0gMTsKQEAgLTE0MSw3ICsxNTgsNyBAQCBib29sIG9z cV9sb2NrKHN0cnVjdCBvcHRpbWlzdGljX3NwaW5fcXVldWUgKmxvY2spCiDCoMKgwqDCoMKgwqDC oMKgICogcG9sbGluZywgYmUgY2FyZWZ1bC4KIMKgwqDCoMKgwqDCoMKgwqAgKi8KIMKgwqDCoMKg wqDCoMKgIGlmIChzbXBfY29uZF9sb2FkX3JlbGF4ZWQoJm5vZGUtPmxvY2tlZCwgVkFMIHx8IG5l ZWRfcmVzY2hlZCgpIHx8Ci0gdmNwdV9pc19wcmVlbXB0ZWQobm9kZV9jcHUobm9kZS0+cHJldikp KSkKK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqAgdmNwdV9pc19wcmVlbXB0ZWRfbm9kZShub2RlKSkpCiDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIHRydWU7CgogwqDCoMKgwqDCoMKgwqAgLyogdW5xdWV1 ZSAqLwoKRm9yIHRob3NlIGNvbmZpZ3VyYXRpb25zLCB2Y3B1X2lzX3ByZWVtcHRlZF9ub2RlKCkg d2lsbCBqdXN0IGdldCAKY29tcGlsZWQgb3V0LgoKQ2hlZXJzLApMb25nbWFuCgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpWaXJ0dWFsaXphdGlvbiBtYWls aW5nIGxpc3QKVmlydHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6 Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vdmlydHVhbGl6YXRp b24=