From mboxrd@z Thu Jan 1 00:00:00 1970 From: Eric Dumazet Subject: Re: inconsistent lock state with usbnet/asix usb ethernet and xhci Date: Tue, 27 Feb 2018 07:09:27 -0800 Message-ID: <1519744167.7296.8.camel@gmail.com> References: <1519740421.7296.6.camel@gmail.com> Mime-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: 8bit Return-path: In-Reply-To: Sender: linux-kernel-owner@vger.kernel.org To: Marek Szyprowski , netdev@vger.kernel.org, Linux USB Mailing List , LKML , 'Linux Samsung SOC' Cc: Dean Jenkins , Oliver Neukum List-Id: linux-samsung-soc@vger.kernel.org On Tue, 2018-02-27 at 15:42 +0100, Marek Szyprowski wrote: > Hi Eric, > > On 2018-02-27 15:07, Eric Dumazet wrote: > > On Tue, 2018-02-27 at 08:26 +0100, Marek Szyprowski wrote: > > > I've noticed that USBnet/ASIX AX88772B USB driver produces deplock kernel > > > warning ("inconsistent lock state") on Chromebook2 Peach-PIT board. No > > > special activity is needed to reproduce this issue, it happens almost > > > on every boot. ASIX USB ethernet is connected to XHCI USB host controller > > > on that board. Is it a known issue? Frankly I have no idea where to look > > > to fix it. The same adapter connected to EHCI ports on other boards based > > > on the same SoC works fine without any warnings. > > > > > > Here are some more information from that board: > > > # lsusb > > > Bus 006 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub > > > Bus 005 Device 002: ID 0b95:772b ASIX Electronics Corp. AX88772B > > > Bus 005 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub > > > Bus 004 Device 001: ID 1d6b:0003 Linux Foundation 3.0 root hub > > > Bus 003 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub > > > Bus 002 Device 001: ID 1d6b:0001 Linux Foundation 1.1 root hub > > > Bus 001 Device 002: ID 2232:1056 Silicon Motion > > > Bus 001 Device 001: ID 1d6b:0002 Linux Foundation 2.0 root hub > > > > > > # lsusb -t > > > /:  Bus 06.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M > > > /:  Bus 05.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M > > >     |__ Port 1: Dev 2, If 0, Class=Vendor Specific Class, Driver=asix, 480M > > > /:  Bus 04.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 5000M > > > /:  Bus 03.Port 1: Dev 1, Class=root_hub, Driver=xhci-hcd/1p, 480M > > > /:  Bus 02.Port 1: Dev 1, Class=root_hub, Driver=exynos-ohci/3p, 12M > > > /:  Bus 01.Port 1: Dev 1, Class=root_hub, Driver=exynos-ehci/3p, 480M > > >     |__ Port 1: Dev 2, If 0, Class=Video, Driver=, 480M > > >     |__ Port 1: Dev 2, If 1, Class=Video, Driver=, 480M > > > > > > > > > And the log with mentioned warning: > > > > > > [   17.768040] ================================ > > > [   17.772239] WARNING: inconsistent lock state > > > [   17.776511] 4.16.0-rc3-next-20180227-00007-g876c53a7493c #453 Not tainted > > > [   17.783329] -------------------------------- > > > [   17.787580] inconsistent {IN-HARDIRQ-W} -> {HARDIRQ-ON-W} usage. > > > [   17.793607] swapper/0/0 [HC0[0]:SC1[1]:HE1:SE0] takes: > > > [   17.798751]  (&syncp->seq#5){?.-.}, at: [<9b22e5f0>] > > > asix_rx_fixup_internal+0x188/0x288 > > > [   17.806790] {IN-HARDIRQ-W} state was registered at: > > > [   17.811677]   tx_complete+0x100/0x208 > > > [   17.815319]   __usb_hcd_giveback_urb+0x60/0xf0 > > > [   17.819770]   xhci_giveback_urb_in_irq+0xa8/0x240 > > > [   17.824469]   xhci_td_cleanup+0xf4/0x16c > > > [   17.828367]   xhci_irq+0xe74/0x2240 > > > [   17.831827]   usb_hcd_irq+0x24/0x38 > > > [   17.835343]   __handle_irq_event_percpu+0x98/0x510 > > > [   17.840111]   handle_irq_event_percpu+0x1c/0x58 > > > [   17.844623]   handle_irq_event+0x38/0x5c > > > [   17.848519]   handle_fasteoi_irq+0xa4/0x138 > > > [   17.852681]   generic_handle_irq+0x18/0x28 > > > [   17.856760]   __handle_domain_irq+0x6c/0xe4 > > > [   17.860941]   gic_handle_irq+0x54/0xa0 > > > [   17.864666]   __irq_svc+0x70/0xb0 > > > [   17.867964]   arch_cpu_idle+0x20/0x3c > > > [   17.871578]   arch_cpu_idle+0x20/0x3c > > > [   17.875190]   do_idle+0x144/0x218 > > > [   17.878468]   cpu_startup_entry+0x18/0x1c > > > [   17.882454]   start_kernel+0x394/0x400 > > > [   17.886177] irq event stamp: 161912 > > > [   17.889616] hardirqs last  enabled at (161912): [<7bedfacf>] > > > __netdev_alloc_skb+0xcc/0x140 > > > [   17.897893] hardirqs last disabled at (161911): [] > > > __netdev_alloc_skb+0x94/0x140 > > > [   17.904903] exynos5-hsi2c 12ca0000.i2c: tx timeout > > > [   17.906116] softirqs last  enabled at (161904): [<387102ff>] > > > irq_enter+0x78/0x80 > > > [   17.906123] softirqs last disabled at (161905): [] > > > irq_exit+0x134/0x158 > > > [   17.925722]. > > > [   17.925722] other info that might help us debug this: > > > [   17.933435]  Possible unsafe locking scenario: > > > [   17.933435]. > > > [   17.940331]        CPU0 > > > [   17.942488]        ---- > > > [   17.944894]   lock(&syncp->seq#5); > > > [   17.948274]   > > > [   17.950847]     lock(&syncp->seq#5); > > > [   17.954386]. > > > [   17.954386]  *** DEADLOCK *** > > > [   17.954386]. > > > [   17.962422] no locks held by swapper/0/0. > > > [   17.966011]. > > > [   17.966011] stack backtrace: > > > [   17.971333] CPU: 0 PID: 0 Comm: swapper/0 Not tainted > > > 4.16.0-rc3-next-20180227-00007-g876c53a7493c #453 > > > [   17.980312] Hardware name: SAMSUNG EXYNOS (Flattened Device Tree) > > > [   17.986380] [] (unwind_backtrace) from [] > > > (show_stack+0x10/0x14) > > > [   17.994128] [] (show_stack) from [] > > > (dump_stack+0x90/0xc8) > > > [   18.001339] [] (dump_stack) from [] > > > (print_usage_bug+0x25c/0x2cc) > > > [   18.009161] [] (print_usage_bug) from [] > > > (mark_lock+0x290/0x698) > > > [   18.014952] exynos5-hsi2c 12ca0000.i2c: tx timeout > > > [   18.016899] [] (mark_lock) from [] > > > (__lock_acquire+0x454/0x1850) > > > [   18.029449] [] (__lock_acquire) from [] > > > (lock_acquire+0xc8/0x2b8) > > > [   18.037272] [] (lock_acquire) from [] > > > (usbnet_skb_return+0x7c/0x1a0) > > > [   18.045356] [] (usbnet_skb_return) from [] > > > (asix_rx_fixup_internal+0x188/0x288) > > > [   18.054420] [] (asix_rx_fixup_internal) from [] > > > (usbnet_bh+0xf8/0x2e4) > > > [   18.062694] [] (usbnet_bh) from [] > > > (tasklet_action+0x8c/0x13c) > > > [   18.070259] [] (tasklet_action) from [] > > > (__do_softirq+0xd4/0x6d4) > > > [   18.078089] [] (__do_softirq) from [] > > > (irq_exit+0x134/0x158) > > > [   18.085480] [] (irq_exit) from [] > > > (__handle_domain_irq+0x70/0xe4) > > > [   18.093314] [] (__handle_domain_irq) from [] > > > (gic_handle_irq+0x54/0xa0) > > > [   18.101670] [] (gic_handle_irq) from [] > > > (__irq_svc+0x70/0xb0) > > > [   18.109163] Exception stack(0xc0f01eb8 to 0xc0f01f00) > > > [   18.114202] 1ea0: 00000001 00000001 > > > [   18.122397] 1ec0: 00000000 c0f0ba80 eef3a540 eef3a540 ee8d2700 > > > c0f088b4 00000402 c09d23e0 > > > [   18.124980] exynos5-hsi2c 12ca0000.i2c: tx timeout > > > [   18.130611] 1ee0: c0f0ba80 c0f01f4c 00000000 c0f01f08 c017ea54 > > > c09d92d4 20000013 ffffffff > > > [   18.135504] cpu cpu0: _set_opp_voltage: failed to set voltage > > > (1250000 1250000 1250000 mV): -110 > > > [   18.143690] [] (__irq_svc) from [] > > > (_raw_spin_unlock_irq+0x28/0x5c) > > > [   18.152671] cpufreq: __target_index: Failed to change cpu frequency: -110 > > > [   18.160683] [] (_raw_spin_unlock_irq) from [] > > > (finish_task_switch+0xb4/0x254) > > > [   18.160696] [] (finish_task_switch) from [] > > > (__schedule+0x290/0xb10) > > > [   18.160704] [] (__schedule) from [] > > > (schedule_idle+0x2c/0x78) > > > [   18.160711] [] (schedule_idle) from [] > > > (cpu_startup_entry+0x18/0x1c) > > > [   18.200726] [] (cpu_startup_entry) from [] > > > (start_kernel+0x394/0x400) > > > > > > Best regards > > > > Please try the attached patch, thanks. > > Thanks for the patch. It fixes the deplock warning. However IMHO the same > fix should be also applied to complete_tx function for modifying stats64 > there: > > diff --git a/drivers/net/usb/usbnet.c b/drivers/net/usb/usbnet.c > index 7f5bda0ec9e8..d9eea8cfe6cb 100644 > --- a/drivers/net/usb/usbnet.c > +++ b/drivers/net/usb/usbnet.c > @@ -1249,11 +1249,12 @@ static void tx_complete (struct urb *urb) > >         if (urb->status == 0) { >                 struct pcpu_sw_netstats *stats64 = > this_cpu_ptr(dev->stats64); > +               unsigned long flags; > > -               u64_stats_update_begin(&stats64->syncp); > +               flags = u64_stats_update_begin_irqsave(&stats64->syncp); >                 stats64->tx_packets += entry->packets; >                 stats64->tx_bytes += entry->length; > -               u64_stats_update_end(&stats64->syncp); > + u64_stats_update_end_irqrestore(&stats64->syncp, flags); >         } else { >                 dev->net->stats.tx_errors++; > > > I've did that and it also works fine without deplock warning. Note that for this one, it seems we also could perform stats updates in BH context, since skb is queued via defer_bh() But simplicity wins I guess. I'll send a formal patch including your change in tx_complete(), thanks ! From mboxrd@z Thu Jan 1 00:00:00 1970 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: base64 Subject: inconsistent lock state with usbnet/asix usb ethernet and xhci From: Eric Dumazet Message-Id: <1519744167.7296.8.camel@gmail.com> Date: Tue, 27 Feb 2018 07:09:27 -0800 To: Marek Szyprowski , netdev@vger.kernel.org, Linux USB Mailing List , LKML , 'Linux Samsung SOC' Cc: Dean Jenkins , Oliver Neukum List-ID: T24gVHVlLCAyMDE4LTAyLTI3IGF0IDE1OjQyICswMTAwLCBNYXJlayBTenlwcm93c2tpIHdyb3Rl Ogo+IEhpIEVyaWMsCj4gCj4gT24gMjAxOC0wMi0yNyAxNTowNywgRXJpYyBEdW1hemV0IHdyb3Rl Ogo+ID4gT24gVHVlLCAyMDE4LTAyLTI3IGF0IDA4OjI2ICswMTAwLCBNYXJlayBTenlwcm93c2tp IHdyb3RlOgo+ID4gPiBJJ3ZlIG5vdGljZWQgdGhhdCBVU0JuZXQvQVNJWCBBWDg4NzcyQiBVU0Ig ZHJpdmVyIHByb2R1Y2VzIGRlcGxvY2sga2VybmVsCj4gPiA+IHdhcm5pbmcgKCJpbmNvbnNpc3Rl bnQgbG9jayBzdGF0ZSIpIG9uIENocm9tZWJvb2syIFBlYWNoLVBJVCBib2FyZC4gTm8KPiA+ID4g c3BlY2lhbCBhY3Rpdml0eSBpcyBuZWVkZWQgdG8gcmVwcm9kdWNlIHRoaXMgaXNzdWUsIGl0IGhh cHBlbnMgYWxtb3N0Cj4gPiA+IG9uIGV2ZXJ5IGJvb3QuIEFTSVggVVNCIGV0aGVybmV0IGlzIGNv bm5lY3RlZCB0byBYSENJIFVTQiBob3N0IGNvbnRyb2xsZXIKPiA+ID4gb24gdGhhdCBib2FyZC4g SXMgaXQgYSBrbm93biBpc3N1ZT8gRnJhbmtseSBJIGhhdmUgbm8gaWRlYSB3aGVyZSB0byBsb29r Cj4gPiA+IHRvIGZpeCBpdC4gVGhlIHNhbWUgYWRhcHRlciBjb25uZWN0ZWQgdG8gRUhDSSBwb3J0 cyBvbiBvdGhlciBib2FyZHMgYmFzZWQKPiA+ID4gb24gdGhlIHNhbWUgU29DIHdvcmtzIGZpbmUg d2l0aG91dCBhbnkgd2FybmluZ3MuCj4gPiA+IAo+ID4gPiBIZXJlIGFyZSBzb21lIG1vcmUgaW5m b3JtYXRpb24gZnJvbSB0aGF0IGJvYXJkOgo+ID4gPiAjIGxzdXNiCj4gPiA+IEJ1cyAwMDYgRGV2 aWNlIDAwMTogSUQgMWQ2YjowMDAzIExpbnV4IEZvdW5kYXRpb24gMy4wIHJvb3QgaHViCj4gPiA+ IEJ1cyAwMDUgRGV2aWNlIDAwMjogSUQgMGI5NTo3NzJiIEFTSVggRWxlY3Ryb25pY3MgQ29ycC4g QVg4ODc3MkIKPiA+ID4gQnVzIDAwNSBEZXZpY2UgMDAxOiBJRCAxZDZiOjAwMDIgTGludXggRm91 bmRhdGlvbiAyLjAgcm9vdCBodWIKPiA+ID4gQnVzIDAwNCBEZXZpY2UgMDAxOiBJRCAxZDZiOjAw MDMgTGludXggRm91bmRhdGlvbiAzLjAgcm9vdCBodWIKPiA+ID4gQnVzIDAwMyBEZXZpY2UgMDAx OiBJRCAxZDZiOjAwMDIgTGludXggRm91bmRhdGlvbiAyLjAgcm9vdCBodWIKPiA+ID4gQnVzIDAw MiBEZXZpY2UgMDAxOiBJRCAxZDZiOjAwMDEgTGludXggRm91bmRhdGlvbiAxLjEgcm9vdCBodWIK PiA+ID4gQnVzIDAwMSBEZXZpY2UgMDAyOiBJRCAyMjMyOjEwNTYgU2lsaWNvbiBNb3Rpb24KPiA+ ID4gQnVzIDAwMSBEZXZpY2UgMDAxOiBJRCAxZDZiOjAwMDIgTGludXggRm91bmRhdGlvbiAyLjAg cm9vdCBodWIKPiA+ID4gCj4gPiA+ICMgbHN1c2IgLXQKPiA+ID4gLzrCoCBCdXMgMDYuUG9ydCAx OiBEZXYgMSwgQ2xhc3M9cm9vdF9odWIsIERyaXZlcj14aGNpLWhjZC8xcCwgNTAwME0KPiA+ID4g LzrCoCBCdXMgMDUuUG9ydCAxOiBEZXYgMSwgQ2xhc3M9cm9vdF9odWIsIERyaXZlcj14aGNpLWhj ZC8xcCwgNDgwTQo+ID4gPiAgIMKgwqDCoCB8X18gUG9ydCAxOiBEZXYgMiwgSWYgMCwgQ2xhc3M9 VmVuZG9yIFNwZWNpZmljIENsYXNzLCBEcml2ZXI9YXNpeCwgNDgwTQo+ID4gPiAvOsKgIEJ1cyAw NC5Qb3J0IDE6IERldiAxLCBDbGFzcz1yb290X2h1YiwgRHJpdmVyPXhoY2ktaGNkLzFwLCA1MDAw TQo+ID4gPiAvOsKgIEJ1cyAwMy5Qb3J0IDE6IERldiAxLCBDbGFzcz1yb290X2h1YiwgRHJpdmVy PXhoY2ktaGNkLzFwLCA0ODBNCj4gPiA+IC86wqAgQnVzIDAyLlBvcnQgMTogRGV2IDEsIENsYXNz PXJvb3RfaHViLCBEcml2ZXI9ZXh5bm9zLW9oY2kvM3AsIDEyTQo+ID4gPiAvOsKgIEJ1cyAwMS5Q b3J0IDE6IERldiAxLCBDbGFzcz1yb290X2h1YiwgRHJpdmVyPWV4eW5vcy1laGNpLzNwLCA0ODBN Cj4gPiA+ICAgwqDCoMKgIHxfXyBQb3J0IDE6IERldiAyLCBJZiAwLCBDbGFzcz1WaWRlbywgRHJp dmVyPSwgNDgwTQo+ID4gPiAgIMKgwqDCoCB8X18gUG9ydCAxOiBEZXYgMiwgSWYgMSwgQ2xhc3M9 VmlkZW8sIERyaXZlcj0sIDQ4ME0KPiA+ID4gCj4gPiA+IAo+ID4gPiBBbmQgdGhlIGxvZyB3aXRo IG1lbnRpb25lZCB3YXJuaW5nOgo+ID4gPiAKPiA+ID4gW8KgwqAgMTcuNzY4MDQwXSA9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQo+ID4gPiBbwqDCoCAxNy43NzIyMzldIFdBUk5JTkc6 IGluY29uc2lzdGVudCBsb2NrIHN0YXRlCj4gPiA+IFvCoMKgIDE3Ljc3NjUxMV0gNC4xNi4wLXJj My1uZXh0LTIwMTgwMjI3LTAwMDA3LWc4NzZjNTNhNzQ5M2MgIzQ1MyBOb3QgdGFpbnRlZAo+ID4g PiBbwqDCoCAxNy43ODMzMjldIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCj4gPiA+ IFvCoMKgIDE3Ljc4NzU4MF0gaW5jb25zaXN0ZW50IHtJTi1IQVJESVJRLVd9IC0+IHtIQVJESVJR LU9OLVd9IHVzYWdlLgo+ID4gPiBbwqDCoCAxNy43OTM2MDddIHN3YXBwZXIvMC8wIFtIQzBbMF06 U0MxWzFdOkhFMTpTRTBdIHRha2VzOgo+ID4gPiBbwqDCoCAxNy43OTg3NTFdwqAgKCZzeW5jcC0+ c2VxIzUpez8uLS59LCBhdDogWzw5YjIyZTVmMD5dCj4gPiA+IGFzaXhfcnhfZml4dXBfaW50ZXJu YWwrMHgxODgvMHgyODgKPiA+ID4gW8KgwqAgMTcuODA2NzkwXSB7SU4tSEFSRElSUS1XfSBzdGF0 ZSB3YXMgcmVnaXN0ZXJlZCBhdDoKPiA+ID4gW8KgwqAgMTcuODExNjc3XcKgwqAgdHhfY29tcGxl dGUrMHgxMDAvMHgyMDgKPiA+ID4gW8KgwqAgMTcuODE1MzE5XcKgwqAgX191c2JfaGNkX2dpdmVi YWNrX3VyYisweDYwLzB4ZjAKPiA+ID4gW8KgwqAgMTcuODE5NzcwXcKgwqAgeGhjaV9naXZlYmFj a191cmJfaW5faXJxKzB4YTgvMHgyNDAKPiA+ID4gW8KgwqAgMTcuODI0NDY5XcKgwqAgeGhjaV90 ZF9jbGVhbnVwKzB4ZjQvMHgxNmMKPiA+ID4gW8KgwqAgMTcuODI4MzY3XcKgwqAgeGhjaV9pcnEr MHhlNzQvMHgyMjQwCj4gPiA+IFvCoMKgIDE3LjgzMTgyN13CoMKgIHVzYl9oY2RfaXJxKzB4MjQv MHgzOAo+ID4gPiBbwqDCoCAxNy44MzUzNDNdwqDCoCBfX2hhbmRsZV9pcnFfZXZlbnRfcGVyY3B1 KzB4OTgvMHg1MTAKPiA+ID4gW8KgwqAgMTcuODQwMTExXcKgwqAgaGFuZGxlX2lycV9ldmVudF9w ZXJjcHUrMHgxYy8weDU4Cj4gPiA+IFvCoMKgIDE3Ljg0NDYyM13CoMKgIGhhbmRsZV9pcnFfZXZl bnQrMHgzOC8weDVjCj4gPiA+IFvCoMKgIDE3Ljg0ODUxOV3CoMKgIGhhbmRsZV9mYXN0ZW9pX2ly cSsweGE0LzB4MTM4Cj4gPiA+IFvCoMKgIDE3Ljg1MjY4MV3CoMKgIGdlbmVyaWNfaGFuZGxlX2ly cSsweDE4LzB4MjgKPiA+ID4gW8KgwqAgMTcuODU2NzYwXcKgwqAgX19oYW5kbGVfZG9tYWluX2ly cSsweDZjLzB4ZTQKPiA+ID4gW8KgwqAgMTcuODYwOTQxXcKgwqAgZ2ljX2hhbmRsZV9pcnErMHg1 NC8weGEwCj4gPiA+IFvCoMKgIDE3Ljg2NDY2Nl3CoMKgIF9faXJxX3N2YysweDcwLzB4YjAKPiA+ ID4gW8KgwqAgMTcuODY3OTY0XcKgwqAgYXJjaF9jcHVfaWRsZSsweDIwLzB4M2MKPiA+ID4gW8Kg wqAgMTcuODcxNTc4XcKgwqAgYXJjaF9jcHVfaWRsZSsweDIwLzB4M2MKPiA+ID4gW8KgwqAgMTcu ODc1MTkwXcKgwqAgZG9faWRsZSsweDE0NC8weDIxOAo+ID4gPiBbwqDCoCAxNy44Nzg0NjhdwqDC oCBjcHVfc3RhcnR1cF9lbnRyeSsweDE4LzB4MWMKPiA+ID4gW8KgwqAgMTcuODgyNDU0XcKgwqAg c3RhcnRfa2VybmVsKzB4Mzk0LzB4NDAwCj4gPiA+IFvCoMKgIDE3Ljg4NjE3N10gaXJxIGV2ZW50 IHN0YW1wOiAxNjE5MTIKPiA+ID4gW8KgwqAgMTcuODg5NjE2XSBoYXJkaXJxcyBsYXN0wqAgZW5h YmxlZCBhdCAoMTYxOTEyKTogWzw3YmVkZmFjZj5dCj4gPiA+IF9fbmV0ZGV2X2FsbG9jX3NrYisw eGNjLzB4MTQwCj4gPiA+IFvCoMKgIDE3Ljg5Nzg5M10gaGFyZGlycXMgbGFzdCBkaXNhYmxlZCBh dCAoMTYxOTExKTogWzxkNTgyNjFkMD5dCj4gPiA+IF9fbmV0ZGV2X2FsbG9jX3NrYisweDk0LzB4 MTQwCj4gPiA+IFvCoMKgIDE3LjkwNDkwM10gZXh5bm9zNS1oc2kyYyAxMmNhMDAwMC5pMmM6IHR4 IHRpbWVvdXQKPiA+ID4gW8KgwqAgMTcuOTA2MTE2XSBzb2Z0aXJxcyBsYXN0wqAgZW5hYmxlZCBh dCAoMTYxOTA0KTogWzwzODcxMDJmZj5dCj4gPiA+IGlycV9lbnRlcisweDc4LzB4ODAKPiA+ID4g W8KgwqAgMTcuOTA2MTIzXSBzb2Z0aXJxcyBsYXN0IGRpc2FibGVkIGF0ICgxNjE5MDUpOiBbPGNm NGM2MjhlPl0KPiA+ID4gaXJxX2V4aXQrMHgxMzQvMHgxNTgKPiA+ID4gW8KgwqAgMTcuOTI1NzIy XS4KPiA+ID4gW8KgwqAgMTcuOTI1NzIyXSBvdGhlciBpbmZvIHRoYXQgbWlnaHQgaGVscCB1cyBk ZWJ1ZyB0aGlzOgo+ID4gPiBbwqDCoCAxNy45MzM0MzVdwqAgUG9zc2libGUgdW5zYWZlIGxvY2tp bmcgc2NlbmFyaW86Cj4gPiA+IFvCoMKgIDE3LjkzMzQzNV0uCj4gPiA+IFvCoMKgIDE3Ljk0MDMz MV3CoMKgwqDCoMKgwqDCoCBDUFUwCj4gPiA+IFvCoMKgIDE3Ljk0MjQ4OF3CoMKgwqDCoMKgwqDC oCAtLS0tCj4gPiA+IFvCoMKgIDE3Ljk0NDg5NF3CoMKgIGxvY2soJnN5bmNwLT5zZXEjNSk7Cj4g PiA+IFvCoMKgIDE3Ljk0ODI3NF3CoMKgIDxJbnRlcnJ1cHQ+Cj4gPiA+IFvCoMKgIDE3Ljk1MDg0 N13CoMKgwqDCoCBsb2NrKCZzeW5jcC0+c2VxIzUpOwo+ID4gPiBbwqDCoCAxNy45NTQzODZdLgo+ ID4gPiBbwqDCoCAxNy45NTQzODZdwqAgKioqIERFQURMT0NLICoqKgo+ID4gPiBbwqDCoCAxNy45 NTQzODZdLgo+ID4gPiBbwqDCoCAxNy45NjI0MjJdIG5vIGxvY2tzIGhlbGQgYnkgc3dhcHBlci8w LzAuCj4gPiA+IFvCoMKgIDE3Ljk2NjAxMV0uCj4gPiA+IFvCoMKgIDE3Ljk2NjAxMV0gc3RhY2sg YmFja3RyYWNlOgo+ID4gPiBbwqDCoCAxNy45NzEzMzNdIENQVTogMCBQSUQ6IDAgQ29tbTogc3dh cHBlci8wIE5vdCB0YWludGVkCj4gPiA+IDQuMTYuMC1yYzMtbmV4dC0yMDE4MDIyNy0wMDAwNy1n ODc2YzUzYTc0OTNjICM0NTMKPiA+ID4gW8KgwqAgMTcuOTgwMzEyXSBIYXJkd2FyZSBuYW1lOiBT QU1TVU5HIEVYWU5PUyAoRmxhdHRlbmVkIERldmljZSBUcmVlKQo+ID4gPiBbwqDCoCAxNy45ODYz ODBdIFs8YzAxMTE1NDg+XSAodW53aW5kX2JhY2t0cmFjZSkgZnJvbSBbPGMwMTBkYmQ4Pl0KPiA+ ID4gKHNob3dfc3RhY2srMHgxMC8weDE0KQo+ID4gPiBbwqDCoCAxNy45OTQxMjhdIFs8YzAxMGRi ZDg+XSAoc2hvd19zdGFjaykgZnJvbSBbPGMwOWJkNDE4Pl0KPiA+ID4gKGR1bXBfc3RhY2srMHg5 MC8weGM4KQo+ID4gPiBbwqDCoCAxOC4wMDEzMzldIFs8YzA5YmQ0MTg+XSAoZHVtcF9zdGFjaykg ZnJvbSBbPGMwMTdmZGY4Pl0KPiA+ID4gKHByaW50X3VzYWdlX2J1ZysweDI1Yy8weDJjYykKPiA+ ID4gW8KgwqAgMTguMDA5MTYxXSBbPGMwMTdmZGY4Pl0gKHByaW50X3VzYWdlX2J1ZykgZnJvbSBb PGMwMTdjMTRjPl0KPiA+ID4gKG1hcmtfbG9jaysweDI5MC8weDY5OCkKPiA+ID4gW8KgwqAgMTgu MDE0OTUyXSBleHlub3M1LWhzaTJjIDEyY2EwMDAwLmkyYzogdHggdGltZW91dAo+ID4gPiBbwqDC oCAxOC4wMTY4OTldIFs8YzAxN2MxNGM+XSAobWFya19sb2NrKSBmcm9tIFs8YzAxN2M5YTg+XQo+ ID4gPiAoX19sb2NrX2FjcXVpcmUrMHg0NTQvMHgxODUwKQo+ID4gPiBbwqDCoCAxOC4wMjk0NDld IFs8YzAxN2M5YTg+XSAoX19sb2NrX2FjcXVpcmUpIGZyb20gWzxjMDE3ZTZlMD5dCj4gPiA+IChs b2NrX2FjcXVpcmUrMHhjOC8weDJiOCkKPiA+ID4gW8KgwqAgMTguMDM3MjcyXSBbPGMwMTdlNmUw Pl0gKGxvY2tfYWNxdWlyZSkgZnJvbSBbPGMwNWJlOThjPl0KPiA+ID4gKHVzYm5ldF9za2JfcmV0 dXJuKzB4N2MvMHgxYTApCj4gPiA+IFvCoMKgIDE4LjA0NTM1Nl0gWzxjMDViZTk4Yz5dICh1c2Ju ZXRfc2tiX3JldHVybikgZnJvbSBbPGMwNWIxODVjPl0KPiA+ID4gKGFzaXhfcnhfZml4dXBfaW50 ZXJuYWwrMHgxODgvMHgyODgpCj4gPiA+IFvCoMKgIDE4LjA1NDQyMF0gWzxjMDViMTg1Yz5dIChh c2l4X3J4X2ZpeHVwX2ludGVybmFsKSBmcm9tIFs8YzA1YmZlNDA+XQo+ID4gPiAodXNibmV0X2Jo KzB4ZjgvMHgyZTQpCj4gPiA+IFvCoMKgIDE4LjA2MjY5NF0gWzxjMDViZmU0MD5dICh1c2JuZXRf YmgpIGZyb20gWzxjMDEyZDZiND5dCj4gPiA+ICh0YXNrbGV0X2FjdGlvbisweDhjLzB4MTNjKQo+ ID4gPiBbwqDCoCAxOC4wNzAyNTldIFs8YzAxMmQ2YjQ+XSAodGFza2xldF9hY3Rpb24pIGZyb20g WzxjMDEwMjIxND5dCj4gPiA+IChfX2RvX3NvZnRpcnErMHhkNC8weDZkNCkKPiA+ID4gW8KgwqAg MTguMDc4MDg5XSBbPGMwMTAyMjE0Pl0gKF9fZG9fc29mdGlycSkgZnJvbSBbPGMwMTJjZjM0Pl0K PiA+ID4gKGlycV9leGl0KzB4MTM0LzB4MTU4KQo+ID4gPiBbwqDCoCAxOC4wODU0ODBdIFs8YzAx MmNmMzQ+XSAoaXJxX2V4aXQpIGZyb20gWzxjMDE4YzQ0ND5dCj4gPiA+IChfX2hhbmRsZV9kb21h aW5faXJxKzB4NzAvMHhlNCkKPiA+ID4gW8KgwqAgMTguMDkzMzE0XSBbPGMwMThjNDQ0Pl0gKF9f aGFuZGxlX2RvbWFpbl9pcnEpIGZyb20gWzxjMDQ2NDAwYz5dCj4gPiA+IChnaWNfaGFuZGxlX2ly cSsweDU0LzB4YTApCj4gPiA+IFvCoMKgIDE4LjEwMTY3MF0gWzxjMDQ2NDAwYz5dIChnaWNfaGFu ZGxlX2lycSkgZnJvbSBbPGMwMTAxOWYwPl0KPiA+ID4gKF9faXJxX3N2YysweDcwLzB4YjApCj4g PiA+IFvCoMKgIDE4LjEwOTE2M10gRXhjZXB0aW9uIHN0YWNrKDB4YzBmMDFlYjggdG8gMHhjMGYw MWYwMCkKPiA+ID4gW8KgwqAgMTguMTE0MjAyXSAxZWEwOiAwMDAwMDAwMSAwMDAwMDAwMQo+ID4g PiBbwqDCoCAxOC4xMjIzOTddIDFlYzA6IDAwMDAwMDAwIGMwZjBiYTgwIGVlZjNhNTQwIGVlZjNh NTQwIGVlOGQyNzAwCj4gPiA+IGMwZjA4OGI0IDAwMDAwNDAyIGMwOWQyM2UwCj4gPiA+IFvCoMKg IDE4LjEyNDk4MF0gZXh5bm9zNS1oc2kyYyAxMmNhMDAwMC5pMmM6IHR4IHRpbWVvdXQKPiA+ID4g W8KgwqAgMTguMTMwNjExXSAxZWUwOiBjMGYwYmE4MCBjMGYwMWY0YyAwMDAwMDAwMCBjMGYwMWYw OCBjMDE3ZWE1NAo+ID4gPiBjMDlkOTJkNCAyMDAwMDAxMyBmZmZmZmZmZgo+ID4gPiBbwqDCoCAx OC4xMzU1MDRdIGNwdSBjcHUwOiBfc2V0X29wcF92b2x0YWdlOiBmYWlsZWQgdG8gc2V0IHZvbHRh Z2UKPiA+ID4gKDEyNTAwMDAgMTI1MDAwMCAxMjUwMDAwIG1WKTogLTExMAo+ID4gPiBbwqDCoCAx OC4xNDM2OTBdIFs8YzAxMDE5ZjA+XSAoX19pcnFfc3ZjKSBmcm9tIFs8YzA5ZDkyZDQ+XQo+ID4g PiAoX3Jhd19zcGluX3VubG9ja19pcnErMHgyOC8weDVjKQo+ID4gPiBbwqDCoCAxOC4xNTI2NzFd IGNwdWZyZXE6IF9fdGFyZ2V0X2luZGV4OiBGYWlsZWQgdG8gY2hhbmdlIGNwdSBmcmVxdWVuY3k6 IC0xMTAKPiA+ID4gW8KgwqAgMTguMTYwNjgzXSBbPGMwOWQ5MmQ0Pl0gKF9yYXdfc3Bpbl91bmxv Y2tfaXJxKSBmcm9tIFs8YzAxNTI2ODQ+XQo+ID4gPiAoZmluaXNoX3Rhc2tfc3dpdGNoKzB4YjQv MHgyNTQpCj4gPiA+IFvCoMKgIDE4LjE2MDY5Nl0gWzxjMDE1MjY4ND5dIChmaW5pc2hfdGFza19z d2l0Y2gpIGZyb20gWzxjMDlkMjNlMD5dCj4gPiA+IChfX3NjaGVkdWxlKzB4MjkwLzB4YjEwKQo+ ID4gPiBbwqDCoCAxOC4xNjA3MDRdIFs8YzA5ZDIzZTA+XSAoX19zY2hlZHVsZSkgZnJvbSBbPGMw OWQzMTM0Pl0KPiA+ID4gKHNjaGVkdWxlX2lkbGUrMHgyYy8weDc4KQo+ID4gPiBbwqDCoCAxOC4x NjA3MTFdIFs8YzA5ZDMxMzQ+XSAoc2NoZWR1bGVfaWRsZSkgZnJvbSBbPGMwMTcwM2EwPl0KPiA+ ID4gKGNwdV9zdGFydHVwX2VudHJ5KzB4MTgvMHgxYykKPiA+ID4gW8KgwqAgMTguMjAwNzI2XSBb PGMwMTcwM2EwPl0gKGNwdV9zdGFydHVwX2VudHJ5KSBmcm9tIFs8YzBlMDBjNzQ+XQo+ID4gPiAo c3RhcnRfa2VybmVsKzB4Mzk0LzB4NDAwKQo+ID4gPiAKPiA+ID4gQmVzdCByZWdhcmRzCj4gPiAK PiA+IFBsZWFzZSB0cnkgdGhlIGF0dGFjaGVkIHBhdGNoLCB0aGFua3MuCj4gCj4gVGhhbmtzIGZv ciB0aGUgcGF0Y2guIEl0IGZpeGVzIHRoZSBkZXBsb2NrIHdhcm5pbmcuIEhvd2V2ZXIgSU1ITyB0 aGUgc2FtZQo+IGZpeCBzaG91bGQgYmUgYWxzbyBhcHBsaWVkIHRvIGNvbXBsZXRlX3R4IGZ1bmN0 aW9uIGZvciBtb2RpZnlpbmcgc3RhdHM2NAo+IHRoZXJlOgo+IAo+IGRpZmYgLS1naXQgYS9kcml2 ZXJzL25ldC91c2IvdXNibmV0LmMgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKPiBpbmRleCA3 ZjViZGEwZWM5ZTguLmQ5ZWVhOGNmZTZjYiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL25ldC91c2Iv dXNibmV0LmMKPiArKysgYi9kcml2ZXJzL25ldC91c2IvdXNibmV0LmMKPiBAQCAtMTI0OSwxMSAr MTI0OSwxMiBAQCBzdGF0aWMgdm9pZCB0eF9jb21wbGV0ZSAoc3RydWN0IHVyYiAqdXJiKQo+IAo+ ICDCoMKgwqDCoMKgwqDCoCBpZiAodXJiLT5zdGF0dXMgPT0gMCkgewo+ICDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoMKgwqAgc3RydWN0IHBjcHVfc3dfbmV0c3RhdHMgKnN0YXRzNjQgPSAKPiB0 aGlzX2NwdV9wdHIoZGV2LT5zdGF0czY0KTsKPiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oCB1bnNpZ25lZCBsb25nIGZsYWdzOwo+IAo+IC3CoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IHU2NF9zdGF0c191cGRhdGVfYmVnaW4oJnN0YXRzNjQtPnN5bmNwKTsKPiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoCBmbGFncyA9IHU2NF9zdGF0c191cGRhdGVfYmVnaW5faXJxc2F2ZSgm c3RhdHM2NC0+c3luY3ApOwo+ICDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgc3RhdHM2 NC0+dHhfcGFja2V0cyArPSBlbnRyeS0+cGFja2V0czsKPiAgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgIHN0YXRzNjQtPnR4X2J5dGVzICs9IGVudHJ5LT5sZW5ndGg7Cj4gLcKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqAgdTY0X3N0YXRzX3VwZGF0ZV9lbmQoJnN0YXRzNjQtPnN5bmNw KTsKPiArIHU2NF9zdGF0c191cGRhdGVfZW5kX2lycXJlc3RvcmUoJnN0YXRzNjQtPnN5bmNwLCBm bGFncyk7Cj4gIMKgwqDCoMKgwqDCoMKgIH0gZWxzZSB7Cj4gIMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBkZXYtPm5ldC0+c3RhdHMudHhfZXJyb3JzKys7Cj4gCj4gCj4gSSd2ZSBkaWQg dGhhdCBhbmQgaXQgYWxzbyB3b3JrcyBmaW5lIHdpdGhvdXQgZGVwbG9jayB3YXJuaW5nLgoKTm90 ZSB0aGF0IGZvciB0aGlzIG9uZSwgaXQgc2VlbXMgd2UgYWxzbyBjb3VsZCBwZXJmb3JtIHN0YXRz IHVwZGF0ZXMgaW4KQkggY29udGV4dCwgc2luY2Ugc2tiIGlzIHF1ZXVlZCB2aWEgZGVmZXJfYmgo KQoKQnV0IHNpbXBsaWNpdHkgd2lucyBJIGd1ZXNzLgoKSSdsbCBzZW5kIGEgZm9ybWFsIHBhdGNo IGluY2x1ZGluZyB5b3VyIGNoYW5nZSBpbiB0eF9jb21wbGV0ZSgpLAp0aGFua3MgIQotLS0KVG8g dW5zdWJzY3JpYmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGxp bnV4LXVzYiIgaW4KdGhlIGJvZHkgb2YgYSBtZXNzYWdlIHRvIG1ham9yZG9tb0B2Z2VyLmtlcm5l bC5vcmcKTW9yZSBtYWpvcmRvbW8gaW5mbyBhdCAgaHR0cDovL3ZnZXIua2VybmVsLm9yZy9tYWpv cmRvbW8taW5mby5odG1sCg==