From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752145AbdAaNOH (ORCPT ); Tue, 31 Jan 2017 08:14:07 -0500 Received: from mga01.intel.com ([192.55.52.88]:8620 "EHLO mga01.intel.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751981AbdAaNNv (ORCPT ); Tue, 31 Jan 2017 08:13:51 -0500 X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.33,315,1477983600"; d="scan'208";a="928539652" Date: Tue, 31 Jan 2017 15:13:03 +0200 From: Imre Deak To: "Rafael J. Wysocki" Cc: sedat.dilek@gmail.com, "Rafael J. Wysocki" , Jani Nikula , Daniel Vetter , intel-gfx , the arch/x86 maintainers , LKML , Pavel Machek , Linux PM , Thomas Gleixner , Chris Wilson Subject: Re: [Intel-gfx] [Linux v4.10.0-rc1+] Still call-traces after suspend-resume (pm? i915? cpu/hotplug?) Message-ID: <20170131131303.GB14349@ideak-desk.fi.intel.com> Reply-To: imre.deak@intel.com References: <7e7ccb13-1db8-af76-9585-ca7bbdd04c55@intel.com> <20170131105800.GA8598@ideak-desk.fi.intel.com> <147578c1-7b21-7dee-372b-e0f1eb8541f4@intel.com> <20170131120256.GA14349@ideak-desk.fi.intel.com> <77ac8c31-68b8-95c6-46d3-e8037fb6c820@intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Content-Disposition: inline In-Reply-To: <77ac8c31-68b8-95c6-46d3-e8037fb6c820@intel.com> User-Agent: Mutt/1.5.23 (2014-03-12) Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Tue, Jan 31, 2017 at 01:12:05PM +0100, Rafael J. Wysocki wrote: > On 1/31/2017 1:02 PM, Imre Deak wrote: > >On Tue, Jan 31, 2017 at 12:39:35PM +0100, Rafael J. Wysocki wrote: > >>On 1/31/2017 11:58 AM, Imre Deak wrote: > >>>Hi Rafael, > >>Hi, > >> > >>>On Mon, Jan 30, 2017 at 11:44:37PM +0100, Rafael J. Wysocki wrote: > >>>>On 1/24/2017 2:33 AM, Sedat Dilek wrote: > >>>>>On Fri, Dec 30, 2016 at 3:02 PM, Rafael J. Wysocki wrote: > >>>>>>On Fri, Dec 30, 2016 at 12:40 PM, Sedat Dilek wrote: > >>>>>>>Hi, > >>>>>>> > >>>>>>>I have already reported this issue in [1]. > >>>>>>>One of the issue was solved. > >>>>>>>Unfortunately, it looks like there is still a different problem here > >>>>>>>(Ubuntu/precise AMD64). > >>>>>>> > >>>>>>>I tried v4.10-rc1 and latest Linus tree up to... > >>>>>>> > >>>>>>>commit 98473f9f3f9bd404873cd1178c8be7d6d619f0d1 > >>>>>>>"mm/filemap: fix parameters to test_bit()" > >>>>>>> > >>>>>>>Here we go... > >>>>>>> > >>>>>>>[ 29.636047] BUG: sleeping function called from invalid context at > >>>>>>>drivers/base/power/runtime.c:1032 > >>>>>>>[ 29.636055] in_atomic(): 1, irqs_disabled(): 0, pid: 1500, name: Xorg > >>>>>>>[ 29.636058] 1 lock held by Xorg/1500: > >>>>>>>[ 29.636060] #0: (&dev->struct_mutex){+.+.+.}, at: > >>>>>>>[] i915_mutex_lock_interruptible+0x43/0x140 [i915] > >>>>>>>[ 29.636107] CPU: 0 PID: 1500 Comm: Xorg Not tainted > >>>>>>>4.10.0-rc1-6-iniza-amd64 #1 > >>>>>>>[ 29.636109] Hardware name: SAMSUNG ELECTRONICS CO., LTD. > >>>>>>>530U3BI/530U4BI/530U4BH/530U3BI/530U4BI/530U4BH, BIOS 13XK 03/28/2013 > >>>>>>>[ 29.636111] Call Trace: > >>>>>>>[ 29.636120] dump_stack+0x85/0xc2 > >>>>>>>[ 29.636124] ___might_sleep+0x196/0x260 > >>>>>>>[ 29.636127] __might_sleep+0x53/0xb0 > >>>>>>>[ 29.636131] __pm_runtime_resume+0x7a/0x90 > >>>>>>>[ 29.636159] intel_runtime_pm_get+0x25/0x90 [i915] > >>>>>>>[ 29.636189] aliasing_gtt_bind_vma+0xaa/0xf0 [i915] > >>>>>>>[ 29.636220] i915_vma_bind+0xaf/0x1e0 [i915] > >>>>>>>[ 29.636248] i915_gem_execbuffer_relocate_entry+0x513/0x6f0 [i915] > >>>>>>>[ 29.636272] i915_gem_execbuffer_relocate_vma.isra.34+0x188/0x250 [i915] > >>>>>>>[ 29.636275] ? trace_hardirqs_on+0xd/0x10 > >>>>>>>[ 29.636294] ? i915_gem_execbuffer_reserve_vma.isra.31+0x152/0x1f0 [i915] > >>>>>>>[ 29.636316] ? i915_gem_execbuffer_reserve.isra.32+0x372/0x3a0 [i915] > >>>>>>>[ 29.636342] i915_gem_do_execbuffer.isra.38+0xa70/0x1a40 [i915] > >>>>>>>[ 29.636347] ? __might_fault+0x4e/0xb0 > >>>>>>>[ 29.636373] i915_gem_execbuffer2+0xc5/0x260 [i915] > >>>>>>>[ 29.636376] ? __might_fault+0x4e/0xb0 > >>>>>>>[ 29.636395] drm_ioctl+0x206/0x450 [drm] > >>>>>>>[ 29.636420] ? i915_gem_execbuffer+0x340/0x340 [i915] > >>>>>>>[ 29.636425] ? __fget+0x5/0x200 > >>>>>>>[ 29.636429] do_vfs_ioctl+0x91/0x6f0 > >>>>>>>[ 29.636431] ? __fget+0x111/0x200 > >>>>>>>[ 29.636433] ? __fget+0x5/0x200 > >>>>>>>[ 29.636436] SyS_ioctl+0x79/0x90 > >>>>>>>[ 29.636441] entry_SYSCALL_64_fastpath+0x23/0xc6 > >>>>>>> > >>>>>>>On suspend/resume I see the same call trace. > >>>>>>>[2] points to the "BUG" line. > >>>>>>Well, this appears to be an i915 issue, but not a serious one. > >>>>>> > >>>>>>Clearly, a function that may sleep (pm_runtime_get_sync() in > >>>>>>intel_runtime_pm_get()) is called with disabled interrupts. If I > >>>>>>understand the code correctly, though, it actually is not going to > >>>>>>sleep in this particular case, because pm_runtime_get_sync() has > >>>>>>already been called once for this device in the same code path which > >>>>>>means that this particular instance will return immediately, so this > >>>>>>is a false-positive (most likely). > >>>Not sure what's the root cause, but thought to clarify the above: > >>> > >>>Yes, i915_gem_do_execbuffer() does take an RPM reference to optimize > >>>things, so the RPM get in aliasing_gtt_bind_vma() won't need to resume > >>>the device on this path. This isn't a guarantee though, > >>>aliasing_gtt_bind_vma() could be called from other places without an RPM > >>>reference. So preemption being disabled at that point is not > >>>intentional. I also can't see where on the above path it would get > >>>disabled due to a bug or otherwise. > >>The i915 code is correct AFAICS, but the core complains about a nested > >>invocation of pm_runtime_get_sync() with disabled interrupts (which looks OK > >>though), so the complaint is a false positive. > >Well, my point was that interrupts (or preemption) doesn't seem to get > >disabled anywhere on that path. > > But the might_sleep_if() assertion in __pm_runtime_resume() triggers for > some reason. I wonder why then? > > Of course, I may be overlooking something in the i915 code. > > In any case, if you do > > pm_runtime_get_sync(dev) > local_irq_disable() > pm_runtime_get_sync(dev) > > pm_runtime_put(dev) > local_irq_enable() > pm_runtime_put(dev) > > that is technically correct, but it will cause the core to complain. Ah, found it it's the i915 reloc_cache keeping some atomic mappings around. So moving the warn as you said looks ok, sorry for the noise. --Imre From mboxrd@z Thu Jan 1 00:00:00 1970 From: Imre Deak Subject: Re: [Linux v4.10.0-rc1+] Still call-traces after suspend-resume (pm? i915? cpu/hotplug?) Date: Tue, 31 Jan 2017 15:13:03 +0200 Message-ID: <20170131131303.GB14349@ideak-desk.fi.intel.com> References: <7e7ccb13-1db8-af76-9585-ca7bbdd04c55@intel.com> <20170131105800.GA8598@ideak-desk.fi.intel.com> <147578c1-7b21-7dee-372b-e0f1eb8541f4@intel.com> <20170131120256.GA14349@ideak-desk.fi.intel.com> <77ac8c31-68b8-95c6-46d3-e8037fb6c820@intel.com> Reply-To: imre.deak@intel.com Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Content-Disposition: inline In-Reply-To: <77ac8c31-68b8-95c6-46d3-e8037fb6c820@intel.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: "Rafael J. Wysocki" Cc: "Rafael J. Wysocki" , Jani Nikula , Daniel Vetter , intel-gfx , the arch/x86 maintainers , LKML , Pavel Machek , Linux PM , sedat.dilek@gmail.com, Thomas Gleixner List-Id: linux-pm@vger.kernel.org T24gVHVlLCBKYW4gMzEsIDIwMTcgYXQgMDE6MTI6MDVQTSArMDEwMCwgUmFmYWVsIEouIFd5c29j a2kgd3JvdGU6Cj4gT24gMS8zMS8yMDE3IDE6MDIgUE0sIEltcmUgRGVhayB3cm90ZToKPiA+T24g VHVlLCBKYW4gMzEsIDIwMTcgYXQgMTI6Mzk6MzVQTSArMDEwMCwgUmFmYWVsIEouIFd5c29ja2kg d3JvdGU6Cj4gPj5PbiAxLzMxLzIwMTcgMTE6NTggQU0sIEltcmUgRGVhayB3cm90ZToKPiA+Pj5I aSBSYWZhZWwsCj4gPj5IaSwKPiA+Pgo+ID4+Pk9uIE1vbiwgSmFuIDMwLCAyMDE3IGF0IDExOjQ0 OjM3UE0gKzAxMDAsIFJhZmFlbCBKLiBXeXNvY2tpIHdyb3RlOgo+ID4+Pj5PbiAxLzI0LzIwMTcg MjozMyBBTSwgU2VkYXQgRGlsZWsgd3JvdGU6Cj4gPj4+Pj5PbiBGcmksIERlYyAzMCwgMjAxNiBh dCAzOjAyIFBNLCBSYWZhZWwgSi4gV3lzb2NraSA8cmFmYWVsQGtlcm5lbC5vcmc+IHdyb3RlOgo+ ID4+Pj4+Pk9uIEZyaSwgRGVjIDMwLCAyMDE2IGF0IDEyOjQwIFBNLCBTZWRhdCBEaWxlayA8c2Vk YXQuZGlsZWtAZ21haWwuY29tPiB3cm90ZToKPiA+Pj4+Pj4+SGksCj4gPj4+Pj4+Pgo+ID4+Pj4+ Pj5JIGhhdmUgYWxyZWFkeSByZXBvcnRlZCB0aGlzIGlzc3VlIGluIFsxXS4KPiA+Pj4+Pj4+T25l IG9mIHRoZSBpc3N1ZSB3YXMgc29sdmVkLgo+ID4+Pj4+Pj5VbmZvcnR1bmF0ZWx5LCBpdCBsb29r cyBsaWtlIHRoZXJlIGlzIHN0aWxsIGEgZGlmZmVyZW50IHByb2JsZW0gaGVyZQo+ID4+Pj4+Pj4o VWJ1bnR1L3ByZWNpc2UgQU1ENjQpLgo+ID4+Pj4+Pj4KPiA+Pj4+Pj4+SSB0cmllZCB2NC4xMC1y YzEgYW5kIGxhdGVzdCBMaW51cyB0cmVlIHVwIHRvLi4uCj4gPj4+Pj4+Pgo+ID4+Pj4+Pj5jb21t aXQgOTg0NzNmOWYzZjliZDQwNDg3M2NkMTE3OGM4YmU3ZDZkNjE5ZjBkMQo+ID4+Pj4+Pj4ibW0v ZmlsZW1hcDogZml4IHBhcmFtZXRlcnMgdG8gdGVzdF9iaXQoKSIKPiA+Pj4+Pj4+Cj4gPj4+Pj4+ PkhlcmUgd2UgZ28uLi4KPiA+Pj4+Pj4+Cj4gPj4+Pj4+PlsgICAyOS42MzYwNDddIEJVRzogc2xl ZXBpbmcgZnVuY3Rpb24gY2FsbGVkIGZyb20gaW52YWxpZCBjb250ZXh0IGF0Cj4gPj4+Pj4+PmRy aXZlcnMvYmFzZS9wb3dlci9ydW50aW1lLmM6MTAzMgo+ID4+Pj4+Pj5bICAgMjkuNjM2MDU1XSBp bl9hdG9taWMoKTogMSwgaXJxc19kaXNhYmxlZCgpOiAwLCBwaWQ6IDE1MDAsIG5hbWU6IFhvcmcK PiA+Pj4+Pj4+WyAgIDI5LjYzNjA1OF0gMSBsb2NrIGhlbGQgYnkgWG9yZy8xNTAwOgo+ID4+Pj4+ Pj5bICAgMjkuNjM2MDYwXSAgIzA6ICAoJmRldi0+c3RydWN0X211dGV4KXsrLisuKy59LCBhdDoK PiA+Pj4+Pj4+WzxmZmZmZmZmZmEwNjgwYzEzPl0gaTkxNV9tdXRleF9sb2NrX2ludGVycnVwdGli bGUrMHg0My8weDE0MCBbaTkxNV0KPiA+Pj4+Pj4+WyAgIDI5LjYzNjEwN10gQ1BVOiAwIFBJRDog MTUwMCBDb21tOiBYb3JnIE5vdCB0YWludGVkCj4gPj4+Pj4+PjQuMTAuMC1yYzEtNi1pbml6YS1h bWQ2NCAjMQo+ID4+Pj4+Pj5bICAgMjkuNjM2MTA5XSBIYXJkd2FyZSBuYW1lOiBTQU1TVU5HIEVM RUNUUk9OSUNTIENPLiwgTFRELgo+ID4+Pj4+Pj41MzBVM0JJLzUzMFU0QkkvNTMwVTRCSC81MzBV M0JJLzUzMFU0QkkvNTMwVTRCSCwgQklPUyAxM1hLIDAzLzI4LzIwMTMKPiA+Pj4+Pj4+WyAgIDI5 LjYzNjExMV0gQ2FsbCBUcmFjZToKPiA+Pj4+Pj4+WyAgIDI5LjYzNjEyMF0gIGR1bXBfc3RhY2sr MHg4NS8weGMyCj4gPj4+Pj4+PlsgICAyOS42MzYxMjRdICBfX19taWdodF9zbGVlcCsweDE5Ni8w eDI2MAo+ID4+Pj4+Pj5bICAgMjkuNjM2MTI3XSAgX19taWdodF9zbGVlcCsweDUzLzB4YjAKPiA+ Pj4+Pj4+WyAgIDI5LjYzNjEzMV0gIF9fcG1fcnVudGltZV9yZXN1bWUrMHg3YS8weDkwCj4gPj4+ Pj4+PlsgICAyOS42MzYxNTldICBpbnRlbF9ydW50aW1lX3BtX2dldCsweDI1LzB4OTAgW2k5MTVd Cj4gPj4+Pj4+PlsgICAyOS42MzYxODldICBhbGlhc2luZ19ndHRfYmluZF92bWErMHhhYS8weGYw IFtpOTE1XQo+ID4+Pj4+Pj5bICAgMjkuNjM2MjIwXSAgaTkxNV92bWFfYmluZCsweGFmLzB4MWUw IFtpOTE1XQo+ID4+Pj4+Pj5bICAgMjkuNjM2MjQ4XSAgaTkxNV9nZW1fZXhlY2J1ZmZlcl9yZWxv Y2F0ZV9lbnRyeSsweDUxMy8weDZmMCBbaTkxNV0KPiA+Pj4+Pj4+WyAgIDI5LjYzNjI3Ml0gIGk5 MTVfZ2VtX2V4ZWNidWZmZXJfcmVsb2NhdGVfdm1hLmlzcmEuMzQrMHgxODgvMHgyNTAgW2k5MTVd Cj4gPj4+Pj4+PlsgICAyOS42MzYyNzVdICA/IHRyYWNlX2hhcmRpcnFzX29uKzB4ZC8weDEwCj4g Pj4+Pj4+PlsgICAyOS42MzYyOTRdICA/IGk5MTVfZ2VtX2V4ZWNidWZmZXJfcmVzZXJ2ZV92bWEu aXNyYS4zMSsweDE1Mi8weDFmMCBbaTkxNV0KPiA+Pj4+Pj4+WyAgIDI5LjYzNjMxNl0gID8gaTkx NV9nZW1fZXhlY2J1ZmZlcl9yZXNlcnZlLmlzcmEuMzIrMHgzNzIvMHgzYTAgW2k5MTVdCj4gPj4+ Pj4+PlsgICAyOS42MzYzNDJdICBpOTE1X2dlbV9kb19leGVjYnVmZmVyLmlzcmEuMzgrMHhhNzAv MHgxYTQwIFtpOTE1XQo+ID4+Pj4+Pj5bICAgMjkuNjM2MzQ3XSAgPyBfX21pZ2h0X2ZhdWx0KzB4 NGUvMHhiMAo+ID4+Pj4+Pj5bICAgMjkuNjM2MzczXSAgaTkxNV9nZW1fZXhlY2J1ZmZlcjIrMHhj NS8weDI2MCBbaTkxNV0KPiA+Pj4+Pj4+WyAgIDI5LjYzNjM3Nl0gID8gX19taWdodF9mYXVsdCsw eDRlLzB4YjAKPiA+Pj4+Pj4+WyAgIDI5LjYzNjM5NV0gIGRybV9pb2N0bCsweDIwNi8weDQ1MCBb ZHJtXQo+ID4+Pj4+Pj5bICAgMjkuNjM2NDIwXSAgPyBpOTE1X2dlbV9leGVjYnVmZmVyKzB4MzQw LzB4MzQwIFtpOTE1XQo+ID4+Pj4+Pj5bICAgMjkuNjM2NDI1XSAgPyBfX2ZnZXQrMHg1LzB4MjAw Cj4gPj4+Pj4+PlsgICAyOS42MzY0MjldICBkb192ZnNfaW9jdGwrMHg5MS8weDZmMAo+ID4+Pj4+ Pj5bICAgMjkuNjM2NDMxXSAgPyBfX2ZnZXQrMHgxMTEvMHgyMDAKPiA+Pj4+Pj4+WyAgIDI5LjYz NjQzM10gID8gX19mZ2V0KzB4NS8weDIwMAo+ID4+Pj4+Pj5bICAgMjkuNjM2NDM2XSAgU3lTX2lv Y3RsKzB4NzkvMHg5MAo+ID4+Pj4+Pj5bICAgMjkuNjM2NDQxXSAgZW50cnlfU1lTQ0FMTF82NF9m YXN0cGF0aCsweDIzLzB4YzYKPiA+Pj4+Pj4+Cj4gPj4+Pj4+Pk9uIHN1c3BlbmQvcmVzdW1lIEkg c2VlIHRoZSBzYW1lIGNhbGwgdHJhY2UuCj4gPj4+Pj4+PlsyXSBwb2ludHMgdG8gdGhlICJCVUci IGxpbmUuCj4gPj4+Pj4+V2VsbCwgdGhpcyBhcHBlYXJzIHRvIGJlIGFuIGk5MTUgaXNzdWUsIGJ1 dCBub3QgYSBzZXJpb3VzIG9uZS4KPiA+Pj4+Pj4KPiA+Pj4+Pj5DbGVhcmx5LCBhIGZ1bmN0aW9u IHRoYXQgbWF5IHNsZWVwIChwbV9ydW50aW1lX2dldF9zeW5jKCkgaW4KPiA+Pj4+Pj5pbnRlbF9y dW50aW1lX3BtX2dldCgpKSBpcyBjYWxsZWQgd2l0aCBkaXNhYmxlZCBpbnRlcnJ1cHRzLiAgSWYg SQo+ID4+Pj4+PnVuZGVyc3RhbmQgdGhlIGNvZGUgY29ycmVjdGx5LCB0aG91Z2gsIGl0IGFjdHVh bGx5IGlzIG5vdCBnb2luZyB0bwo+ID4+Pj4+PnNsZWVwIGluIHRoaXMgcGFydGljdWxhciBjYXNl LCBiZWNhdXNlIHBtX3J1bnRpbWVfZ2V0X3N5bmMoKSBoYXMKPiA+Pj4+Pj5hbHJlYWR5IGJlZW4g Y2FsbGVkIG9uY2UgZm9yIHRoaXMgZGV2aWNlIGluIHRoZSBzYW1lIGNvZGUgcGF0aCB3aGljaAo+ ID4+Pj4+Pm1lYW5zIHRoYXQgdGhpcyBwYXJ0aWN1bGFyIGluc3RhbmNlIHdpbGwgcmV0dXJuIGlt bWVkaWF0ZWx5LCBzbyB0aGlzCj4gPj4+Pj4+aXMgYSBmYWxzZS1wb3NpdGl2ZSAobW9zdCBsaWtl bHkpLgo+ID4+Pk5vdCBzdXJlIHdoYXQncyB0aGUgcm9vdCBjYXVzZSwgYnV0IHRob3VnaHQgdG8g Y2xhcmlmeSB0aGUgYWJvdmU6Cj4gPj4+Cj4gPj4+WWVzLCBpOTE1X2dlbV9kb19leGVjYnVmZmVy KCkgZG9lcyB0YWtlIGFuIFJQTSByZWZlcmVuY2UgdG8gb3B0aW1pemUKPiA+Pj50aGluZ3MsIHNv IHRoZSBSUE0gZ2V0IGluIGFsaWFzaW5nX2d0dF9iaW5kX3ZtYSgpIHdvbid0IG5lZWQgdG8gcmVz dW1lCj4gPj4+dGhlIGRldmljZSBvbiB0aGlzIHBhdGguIFRoaXMgaXNuJ3QgYSBndWFyYW50ZWUg dGhvdWdoLAo+ID4+PmFsaWFzaW5nX2d0dF9iaW5kX3ZtYSgpIGNvdWxkIGJlIGNhbGxlZCBmcm9t IG90aGVyIHBsYWNlcyB3aXRob3V0IGFuIFJQTQo+ID4+PnJlZmVyZW5jZS4gU28gcHJlZW1wdGlv biBiZWluZyBkaXNhYmxlZCBhdCB0aGF0IHBvaW50IGlzIG5vdAo+ID4+PmludGVudGlvbmFsLiBJ IGFsc28gY2FuJ3Qgc2VlIHdoZXJlIG9uIHRoZSBhYm92ZSBwYXRoIGl0IHdvdWxkIGdldAo+ID4+ PmRpc2FibGVkIGR1ZSB0byBhIGJ1ZyBvciBvdGhlcndpc2UuCj4gPj5UaGUgaTkxNSBjb2RlIGlz IGNvcnJlY3QgQUZBSUNTLCBidXQgdGhlIGNvcmUgY29tcGxhaW5zIGFib3V0IGEgbmVzdGVkCj4g Pj5pbnZvY2F0aW9uIG9mIHBtX3J1bnRpbWVfZ2V0X3N5bmMoKSB3aXRoIGRpc2FibGVkIGludGVy cnVwdHMgKHdoaWNoIGxvb2tzIE9LCj4gPj50aG91Z2gpLCBzbyB0aGUgY29tcGxhaW50IGlzIGEg ZmFsc2UgcG9zaXRpdmUuCj4gPldlbGwsIG15IHBvaW50IHdhcyB0aGF0IGludGVycnVwdHMgKG9y IHByZWVtcHRpb24pIGRvZXNuJ3Qgc2VlbSB0byBnZXQKPiA+ZGlzYWJsZWQgYW55d2hlcmUgb24g dGhhdCBwYXRoLgo+IAo+IEJ1dCB0aGUgbWlnaHRfc2xlZXBfaWYoKSBhc3NlcnRpb24gaW4gX19w bV9ydW50aW1lX3Jlc3VtZSgpIHRyaWdnZXJzIGZvcgo+IHNvbWUgcmVhc29uLiAgSSB3b25kZXIg d2h5IHRoZW4/Cj4gCj4gT2YgY291cnNlLCBJIG1heSBiZSBvdmVybG9va2luZyBzb21ldGhpbmcg aW4gdGhlIGk5MTUgY29kZS4KPiAKPiBJbiBhbnkgY2FzZSwgaWYgeW91IGRvCj4gCj4gcG1fcnVu dGltZV9nZXRfc3luYyhkZXYpCj4gbG9jYWxfaXJxX2Rpc2FibGUoKQo+IHBtX3J1bnRpbWVfZ2V0 X3N5bmMoZGV2KQo+IDxkbyBzb21ldGhpbmc+Cj4gcG1fcnVudGltZV9wdXQoZGV2KQo+IGxvY2Fs X2lycV9lbmFibGUoKQo+IHBtX3J1bnRpbWVfcHV0KGRldikKPiAKPiB0aGF0IGlzIHRlY2huaWNh bGx5IGNvcnJlY3QsIGJ1dCBpdCB3aWxsIGNhdXNlIHRoZSBjb3JlIHRvIGNvbXBsYWluLgoKQWgs IGZvdW5kIGl0IGl0J3MgdGhlIGk5MTUgcmVsb2NfY2FjaGUga2VlcGluZyBzb21lIGF0b21pYyBt YXBwaW5ncwphcm91bmQuIFNvIG1vdmluZyB0aGUgd2FybiBhcyB5b3Ugc2FpZCBsb29rcyBvaywg c29ycnkgZm9yIHRoZSBub2lzZS4KCi0tSW1yZQpfX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0 cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9s aXN0aW5mby9pbnRlbC1nZngK