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 X-Spam-Level: X-Spam-Status: No, score=-7.1 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id E60FBC43441 for ; Mon, 12 Nov 2018 08:53:44 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 5136922360 for ; Mon, 12 Nov 2018 08:53:44 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=synopsys.com header.i=@synopsys.com header.b="N4DVPr6Z" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5136922360 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=synopsys.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729074AbeKLSpy (ORCPT ); Mon, 12 Nov 2018 13:45:54 -0500 Received: from smtprelay2.synopsys.com ([198.182.60.111]:58998 "EHLO smtprelay.synopsys.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727996AbeKLSpx (ORCPT ); Mon, 12 Nov 2018 13:45:53 -0500 Received: from mailhost.synopsys.com (mailhost3.synopsys.com [10.12.238.238]) by smtprelay.synopsys.com (Postfix) with ESMTP id C765710C1102; Mon, 12 Nov 2018 00:53:40 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=synopsys.com; s=mail; t=1542012820; bh=QA5q6GpD+nqz0fxDWQerMoerwRAOLN+SDHbzHlcRGa4=; h=From:To:CC:Subject:Date:References:From; b=N4DVPr6ZhrI7r9y/PVFjox9Drw4VjCQph9o652QavHxIb9dxfOyyOZgFVSAo6N5VB 0RTA01NKo8DrCelOVDMTmIbinGyt+IUqEEmyd+n85nTfNvTnaYWst5B2Xc+RGYdxUA xtoR0jqomU3ca2X6TlXCWGsQ4ZC82563OiOikzhbM0Ubsb+V3bNBdmzhw/EKG/keXY gl+LlrI/90nxl+APS4KiqVyHfzPTV6kZ6DgsvNWKUuKWvSeypvmQkZ+D4JUW3W/cvy KP3igjUCbNqc9Zvo9Tm9kZanEPsCpSeIQBPQ0qi/jXooIL4Eg6pYQ6TTW2TANLnnjq 2F2JwoMv2r/fA== Received: from us01wehtc1.internal.synopsys.com (us01wehtc1-vip.internal.synopsys.com [10.12.239.236]) by mailhost.synopsys.com (Postfix) with ESMTP id 6B3643A89; Mon, 12 Nov 2018 00:53:40 -0800 (PST) Received: from AM04WEHTCA.internal.synopsys.com (10.116.16.190) by us01wehtc1.internal.synopsys.com (10.12.239.231) with Microsoft SMTP Server (TLS) id 14.3.408.0; Mon, 12 Nov 2018 00:53:39 -0800 Received: from AM04WEMBXA.internal.synopsys.com ([fe80::79c3:55f2:1f20:5bf4]) by am04wehtca.internal.synopsys.com ([::1]) with mapi id 14.03.0415.000; Mon, 12 Nov 2018 12:53:37 +0400 From: Minas Harutyunyan To: John Keeping , Minas Harutyunyan CC: Greg Kroah-Hartman , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "arthur.petrosyan@synopsys.com" Subject: Re: [PATCH] usb: dwc2: gadget: fix ISOC frame overflow handling Thread-Topic: [PATCH] usb: dwc2: gadget: fix ISOC frame overflow handling Thread-Index: AQHUatZW7CBOg1jSlEOevZqXY6bG3Q== Date: Mon, 12 Nov 2018 08:53:36 +0000 Message-ID: <410670D7E743164D87FA6160E7907A56013A7A27D7@am04wembxa.internal.synopsys.com> References: <20181023134355.29829-1-john@metanate.com> <410670D7E743164D87FA6160E7907A56013A79E7CE@am04wembxa.internal.synopsys.com> <20181108173654.118f9e3e@donbot> <410670D7E743164D87FA6160E7907A56013A7A0F2B@am04wembxa.internal.synopsys.com> <410670D7E743164D87FA6160E7907A56013A7A12C1@am04wembxa.internal.synopsys.com> <20181109184246.33cb4487@donbot> Accept-Language: en-US Content-Language: en-US X-MS-Has-Attach: X-MS-TNEF-Correlator: x-originating-ip: [10.116.70.150] Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi John,=0A= =0A= On 11/9/2018 10:43 PM, John Keeping wrote:=0A= > Hi Minas,=0A= > =0A= > On Fri, 9 Nov 2018 14:36:36 +0000=0A= > Minas Harutyunyan wrote:=0A= > =0A= >> On 11/9/2018 12:43 PM, Minas Harutyunyan wrote:=0A= >>> Hi John,=0A= >>>=0A= >>> On 11/8/2018 9:37 PM, John Keeping wrote:=0A= >>>> Hi Minas,=0A= >>>>=0A= >>>> On Mon, 5 Nov 2018 08:28:07 +0000=0A= >>>> Minas Harutyunyan wrote:=0A= >>>>=0A= >>>>> On 10/23/2018 5:43 PM, John Keeping wrote:=0A= >>>>>> By clearing the overrun flag as soon as the target frame is next=0A= >>>>>> incremented, we can end up incrementing the target frame more=0A= >>>>>> than expected in dwc2_gadget_handle_ep_disabled() when the=0A= >>>>>> endpoint's interval is greater than 1. This happens if the=0A= >>>>>> target frame has just wrapped at the point when the endpoint is=0A= >>>>>> disabled and the frame number has not yet done so.=0A= >>>>>>=0A= >>>>>> Instead, wait until the frame number also wraps and then clear=0A= >>>>>> the overrun flag.=0A= >>>>>>=0A= >>>>>> Signed-off-by: John Keeping =0A= >>>>>> ---=0A= >>>>>> drivers/usb/dwc2/gadget.c | 2 +-=0A= >>>>>> 1 file changed, 1 insertion(+), 1 deletion(-)=0A= >>>>>>=0A= >>>>>> diff --git a/drivers/usb/dwc2/gadget.c=0A= >>>>>> b/drivers/usb/dwc2/gadget.c index 2d6d2c8244de..8da2c052dfa1=0A= >>>>>> 100644 --- a/drivers/usb/dwc2/gadget.c=0A= >>>>>> +++ b/drivers/usb/dwc2/gadget.c=0A= >>>>>> @@ -117,7 +117,7 @@ static inline void=0A= >>>>>> dwc2_gadget_incr_frame_num(struct dwc2_hsotg_ep *hs_ep) if=0A= >>>>>> (hs_ep->target_frame > DSTS_SOFFN_LIMIT) { hs_ep->frame_overrun =3D= =0A= >>>>>> true; hs_ep->target_frame &=3D DSTS_SOFFN_LIMIT;=0A= >>>>>> - } else {=0A= >>>>>> + } else if (hs_ep->parent->frame_number <=0A= >>>>>> hs_ep->target_frame) { hs_ep->frame_overrun =3D false;=0A= >>>>>> }=0A= >>>>>> }=0A= >>>>>> =0A= >>>>> Did you tested mentioned by you scenario? If you see issue can you=0A= >>>>> provide debug log and point the issue line in the log.=0A= >>>>=0A= >>>> It only reproduces very occasionally so it's difficult to capture=0A= >>>> a full debug log containing the error.=0A= >>>>=0A= >>>> I applied this patch to capture logging specifically around this=0A= >>>> scenario:=0A= >>>>=0A= >>>> -- >8 --=0A= >>>> diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c=0A= >>>> index 220c0f9b89b0..3770b9d3b523 100644=0A= >>>> --- a/drivers/usb/dwc2/gadget.c=0A= >>>> +++ b/drivers/usb/dwc2/gadget.c=0A= >>>> @@ -2722,13 +2722,20 @@ static void=0A= >>>> dwc2_gadget_handle_ep_disabled(struct dwc2_hsotg_ep *hs_ep) }=0A= >>>> =0A= >>>> do {=0A= >>>> + unsigned int target_frame =3D hs_ep->target_frame;=0A= >>>> + bool frame_overrun =3D hs_ep->frame_overrun;=0A= >>>> +=0A= >>>> hs_req =3D get_ep_head(hs_ep);=0A= >>>> if (hs_req)=0A= >>>> dwc2_hsotg_complete_request(hsotg,=0A= >>>> hs_ep, hs_req, -ENODATA);=0A= >>>> +=0A= >>>> dwc2_gadget_incr_frame_num(hs_ep);=0A= >>>> /* Update current frame number value. */=0A= >>>> hsotg->frame_number =3D=0A= >>>> dwc2_hsotg_read_frameno(hsotg); +=0A= >>>> + dev_warn(hsotg->dev, "%s: expiring request=0A= >>>> frame_number=3D0x%04x target_frame=3D0x%04x overrun=3D%u\n",=0A= >>>> + __func__, hsotg->frame_number,=0A= >>>> target_frame, frame_overrun); } while=0A= >>>> (dwc2_gadget_target_frame_elapsed(hs_ep));=0A= >>>> dwc2_gadget_start_next_request(hs_ep);=0A= >>>> -- 8< --=0A= >>>>=0A= >>> According above patch in debug log should be printed overrun flag=0A= >>> also. Could you please resend log with this flag.=0A= > =0A= > D'oh! I included a log from an earlier version before I added the=0A= > overrun flag.=0A= > =0A= >> One more request. Please add EP number to debug print.=0A= > =0A= > Here's an updated log:=0A= > =0A= > -- >8 --=0A= > [ 264.926385] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x2161 target_frame=3D0x2168 overrun=3D0=0A= > [ 265.905413] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0008 overrun=3D0=0A= > [ 265.905421] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0010 overrun=3D0=0A= > [ 265.905427] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0018 overrun=3D0=0A= > [ 265.905432] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0020 overrun=3D0=0A= > [ 265.905438] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0028 overrun=3D0=0A= > [ 265.905443] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0030 overrun=3D0=0A= > [ 265.905448] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0038 overrun=3D0=0A= > [ 265.905454] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0040 overrun=3D0=0A= > [ 265.905459] dwc2 ff580000.usb: dwc2_gadget_handle_ep_disabled: expirin= g request ep=3D2 frame_number=3D0x3ff9 target_frame=3D0x0048 overrun=3D0=0A= > -- 8< --=0A= > =0A= > Once again there is an initial failure before it enters the failure mode= =0A= > my patch is trying to address. This seems to be consistent, so it may=0A= > be important, but there is ~80ms before the failure starts.=0A= > =0A= >>>> This was on v4.19 with an additional patch to disable descriptor=0A= >>>> DMA because that seems to be causing problems on RK3288 although I=0A= >>>> haven't figured out exactly why it's a problem.=0A= >>>=0A= >>> In which mode you run tests Slave or Buffer DMA?=0A= > =0A= > Buffer DMA but with descriptor DMA forced off (g_dma=3D1, g_dma_desc=3D0)= .=0A= > =0A= > For the record, my test case is the standard UAC2 gadget with:=0A= > =0A= > c_srate =3D p_srate =3D 44100=0A= > c_ssize =3D p_ssize =3D 4=0A= > c_chmask =3D 0xf=0A= > p_chmask =3D 3=0A= > =0A= > and it seems that the failure only triggers when using arecord to=0A= > capture from the gadget interface (this is with a host program both=0A= > streaming in both directions over the USB connection); I suspect that=0A= > actually it just makes it more likely because there is more work done in= =0A= > the completion handler, but I haven't seen the failure without arecord=0A= > running.=0A= > =0A= > =0A= > Regards,=0A= > John=0A= > =0A= I think cause of issue not in dwc2_gadget_target_frame_elapsed() =0A= function, but in do-while loop in dwc2_gadget_handle_ep_disabled().=0A= Could you please try below patch:=0A= =0A= diff --git a/drivers/usb/dwc2/gadget.c b/drivers/usb/dwc2/gadget.c=0A= index 8eb25e3597b0..4ad869853bfa 100644=0A= --- a/drivers/usb/dwc2/gadget.c=0A= +++ b/drivers/usb/dwc2/gadget.c=0A= @@ -2762,8 +2762,11 @@ static void dwc2_gadget_handle_ep_disabled(struct = =0A= dwc2_hsotg_ep *hs_ep)=0A= =0A= do {=0A= hs_req =3D get_ep_head(hs_ep);=0A= - if (hs_req)=0A= - dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req,= =0A= + if (!hs_req) {=0A= + dev_warn(hsotg->dev, "%s: ISOC EP queue =0A= empty\n", __func__);=0A= + return;=0A= + }=0A= + dwc2_hsotg_complete_request(hsotg, hs_ep, hs_req,=0A= -ENODATA);=0A= dwc2_gadget_incr_frame_num(hs_ep);=0A= /* Update current frame number value. */=0A= =0A= Thanks,=0A= Minas=0A= =0A= 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: usb: dwc2: gadget: fix ISOC frame overflow handling From: Minas Harutyunyan Message-Id: <410670D7E743164D87FA6160E7907A56013A7A27D7@am04wembxa.internal.synopsys.com> Date: Mon, 12 Nov 2018 08:53:36 +0000 To: John Keeping , Minas Harutyunyan Cc: Greg Kroah-Hartman , "linux-usb@vger.kernel.org" , "linux-kernel@vger.kernel.org" , "arthur.petrosyan@synopsys.com" List-ID: SGkgSm9obiwKCk9uIDExLzkvMjAxOCAxMDo0MyBQTSwgSm9obiBLZWVwaW5nIHdyb3RlOgo+IEhp IE1pbmFzLAo+IAo+IE9uIEZyaSwgOSBOb3YgMjAxOCAxNDozNjozNiArMDAwMAo+IE1pbmFzIEhh cnV0eXVueWFuIDxtaW5hcy5oYXJ1dHl1bnlhbkBzeW5vcHN5cy5jb20+IHdyb3RlOgo+IAo+PiBP biAxMS85LzIwMTggMTI6NDMgUE0sIE1pbmFzIEhhcnV0eXVueWFuIHdyb3RlOgo+Pj4gSGkgSm9o biwKPj4+Cj4+PiBPbiAxMS84LzIwMTggOTozNyBQTSwgSm9obiBLZWVwaW5nIHdyb3RlOgo+Pj4+ IEhpIE1pbmFzLAo+Pj4+Cj4+Pj4gT24gTW9uLCA1IE5vdiAyMDE4IDA4OjI4OjA3ICswMDAwCj4+ Pj4gTWluYXMgSGFydXR5dW55YW4gPG1pbmFzLmhhcnV0eXVueWFuQHN5bm9wc3lzLmNvbT4gd3Jv dGU6Cj4+Pj4KPj4+Pj4gT24gMTAvMjMvMjAxOCA1OjQzIFBNLCBKb2huIEtlZXBpbmcgd3JvdGU6 Cj4+Pj4+PiBCeSBjbGVhcmluZyB0aGUgb3ZlcnJ1biBmbGFnIGFzIHNvb24gYXMgdGhlIHRhcmdl dCBmcmFtZSBpcyBuZXh0Cj4+Pj4+PiBpbmNyZW1lbnRlZCwgd2UgY2FuIGVuZCB1cCBpbmNyZW1l bnRpbmcgdGhlIHRhcmdldCBmcmFtZSBtb3JlCj4+Pj4+PiB0aGFuIGV4cGVjdGVkIGluIGR3YzJf Z2FkZ2V0X2hhbmRsZV9lcF9kaXNhYmxlZCgpIHdoZW4gdGhlCj4+Pj4+PiBlbmRwb2ludCdzIGlu dGVydmFsIGlzIGdyZWF0ZXIgdGhhbiAxLiAgVGhpcyBoYXBwZW5zIGlmIHRoZQo+Pj4+Pj4gdGFy Z2V0IGZyYW1lIGhhcyBqdXN0IHdyYXBwZWQgYXQgdGhlIHBvaW50IHdoZW4gdGhlIGVuZHBvaW50 IGlzCj4+Pj4+PiBkaXNhYmxlZCBhbmQgdGhlIGZyYW1lIG51bWJlciBoYXMgbm90IHlldCBkb25l IHNvLgo+Pj4+Pj4KPj4+Pj4+IEluc3RlYWQsIHdhaXQgdW50aWwgdGhlIGZyYW1lIG51bWJlciBh bHNvIHdyYXBzIGFuZCB0aGVuIGNsZWFyCj4+Pj4+PiB0aGUgb3ZlcnJ1biBmbGFnLgo+Pj4+Pj4K Pj4+Pj4+IFNpZ25lZC1vZmYtYnk6IEpvaG4gS2VlcGluZyA8am9obkBtZXRhbmF0ZS5jb20+Cj4+ Pj4+PiAtLS0KPj4+Pj4+ICAgICAgZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYyB8IDIgKy0KPj4+ Pj4+ICAgICAgMSBmaWxlIGNoYW5nZWQsIDEgaW5zZXJ0aW9uKCspLCAxIGRlbGV0aW9uKC0pCj4+ Pj4+Pgo+Pj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvZ2FkZ2V0LmMKPj4+Pj4+ IGIvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYyBpbmRleCAyZDZkMmM4MjQ0ZGUuLjhkYTJjMDUy ZGZhMQo+Pj4+Pj4gMTAwNjQ0IC0tLSBhL2RyaXZlcnMvdXNiL2R3YzIvZ2FkZ2V0LmMKPj4+Pj4+ ICsrKyBiL2RyaXZlcnMvdXNiL2R3YzIvZ2FkZ2V0LmMKPj4+Pj4+IEBAIC0xMTcsNyArMTE3LDcg QEAgc3RhdGljIGlubGluZSB2b2lkCj4+Pj4+PiBkd2MyX2dhZGdldF9pbmNyX2ZyYW1lX251bShz dHJ1Y3QgZHdjMl9oc290Z19lcCAqaHNfZXApIGlmCj4+Pj4+PiAoaHNfZXAtPnRhcmdldF9mcmFt ZSA+IERTVFNfU09GRk5fTElNSVQpIHsgaHNfZXAtPmZyYW1lX292ZXJydW4gPQo+Pj4+Pj4gdHJ1 ZTsgaHNfZXAtPnRhcmdldF9mcmFtZSAmPSBEU1RTX1NPRkZOX0xJTUlUOwo+Pj4+Pj4gLQl9IGVs c2Ugewo+Pj4+Pj4gKwl9IGVsc2UgaWYgKGhzX2VwLT5wYXJlbnQtPmZyYW1lX251bWJlciA8Cj4+ Pj4+PiBoc19lcC0+dGFyZ2V0X2ZyYW1lKSB7IGhzX2VwLT5mcmFtZV9vdmVycnVuID0gZmFsc2U7 Cj4+Pj4+PiAgICAgIAl9Cj4+Pj4+PiAgICAgIH0KPj4+Pj4+ICAgICAgCj4+Pj4+IERpZCB5b3Ug dGVzdGVkIG1lbnRpb25lZCBieSB5b3Ugc2NlbmFyaW8/IElmIHlvdSBzZWUgaXNzdWUgY2FuIHlv dQo+Pj4+PiBwcm92aWRlIGRlYnVnIGxvZyBhbmQgcG9pbnQgdGhlIGlzc3VlIGxpbmUgaW4gdGhl IGxvZy4KPj4+Pgo+Pj4+IEl0IG9ubHkgcmVwcm9kdWNlcyB2ZXJ5IG9jY2FzaW9uYWxseSBzbyBp dCdzIGRpZmZpY3VsdCB0byBjYXB0dXJlCj4+Pj4gYSBmdWxsIGRlYnVnIGxvZyBjb250YWluaW5n IHRoZSBlcnJvci4KPj4+Pgo+Pj4+IEkgYXBwbGllZCB0aGlzIHBhdGNoIHRvIGNhcHR1cmUgbG9n Z2luZyBzcGVjaWZpY2FsbHkgYXJvdW5kIHRoaXMKPj4+PiBzY2VuYXJpbzoKPj4+Pgo+Pj4+IC0t ID44IC0tCj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvdXNiL2R3YzIvZ2FkZ2V0LmMgYi9kcml2 ZXJzL3VzYi9kd2MyL2dhZGdldC5jCj4+Pj4gaW5kZXggMjIwYzBmOWI4OWIwLi4zNzcwYjlkM2I1 MjMgMTAwNjQ0Cj4+Pj4gLS0tIGEvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYwo+Pj4+ICsrKyBi L2RyaXZlcnMvdXNiL2R3YzIvZ2FkZ2V0LmMKPj4+PiBAQCAtMjcyMiwxMyArMjcyMiwyMCBAQCBz dGF0aWMgdm9pZAo+Pj4+IGR3YzJfZ2FkZ2V0X2hhbmRsZV9lcF9kaXNhYmxlZChzdHJ1Y3QgZHdj Ml9oc290Z19lcCAqaHNfZXApIH0KPj4+PiAgICAgCj4+Pj4gICAgICAgICAgICBkbyB7Cj4+Pj4g KyAgICAgICAgICAgICAgIHVuc2lnbmVkIGludCB0YXJnZXRfZnJhbWUgPSBoc19lcC0+dGFyZ2V0 X2ZyYW1lOwo+Pj4+ICsgICAgICAgICAgICAgICBib29sIGZyYW1lX292ZXJydW4gPSBoc19lcC0+ ZnJhbWVfb3ZlcnJ1bjsKPj4+PiArCj4+Pj4gICAgICAgICAgICAgICAgICAgIGhzX3JlcSA9IGdl dF9lcF9oZWFkKGhzX2VwKTsKPj4+PiAgICAgICAgICAgICAgICAgICAgaWYgKGhzX3JlcSkKPj4+ PiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkd2MyX2hzb3RnX2NvbXBsZXRlX3JlcXVlc3Qo aHNvdGcsCj4+Pj4gaHNfZXAsIGhzX3JlcSwgLUVOT0RBVEEpOwo+Pj4+ICsKPj4+PiAgICAgICAg ICAgICAgICAgICAgZHdjMl9nYWRnZXRfaW5jcl9mcmFtZV9udW0oaHNfZXApOwo+Pj4+ICAgICAg ICAgICAgICAgICAgICAvKiBVcGRhdGUgY3VycmVudCBmcmFtZSBudW1iZXIgdmFsdWUuICovCj4+ Pj4gICAgICAgICAgICAgICAgICAgIGhzb3RnLT5mcmFtZV9udW1iZXIgPQo+Pj4+IGR3YzJfaHNv dGdfcmVhZF9mcmFtZW5vKGhzb3RnKTsgKwo+Pj4+ICsgICAgICAgICAgICAgICBkZXZfd2Fybiho c290Zy0+ZGV2LCAiJXM6IGV4cGlyaW5nIHJlcXVlc3QKPj4+PiBmcmFtZV9udW1iZXI9MHglMDR4 IHRhcmdldF9mcmFtZT0weCUwNHggb3ZlcnJ1bj0ldVxuIiwKPj4+PiArICAgICAgICAgICAgICAg ICAgICAgICAgX19mdW5jX18sIGhzb3RnLT5mcmFtZV9udW1iZXIsCj4+Pj4gdGFyZ2V0X2ZyYW1l LCBmcmFtZV9vdmVycnVuKTsgfSB3aGlsZQo+Pj4+IChkd2MyX2dhZGdldF90YXJnZXRfZnJhbWVf ZWxhcHNlZChoc19lcCkpOwo+Pj4+ICAgICAgICAgICAgZHdjMl9nYWRnZXRfc3RhcnRfbmV4dF9y ZXF1ZXN0KGhzX2VwKTsKPj4+PiAtLSA4PCAtLQo+Pj4+Cj4+PiBBY2NvcmRpbmcgYWJvdmUgcGF0 Y2ggaW4gZGVidWcgbG9nIHNob3VsZCBiZSBwcmludGVkIG92ZXJydW4gZmxhZwo+Pj4gYWxzby4g Q291bGQgeW91IHBsZWFzZSByZXNlbmQgbG9nIHdpdGggdGhpcyBmbGFnLgo+IAo+IEQnb2ghICBJ IGluY2x1ZGVkIGEgbG9nIGZyb20gYW4gZWFybGllciB2ZXJzaW9uIGJlZm9yZSBJIGFkZGVkIHRo ZQo+IG92ZXJydW4gZmxhZy4KPiAKPj4gT25lIG1vcmUgcmVxdWVzdC4gUGxlYXNlIGFkZCBFUCBu dW1iZXIgdG8gZGVidWcgcHJpbnQuCj4gCj4gSGVyZSdzIGFuIHVwZGF0ZWQgbG9nOgo+IAo+IC0t ID44IC0tCj4gWyAgMjY0LjkyNjM4NV0gZHdjMiBmZjU4MDAwMC51c2I6IGR3YzJfZ2FkZ2V0X2hh bmRsZV9lcF9kaXNhYmxlZDogZXhwaXJpbmcgcmVxdWVzdCBlcD0yIGZyYW1lX251bWJlcj0weDIx NjEgdGFyZ2V0X2ZyYW1lPTB4MjE2OCBvdmVycnVuPTAKPiBbICAyNjUuOTA1NDEzXSBkd2MyIGZm NTgwMDAwLnVzYjogZHdjMl9nYWRnZXRfaGFuZGxlX2VwX2Rpc2FibGVkOiBleHBpcmluZyByZXF1 ZXN0IGVwPTIgZnJhbWVfbnVtYmVyPTB4M2ZmOSB0YXJnZXRfZnJhbWU9MHgwMDA4IG92ZXJydW49 MAo+IFsgIDI2NS45MDU0MjFdIGR3YzIgZmY1ODAwMDAudXNiOiBkd2MyX2dhZGdldF9oYW5kbGVf ZXBfZGlzYWJsZWQ6IGV4cGlyaW5nIHJlcXVlc3QgZXA9MiBmcmFtZV9udW1iZXI9MHgzZmY5IHRh cmdldF9mcmFtZT0weDAwMTAgb3ZlcnJ1bj0wCj4gWyAgMjY1LjkwNTQyN10gZHdjMiBmZjU4MDAw MC51c2I6IGR3YzJfZ2FkZ2V0X2hhbmRsZV9lcF9kaXNhYmxlZDogZXhwaXJpbmcgcmVxdWVzdCBl cD0yIGZyYW1lX251bWJlcj0weDNmZjkgdGFyZ2V0X2ZyYW1lPTB4MDAxOCBvdmVycnVuPTAKPiBb ICAyNjUuOTA1NDMyXSBkd2MyIGZmNTgwMDAwLnVzYjogZHdjMl9nYWRnZXRfaGFuZGxlX2VwX2Rp c2FibGVkOiBleHBpcmluZyByZXF1ZXN0IGVwPTIgZnJhbWVfbnVtYmVyPTB4M2ZmOSB0YXJnZXRf ZnJhbWU9MHgwMDIwIG92ZXJydW49MAo+IFsgIDI2NS45MDU0MzhdIGR3YzIgZmY1ODAwMDAudXNi OiBkd2MyX2dhZGdldF9oYW5kbGVfZXBfZGlzYWJsZWQ6IGV4cGlyaW5nIHJlcXVlc3QgZXA9MiBm cmFtZV9udW1iZXI9MHgzZmY5IHRhcmdldF9mcmFtZT0weDAwMjggb3ZlcnJ1bj0wCj4gWyAgMjY1 LjkwNTQ0M10gZHdjMiBmZjU4MDAwMC51c2I6IGR3YzJfZ2FkZ2V0X2hhbmRsZV9lcF9kaXNhYmxl ZDogZXhwaXJpbmcgcmVxdWVzdCBlcD0yIGZyYW1lX251bWJlcj0weDNmZjkgdGFyZ2V0X2ZyYW1l PTB4MDAzMCBvdmVycnVuPTAKPiBbICAyNjUuOTA1NDQ4XSBkd2MyIGZmNTgwMDAwLnVzYjogZHdj Ml9nYWRnZXRfaGFuZGxlX2VwX2Rpc2FibGVkOiBleHBpcmluZyByZXF1ZXN0IGVwPTIgZnJhbWVf bnVtYmVyPTB4M2ZmOSB0YXJnZXRfZnJhbWU9MHgwMDM4IG92ZXJydW49MAo+IFsgIDI2NS45MDU0 NTRdIGR3YzIgZmY1ODAwMDAudXNiOiBkd2MyX2dhZGdldF9oYW5kbGVfZXBfZGlzYWJsZWQ6IGV4 cGlyaW5nIHJlcXVlc3QgZXA9MiBmcmFtZV9udW1iZXI9MHgzZmY5IHRhcmdldF9mcmFtZT0weDAw NDAgb3ZlcnJ1bj0wCj4gWyAgMjY1LjkwNTQ1OV0gZHdjMiBmZjU4MDAwMC51c2I6IGR3YzJfZ2Fk Z2V0X2hhbmRsZV9lcF9kaXNhYmxlZDogZXhwaXJpbmcgcmVxdWVzdCBlcD0yIGZyYW1lX251bWJl cj0weDNmZjkgdGFyZ2V0X2ZyYW1lPTB4MDA0OCBvdmVycnVuPTAKPiAtLSA4PCAtLQo+IAo+IE9u Y2UgYWdhaW4gdGhlcmUgaXMgYW4gaW5pdGlhbCBmYWlsdXJlIGJlZm9yZSBpdCBlbnRlcnMgdGhl IGZhaWx1cmUgbW9kZQo+IG15IHBhdGNoIGlzIHRyeWluZyB0byBhZGRyZXNzLiAgVGhpcyBzZWVt cyB0byBiZSBjb25zaXN0ZW50LCBzbyBpdCBtYXkKPiBiZSBpbXBvcnRhbnQsIGJ1dCB0aGVyZSBp cyB+ODBtcyBiZWZvcmUgdGhlIGZhaWx1cmUgc3RhcnRzLgo+IAo+Pj4+IFRoaXMgd2FzIG9uIHY0 LjE5IHdpdGggYW4gYWRkaXRpb25hbCBwYXRjaCB0byBkaXNhYmxlIGRlc2NyaXB0b3IKPj4+PiBE TUEgYmVjYXVzZSB0aGF0IHNlZW1zIHRvIGJlIGNhdXNpbmcgcHJvYmxlbXMgb24gUkszMjg4IGFs dGhvdWdoIEkKPj4+PiBoYXZlbid0IGZpZ3VyZWQgb3V0IGV4YWN0bHkgd2h5IGl0J3MgYSBwcm9i bGVtLgo+Pj4KPj4+IEluIHdoaWNoIG1vZGUgeW91IHJ1biB0ZXN0cyBTbGF2ZSBvciBCdWZmZXIg RE1BPwo+IAo+IEJ1ZmZlciBETUEgYnV0IHdpdGggZGVzY3JpcHRvciBETUEgZm9yY2VkIG9mZiAo Z19kbWE9MSwgZ19kbWFfZGVzYz0wKS4KPiAKPiBGb3IgdGhlIHJlY29yZCwgbXkgdGVzdCBjYXNl IGlzIHRoZSBzdGFuZGFyZCBVQUMyIGdhZGdldCB3aXRoOgo+IAo+IAljX3NyYXRlID0gcF9zcmF0 ZSA9IDQ0MTAwCj4gCWNfc3NpemUgPSBwX3NzaXplID0gNAo+IAljX2NobWFzayA9IDB4Zgo+IAlw X2NobWFzayA9IDMKPiAKPiBhbmQgaXQgc2VlbXMgdGhhdCB0aGUgZmFpbHVyZSBvbmx5IHRyaWdn ZXJzIHdoZW4gdXNpbmcgYXJlY29yZCB0bwo+IGNhcHR1cmUgZnJvbSB0aGUgZ2FkZ2V0IGludGVy ZmFjZSAodGhpcyBpcyB3aXRoIGEgaG9zdCBwcm9ncmFtIGJvdGgKPiBzdHJlYW1pbmcgaW4gYm90 aCBkaXJlY3Rpb25zIG92ZXIgdGhlIFVTQiBjb25uZWN0aW9uKTsgSSBzdXNwZWN0IHRoYXQKPiBh Y3R1YWxseSBpdCBqdXN0IG1ha2VzIGl0IG1vcmUgbGlrZWx5IGJlY2F1c2UgdGhlcmUgaXMgbW9y ZSB3b3JrIGRvbmUgaW4KPiB0aGUgY29tcGxldGlvbiBoYW5kbGVyLCBidXQgSSBoYXZlbid0IHNl ZW4gdGhlIGZhaWx1cmUgd2l0aG91dCBhcmVjb3JkCj4gcnVubmluZy4KPiAKPiAKPiBSZWdhcmRz LAo+IEpvaG4KPiAKSSB0aGluayBjYXVzZSBvZiBpc3N1ZSBub3QgaW4gZHdjMl9nYWRnZXRfdGFy Z2V0X2ZyYW1lX2VsYXBzZWQoKSAKZnVuY3Rpb24sIGJ1dCBpbiBkby13aGlsZSBsb29wIGluIGR3 YzJfZ2FkZ2V0X2hhbmRsZV9lcF9kaXNhYmxlZCgpLgpDb3VsZCB5b3UgcGxlYXNlIHRyeSBiZWxv dyBwYXRjaDoKCiAgICAgICAgICAgICAgICAgZHdjMl9nYWRnZXRfaW5jcl9mcmFtZV9udW0oaHNf ZXApOwogICAgICAgICAgICAgICAgIC8qIFVwZGF0ZSBjdXJyZW50IGZyYW1lIG51bWJlciB2YWx1 ZS4gKi8KClRoYW5rcywKTWluYXMKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3VzYi9kd2MyL2dhZGdl dC5jIGIvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYwppbmRleCA4ZWIyNWUzNTk3YjAuLjRhZDg2 OTg1M2JmYSAxMDA2NDQKLS0tIGEvZHJpdmVycy91c2IvZHdjMi9nYWRnZXQuYworKysgYi9kcml2 ZXJzL3VzYi9kd2MyL2dhZGdldC5jCkBAIC0yNzYyLDggKzI3NjIsMTEgQEAgc3RhdGljIHZvaWQg ZHdjMl9nYWRnZXRfaGFuZGxlX2VwX2Rpc2FibGVkKHN0cnVjdCAKZHdjMl9oc290Z19lcCAqaHNf ZXApCgogICAgICAgICBkbyB7CiAgICAgICAgICAgICAgICAgaHNfcmVxID0gZ2V0X2VwX2hlYWQo aHNfZXApOwotICAgICAgICAgICAgICAgaWYgKGhzX3JlcSkKLSAgICAgICAgICAgICAgICAgICAg ICAgZHdjMl9oc290Z19jb21wbGV0ZV9yZXF1ZXN0KGhzb3RnLCBoc19lcCwgaHNfcmVxLAorICAg ICAgICAgICAgICAgaWYgKCFoc19yZXEpIHsKKyAgICAgICAgICAgICAgICAgICAgICAgZGV2X3dh cm4oaHNvdGctPmRldiwgIiVzOiBJU09DIEVQIHF1ZXVlIAplbXB0eVxuIiwgX19mdW5jX18pOwor ICAgICAgICAgICAgICAgICAgICAgICByZXR1cm47CisgICAgICAgICAgICAgICB9CisgICAgICAg ICAgICAgICBkd2MyX2hzb3RnX2NvbXBsZXRlX3JlcXVlc3QoaHNvdGcsIGhzX2VwLCBoc19yZXEs CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgLUVO T0RBVEEpOwo=