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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 3086BC17443 for ; Mon, 11 Nov 2019 09:55:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id F35F620856 for ; Mon, 11 Nov 2019 09:55:52 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726952AbfKKJzv (ORCPT ); Mon, 11 Nov 2019 04:55:51 -0500 Received: from metis.ext.pengutronix.de ([85.220.165.71]:54067 "EHLO metis.ext.pengutronix.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726847AbfKKJzr (ORCPT ); Mon, 11 Nov 2019 04:55:47 -0500 Received: from kresse.hi.pengutronix.de ([2001:67c:670:100:1d::2a]) by metis.ext.pengutronix.de with esmtp (Exim 4.92) (envelope-from ) id 1iU6QA-0005W7-NO; Mon, 11 Nov 2019 10:55:42 +0100 Message-ID: <7379bfe6c530132caab4cd930cd94f0e28c935ff.camel@pengutronix.de> Subject: Re: [PATCH 15/16] drm/etnaviv: use ktime_t for timeouts From: Lucas Stach To: Arnd Bergmann Cc: y2038 Mailman List , David Airlie , Daniel Vetter , Guido =?ISO-8859-1?Q?G=FCnther?= , "linux-kernel@vger.kernel.org" , dri-devel , The etnaviv authors , Russell King , Sam Ravnborg , Christian =?ISO-8859-1?Q?K=F6nig?= , Emil Velikov Date: Mon, 11 Nov 2019 10:55:40 +0100 In-Reply-To: References: <20191108213257.3097633-1-arnd@arndb.de> <20191108213257.3097633-16-arnd@arndb.de> <3a0cfce79620152facfe31b442a735db1dcda436.camel@pengutronix.de> Content-Type: text/plain; charset="UTF-8" User-Agent: Evolution 3.30.5-1.1 MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-SA-Exim-Connect-IP: 2001:67c:670:100:1d::2a X-SA-Exim-Mail-From: l.stach@pengutronix.de X-SA-Exim-Scanned: No (on metis.ext.pengutronix.de); SAEximRunCond expanded to false X-PTX-Original-Recipient: linux-kernel@vger.kernel.org Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On Sa, 2019-11-09 at 13:12 +0100, Arnd Bergmann wrote: > On Sat, Nov 9, 2019 at 12:03 AM Lucas Stach wrote: > > Am Freitag, den 08.11.2019, 22:32 +0100 schrieb Arnd Bergmann: > > > struct timespec is being removed from the kernel because it often leads > > > to code that is not y2038-safe. > > > > > > In the etnaviv driver, monotonic timestamps are used, which do not suffer > > > from overflow, but using ktime_t still leads to better code overall. > > > > > > The conversion is straightforward for the most part, except for > > > etnaviv_timeout_to_jiffies(), which needs to handle arguments larger > > > than MAX_JIFFY_OFFSET on 32-bit architectures. > > > > > > Signed-off-by: Arnd Bergmann > > > @@ -368,7 +366,7 @@ static int etnaviv_ioctl_wait_fence(struct drm_device *dev, void *data, > > > return -ENXIO; > > > > > > if (args->flags & ETNA_WAIT_NONBLOCK) > > > - timeout = NULL; > > > + timeout = ktime_set(0, 0); > > > > This is a change in behavior, as far as I can see. After this change > > the called internal function is not able to differentiate between a > > NONBLOCK call and a blocking call with 0 timeout. The difference being > > that on a busy object the NONBLOCK call will return -EBUSY, while a > > blocking call will return -ETIMEDOUT. > > Ah, good point. I created this patch a long time ago (cherry-picked it out > of an older branch I had done), so I don't remember how I concluded this > was a safe conversion, of if I missed that difference originally. > > > But then CLOCK_MONOTONIC starts at 0 and should not never wrap, right? > > Yes, that is correct. > > > If that's the case then we should never encounter a genuine 0 timeout > > and this change would be okay. > > That's quite likely, I'd say any program passing {0,0} as a timeout without > ETNA_WAIT_NONBLOCK is already broken, but if we leave it like that, > it would be best to describe the reasoning in the changelog. > > Should I change the changelog, or change the patch to restore the > current behavior instead? > > I guess I could fold the change below into my patch to make it transparent > to the application again. If we assume 0 to never be a valid timeout, due to monotonic clock starting at 0 and never wrapping then I think we shouldn't introduce any additional code complexity to fix up the return value for this specific case. I'm not aware of any etnaviv userspace being broken in this way to rely on the return value for an invalid timeout input. Please just amend the commit message to mention the change in behavior and why we think it is safe to do. Regards, Lucas > Arnd > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_drv.c > b/drivers/gpu/drm/etnaviv/etnaviv_drv.c > index 1250c5e06329..162cedfb7f72 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_drv.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_drv.c > @@ -354,6 +354,7 @@ static int etnaviv_ioctl_wait_fence(struct > drm_device *dev, void *data, > ktime_t timeout = ktime_set(args->timeout.tv_sec, > args->timeout.tv_nsec); > struct etnaviv_gpu *gpu; > + int ret; > > if (args->flags & ~(ETNA_WAIT_NONBLOCK)) > return -EINVAL; > @@ -365,8 +366,12 @@ static int etnaviv_ioctl_wait_fence(struct > drm_device *dev, void *data, > if (!gpu) > return -ENXIO; > > - if (args->flags & ETNA_WAIT_NONBLOCK) > - timeout = ktime_set(0, 0); > + if (args->flags & ETNA_WAIT_NONBLOCK) { > + ret = etnaviv_gpu_wait_fence_interruptible(gpu, args->fence, > + ktime_set(0, 0)); > + > + return (ret == -ETIMEDOUT) ? -EBUSY : ret; > + } > > return etnaviv_gpu_wait_fence_interruptible(gpu, args->fence, > timeout); > @@ -421,10 +426,13 @@ static int etnaviv_ioctl_gem_wait(struct > drm_device *dev, void *data, > if (!obj) > return -ENOENT; > > - if (args->flags & ETNA_WAIT_NONBLOCK) > - timeout = ktime_set(0, 0); > - > - ret = etnaviv_gem_wait_bo(gpu, obj, timeout); > + if (args->flags & ETNA_WAIT_NONBLOCK) { > + ret = etnaviv_gem_wait_bo(gpu, obj, ktime_set(0, 0)); > + if (ret == -ETIMEDOUT) > + ret = -EBUSY; > + } else { > + ret = etnaviv_gem_wait_bo(gpu, obj, timeout); > + } > > drm_gem_object_put_unlocked(obj); > > diff --git a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > index e42b1c4d902c..fa6986c5a5fe 100644 > --- a/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > +++ b/drivers/gpu/drm/etnaviv/etnaviv_gpu.c > @@ -1135,6 +1135,7 @@ int etnaviv_gpu_wait_fence_interruptible(struct > etnaviv_gpu *gpu, > u32 id, ktime_t timeout) > { > struct dma_fence *fence; > + unsigned long remaining; > int ret; > > /* > @@ -1151,12 +1152,12 @@ int > etnaviv_gpu_wait_fence_interruptible(struct etnaviv_gpu *gpu, > if (!fence) > return 0; > > - if (!timeout) { > - /* No timeout was requested: just test for completion */ > - ret = dma_fence_is_signaled(fence) ? 0 : -EBUSY; > + if (!timeout || > + (remaining = etnaviv_timeout_to_jiffies(timeout)) == 0) { > + /* No timeout was requested, or timeout is already expired, > + * just test for completion */ > + ret = dma_fence_is_signaled(fence) ? 0 : -ETIMEDOUT; > } else { > - unsigned long remaining = etnaviv_timeout_to_jiffies(timeout); > - > ret = dma_fence_wait_timeout(fence, true, remaining); > if (ret == 0) > ret = -ETIMEDOUT; > @@ -1185,7 +1186,7 @@ int etnaviv_gpu_wait_obj_inactive(struct etnaviv_gpu *gpu, > long ret; > > if (!timeout) > - return !is_active(etnaviv_obj) ? 0 : -EBUSY; > + return !is_active(etnaviv_obj) ? 0 : -ETIMEDOUT; > > remaining = etnaviv_timeout_to_jiffies(timeout); From mboxrd@z Thu Jan 1 00:00:00 1970 From: Lucas Stach Subject: Re: [PATCH 15/16] drm/etnaviv: use ktime_t for timeouts Date: Mon, 11 Nov 2019 10:55:40 +0100 Message-ID: <7379bfe6c530132caab4cd930cd94f0e28c935ff.camel@pengutronix.de> References: <20191108213257.3097633-1-arnd@arndb.de> <20191108213257.3097633-16-arnd@arndb.de> <3a0cfce79620152facfe31b442a735db1dcda436.camel@pengutronix.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from metis.ext.pengutronix.de (metis.ext.pengutronix.de [IPv6:2001:67c:670:201:290:27ff:fe1d:cc33]) by gabe.freedesktop.org (Postfix) with ESMTPS id 036616E891 for ; Mon, 11 Nov 2019 09:55:45 +0000 (UTC) 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: Arnd Bergmann Cc: y2038 Mailman List , Guido =?ISO-8859-1?Q?G=FCnther?= , "linux-kernel@vger.kernel.org" , dri-devel , The etnaviv authors , David Airlie , Russell King , Sam Ravnborg , Christian =?ISO-8859-1?Q?K=F6nig?= , Emil Velikov List-Id: dri-devel@lists.freedesktop.org T24gU2EsIDIwMTktMTEtMDkgYXQgMTM6MTIgKzAxMDAsIEFybmQgQmVyZ21hbm4gd3JvdGU6Cj4g T24gU2F0LCBOb3YgOSwgMjAxOSBhdCAxMjowMyBBTSBMdWNhcyBTdGFjaCA8bC5zdGFjaEBwZW5n dXRyb25peC5kZT4gd3JvdGU6Cj4gPiBBbSBGcmVpdGFnLCBkZW4gMDguMTEuMjAxOSwgMjI6MzIg KzAxMDAgc2NocmllYiBBcm5kIEJlcmdtYW5uOgo+ID4gPiBzdHJ1Y3QgdGltZXNwZWMgaXMgYmVp bmcgcmVtb3ZlZCBmcm9tIHRoZSBrZXJuZWwgYmVjYXVzZSBpdCBvZnRlbiBsZWFkcwo+ID4gPiB0 byBjb2RlIHRoYXQgaXMgbm90IHkyMDM4LXNhZmUuCj4gPiA+IAo+ID4gPiBJbiB0aGUgZXRuYXZp diBkcml2ZXIsIG1vbm90b25pYyB0aW1lc3RhbXBzIGFyZSB1c2VkLCB3aGljaCBkbyBub3Qgc3Vm ZmVyCj4gPiA+IGZyb20gb3ZlcmZsb3csIGJ1dCB1c2luZyBrdGltZV90IHN0aWxsIGxlYWRzIHRv IGJldHRlciBjb2RlIG92ZXJhbGwuCj4gPiA+IAo+ID4gPiBUaGUgY29udmVyc2lvbiBpcyBzdHJh aWdodGZvcndhcmQgZm9yIHRoZSBtb3N0IHBhcnQsIGV4Y2VwdCBmb3IKPiA+ID4gZXRuYXZpdl90 aW1lb3V0X3RvX2ppZmZpZXMoKSwgd2hpY2ggbmVlZHMgdG8gaGFuZGxlIGFyZ3VtZW50cyBsYXJn ZXIKPiA+ID4gdGhhbiBNQVhfSklGRllfT0ZGU0VUIG9uIDMyLWJpdCBhcmNoaXRlY3R1cmVzLgo+ ID4gPiAKPiA+ID4gU2lnbmVkLW9mZi1ieTogQXJuZCBCZXJnbWFubiA8YXJuZEBhcm5kYi5kZT4K PiA+ID4gQEAgLTM2OCw3ICszNjYsNyBAQCBzdGF0aWMgaW50IGV0bmF2aXZfaW9jdGxfd2FpdF9m ZW5jZShzdHJ1Y3QgZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ID4gPiAgICAgICAgICAg ICAgIHJldHVybiAtRU5YSU87Cj4gPiA+IAo+ID4gPiAgICAgICBpZiAoYXJncy0+ZmxhZ3MgJiBF VE5BX1dBSVRfTk9OQkxPQ0spCj4gPiA+IC0gICAgICAgICAgICAgdGltZW91dCA9IE5VTEw7Cj4g PiA+ICsgICAgICAgICAgICAgdGltZW91dCA9IGt0aW1lX3NldCgwLCAwKTsKPiA+IAo+ID4gVGhp cyBpcyBhIGNoYW5nZSBpbiBiZWhhdmlvciwgYXMgZmFyIGFzIEkgY2FuIHNlZS4gQWZ0ZXIgdGhp cyBjaGFuZ2UKPiA+IHRoZSBjYWxsZWQgaW50ZXJuYWwgZnVuY3Rpb24gaXMgbm90IGFibGUgdG8g ZGlmZmVyZW50aWF0ZSBiZXR3ZWVuIGEKPiA+IE5PTkJMT0NLIGNhbGwgYW5kIGEgYmxvY2tpbmcg Y2FsbCB3aXRoIDAgdGltZW91dC4gVGhlIGRpZmZlcmVuY2UgYmVpbmcKPiA+IHRoYXQgb24gYSBi dXN5IG9iamVjdCB0aGUgTk9OQkxPQ0sgY2FsbCB3aWxsIHJldHVybiAtRUJVU1ksIHdoaWxlIGEK PiA+IGJsb2NraW5nIGNhbGwgd2lsbCByZXR1cm4gLUVUSU1FRE9VVC4KPiAKPiBBaCwgZ29vZCBw b2ludC4gSSBjcmVhdGVkIHRoaXMgcGF0Y2ggYSBsb25nIHRpbWUgYWdvIChjaGVycnktcGlja2Vk IGl0IG91dAo+IG9mIGFuIG9sZGVyIGJyYW5jaCBJIGhhZCBkb25lKSwgc28gSSBkb24ndCByZW1l bWJlciBob3cgSSBjb25jbHVkZWQgdGhpcwo+IHdhcyBhIHNhZmUgY29udmVyc2lvbiwgb2YgaWYg SSBtaXNzZWQgdGhhdCBkaWZmZXJlbmNlIG9yaWdpbmFsbHkuCj4gCj4gPiBCdXQgdGhlbiBDTE9D S19NT05PVE9OSUMgc3RhcnRzIGF0IDAgYW5kIHNob3VsZCBub3QgbmV2ZXIgd3JhcCwgcmlnaHQ/ Cj4gCj4gWWVzLCB0aGF0IGlzIGNvcnJlY3QuCj4gCj4gPiBJZiB0aGF0J3MgdGhlIGNhc2UgdGhl biB3ZSBzaG91bGQgbmV2ZXIgZW5jb3VudGVyIGEgZ2VudWluZSAwIHRpbWVvdXQKPiA+IGFuZCB0 aGlzIGNoYW5nZSB3b3VsZCBiZSBva2F5Lgo+IAo+IFRoYXQncyBxdWl0ZSBsaWtlbHksIEknZCBz YXkgYW55IHByb2dyYW0gcGFzc2luZyB7MCwwfSBhcyBhIHRpbWVvdXQgd2l0aG91dAo+IEVUTkFf V0FJVF9OT05CTE9DSyBpcyBhbHJlYWR5IGJyb2tlbiwgYnV0IGlmIHdlIGxlYXZlIGl0IGxpa2Ug dGhhdCwKPiBpdCB3b3VsZCBiZSBiZXN0IHRvIGRlc2NyaWJlIHRoZSByZWFzb25pbmcgaW4gdGhl IGNoYW5nZWxvZy4KPiAKPiBTaG91bGQgSSBjaGFuZ2UgdGhlIGNoYW5nZWxvZywgb3IgY2hhbmdl IHRoZSBwYXRjaCB0byByZXN0b3JlIHRoZQo+IGN1cnJlbnQgYmVoYXZpb3IgaW5zdGVhZD8KPiAK PiBJIGd1ZXNzIEkgY291bGQgZm9sZCB0aGUgY2hhbmdlIGJlbG93IGludG8gbXkgcGF0Y2ggdG8g bWFrZSBpdCB0cmFuc3BhcmVudAo+IHRvIHRoZSBhcHBsaWNhdGlvbiBhZ2Fpbi4KCklmIHdlIGFz c3VtZSAwIHRvIG5ldmVyIGJlIGEgdmFsaWQgdGltZW91dCwgZHVlIHRvIG1vbm90b25pYyBjbG9j awpzdGFydGluZyBhdCAwIGFuZCBuZXZlciB3cmFwcGluZyB0aGVuIEkgdGhpbmsgd2Ugc2hvdWxk bid0IGludHJvZHVjZQphbnkgYWRkaXRpb25hbCBjb2RlIGNvbXBsZXhpdHkgdG8gZml4IHVwIHRo ZSByZXR1cm4gdmFsdWUgZm9yIHRoaXMKc3BlY2lmaWMgY2FzZS4gSSdtIG5vdCBhd2FyZSBvZiBh bnkgZXRuYXZpdiB1c2Vyc3BhY2UgYmVpbmcgYnJva2VuIGluCnRoaXMgd2F5IHRvIHJlbHkgb24g dGhlIHJldHVybiB2YWx1ZSBmb3IgYW4gaW52YWxpZCB0aW1lb3V0IGlucHV0LgoKUGxlYXNlIGp1 c3QgYW1lbmQgdGhlIGNvbW1pdCBtZXNzYWdlIHRvIG1lbnRpb24gdGhlIGNoYW5nZSBpbiBiZWhh dmlvcgphbmQgd2h5IHdlIHRoaW5rIGl0IGlzIHNhZmUgdG8gZG8uCgpSZWdhcmRzLApMdWNhcwoK PiAgICAgICBBcm5kCj4gCj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0 bmF2aXZfZHJ2LmMKPiBiL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZHJ2LmMKPiBp bmRleCAxMjUwYzVlMDYzMjkuLjE2MmNlZGZiN2Y3MiAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dw dS9kcm0vZXRuYXZpdi9ldG5hdml2X2Rydi5jCj4gKysrIGIvZHJpdmVycy9ncHUvZHJtL2V0bmF2 aXYvZXRuYXZpdl9kcnYuYwo+IEBAIC0zNTQsNiArMzU0LDcgQEAgc3RhdGljIGludCBldG5hdml2 X2lvY3RsX3dhaXRfZmVuY2Uoc3RydWN0Cj4gZHJtX2RldmljZSAqZGV2LCB2b2lkICpkYXRhLAo+ ICAgICAgICAga3RpbWVfdCB0aW1lb3V0ID0ga3RpbWVfc2V0KGFyZ3MtPnRpbWVvdXQudHZfc2Vj LAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGFyZ3MtPnRpbWVvdXQudHZf bnNlYyk7Cj4gICAgICAgICBzdHJ1Y3QgZXRuYXZpdl9ncHUgKmdwdTsKPiArICAgICAgIGludCBy ZXQ7Cj4gCj4gICAgICAgICBpZiAoYXJncy0+ZmxhZ3MgJiB+KEVUTkFfV0FJVF9OT05CTE9DSykp Cj4gICAgICAgICAgICAgICAgIHJldHVybiAtRUlOVkFMOwo+IEBAIC0zNjUsOCArMzY2LDEyIEBA IHN0YXRpYyBpbnQgZXRuYXZpdl9pb2N0bF93YWl0X2ZlbmNlKHN0cnVjdAo+IGRybV9kZXZpY2Ug KmRldiwgdm9pZCAqZGF0YSwKPiAgICAgICAgIGlmICghZ3B1KQo+ICAgICAgICAgICAgICAgICBy ZXR1cm4gLUVOWElPOwo+IAo+IC0gICAgICAgaWYgKGFyZ3MtPmZsYWdzICYgRVROQV9XQUlUX05P TkJMT0NLKQo+IC0gICAgICAgICAgICAgICB0aW1lb3V0ID0ga3RpbWVfc2V0KDAsIDApOwo+ICsg ICAgICAgaWYgKGFyZ3MtPmZsYWdzICYgRVROQV9XQUlUX05PTkJMT0NLKSB7Cj4gKyAgICAgICAg ICAgICAgIHJldCA9IGV0bmF2aXZfZ3B1X3dhaXRfZmVuY2VfaW50ZXJydXB0aWJsZShncHUsIGFy Z3MtPmZlbmNlLAo+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAga3RpbWVfc2V0KDAsIDApKTsKPiArCj4gKyAgICAgICAgICAgICAgIHJl dHVybiAocmV0ID09IC1FVElNRURPVVQpID8gLUVCVVNZIDogcmV0Owo+ICsgICAgICAgfQo+IAo+ ICAgICAgICAgcmV0dXJuIGV0bmF2aXZfZ3B1X3dhaXRfZmVuY2VfaW50ZXJydXB0aWJsZShncHUs IGFyZ3MtPmZlbmNlLAo+ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICAgICB0aW1lb3V0KTsKPiBAQCAtNDIxLDEwICs0MjYsMTMgQEAgc3RhdGljIGludCBl dG5hdml2X2lvY3RsX2dlbV93YWl0KHN0cnVjdAo+IGRybV9kZXZpY2UgKmRldiwgdm9pZCAqZGF0 YSwKPiAgICAgICAgIGlmICghb2JqKQo+ICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0VOVDsK PiAKPiAtICAgICAgIGlmIChhcmdzLT5mbGFncyAmIEVUTkFfV0FJVF9OT05CTE9DSykKPiAtICAg ICAgICAgICAgICAgdGltZW91dCA9IGt0aW1lX3NldCgwLCAwKTsKPiAtCj4gLSAgICAgICByZXQg PSBldG5hdml2X2dlbV93YWl0X2JvKGdwdSwgb2JqLCB0aW1lb3V0KTsKPiArICAgICAgIGlmIChh cmdzLT5mbGFncyAmIEVUTkFfV0FJVF9OT05CTE9DSykgewo+ICsgICAgICAgICAgICAgICByZXQg PSBldG5hdml2X2dlbV93YWl0X2JvKGdwdSwgb2JqLCBrdGltZV9zZXQoMCwgMCkpOwo+ICsgICAg ICAgICAgICAgICBpZiAocmV0ID09IC1FVElNRURPVVQpCj4gKyAgICAgICAgICAgICAgICAgICAg ICAgcmV0ID0gLUVCVVNZOwo+ICsgICAgICAgfSBlbHNlIHsKPiArICAgICAgICAgICAgICAgcmV0 ID0gZXRuYXZpdl9nZW1fd2FpdF9ibyhncHUsIG9iaiwgdGltZW91dCk7Cj4gKyAgICAgICB9Cj4g Cj4gICAgICAgICBkcm1fZ2VtX29iamVjdF9wdXRfdW5sb2NrZWQob2JqKTsKPiAKPiBkaWZmIC0t Z2l0IGEvZHJpdmVycy9ncHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuYwo+IGIvZHJpdmVycy9n cHUvZHJtL2V0bmF2aXYvZXRuYXZpdl9ncHUuYwo+IGluZGV4IGU0MmIxYzRkOTAyYy4uZmE2OTg2 YzVhNWZlIDEwMDY0NAo+IC0tLSBhL2RyaXZlcnMvZ3B1L2RybS9ldG5hdml2L2V0bmF2aXZfZ3B1 LmMKPiArKysgYi9kcml2ZXJzL2dwdS9kcm0vZXRuYXZpdi9ldG5hdml2X2dwdS5jCj4gQEAgLTEx MzUsNiArMTEzNSw3IEBAIGludCBldG5hdml2X2dwdV93YWl0X2ZlbmNlX2ludGVycnVwdGlibGUo c3RydWN0Cj4gZXRuYXZpdl9ncHUgKmdwdSwKPiAgICAgICAgIHUzMiBpZCwga3RpbWVfdCB0aW1l b3V0KQo+ICB7Cj4gICAgICAgICBzdHJ1Y3QgZG1hX2ZlbmNlICpmZW5jZTsKPiArICAgICAgIHVu c2lnbmVkIGxvbmcgcmVtYWluaW5nOwo+ICAgICAgICAgaW50IHJldDsKPiAKPiAgICAgICAgIC8q Cj4gQEAgLTExNTEsMTIgKzExNTIsMTIgQEAgaW50Cj4gZXRuYXZpdl9ncHVfd2FpdF9mZW5jZV9p bnRlcnJ1cHRpYmxlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LAo+ICAgICAgICAgaWYgKCFmZW5j ZSkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIDA7Cj4gCj4gLSAgICAgICBpZiAoIXRpbWVvdXQp IHsKPiAtICAgICAgICAgICAgICAgLyogTm8gdGltZW91dCB3YXMgcmVxdWVzdGVkOiBqdXN0IHRl c3QgZm9yIGNvbXBsZXRpb24gKi8KPiAtICAgICAgICAgICAgICAgcmV0ID0gZG1hX2ZlbmNlX2lz X3NpZ25hbGVkKGZlbmNlKSA/IDAgOiAtRUJVU1k7Cj4gKyAgICAgICBpZiAoIXRpbWVvdXQgfHwK PiArICAgICAgICAgICAocmVtYWluaW5nID0gZXRuYXZpdl90aW1lb3V0X3RvX2ppZmZpZXModGlt ZW91dCkpID09IDApIHsKPiArICAgICAgICAgICAgICAgLyogTm8gdGltZW91dCB3YXMgcmVxdWVz dGVkLCBvciB0aW1lb3V0IGlzIGFscmVhZHkgZXhwaXJlZCwKPiArICAgICAgICAgICAgICAgICog anVzdCB0ZXN0IGZvciBjb21wbGV0aW9uICovCj4gKyAgICAgICAgICAgICAgIHJldCA9IGRtYV9m ZW5jZV9pc19zaWduYWxlZChmZW5jZSkgPyAwIDogLUVUSU1FRE9VVDsKPiAgICAgICAgIH0gZWxz ZSB7Cj4gLSAgICAgICAgICAgICAgIHVuc2lnbmVkIGxvbmcgcmVtYWluaW5nID0gZXRuYXZpdl90 aW1lb3V0X3RvX2ppZmZpZXModGltZW91dCk7Cj4gLQo+ICAgICAgICAgICAgICAgICByZXQgPSBk bWFfZmVuY2Vfd2FpdF90aW1lb3V0KGZlbmNlLCB0cnVlLCByZW1haW5pbmcpOwo+ICAgICAgICAg ICAgICAgICBpZiAocmV0ID09IDApCj4gICAgICAgICAgICAgICAgICAgICAgICAgcmV0ID0gLUVU SU1FRE9VVDsKPiBAQCAtMTE4NSw3ICsxMTg2LDcgQEAgaW50IGV0bmF2aXZfZ3B1X3dhaXRfb2Jq X2luYWN0aXZlKHN0cnVjdCBldG5hdml2X2dwdSAqZ3B1LAo+ICAgICAgICAgbG9uZyByZXQ7Cj4g Cj4gICAgICAgICBpZiAoIXRpbWVvdXQpCj4gLSAgICAgICAgICAgICAgIHJldHVybiAhaXNfYWN0 aXZlKGV0bmF2aXZfb2JqKSA/IDAgOiAtRUJVU1k7Cj4gKyAgICAgICAgICAgICAgIHJldHVybiAh aXNfYWN0aXZlKGV0bmF2aXZfb2JqKSA/IDAgOiAtRVRJTUVET1VUOwo+IAo+ICAgICAgICAgcmVt YWluaW5nID0gZXRuYXZpdl90aW1lb3V0X3RvX2ppZmZpZXModGltZW91dCk7CgpfX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBs aXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVz a3RvcC5vcmcvbWFpbG1hbi9saXN0aW5mby9kcmktZGV2ZWw=