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=-2.2 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS, USER_AGENT_SANE_1 autolearn=no 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 B38CDC5DF60 for ; Tue, 5 Nov 2019 17:03:24 +0000 (UTC) Received: from alsa0.perex.cz (alsa0.perex.cz [77.48.224.243]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 77F5F21D71 for ; Tue, 5 Nov 2019 17:03:23 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=alsa-project.org header.i=@alsa-project.org header.b="DzKsq+DS"; dkim=fail reason="signature verification failed" (2048-bit key) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="Dw6+oQEz" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 77F5F21D71 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=armlinux.org.uk Authentication-Results: mail.kernel.org; spf=pass smtp.mailfrom=alsa-devel-bounces@alsa-project.org Received: from alsa1.perex.cz (alsa1.perex.cz [207.180.221.201]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by alsa0.perex.cz (Postfix) with ESMTPS id 1275616E0; Tue, 5 Nov 2019 18:02:31 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa0.perex.cz 1275616E0 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=alsa-project.org; s=default; t=1572973401; bh=2iNofPldfrzl2AoEkkoIknej1llMVlm12qNkrtf0khE=; h=Date:From:To:References:In-Reply-To:Cc:Subject:List-Id: List-Unsubscribe:List-Archive:List-Post:List-Help:List-Subscribe: From; b=DzKsq+DST1L7nkgRzRKbwpxxPfqsEG3w2DuPEMhQNKEWvYptcMZZNgCDHlgOXW3FA u0cABdKq8fZ2A1EMfB1YZ8k62732iHMvy8wRhGRfbxhNVzfAct9nYYepynAmDFjpo0 FIcWHXfx1xB3FP1Nm35bUtXHVqVEpU/Igir27oHs= Received: from alsa1.perex.cz (localhost.localdomain [127.0.0.1]) by alsa1.perex.cz (Postfix) with ESMTP id 903B2F8015B; Tue, 5 Nov 2019 18:02:30 +0100 (CET) Received: by alsa1.perex.cz (Postfix, from userid 50401) id 8916CF8049B; Tue, 5 Nov 2019 18:02:29 +0100 (CET) Received: from pandora.armlinux.org.uk (pandora.armlinux.org.uk [IPv6:2001:4d48:ad52:3201:214:fdff:fe10:1be6]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (No client certificate requested) by alsa1.perex.cz (Postfix) with ESMTPS id 3F6E6F8015B for ; Tue, 5 Nov 2019 18:02:24 +0100 (CET) DKIM-Filter: OpenDKIM Filter v2.11.0 alsa1.perex.cz 3F6E6F8015B Authentication-Results: alsa1.perex.cz; dkim=pass (2048-bit key) header.d=armlinux.org.uk header.i=@armlinux.org.uk header.b="Dw6+oQEz" DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=armlinux.org.uk; s=pandora-2019; h=Sender:In-Reply-To:Content-Type: MIME-Version:References:Message-ID:Subject:Cc:To:From:Date:Reply-To: Content-Transfer-Encoding:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id: List-Help:List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=4M+7ichyAPZEL6AESNwqcRIL14sHkJnW8d2rfDweu/0=; b=Dw6+oQEzEFReVJQml0Asy6oh0 T3z3EyQgXsbUzLtjYdFQ69Sq8UO5hU41wPBAx3fhEppAxsCLA7ypcn2HisHMbW12DhzFcNB44zyjM MwNaDqAsLTjixnMgDY2NAfJNglArprsc4qLNLAPh07uputNHEoK86WnYYFj7HI/SGadXisw2i5rFh BBjMQEPDQDYJAepORE836rAWtiefmDuy1e10fuCcRLyCR/daTbdW+CqQ5560e/GQOZZiaqomNlod4 wDOqKOiQBq+iuCyU7cQgUm9DougmHnmRciZuufdl4+70SZ2uPPsOYgizGorXotoNxLk6Gy1IvleNx x04qouMww==; Received: from shell.armlinux.org.uk ([2002:4e20:1eda:1:5054:ff:fe00:4ec]:59730) by pandora.armlinux.org.uk with esmtpsa (TLSv1.2:ECDHE-RSA-AES256-GCM-SHA384:256) (Exim 4.90_1) (envelope-from ) id 1iS2DX-0007ce-31; Tue, 05 Nov 2019 17:02:07 +0000 Received: from linux by shell.armlinux.org.uk with local (Exim 4.92) (envelope-from ) id 1iS2DT-0003E6-Oe; Tue, 05 Nov 2019 17:02:03 +0000 Date: Tue, 5 Nov 2019 17:02:03 +0000 From: Russell King - ARM Linux admin To: Takashi Iwai Message-ID: <20191105170203.GR25745@shell.armlinux.org.uk> References: <6ad19121-c0e3-d278-2943-ff93ef80353b@baylibre.com> <20191105160215.GQ25745@shell.armlinux.org.uk> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: Mutt/1.10.1 (2018-07-13) Cc: Jernej Skrabec , Jonas Karlman , Neil Armstrong , alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, Andrzej Hajda , Laurent Pinchart , Philipp Zabel Subject: Re: [alsa-devel] Incorrect buffer handling in dw-hdmi bridge audio X-BeenThere: alsa-devel@alsa-project.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: "Alsa-devel mailing list for ALSA developers - http://www.alsa-project.org" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: alsa-devel-bounces@alsa-project.org Sender: "Alsa-devel" On Tue, Nov 05, 2019 at 05:44:26PM +0100, Takashi Iwai wrote: > On Tue, 05 Nov 2019 17:33:44 +0100, > Takashi Iwai wrote: > > > > On Tue, 05 Nov 2019 17:02:15 +0100, > > Russell King - ARM Linux admin wrote: > > > > > > On Tue, Nov 05, 2019 at 09:07:43AM +0100, Neil Armstrong wrote: > > > > Hi, > > > > > > > > On 05/11/2019 08:55, Takashi Iwai wrote: > > > > > Hi, > > > > > > > > > > while recently working on the ALSA memory allocator API cleanup, I > > > > > noticed that dw-hdmi bridge driver seems doing weird about the buffer > > > > > management. It pre-allocates the usual device buffers fully at the > > > > > probe time, while each stream allocates the buffer via the vmalloc > > > > > helpers and replaces with it at each open. > > > > > > > > > > I guess it's no expected behavior? It's basically a full waste of > > > > > resources, and the vmalloc buffer isn't guaranteed to work well for > > > > > mmap on every architecture. > > > > > > > > > > Below is the patch to address it. Can anyone check whether this still > > > > > works? > > > > > > > > I don't have the setup to check, but this has been pushed by Russell I Added in CC. > > > > > > > > I also added the imx maintainer since it's (AFAIK) only used on iMX SoCs. > > > > > > > > Neil > > > > > > > > > > > > > > Since I have a cleanup series and this is involved, I'd like to take > > > > > the fix through my tree once after it's confirmed (and get ACK if > > > > > possible). > > > > > > > > > > > > > > > Thanks! > > > > > > > > > > Takashi > > > > > > > > > > -- 8< -- > > > > > From: Takashi Iwai > > > > > Subject: [PATCH] drm/bridge: dw-hdmi: Fix the incorrect buffer allocations > > > > > > > > > > The driver sets up the buffer preallocation with SNDRV_DMA_TYPE_DEV, > > > > > while it re-allocates and releases vmalloc pages. This is not only a > > > > > lot of waste resources but also causes the mmap malfunction. > > > > > > > > > > Change / drop the vmalloc-related code and use the standard buffer > > > > > allocation / release code instead. > > > > > > I think getting rid of the vmalloc code here is a mistake - I seem to > > > remember using the standard buffer allocation causes failures, due to > > > memory fragmentation. Since the hardware is limited to DMA from at > > > most one page, there is no reason for this driver to require contiguous > > > pages, hence why it's using - and should use - vmalloc pages. vmalloc > > > is way kinder to the MM subsystem than trying to request large order > > > contiguous pages. > > > > > > So, NAK on this patch. > > > > OK, then we should do other way round, rather drop the buffer > > preallocation instead. Currently vmalloc buffer is always allocated > > at each open and overrides the preallocated buffer, so the whole 64k > > and more are wasted for no use. > > > > (BTW, the current code has this snippet: > > > > /* Limit the buffer size to the size of the preallocated buffer */ > > ret = snd_pcm_hw_constraint_minmax(runtime, > > SNDRV_PCM_HW_PARAM_BUFFER_SIZE, > > 0, substream->dma_buffer.bytes); > > > > ... and this would have to limit the buffer size only to the > > preallocated size -- which essentially makes the argument above > > invalid. However, this check looks actually bogus, the constraint > > parameter should be SNDRV_PCM_HW_PARAM_BUFFER_BYTES, not _SIZE. It > > might be the reason it worked somehow...) > > > > So below is the revised patch. Could you guys check it again? > > > > There I copied the comment as is, although the 512k mentioned there > > looks inconsistent with the actual code. Should it be 1M? > > ... and reading the patch again, I found that the hw constraint call > can be dropped as well. The dw_hdmi_hw definition already contains > the max buffer size. > > Below is the re-revised patch. Please check it. I was slightly wrong - sorry. It's been a long time since I looked at this driver, or even used it - but it is the only driver that supports HDMI audio on iMX6 platforms, so I guess there are lots of users out there... or maybe not if none of them use mainline kernels. The hardware is capable of reading across a page. However, the hardware is _not_ capable of reading any data that is formatted as ALSA APIs allow it to be. The driver has to reformat the ALSA supplied sound buffers to the layout the hardware requires. To do this, we have two different buffers: - The substream buffer is the buffer which the hardware reads from. - The runtime buffer is the buffer which ALSA uses. The call to snd_pcm_lib_preallocate_pages_for_all() allocates the hardware buffer, which is a single contiguous buffer of fixed size. The user buffer is allocated with snd_pcm_lib_alloc_vmalloc_buffer(). Hence, the driver makes use of both. You can't get rid of either of them. -- RMK's Patch system: https://www.armlinux.org.uk/developer/patches/ FTTC broadband for 0.8mile line in suburbia: sync at 12.1Mbps down 622kbps up According to speedtest.net: 11.9Mbps down 500kbps up _______________________________________________ Alsa-devel mailing list Alsa-devel@alsa-project.org https://mailman.alsa-project.org/mailman/listinfo/alsa-devel From mboxrd@z Thu Jan 1 00:00:00 1970 From: Russell King - ARM Linux admin Subject: Re: Incorrect buffer handling in dw-hdmi bridge audio Date: Tue, 5 Nov 2019 17:02:03 +0000 Message-ID: <20191105170203.GR25745@shell.armlinux.org.uk> References: <6ad19121-c0e3-d278-2943-ff93ef80353b@baylibre.com> <20191105160215.GQ25745@shell.armlinux.org.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from pandora.armlinux.org.uk (pandora.armlinux.org.uk [IPv6:2001:4d48:ad52:3201:214:fdff:fe10:1be6]) by gabe.freedesktop.org (Postfix) with ESMTPS id ECBD589708 for ; Tue, 5 Nov 2019 17:02:17 +0000 (UTC) Content-Disposition: inline In-Reply-To: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" To: Takashi Iwai Cc: Jernej Skrabec , Jonas Karlman , Neil Armstrong , alsa-devel@alsa-project.org, dri-devel@lists.freedesktop.org, Laurent Pinchart List-Id: dri-devel@lists.freedesktop.org T24gVHVlLCBOb3YgMDUsIDIwMTkgYXQgMDU6NDQ6MjZQTSArMDEwMCwgVGFrYXNoaSBJd2FpIHdy b3RlOgo+IE9uIFR1ZSwgMDUgTm92IDIwMTkgMTc6MzM6NDQgKzAxMDAsCj4gVGFrYXNoaSBJd2Fp IHdyb3RlOgo+ID4gCj4gPiBPbiBUdWUsIDA1IE5vdiAyMDE5IDE3OjAyOjE1ICswMTAwLAo+ID4g UnVzc2VsbCBLaW5nIC0gQVJNIExpbnV4IGFkbWluIHdyb3RlOgo+ID4gPiAKPiA+ID4gT24gVHVl LCBOb3YgMDUsIDIwMTkgYXQgMDk6MDc6NDNBTSArMDEwMCwgTmVpbCBBcm1zdHJvbmcgd3JvdGU6 Cj4gPiA+ID4gSGksCj4gPiA+ID4gCj4gPiA+ID4gT24gMDUvMTEvMjAxOSAwODo1NSwgVGFrYXNo aSBJd2FpIHdyb3RlOgo+ID4gPiA+ID4gSGksCj4gPiA+ID4gPiAKPiA+ID4gPiA+IHdoaWxlIHJl Y2VudGx5IHdvcmtpbmcgb24gdGhlIEFMU0EgbWVtb3J5IGFsbG9jYXRvciBBUEkgY2xlYW51cCwg SQo+ID4gPiA+ID4gbm90aWNlZCB0aGF0IGR3LWhkbWkgYnJpZGdlIGRyaXZlciBzZWVtcyBkb2lu ZyB3ZWlyZCBhYm91dCB0aGUgYnVmZmVyCj4gPiA+ID4gPiBtYW5hZ2VtZW50LiAgSXQgcHJlLWFs bG9jYXRlcyB0aGUgdXN1YWwgZGV2aWNlIGJ1ZmZlcnMgZnVsbHkgYXQgdGhlCj4gPiA+ID4gPiBw cm9iZSB0aW1lLCB3aGlsZSBlYWNoIHN0cmVhbSBhbGxvY2F0ZXMgdGhlIGJ1ZmZlciB2aWEgdGhl IHZtYWxsb2MKPiA+ID4gPiA+IGhlbHBlcnMgYW5kIHJlcGxhY2VzIHdpdGggaXQgYXQgZWFjaCBv cGVuLgo+ID4gPiA+ID4gCj4gPiA+ID4gPiBJIGd1ZXNzIGl0J3Mgbm8gZXhwZWN0ZWQgYmVoYXZp b3I/ICBJdCdzIGJhc2ljYWxseSBhIGZ1bGwgd2FzdGUgb2YKPiA+ID4gPiA+IHJlc291cmNlcywg YW5kIHRoZSB2bWFsbG9jIGJ1ZmZlciBpc24ndCBndWFyYW50ZWVkIHRvIHdvcmsgd2VsbCBmb3IK PiA+ID4gPiA+IG1tYXAgb24gZXZlcnkgYXJjaGl0ZWN0dXJlLgo+ID4gPiA+ID4gCj4gPiA+ID4g PiBCZWxvdyBpcyB0aGUgcGF0Y2ggdG8gYWRkcmVzcyBpdC4gIENhbiBhbnlvbmUgY2hlY2sgd2hl dGhlciB0aGlzIHN0aWxsCj4gPiA+ID4gPiB3b3Jrcz8KPiA+ID4gPiAKPiA+ID4gPiBJIGRvbid0 IGhhdmUgdGhlIHNldHVwIHRvIGNoZWNrLCBidXQgdGhpcyBoYXMgYmVlbiBwdXNoZWQgYnkgUnVz c2VsbCBJIEFkZGVkIGluIENDLgo+ID4gPiA+IAo+ID4gPiA+IEkgYWxzbyBhZGRlZCB0aGUgaW14 IG1haW50YWluZXIgc2luY2UgaXQncyAoQUZBSUspIG9ubHkgdXNlZCBvbiBpTVggU29Dcy4KPiA+ ID4gPiAKPiA+ID4gPiBOZWlsCj4gPiA+ID4gCj4gPiA+ID4gPiAKPiA+ID4gPiA+IFNpbmNlIEkg aGF2ZSBhIGNsZWFudXAgc2VyaWVzIGFuZCB0aGlzIGlzIGludm9sdmVkLCBJJ2QgbGlrZSB0byB0 YWtlCj4gPiA+ID4gPiB0aGUgZml4IHRocm91Z2ggbXkgdHJlZSBvbmNlIGFmdGVyIGl0J3MgY29u ZmlybWVkIChhbmQgZ2V0IEFDSyBpZgo+ID4gPiA+ID4gcG9zc2libGUpLgo+ID4gPiA+ID4gCj4g PiA+ID4gPiAKPiA+ID4gPiA+IFRoYW5rcyEKPiA+ID4gPiA+IAo+ID4gPiA+ID4gVGFrYXNoaQo+ ID4gPiA+ID4gCj4gPiA+ID4gPiAtLSA4PCAtLQo+ID4gPiA+ID4gRnJvbTogVGFrYXNoaSBJd2Fp IDx0aXdhaUBzdXNlLmRlPgo+ID4gPiA+ID4gU3ViamVjdDogW1BBVENIXSBkcm0vYnJpZGdlOiBk dy1oZG1pOiBGaXggdGhlIGluY29ycmVjdCBidWZmZXIgYWxsb2NhdGlvbnMKPiA+ID4gPiA+IAo+ ID4gPiA+ID4gVGhlIGRyaXZlciBzZXRzIHVwIHRoZSBidWZmZXIgcHJlYWxsb2NhdGlvbiB3aXRo IFNORFJWX0RNQV9UWVBFX0RFViwKPiA+ID4gPiA+IHdoaWxlIGl0IHJlLWFsbG9jYXRlcyBhbmQg cmVsZWFzZXMgdm1hbGxvYyBwYWdlcy4gIFRoaXMgaXMgbm90IG9ubHkgYQo+ID4gPiA+ID4gbG90 IG9mIHdhc3RlIHJlc291cmNlcyBidXQgYWxzbyBjYXVzZXMgdGhlIG1tYXAgbWFsZnVuY3Rpb24u Cj4gPiA+ID4gPiAKPiA+ID4gPiA+IENoYW5nZSAvIGRyb3AgdGhlIHZtYWxsb2MtcmVsYXRlZCBj b2RlIGFuZCB1c2UgdGhlIHN0YW5kYXJkIGJ1ZmZlcgo+ID4gPiA+ID4gYWxsb2NhdGlvbiAvIHJl bGVhc2UgY29kZSBpbnN0ZWFkLgo+ID4gPiAKPiA+ID4gSSB0aGluayBnZXR0aW5nIHJpZCBvZiB0 aGUgdm1hbGxvYyBjb2RlIGhlcmUgaXMgYSBtaXN0YWtlIC0gSSBzZWVtIHRvCj4gPiA+IHJlbWVt YmVyIHVzaW5nIHRoZSBzdGFuZGFyZCBidWZmZXIgYWxsb2NhdGlvbiBjYXVzZXMgZmFpbHVyZXMs IGR1ZSB0bwo+ID4gPiBtZW1vcnkgZnJhZ21lbnRhdGlvbi4gIFNpbmNlIHRoZSBoYXJkd2FyZSBp cyBsaW1pdGVkIHRvIERNQSBmcm9tIGF0Cj4gPiA+IG1vc3Qgb25lIHBhZ2UsIHRoZXJlIGlzIG5v IHJlYXNvbiBmb3IgdGhpcyBkcml2ZXIgdG8gcmVxdWlyZSBjb250aWd1b3VzCj4gPiA+IHBhZ2Vz LCBoZW5jZSB3aHkgaXQncyB1c2luZyAtIGFuZCBzaG91bGQgdXNlIC0gdm1hbGxvYyBwYWdlcy4g IHZtYWxsb2MKPiA+ID4gaXMgd2F5IGtpbmRlciB0byB0aGUgTU0gc3Vic3lzdGVtIHRoYW4gdHJ5 aW5nIHRvIHJlcXVlc3QgbGFyZ2Ugb3JkZXIKPiA+ID4gY29udGlndW91cyBwYWdlcy4KPiA+ID4g Cj4gPiA+IFNvLCBOQUsgb24gdGhpcyBwYXRjaC4KPiA+IAo+ID4gT0ssIHRoZW4gd2Ugc2hvdWxk IGRvIG90aGVyIHdheSByb3VuZCwgcmF0aGVyIGRyb3AgdGhlIGJ1ZmZlcgo+ID4gcHJlYWxsb2Nh dGlvbiBpbnN0ZWFkLiAgQ3VycmVudGx5IHZtYWxsb2MgYnVmZmVyIGlzIGFsd2F5cyBhbGxvY2F0 ZWQKPiA+IGF0IGVhY2ggb3BlbiBhbmQgb3ZlcnJpZGVzIHRoZSBwcmVhbGxvY2F0ZWQgYnVmZmVy LCBzbyB0aGUgd2hvbGUgNjRrCj4gPiBhbmQgbW9yZSBhcmUgd2FzdGVkIGZvciBubyB1c2UuCj4g PiAKPiA+IChCVFcsIHRoZSBjdXJyZW50IGNvZGUgaGFzIHRoaXMgc25pcHBldDoKPiA+IAo+ID4g CS8qIExpbWl0IHRoZSBidWZmZXIgc2l6ZSB0byB0aGUgc2l6ZSBvZiB0aGUgcHJlYWxsb2NhdGVk IGJ1ZmZlciAqLwo+ID4gCXJldCA9IHNuZF9wY21faHdfY29uc3RyYWludF9taW5tYXgocnVudGlt ZSwKPiA+IAkJCQkJICAgU05EUlZfUENNX0hXX1BBUkFNX0JVRkZFUl9TSVpFLAo+ID4gCQkJCQkg ICAwLCBzdWJzdHJlYW0tPmRtYV9idWZmZXIuYnl0ZXMpOwo+ID4gCj4gPiAuLi4gYW5kIHRoaXMg d291bGQgaGF2ZSB0byBsaW1pdCB0aGUgYnVmZmVyIHNpemUgb25seSB0byB0aGUKPiA+IHByZWFs bG9jYXRlZCBzaXplIC0tIHdoaWNoIGVzc2VudGlhbGx5IG1ha2VzIHRoZSBhcmd1bWVudCBhYm92 ZQo+ID4gaW52YWxpZC4gIEhvd2V2ZXIsIHRoaXMgY2hlY2sgbG9va3MgYWN0dWFsbHkgYm9ndXMs IHRoZSBjb25zdHJhaW50Cj4gPiBwYXJhbWV0ZXIgc2hvdWxkIGJlIFNORFJWX1BDTV9IV19QQVJB TV9CVUZGRVJfQllURVMsIG5vdCBfU0laRS4gIEl0Cj4gPiBtaWdodCBiZSB0aGUgcmVhc29uIGl0 IHdvcmtlZCBzb21laG93Li4uKQo+ID4gCj4gPiBTbyBiZWxvdyBpcyB0aGUgcmV2aXNlZCBwYXRj aC4gIENvdWxkIHlvdSBndXlzIGNoZWNrIGl0IGFnYWluPwo+ID4gCj4gPiBUaGVyZSBJIGNvcGll ZCB0aGUgY29tbWVudCBhcyBpcywgYWx0aG91Z2ggdGhlIDUxMmsgbWVudGlvbmVkIHRoZXJlCj4g PiBsb29rcyBpbmNvbnNpc3RlbnQgd2l0aCB0aGUgYWN0dWFsIGNvZGUuICBTaG91bGQgaXQgYmUg MU0/Cj4gCj4gLi4uIGFuZCByZWFkaW5nIHRoZSBwYXRjaCBhZ2FpbiwgSSBmb3VuZCB0aGF0IHRo ZSBodyBjb25zdHJhaW50IGNhbGwKPiBjYW4gYmUgZHJvcHBlZCBhcyB3ZWxsLiAgVGhlIGR3X2hk bWlfaHcgZGVmaW5pdGlvbiBhbHJlYWR5IGNvbnRhaW5zCj4gdGhlIG1heCBidWZmZXIgc2l6ZS4K PiAKPiBCZWxvdyBpcyB0aGUgcmUtcmV2aXNlZCBwYXRjaC4gIFBsZWFzZSBjaGVjayBpdC4KCkkg d2FzIHNsaWdodGx5IHdyb25nIC0gc29ycnkuICBJdCdzIGJlZW4gYSBsb25nIHRpbWUgc2luY2Ug SSBsb29rZWQgYXQKdGhpcyBkcml2ZXIsIG9yIGV2ZW4gdXNlZCBpdCAtIGJ1dCBpdCBpcyB0aGUg b25seSBkcml2ZXIgdGhhdCBzdXBwb3J0cwpIRE1JIGF1ZGlvIG9uIGlNWDYgcGxhdGZvcm1zLCBz byBJIGd1ZXNzIHRoZXJlIGFyZSBsb3RzIG9mIHVzZXJzIG91dAp0aGVyZS4uLiBvciBtYXliZSBu b3QgaWYgbm9uZSBvZiB0aGVtIHVzZSBtYWlubGluZSBrZXJuZWxzLgoKVGhlIGhhcmR3YXJlIGlz IGNhcGFibGUgb2YgcmVhZGluZyBhY3Jvc3MgYSBwYWdlLiAgSG93ZXZlciwgdGhlIGhhcmR3YXJl CmlzIF9ub3RfIGNhcGFibGUgb2YgcmVhZGluZyBhbnkgZGF0YSB0aGF0IGlzIGZvcm1hdHRlZCBh cyBBTFNBIEFQSXMKYWxsb3cgaXQgdG8gYmUuICBUaGUgZHJpdmVyIGhhcyB0byByZWZvcm1hdCB0 aGUgQUxTQSBzdXBwbGllZCBzb3VuZApidWZmZXJzIHRvIHRoZSBsYXlvdXQgdGhlIGhhcmR3YXJl IHJlcXVpcmVzLgoKVG8gZG8gdGhpcywgd2UgaGF2ZSB0d28gZGlmZmVyZW50IGJ1ZmZlcnM6Cgot IFRoZSBzdWJzdHJlYW0gYnVmZmVyIGlzIHRoZSBidWZmZXIgd2hpY2ggdGhlIGhhcmR3YXJlIHJl YWRzIGZyb20uCi0gVGhlIHJ1bnRpbWUgYnVmZmVyIGlzIHRoZSBidWZmZXIgd2hpY2ggQUxTQSB1 c2VzLgoKVGhlIGNhbGwgdG8gc25kX3BjbV9saWJfcHJlYWxsb2NhdGVfcGFnZXNfZm9yX2FsbCgp IGFsbG9jYXRlcyB0aGUKaGFyZHdhcmUgYnVmZmVyLCB3aGljaCBpcyBhIHNpbmdsZSBjb250aWd1 b3VzIGJ1ZmZlciBvZiBmaXhlZCBzaXplLgoKVGhlIHVzZXIgYnVmZmVyIGlzIGFsbG9jYXRlZCB3 aXRoIHNuZF9wY21fbGliX2FsbG9jX3ZtYWxsb2NfYnVmZmVyKCkuCgpIZW5jZSwgdGhlIGRyaXZl ciBtYWtlcyB1c2Ugb2YgYm90aC4gIFlvdSBjYW4ndCBnZXQgcmlkIG9mIGVpdGhlcgpvZiB0aGVt LgoKLS0gClJNSydzIFBhdGNoIHN5c3RlbTogaHR0cHM6Ly93d3cuYXJtbGludXgub3JnLnVrL2Rl dmVsb3Blci9wYXRjaGVzLwpGVFRDIGJyb2FkYmFuZCBmb3IgMC44bWlsZSBsaW5lIGluIHN1YnVy YmlhOiBzeW5jIGF0IDEyLjFNYnBzIGRvd24gNjIya2JwcyB1cApBY2NvcmRpbmcgdG8gc3BlZWR0 ZXN0Lm5ldDogMTEuOU1icHMgZG93biA1MDBrYnBzIHVwCl9fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fCmRyaS1kZXZlbCBtYWlsaW5nIGxpc3QKZHJpLWRldmVs QGxpc3RzLmZyZWVkZXNrdG9wLm9yZwpodHRwczovL2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWls bWFuL2xpc3RpbmZvL2RyaS1kZXZlbA==