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=-13.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 autolearn=unavailable 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 B9CF5C11D00 for ; Thu, 20 Feb 2020 22:51:21 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 8F225207FD for ; Thu, 20 Feb 2020 22:51:21 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=shipmail.org header.i=@shipmail.org header.b="Q3mOx/61" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8F225207FD Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=shipmail.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=dri-devel-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 74DF26EE85; Thu, 20 Feb 2020 22:51:18 +0000 (UTC) Received: from pio-pvt-msa2.bahnhof.se (pio-pvt-msa2.bahnhof.se [79.136.2.41]) by gabe.freedesktop.org (Postfix) with ESMTPS id A204E6EE84; Thu, 20 Feb 2020 22:51:16 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by pio-pvt-msa2.bahnhof.se (Postfix) with ESMTP id AF7FB3F53F; Thu, 20 Feb 2020 23:51:14 +0100 (CET) Authentication-Results: pio-pvt-msa2.bahnhof.se; dkim=pass (1024-bit key; unprotected) header.d=shipmail.org header.i=@shipmail.org header.b=Q3mOx/61; dkim-atps=neutral X-Virus-Scanned: Debian amavisd-new at bahnhof.se Received: from pio-pvt-msa2.bahnhof.se ([127.0.0.1]) by localhost (pio-pvt-msa2.bahnhof.se [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0ABT3CG2jHcS; Thu, 20 Feb 2020 23:51:10 +0100 (CET) Received: from mail1.shipmail.org (h-205-35.A357.priv.bahnhof.se [155.4.205.35]) (Authenticated sender: mb878879) by pio-pvt-msa2.bahnhof.se (Postfix) with ESMTPA id BAEEB3F52B; Thu, 20 Feb 2020 23:51:08 +0100 (CET) Received: from localhost.localdomain (h-205-35.A357.priv.bahnhof.se [155.4.205.35]) by mail1.shipmail.org (Postfix) with ESMTPSA id C611C36016F; Thu, 20 Feb 2020 23:51:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=shipmail.org; s=mail; t=1582239067; bh=pLR+sI44kJIdfLFqdg9hcOGfLoMfzbAnrGHOm8gHEMk=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Q3mOx/61hBR+Eb4i2HpqXJ2ZlYrWzKX3nLu2/0U91TRG3+u/sfmffXGUVGuL4PzuY ae7aQA7Wn/1M98H8CtRx7b/KgsoFDAa5ZojZAd+3WTnkD6sXYKz9FyUWWDeggyJFLW GceQ1AJjjYAXEvhPhQmD37H3Weai+ya7NY9NVRcA= Subject: Re: [PATCH 5/5] drm/amdgpu: implement amdgpu_gem_prime_move_notify v2 To: Daniel Vetter References: <20200217154509.2265-1-christian.koenig@amd.com> <20200217154509.2265-6-christian.koenig@amd.com> <20200217175518.GL2363188@phenom.ffwll.local> <79a0d79f-91bd-2481-740c-20e6c819c7c9@shipmail.org> <20200220180459.GS2363188@phenom.ffwll.local> <20200220200831.GA2363188@phenom.ffwll.local> From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m_=28VMware=29?= Organization: VMware Inc. Message-ID: <501bf409-e4fe-a318-17b4-d5d050b09529@shipmail.org> Date: Thu, 20 Feb 2020 23:51:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <20200220200831.GA2363188@phenom.ffwll.local> Content-Language: en-US X-BeenThere: dri-devel@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Direct Rendering Infrastructure - Development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "moderated list:DMA BUFFER SHARING FRAMEWORK" , =?UTF-8?Q?Christian_K=c3=b6nig?= , intel-gfx , dri-devel , "open list:DMA BUFFER SHARING FRAMEWORK" Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: dri-devel-bounces@lists.freedesktop.org Sender: "dri-devel" T24gMi8yMC8yMCA5OjA4IFBNLCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+IE9uIFRodSwgRmViIDIw LCAyMDIwIGF0IDA4OjQ2OjI3UE0gKzAxMDAsIFRob21hcyBIZWxsc3Ryw7ZtIChWTXdhcmUpIHdy b3RlOgo+PiBPbiAyLzIwLzIwIDc6MDQgUE0sIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+PiBPbiBU aHUsIEZlYiAyMCwgMjAyMCBhdCAxMDozOTowNkFNICswMTAwLCBUaG9tYXMgSGVsbHN0csO2bSAo Vk13YXJlKSB3cm90ZToKPj4+PiBPbiAyLzE5LzIwIDc6NDIgQU0sIFRob21hcyBIZWxsc3Ryw7Zt IChWTXdhcmUpIHdyb3RlOgo+Pj4+PiBPbiAyLzE4LzIwIDEwOjAxIFBNLCBEYW5pZWwgVmV0dGVy IHdyb3RlOgo+Pj4+Pj4gT24gVHVlLCBGZWIgMTgsIDIwMjAgYXQgOToxNyBQTSBUaG9tYXMgSGVs bHN0csO2bSAoVk13YXJlKQo+Pj4+Pj4gPHRob21hc19vc0BzaGlwbWFpbC5vcmc+IHdyb3RlOgo+ Pj4+Pj4+IE9uIDIvMTcvMjAgNjo1NSBQTSwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4+Pj4+Pj4g T24gTW9uLCBGZWIgMTcsIDIwMjAgYXQgMDQ6NDU6MDlQTSArMDEwMCwgQ2hyaXN0aWFuIEvDtm5p ZyB3cm90ZToKPj4+Pj4+Pj4+IEltcGxlbWVudCB0aGUgaW1wb3J0ZXIgc2lkZSBvZiB1bnBpbm5l ZCBETUEtYnVmIGhhbmRsaW5nLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IHYyOiB1cGRhdGUgcGFnZSB0 YWJsZXMgaW1tZWRpYXRlbHkKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBDaHJp c3RpYW4gS8O2bmlnIDxjaHJpc3RpYW4ua29lbmlnQGFtZC5jb20+Cj4+Pj4+Pj4+PiAtLS0KPj4+ Pj4+Pj4+ICAgwqDCoCBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZG1hX2J1Zi5j IHwgNjYKPj4+Pj4+Pj4+ICsrKysrKysrKysrKysrKysrKysrLQo+Pj4+Pj4+Pj4gICDCoMKgIGRy aXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9vYmplY3QuY8KgIHzCoCA2ICsrCj4+Pj4+ Pj4+PiAgIMKgwqAgMiBmaWxlcyBjaGFuZ2VkLCA3MSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2FtZGdwdV9kbWFfYnVmLmMKPj4+Pj4+Pj4+IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9h bWRncHUvYW1kZ3B1X2RtYV9idWYuYwo+Pj4+Pj4+Pj4gaW5kZXggNzcwYmFiYTYyMWIzLi40OGRl NzYyNGQ0OWMgMTAwNjQ0Cj4+Pj4+Pj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdw dS9hbWRncHVfZG1hX2J1Zi5jCj4+Pj4+Pj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2Ft ZGdwdS9hbWRncHVfZG1hX2J1Zi5jCj4+Pj4+Pj4+PiBAQCAtNDUzLDcgKzQ1Myw3MSBAQCBhbWRn cHVfZG1hX2J1Zl9jcmVhdGVfb2JqKHN0cnVjdAo+Pj4+Pj4+Pj4gZHJtX2RldmljZSAqZGV2LCBz dHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZikKPj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoCByZXR1cm4gRVJS X1BUUihyZXQpOwo+Pj4+Pj4+Pj4gICDCoMKgIH0KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiArLyoqCj4+ Pj4+Pj4+PiArICogYW1kZ3B1X2RtYV9idWZfbW92ZV9ub3RpZnkgLSAmYXR0YWNoLm1vdmVfbm90 aWZ5IGltcGxlbWVudGF0aW9uCj4+Pj4+Pj4+PiArICoKPj4+Pj4+Pj4+ICsgKiBAYXR0YWNoOiB0 aGUgRE1BLWJ1ZiBhdHRhY2htZW50Cj4+Pj4+Pj4+PiArICoKPj4+Pj4+Pj4+ICsgKiBJbnZhbGlk YXRlIHRoZSBETUEtYnVmIGF0dGFjaG1lbnQsIG1ha2luZyBzdXJlIHRoYXQKPj4+Pj4+Pj4+IHRo ZSB3ZSByZS1jcmVhdGUgdGhlCj4+Pj4+Pj4+PiArICogbWFwcGluZyBiZWZvcmUgdGhlIG5leHQg dXNlLgo+Pj4+Pj4+Pj4gKyAqLwo+Pj4+Pj4+Pj4gK3N0YXRpYyB2b2lkCj4+Pj4+Pj4+PiArYW1k Z3B1X2RtYV9idWZfbW92ZV9ub3RpZnkoc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNo KQo+Pj4+Pj4+Pj4gK3sKPj4+Pj4+Pj4+ICvCoMKgwqAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpv YmogPSBhdHRhY2gtPmltcG9ydGVyX3ByaXY7Cj4+Pj4+Pj4+PiArwqDCoMKgIHN0cnVjdCB3d19h Y3F1aXJlX2N0eCAqdGlja2V0ID0gZG1hX3Jlc3ZfbG9ja2luZ19jdHgob2JqLT5yZXN2KTsKPj4+ Pj4+Pj4+ICvCoMKgwqAgc3RydWN0IGFtZGdwdV9ibyAqYm8gPSBnZW1fdG9fYW1kZ3B1X2JvKG9i aik7Cj4+Pj4+Pj4+PiArwqDCoMKgIHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gYW1kZ3B1 X3R0bV9hZGV2KGJvLT50Ym8uYmRldik7Cj4+Pj4+Pj4+PiArwqDCoMKgIHN0cnVjdCB0dG1fb3Bl cmF0aW9uX2N0eCBjdHggPSB7IGZhbHNlLCBmYWxzZSB9Owo+Pj4+Pj4+Pj4gK8KgwqDCoCBzdHJ1 Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQgPSB7fTsKPj4+Pj4+Pj4+ICvCoMKgwqAgc3RydWN0 IGFtZGdwdV92bV9ib19iYXNlICpib19iYXNlOwo+Pj4+Pj4+Pj4gK8KgwqDCoCBpbnQgcjsKPj4+ Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICvCoMKgwqAgaWYgKGJvLT50Ym8ubWVtLm1lbV90eXBlID09IFRU TV9QTF9TWVNURU0pCj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArwqDCoMKgIHIgPSB0dG1fYm9fdmFsaWRhdGUoJmJvLT50Ym8s ICZwbGFjZW1lbnQsICZjdHgpOwo+Pj4+Pj4+Pj4gK8KgwqDCoCBpZiAocikgewo+Pj4+Pj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW52YWxpZGF0ZSBE TUEtYnVmCj4+Pj4+Pj4+PiBpbXBvcnQgKCVkKSlcbiIsIHIpOwo+Pj4+Pj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+Pj4+Pj4+Pj4gK8KgwqDCoCB9Cj4+Pj4+Pj4+PiArCj4+ Pj4+Pj4+PiArwqDCoMKgIGZvciAoYm9fYmFzZSA9IGJvLT52bV9ibzsgYm9fYmFzZTsgYm9fYmFz ZSA9IGJvX2Jhc2UtPm5leHQpIHsKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0 cnVjdCBhbWRncHVfdm0gKnZtID0gYm9fYmFzZS0+dm07Cj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBzdHJ1Y3QgZG1hX3Jlc3YgKnJlc3YgPSB2bS0+cm9vdC5iYXNlLmJvLT50Ym8u YmFzZS5yZXN2Owo+Pj4+Pj4+Pj4gKwo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKHRpY2tldCkgewo+Pj4+Pj4+PiBZZWFoIHNvIHRoaXMgaXMga2luZGEgd2h5IEkndmUgYmVl biBhIHRvdGFsIHBhaW4gYWJvdXQgdGhlCj4+Pj4+Pj4+IGV4YWN0IHNlbWFudGljcwo+Pj4+Pj4+ PiBvZiB0aGUgbW92ZV9ub3RpZnkgaG9vay4gSSB0aGluayB3ZSBzaG91bGQgZmxhdC1vdXQgcmVx dWlyZQo+Pj4+Pj4+PiB0aGF0IGltcG9ydGVycwo+Pj4+Pj4+PiBfYWx3YXlzXyBoYXZlIGEgdGlj a2V0IGF0dGFjaCB3aGVuIHRoZXkgY2FsbCB0aGlzLCBhbmQgdGhhdAo+Pj4+Pj4+PiB0aGV5IGNh biBjb3BlCj4+Pj4+Pj4+IHdpdGggYWRkaXRpb25hbCBsb2NrcyBiZWluZyB0YWtlbiAoaS5lLiBm dWxsIEVERUFETENLKSBoYW5kbGluZy4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gU2ltcGxlc3Qgd2F5IHRv IGZvcmNlIHRoYXQgY29udHJhY3QgaXMgdG8gYWRkIGEgZHVtbXkgMm5kCj4+Pj4+Pj4+IHd3X211 dGV4IGxvY2sgdG8KPj4+Pj4+Pj4gdGhlIGRtYV9yZXN2IG9iamVjdCwgd2hpY2ggd2UgdGhlbiBj YW4gdGFrZSAjaWZkZWYKPj4+Pj4+Pj4gQ09ORklHX1dXX01VVEVYX1NMT1dQQVRIX0RFQlVHLiBQ bHVzIG1hYnllIGEgV0FSTl9PTighdGlja2V0KS4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gTm93IHRoZSBy ZWFsIGRpc2FzdGVyIGlzIGhvdyB3ZSBoYW5kbGUgZGVhZGxvY2tzLiBUd28gaXNzdWVzOgo+Pj4+ Pj4+Pgo+Pj4+Pj4+PiAtIElkZWFsbHkgd2UnZCBrZWVwIGFueSBsb2NrIHdlJ3ZlIHRha2VuIGxv Y2tlZCB1bnRpbCB0aGUKPj4+Pj4+Pj4gZW5kLCBpdCBoZWxwcwo+Pj4+Pj4+PiAgIMKgwqDCoCBu ZWVkbGVzcyBiYWNrb2Zmcy4gSSd2ZSBwbGF5ZWQgYXJvdW5kIGEgYml0IHdpdGggdGhhdAo+Pj4+ Pj4+PiBidXQgbm90IGV2ZW4gcG9jCj4+Pj4+Pj4+ICAgwqDCoMKgIGxldmVsLCBqdXN0IGFuIGlk ZWE6Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+IGh0dHBzOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvfmRhbnZl dC9kcm0vY29tbWl0Lz9pZD1iMTc5OWM1YTBmMDJkZjllMWJiMDhkMjdiZTM3MzMxMjU1YWI3NTgy Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+ICAgwqDCoMKgIElkZWEgaXMgZXNzZW50aWFsbHkg dG8gdHJhY2sgYSBsaXN0IG9mIG9iamVjdHMgd2UgaGFkIHRvCj4+Pj4+Pj4+IGxvY2sgYXMgcGFy dCBvZgo+Pj4+Pj4+PiAgIMKgwqDCoCB0aGUgdHRtX2JvX3ZhbGlkYXRlIG9mIHRoZSBtYWluIG9i amVjdC4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gLSBTZWNvbmQgb25lIGlzIGlmIHdlIGdldCBhIEVERUFE TENLIG9uIG9uZSBvZiB0aGVzZQo+Pj4+Pj4+PiBzdWJsb2NrcyAobGlrZSB0aGUKPj4+Pj4+Pj4g ICDCoMKgwqAgb25lIGhlcmUpLiBXZSBuZWVkIHRvIHBhc3MgdGhhdCB1cCB0aGUgZW50aXJlIGNh bGxjaGFpbiwKPj4+Pj4+Pj4gaW5jbHVkaW5nIGEKPj4+Pj4+Pj4gICDCoMKgwqAgdGVtcG9yYXJ5 IHJlZmVyZW5jZSAod2UgaGF2ZSB0byBkcm9wIGxvY2tzIHRvIGRvIHRoZQo+Pj4+Pj4+PiB3d19t dXRleF9sb2NrX3Nsb3cKPj4+Pj4+Pj4gICDCoMKgwqAgY2FsbCksIGFuZCBuZWVkIGEgY3VzdG9t IGNhbGxiYWNrIHRvIGRyb3AgdGhhdCB0ZW1wb3JhcnkgcmVmZXJlbmNlCj4+Pj4+Pj4+ICAgwqDC oMKgIChzaW5jZSB0aGF0J3MgYWxsIGRyaXZlciBzcGVjaWZpYywgbWlnaHQgZXZlbiBiZQo+Pj4+ Pj4+PiBpbnRlcm5hbCB3d19tdXRleCBhbmQKPj4+Pj4+Pj4gICDCoMKgwqAgbm90IGFueXRoaW5n IHJlbW90ZWx5IGxvb2tpbmcgbGlrZSBhIG5vcm1hbCBkbWFfYnVmKS4KPj4+Pj4+Pj4gVGhpcyBw cm9iYWJseQo+Pj4+Pj4+PiAgIMKgwqDCoCBuZWVkcyB0aGUgZXhlYyB1dGlsIGhlbHBlcnMgZnJv bSB0dG0sIGJ1dCBhdCB0aGUKPj4+Pj4+Pj4gZG1hX3Jlc3YgbGV2ZWwsIHNvIHRoYXQKPj4+Pj4+ Pj4gICDCoMKgwqAgd2UgY2FuIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6Cj4+Pj4+Pj4+Cj4+Pj4+ Pj4+IHN0cnVjdCBkbWFfcmVzdl90aWNrZXQgewo+Pj4+Pj4+PiAgIMKgwqDCoMKgwqDCoCBzdHJ1 Y3Qgd3dfYWNxdWlyZV9jdHggYmFzZTsKPj4+Pj4+Pj4KPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqAg LyogY2FuIGJlIHNldCBieSBhbnlvbmUgKGluY2x1ZGluZyBvdGhlciBkcml2ZXJzKQo+Pj4+Pj4+ PiB0aGF0IGdvdCBob2xkIG9mCj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoMKgwqAgKiB0aGlzIHRpY2tl dCBhbmQgaGFkIHRvIGFjcXVpcmUgc29tZSBuZXcgbG9jay4gVGhpcwo+Pj4+Pj4+PiBsb2NrIG1p Z2h0Cj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoMKgwqAgKiBwcm90ZWN0IGFueXRoaW5nLCBpbmNsdWRp bmcgZHJpdmVyLWludGVybmFsIHN0dWZmLCBhbmQgaXNuJ3QKPj4+Pj4+Pj4gICDCoMKgwqDCoMKg wqDCoCAqIHJlcXVpcmVkIHRvIGJlIGEgZG1hX2J1ZiBvciBldmVuIGp1c3QgYSBkbWFfcmVzdi4g Ki8KPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqAgc3RydWN0IHd3X211dGV4ICpjb250ZW5kZWRfbG9j azsKPj4+Pj4+Pj4KPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqAgLyogY2FsbGJhY2sgd2hpY2ggdGhl IGRyaXZlciAod2hpY2ggbWlnaHQgYmUgYSBkbWEtYnVmIGV4cG9ydGVyCj4+Pj4+Pj4+ICAgwqDC oMKgwqDCoMKgwqAgKiBhbmQgbm90IG1hdGNoaW5nIHRoZSBkcml2ZXIgdGhhdCBzdGFydGVkIHRo aXMKPj4+Pj4+Pj4gbG9ja2luZyB0aWNrZXQpCj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoMKgwqAgKiBz ZXRzIHRvZ2V0aGVyIHdpdGggQGNvbnRlbmRlZF9sb2NrLCBmb3IgdGhlIG1haW4KPj4+Pj4+Pj4g ZHJpdmVyIHRvIGRyb3AKPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqDCoCAqIHdoZW4gaXQgY2FsbHMg ZG1hX3Jlc3ZfdW5sb2NrIG9uIHRoZSBjb250ZW5kZWRfbG9jay4gKi8KPj4+Pj4+Pj4gICDCoMKg wqDCoMKgwqAgdm9pZCAoZHJvcF9yZWYqKShzdHJ1Y3Qgd3dfbXV0ZXggKmNvbnRlbmRlZF9sb2Nr KTsKPj4+Pj4+Pj4gfTsKPj4+Pj4+Pj4KPj4+Pj4+Pj4gVGhpcyBpcyBhbGwgc3VwcmVtZWx5IG5h c3R5IChhbHNvIHR0bV9ib192YWxpZGF0ZSB3b3VsZCBuZWVkIHRvIGJlCj4+Pj4+Pj4+IGltcHJv dmVkIHRvIGhhbmRsZSB0aGVzZSBzdWJsb2NrcyBhbmQgcmFuZG9tIG5ldyBvYmplY3RzCj4+Pj4+ Pj4+IHRoYXQgY291bGQgZm9yY2UKPj4+Pj4+Pj4gYSB3d19tdXRleF9sb2NrX3Nsb3cpLgo+Pj4+ Pj4+Pgo+Pj4+Pj4+IEp1c3QgYSBzaG9ydCBjb21tZW50IG9uIHRoaXM6Cj4+Pj4+Pj4KPj4+Pj4+ PiBOZWl0aGVyIHRoZSBjdXJyZW50bHkgdXNlZCB3YWl0LWRpZSBvciB0aGUgd291bmQtd2FpdCBh bGdvcml0aG0KPj4+Pj4+PiAqc3RyaWN0bHkqIHJlcXVpcmVzIGEgc2xvdyBsb2NrIG9uIHRoZSBj b250ZW5kZWQgbG9jay4gRm9yCj4+Pj4+Pj4gd2FpdC1kaWUgaXQncwo+Pj4+Pj4+IGp1c3QgdmVy eSBjb252ZW5pZW50IHNpbmNlIGl0IG1ha2VzIHVzIHNsZWVwIGluc3RlYWQgb2Ygc3Bpbm5pbmcg d2l0aAo+Pj4+Pj4+IC1FREVBRExLIG9uIHRoZSBjb250ZW5kZWQgbG9jay4gRm9yIHdvdW5kLXdh aXQgSUlSQyBvbmUgY291bGQganVzdAo+Pj4+Pj4+IGltbWVkaWF0ZWx5IHJlc3RhcnQgdGhlIHdo b2xlIGxvY2tpbmcgdHJhbnNhY3Rpb24gYWZ0ZXIgYW4KPj4+Pj4+PiAtRURFQURMSywgYW5kCj4+ Pj4+Pj4gdGhlIHRyYW5zYWN0aW9uIHdvdWxkIGF1dG9tYXRpY2FsbHkgZW5kIHVwIHdhaXRpbmcg b24gdGhlIGNvbnRlbmRlZAo+Pj4+Pj4+IGxvY2ssIHByb3ZpZGVkIHRoZSBtdXRleCBsb2NrIHN0 ZWFsaW5nIGlzIG5vdCBhbGxvd2VkLiBUaGVyZSBpcyBob3dldmVyCj4+Pj4+Pj4gYSBwb3NzaWJp bGl0eSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHdvdW5kZWQgYWdhaW4gb24gYW5vdGhl cgo+Pj4+Pj4+IGxvY2ssIHRha2VuIGJlZm9yZSB0aGUgY29udGVuZGVkIGxvY2ssIGJ1dCBJIHRo aW5rIHRoZXJlIGFyZSB3YXlzIHRvCj4+Pj4+Pj4gaW1wcm92ZSB0aGUgd291bmQtd2FpdCBhbGdv cml0aG0gdG8gcmVkdWNlIHRoYXQgcHJvYmFiaWxpdHkuCj4+Pj4+Pj4KPj4+Pj4+PiBTbyBpbiBz aG9ydCwgY2hvb3NpbmcgdGhlIHdvdW5kLXdhaXQgYWxnb3JpdGhtIGluc3RlYWQgb2Ygd2FpdC1k aWUgYW5kCj4+Pj4+Pj4gcGVyaGFwcyBtb2RpZnlpbmcgdGhlIHd3IG11dGV4IGNvZGUgc29tZXdo YXQgd291bGQgcHJvYmFibHkgaGVscAo+Pj4+Pj4+IHBhc3NpbmcKPj4+Pj4+PiBhbiAtRURFQURM SyB1cCB0aGUgY2FsbCBjaGFpbiB3aXRob3V0IHJlcXVpcmluZyBwYXNzaW5nIHRoZSBjb250ZW5k ZWQKPj4+Pj4+PiBsb2NrLCBhcyBsb25nIGFzIGVhY2ggbG9ja2VyIHJlbGVhc2VzIGl0cyBvd24g bG9ja3Mgd2hlbiByZWNlaXZpbmcgYW4KPj4+Pj4+PiAtRURFQURMSy4KPj4+Pj4+IEhtIHRoaXMg aXMga2luZGEgdGVtcHRpbmcsIHNpbmNlIHJvbGxpbmcgb3V0IHRoZSBmdWxsIGJhY2tvZmYgdHJp Y2tlcgo+Pj4+Pj4gYWNyb3NzIGRyaXZlciBib3VuZGFyaWVzIGlzIGdvaW5nIHRvIGJlIHJlYWwg cGFpbmZ1bC4KPj4+Pj4+Cj4+Pj4+PiBXaGF0IEknbSBraW5kYSB3b3JyaWVkIGFib3V0IGlzIHRo ZSBkZWJ1Zy92YWxpZGF0aW9uIGNoZWNrcyB3ZSdyZQo+Pj4+Pj4gbG9zaW5nIHdpdGggdGhpcy4g VGhlIHJlcXVpcmVkIGJhY2tvZmYgaGFzIHRoaXMgbmljZSBwcm9wZXJ0eSB0aGF0Cj4+Pj4+PiB3 d19tdXRleCBkZWJ1ZyBjb2RlIGNhbiBjaGVjayB0aGF0IHdlJ3ZlIGZ1bGx5IHVud291bmQgZXZl cnl0aGluZyB3aGVuCj4+Pj4+PiB3ZSBzaG91bGQsIHRoYXQgd2UndmUgYmxvY2tlZCBvbiB0aGUg cmlnaHQgbG9jaywgYW5kIHRoYXQgd2UncmUKPj4+Pj4+IHJlc3RhcnRpbmcgZXZlcnl0aGluZyB3 aXRob3V0IGtlZWxpbmcgb3Zlci4gV2l0aG91dCB0aGF0IEkgdGhpbmsgd2UKPj4+Pj4+IGNvdWxk IGVuZCB1cCB3aXRoIHNpdHVhdGlvbnMgd2hlcmUgYSBkcml2ZXIgaW4gdGhlIG1pZGRsZSBmZWVs cyBsaWtlCj4+Pj4+PiBoYW5kbGluZyB0aGUgRURFQURMQ0ssIHdoaWNoIG1pZ2h0IGdvIHdlbGwg bW9zdCBvZiB0aGUgdGltZXMgKHRoZQo+Pj4+Pj4gZGVhZGxvY2sgd2lsbCBwcm9iYWJseSBiZSBt b3N0bHkgd2l0aGluIGEgZ2l2ZW4gZHJpdmVyLCBub3QgYWNyb3NzKS4KPj4+Pj4+IFJpZ2h0IHVw IHRvIHRoZSBwb2ludCB3aGVyZSBzb21lb25lIGNyZWF0ZXMgYSBkZWFkbG9jayBhY3Jvc3MgZHJp dmVycywKPj4+Pj4+IGFuZCB0aGUgbGFjayBvZiBmdWxsIHJvbGxiYWNrIHdpbGwgYmUgZmVsdC4K Pj4+Pj4+Cj4+Pj4+PiBTbyBub3Qgc3VyZSB3aGV0aGVyIHdlIGNhbiBzdGlsbCBrZWVwIGFsbCB0 aGVzZSBkZWJ1Zy92YWxpZGF0aW9uCj4+Pj4+PiBjaGVja3MsIG9yIHdoZXRoZXIgdGhpcyBpcyBh IHN0ZXAgdG9vIGZhciB0b3dhcmRzIGNsZXZlciB0cmlja3MuCj4+Pj4+IEkgdGhpbmsgd2UgY291 bGQgZGVmaW5pdGVseSBmaW5kIGEgd2F5IHRvIGtlZXAgZGVidWdnaW5nIHRvIG1ha2Ugc3VyZQo+ Pj4+PiBldmVyeXRoaW5nIGlzIHVud291bmQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVzdGFydCB0 aGUgbG9ja2luZwo+Pj4+PiB0cmFuc2FjdGlvbi4gQnV0IHRoZSBkZWJ1ZyBjaGVjayB0aGF0IHdl J3JlIHJlc3RhcnRpbmcgb24gdGhlIGNvbnRlbmRlZAo+Pj4+PiBsb2NrIG9ubHkgcmVhbGx5IG1h a2VzIHNlbnNlIGZvciB3YWl0LWRpZSwgKGFuZCB3ZSBjb3VsZCBlYXNpbHkga2VlcCBpdAo+Pj4+ PiBmb3Igd2FpdC1kaWUpLiBUaGUgbG9jayByZXR1cm5pbmcgLUVERUFETEsgZm9yIHdvdW5kLXdh aXQgbWF5IGFjdHVhbGx5Cj4+Pj4+IG5vdCBiZSB0aGUgY29udGVuZGluZyBsb2NrIGJ1dCBhbiBh cmJpdHJhcnkgbG9jayB0aGF0IHRoZSB3b3VuZGVkCj4+Pj4+IHRyYW5zYWN0aW9uIGF0dGVtcHRz IHRvIHRha2UgYWZ0ZXIgaXQgaXMgd291bmRlZC4KPj4+Pj4KPj4+Pj4gU28gaW4gdGhlIGVuZCBJ TU8gdGhpcyBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gYWRkZWQgKHBvc3NpYmx5IHNldmVyZSkKPj4+ Pj4gbG9ja2luZyBjb21wbGV4aXR5IGludG8gZG1hLWJ1ZiBhbmQgbm90IGJlaW5nIGFibGUgdG8g c3dpdGNoIGJhY2sgdG8KPj4+Pj4gd2FpdC1kaWUgZWZmaWNpZW50bHkgaWYgd2UgbmVlZCAvIHdh bnQgdG8gZG8gdGhhdC4KPj4+Pj4KPj4+Pj4gL1Rob21hcwo+Pj4+IEFuZCBhcyBhIGNvbnNlcXVl bmNlIGFuIGludGVyZmFjZSAqY291bGQqIGJlOgo+Pj4+Cj4+Pj4gKikgV2UgaW50cm9kdWNlIGZ1 bmN0aW9ucwo+Pj4+Cj4+Pj4gdm9pZCB3d19hY3F1aXJlX3JlbGF4KHN0cnVjdCB3d19hY3F1aXJl X2N0eCAqY3R4KTsKPj4+PiBpbnQgd3dfYWNxdWlyZV9yZWxheF9pbnRlcnJ1cHRpYmxlKHN0cnVj dCB3d19hY3F1aXJlX2N0eCAqY3R4KTsKPj4+Pgo+Pj4+IHRoYXQgY2FuIGJlIHVzZWQgaW5zdGVh ZCBvZiB3d19tdXRleF9sb2NrX3Nsb3coKSBpbiB0aGUgYWJzZW5jZSBvZiBhCj4+Pj4gY29udGVu ZGluZyBsb2NrIHRvIGF2b2lkIHNwaW5uaW5nIG9uIC1FREVBRExLLiBXaGlsZSB0cnlpbmcgdG8g dGFrZSB0aGUKPj4+PiBjb250ZW5kaW5nIGxvY2sgaXMgcHJvYmFibHkgdGhlIGJlc3QgY2hvaWNl IHRoZXJlIGFyZSB2YXJpb3VzIHNlY29uZCBiZXN0Cj4+Pj4gYXBwcm9hY2hlcyB0aGF0IGNhbiBi ZSBleHBsb3JlZCwgZm9yIGV4YW1wbGUgd2FpdGluZyBvbiB0aGUgY29udGVuZGluZwo+Pj4+IGFj cXVpcmUgdG8gZmluaXNoIG9yIGluIHRoZSB3b3VuZC13YWl0IGNhc2UsIHBlcmhhcHMgZG8gbm90 aGluZy4gVGhlc2UKPj4+PiBmdW5jdGlvbnMgd2lsbCBhbHNvIGhlbHAgdXMga2VlcCB0aGUgZGVi dWdnaW5nLgo+Pj4gSG0gLi4uIEkgZ3Vlc3MgdGhpcyBjb3VsZCB3b3JrLiBUcm91YmxlIGlzLCBp dCBvbmx5IGdldHMgcmlkIG9mIHRoZQo+Pj4gc2xvd3BhdGggbG9ja2luZyBib29rLWtlZXBpbmcg aGVhZGFjaGVzLCB3ZSBzdGlsbCBoYXZlIHF1aXRlIGEgZmV3IG90aGVycy4KPj4+Cj4+Pj4gKikg QSBmdW5jdGlvbiByZXR1cm5pbmcgLUVERUFETEsgdG8gYSBjYWxsZXIgKm11c3QqIGhhdmUgYWxy ZWFkeSByZWxlYXNlZAo+Pj4+IGl0cyBvd24gbG9ja3MuCj4+PiBTbyB0aGlzIHRpZXMgdG8gYW5v dGhlciBxdWVzdGlvbiwgYXMgaW4gc2hvdWxkIHRoZXNlIGNhbGxiYWNrcyBoYXZlIHRvCj4+PiBk cm9wcyB0aGUgbG9ja3MgdGhlaSBhY3F1aXJlIChtdWNoIHNpbXBsZXIgY29kZSkgb3Igbm90IChs ZXNzIHRocmFzaGluZywKPj4+IGlmIHdlIGRyb3AgbG9ja3Mgd2UgbWlnaHQgZW5kIHVwIGluIGEg c2l0dWF0aW9uIHdoZXJlIHRocmVhZHMgdGhyYXNoCj4+PiBhcm91bmQgaW5zdGVhZCBvZiByZWFs aXppbmcgcXVpY2tlciB0aGF0IHRoZXkncmUgYWN0dWFsbHkgZGVhZGxvY2tpbmcgYW5kCj4+PiBv bmUgb2YgdGhlbSBzaG91bGQgc3RvcCBhbmQgYmFjayBvZmYpLgo+PiBIbW0uLiBDb3VsZCB5b3Ug ZGVzY3JpYmUgc3VjaCBhIHRocmFzaGluZyBjYXNlIHdpdGggYW4gZXhhbXBsZT8KPiBJZ25vcmlu ZyBjcm9zcyBkZXZpY2UgZnVuIGFuZCBhbGwgdGhhdCwganVzdCBhIHNpbXBsaWZpZWQgZXhhbXBs ZSBvZiB3aHkKPiBob2xkaW5nIG9udG8gbG9ja3MgeW91J3ZlIGFjcXVpcmVkIGZvciBldmljdGlv biBpcyB1c2VmdWwsIGF0IGxlYXN0IGluIGEKPiBzbG93IHBhdGguCj4KPiAtIG9uZSB0aHJlYWQg dHJ5aW5nIHRvIGRvIGFuIGV4ZWNidWYgd2l0aCBhIGh1Z2UgYm8KPgo+IHZzLgo+Cj4gLSBhbiBl bnRpcmUgcGlsZSBvZiB0aHJlYWQgdGhhdCB0cnkgdG8gZG8gZXhlY2J1ZiB3aXRoIGp1c3QgYSBm ZXcgc21hbGwgYm8KPgo+IEZpcnN0IHRocmVhZCBpcyBpbiB0aGUgZXZpY3Rpb24gbG9vcCwgc2Vs ZWN0cyBhIGJvLCB3aW5zIGFnYWluc3QgYWxsIHRoZQo+IG90aGVyIHRocmVhZCBzaW5jZSBpdCdz IGJlZW4gZG9pbmcgdGhpcyBmb3JldmVyIGFscmVhZHksIGdldHMgdGhlIGJvIG1vdmVkCj4gb3V0 LCB1bmxvY2tzLgo+Cj4gU2luY2UgaXQncyBjb21wZXRpbmcgYWdhaW5zdCBsb3RzIG9mIG90aGVy IHRocmVhZHMgd2l0aCBzbWFsbCBibywgaXQnbGwKPiBoYXZlIHRvIGRvIHRoYXQgYSBsb3Qgb2Yg dGltZXMuIE9mdGVuIGVub3VnaCB0byBjcmVhdGUgYSBjb250aWd1b3VzIGhvbGUuCj4gSWYgeW91 IGhhdmUgYSBzbWFydGVyIGFsbG9jYXRvciB0aGF0IHRyaWVzIHRvIGNyZWF0ZSB0aGF0IGhvbGUg bW9yZQo+IGFjdGl2ZWx5LCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBzaW5nbGUgaHVnZSBibyBpcyBh IHN1YnN0YW50aWFsIHBhcnQgb2YKPiB0b3RhbCB2cmFtLgo+Cj4gVGhlIG90aGVyIHRocmVhZHMg d2lsbCBiZSBxdWlja2VyIGluIGNyYW1taW5nIG5ldyBzdHVmZiBpbiwgZXZlbiBpZiB0aGV5Cj4g b2NjYXNpb25hbGx5IGxvc2UgdGhlIHd3IGRhbmNlIGFnYWluc3QgdGhlIHNpbmdsZSB0aHJlYWQu IFNvIHRoZSBiaWcKPiB0aHJlYWQgbGl2ZWxvY2tzLgo+Cj4gSWYgb3RvaCB0aGUgYmlnIHRocmVh ZCB3b3VsZCBrZWVwIG9udG8gYWxsIHRoZSBsb2NrcywgZXZlbnR1YWxseSBpdCBoYXZlCj4gdGhl IGVudGlyZSB2cmFtIGxvY2tlZCwgYW5kIGV2ZXJ5IG90aGVyIHRocmVhZCBpcyBndWFyYW50ZWVk IHRvIGxvc2UKPiBhZ2FpbnN0IGl0IGluIHRoZSB3dyBkYW5jZSBhbmQgcXVldWUgdXAgYmVoaW5k LiBBbmQgaXQgY291bGQgZmluYWxseSBidXQKPiBpdHMgaHVnZSBibyBpbnRvIHZyYW0gYW5kIGV4 ZWN1dGUuCgpIbW0sIHllcyB0aGlzIGluZGVlZCBleHBsYWlucyB3aHkgaXQncyBiZW5lZmljaWFs IGluIHNvbWUgY2FzZXMgdG8ga2VlcCAKYSBudW1iZXIgb2bCoCBsb2NrcyBoZWxkIGFjcm9zcyBj ZXJ0YWluIG9wZXJhdGlvbnMsIGJ1dCBJIHN0aWxsIGZhaWwgdG8gCnNlZSB3aHkgd2Ugd291bGQg bGlrZSAqYWxsKiBsb2NrcyBoZWxkIGFjcm9zcyB0aGUgZW50aXJlIHRyYW5zYWN0aW9uPyBJbiAK dGhlIGFib3ZlIGNhc2UgSSdkIGVudmlzaW9uIHVzIGVuZGluZyB1cCB3aXRoIHNvbWV0aGluZyBs aWtlOgoKaW50IHZhbGlkYXRlKGN0eCwgYm8pCnsKCiDCoMKgwqAgZm9yX2VhY2hfc3VpdGFibGVf Ym9fdG9fZXZpY3QoZWJvKSB7CiDCoMKgwqAgwqDCoMKgIHIgPSBsb2NrKGN0eCwgZWJvKTsKIMKg wqDCoCDCoMKgwqAgaWYgKHIgPT0gRURFQURMSykKIMKgwqDCoCDCoMKgwqAgwqDCoMKgIGdvdG8g b3V0X3VubG9jazsKCiDCoMKgwqAgwqDCoMKgIHIgPSBtb3ZlX25vdGlmeShjdHgsIGVibyk7Ly8g bG9ja3MgYW5kIHVubG9ja3MgR1BVIFZNIGJvLgogwqDCoMKgIMKgwqDCoCBpZiAociA9PSBFREVB RExLKQogwqDCoMKgIMKgwqDCoCDCoMKgwqAgZ290byBvdXRfdW5sb2NrOwogwqDCoMKgIMKgwqDC oCBldmljdCgpOwogwqDCoMKgIH0KCiDCoMKgwqAgcGxhY2VfYm8oYm8pOwogwqDCoMKgIC8vUmVw ZWF0IHVudGlsIHN1Y2Nlc3MuCgoKb3V0X3VubG9jazoKIMKgwqDCoCBmb3JfZWFjaF9sb2NrZWRf Ym8oZWJvKQogwqDCoMKgIMKgwqDCoCB1bmxvY2soY3R4LCBlYm8pOwp9CgoKdm9pZCBjb21tYW5k X3N1Ym1pc3Npb24oKQp7CiDCoMKgwqAgYWNxdWlyZV9pbml0KGN0eCk7CgpyZXN0YXJ0OgogwqDC oMKgIGZvcl9lYWNoX2JvX2luX2NzKGJvKSB7CiDCoMKgwqAgwqDCoMKgIHIgPSBsb2NrKGN0eCwg Ym8pOwogwqDCoMKgIMKgwqDCoCBpZiAociA9PSAtRURFQURMSykKIMKgwqDCoCDCoMKgwqAgwqDC oMKgIGdvdG8gb3V0X3VucmVzZXJ2ZTsKIMKgwqDCoCB9CgogwqDCoMKgIGZvcl9lYWNoX2JvX2lu X2NzKGJvKSB7CiDCoMKgwqAgwqDCoMKgIHIgPSB2YWxpZGF0ZShjdHgsIGJvKTsKIMKgwqDCoCDC oMKgwqAgaWYgKHIgPT0gLUVERUFETEspCiDCoMKgwqAgwqDCoMKgIMKgwqDCoCBnb3RvIG91dF91 bnJlc2VydmU7CiDCoMKgwqAgfTsKCiDCoMKgwqAgY3MoKTsKCiDCoMKgwqAgZm9yX2VhY2hfYm9f aW5fY3MoYm8pCiDCoMKgwqAgwqDCoMKgIHVubG9jayhjdHgsIGJvKTsKCiDCoMKgwqAgYWNxdWly ZV9maW5pKGN0eCk7CiDCoMKgwqAgcmV0dXJuIDA7CgpvdXRfdW5yZXNlcnZlOgogwqDCoMKgIGZv cl9lYWNoX2xvY2tlZF9ibygpCiDCoMKgwqAgwqDCoMKgIHVubG9jayhjdHgsIGJvKTsKCiDCoMKg wqAgYWNxdWlyZV9yZWxheCgpOwogwqDCoMKgIGdvdG8gcmVzdGFydDsKfQoKCj4KPiBWYXJ5IGV4 YW1wbGUgZm9yIG11bHRpLWdwdSBhbmQgbW9yZSByZWFsaXNtLCBidXQgdGhhdCdzIHJvdWdobHkg aXQuCj4KPiBBc2lkZSwgYSBsb3Qgb2YgdGhlIHN0dWZmIENocmlzdGlhbiBoYXMgYmVlbiBkb2lu ZyBpbiB0dG0gaXMgdG8gaW1wcm92ZQo+IHRoZSBjaGFuY2VzIHRoYXQgdGhlIGNvbXBldGluZyB0 aHJlYWRzIHdpbGwgaGl0IG9uZSBvZiB0aGUgbG9ja2VkIG9iamVjdHMKPiBvZiB0aGUgYmlnIHRo cmVhZCwgYW5kIGF0IGxlYXN0IGJhY2sgb2ZmIGEgYml0LiBUaGF0J3MgYXQgbGVhc3QgbXkKPiB1 bmRlcnN0YW5kaW5nIG9mIHdoYXQncyBiZWVuIGhhcHBlbmluZy4KPiAtRGFuaWVsCgpPSyB1bnNl cnN0b29kLiBGb3Igdm13Z2Z4IHRoZSBjcnVkZSBzaW1wbGlzdGljIGlkZWEgdG8gYXZvaWQgdGhh dCAKc2l0dWF0aW9uIGhhcyBiZWVuIHRvIGhhdmUgYW4gcndzZW0gYXJvdW5kIGNvbW1hbmQgc3Vi bWlzc2lvbjogV2hlbiB0aGUgCnRocmVhZCB3aXRoIHRoZSBiaWcgYm8gaGFzIHJ1biBhIGZ1bGwg TFJVIHdvcnRoIG9mIGV2aWN0aW9uIHdpdGhvdXQgCnN1Y2NlZWRpbmcgaXQgd291bGQgZ2V0IGFu bm95ZWQgYW5kIHRha2UgdGhlIHJ3c2VtIGluIHdyaXRlIG1vZGUsIApibG9ja2luZyBjb21wZXRp bmcgdGhyZWFkcy4gQnV0IHRoYXQgd291bGQgb2YgY291cnNlIG5ldmVyIHdvcmsgaW4gYSAKZG1h LWJ1ZiBzZXR0aW5nLCBhbmQgSUlSQyB0aGUgaW1wbGVtZW50YXRpb24gaXMgbm90IGNvbXBsZXRl IGVpdGhlci4uLi4KCi9UaG9tYXMKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpkcmktZGV2ZWwgbWFpbGluZyBsaXN0CmRyaS1kZXZlbEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9kcmktZGV2ZWwK 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=-13.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 57756C11D24 for ; Thu, 20 Feb 2020 22:51:19 +0000 (UTC) Received: from gabe.freedesktop.org (gabe.freedesktop.org [131.252.210.177]) (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 F3FF8207FD for ; Thu, 20 Feb 2020 22:51:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=shipmail.org header.i=@shipmail.org header.b="Q3mOx/61" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org F3FF8207FD Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=shipmail.org Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=intel-gfx-bounces@lists.freedesktop.org Received: from gabe.freedesktop.org (localhost [127.0.0.1]) by gabe.freedesktop.org (Postfix) with ESMTP id 5F3AB6EE84; Thu, 20 Feb 2020 22:51:18 +0000 (UTC) Received: from pio-pvt-msa2.bahnhof.se (pio-pvt-msa2.bahnhof.se [79.136.2.41]) by gabe.freedesktop.org (Postfix) with ESMTPS id A204E6EE84; Thu, 20 Feb 2020 22:51:16 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by pio-pvt-msa2.bahnhof.se (Postfix) with ESMTP id AF7FB3F53F; Thu, 20 Feb 2020 23:51:14 +0100 (CET) Authentication-Results: pio-pvt-msa2.bahnhof.se; dkim=pass (1024-bit key; unprotected) header.d=shipmail.org header.i=@shipmail.org header.b=Q3mOx/61; dkim-atps=neutral X-Virus-Scanned: Debian amavisd-new at bahnhof.se Received: from pio-pvt-msa2.bahnhof.se ([127.0.0.1]) by localhost (pio-pvt-msa2.bahnhof.se [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0ABT3CG2jHcS; Thu, 20 Feb 2020 23:51:10 +0100 (CET) Received: from mail1.shipmail.org (h-205-35.A357.priv.bahnhof.se [155.4.205.35]) (Authenticated sender: mb878879) by pio-pvt-msa2.bahnhof.se (Postfix) with ESMTPA id BAEEB3F52B; Thu, 20 Feb 2020 23:51:08 +0100 (CET) Received: from localhost.localdomain (h-205-35.A357.priv.bahnhof.se [155.4.205.35]) by mail1.shipmail.org (Postfix) with ESMTPSA id C611C36016F; Thu, 20 Feb 2020 23:51:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=shipmail.org; s=mail; t=1582239067; bh=pLR+sI44kJIdfLFqdg9hcOGfLoMfzbAnrGHOm8gHEMk=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Q3mOx/61hBR+Eb4i2HpqXJ2ZlYrWzKX3nLu2/0U91TRG3+u/sfmffXGUVGuL4PzuY ae7aQA7Wn/1M98H8CtRx7b/KgsoFDAa5ZojZAd+3WTnkD6sXYKz9FyUWWDeggyJFLW GceQ1AJjjYAXEvhPhQmD37H3Weai+ya7NY9NVRcA= To: Daniel Vetter References: <20200217154509.2265-1-christian.koenig@amd.com> <20200217154509.2265-6-christian.koenig@amd.com> <20200217175518.GL2363188@phenom.ffwll.local> <79a0d79f-91bd-2481-740c-20e6c819c7c9@shipmail.org> <20200220180459.GS2363188@phenom.ffwll.local> <20200220200831.GA2363188@phenom.ffwll.local> From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m_=28VMware=29?= Organization: VMware Inc. Message-ID: <501bf409-e4fe-a318-17b4-d5d050b09529@shipmail.org> Date: Thu, 20 Feb 2020 23:51:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <20200220200831.GA2363188@phenom.ffwll.local> Content-Language: en-US Subject: Re: [Intel-gfx] [PATCH 5/5] drm/amdgpu: implement amdgpu_gem_prime_move_notify v2 X-BeenThere: intel-gfx@lists.freedesktop.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Intel graphics driver community testing & development List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: "moderated list:DMA BUFFER SHARING FRAMEWORK" , =?UTF-8?Q?Christian_K=c3=b6nig?= , intel-gfx , dri-devel , "open list:DMA BUFFER SHARING FRAMEWORK" Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" T24gMi8yMC8yMCA5OjA4IFBNLCBEYW5pZWwgVmV0dGVyIHdyb3RlOgo+IE9uIFRodSwgRmViIDIw LCAyMDIwIGF0IDA4OjQ2OjI3UE0gKzAxMDAsIFRob21hcyBIZWxsc3Ryw7ZtIChWTXdhcmUpIHdy b3RlOgo+PiBPbiAyLzIwLzIwIDc6MDQgUE0sIERhbmllbCBWZXR0ZXIgd3JvdGU6Cj4+PiBPbiBU aHUsIEZlYiAyMCwgMjAyMCBhdCAxMDozOTowNkFNICswMTAwLCBUaG9tYXMgSGVsbHN0csO2bSAo Vk13YXJlKSB3cm90ZToKPj4+PiBPbiAyLzE5LzIwIDc6NDIgQU0sIFRob21hcyBIZWxsc3Ryw7Zt IChWTXdhcmUpIHdyb3RlOgo+Pj4+PiBPbiAyLzE4LzIwIDEwOjAxIFBNLCBEYW5pZWwgVmV0dGVy IHdyb3RlOgo+Pj4+Pj4gT24gVHVlLCBGZWIgMTgsIDIwMjAgYXQgOToxNyBQTSBUaG9tYXMgSGVs bHN0csO2bSAoVk13YXJlKQo+Pj4+Pj4gPHRob21hc19vc0BzaGlwbWFpbC5vcmc+IHdyb3RlOgo+ Pj4+Pj4+IE9uIDIvMTcvMjAgNjo1NSBQTSwgRGFuaWVsIFZldHRlciB3cm90ZToKPj4+Pj4+Pj4g T24gTW9uLCBGZWIgMTcsIDIwMjAgYXQgMDQ6NDU6MDlQTSArMDEwMCwgQ2hyaXN0aWFuIEvDtm5p ZyB3cm90ZToKPj4+Pj4+Pj4+IEltcGxlbWVudCB0aGUgaW1wb3J0ZXIgc2lkZSBvZiB1bnBpbm5l ZCBETUEtYnVmIGhhbmRsaW5nLgo+Pj4+Pj4+Pj4KPj4+Pj4+Pj4+IHYyOiB1cGRhdGUgcGFnZSB0 YWJsZXMgaW1tZWRpYXRlbHkKPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiBTaWduZWQtb2ZmLWJ5OiBDaHJp c3RpYW4gS8O2bmlnIDxjaHJpc3RpYW4ua29lbmlnQGFtZC5jb20+Cj4+Pj4+Pj4+PiAtLS0KPj4+ Pj4+Pj4+ICAgwqDCoCBkcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdwdS9hbWRncHVfZG1hX2J1Zi5j IHwgNjYKPj4+Pj4+Pj4+ICsrKysrKysrKysrKysrKysrKysrLQo+Pj4+Pj4+Pj4gICDCoMKgIGRy aXZlcnMvZ3B1L2RybS9hbWQvYW1kZ3B1L2FtZGdwdV9vYmplY3QuY8KgIHzCoCA2ICsrCj4+Pj4+ Pj4+PiAgIMKgwqAgMiBmaWxlcyBjaGFuZ2VkLCA3MSBpbnNlcnRpb25zKCspLCAxIGRlbGV0aW9u KC0pCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9hbWQv YW1kZ3B1L2FtZGdwdV9kbWFfYnVmLmMKPj4+Pj4+Pj4+IGIvZHJpdmVycy9ncHUvZHJtL2FtZC9h bWRncHUvYW1kZ3B1X2RtYV9idWYuYwo+Pj4+Pj4+Pj4gaW5kZXggNzcwYmFiYTYyMWIzLi40OGRl NzYyNGQ0OWMgMTAwNjQ0Cj4+Pj4+Pj4+PiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vYW1kL2FtZGdw dS9hbWRncHVfZG1hX2J1Zi5jCj4+Pj4+Pj4+PiArKysgYi9kcml2ZXJzL2dwdS9kcm0vYW1kL2Ft ZGdwdS9hbWRncHVfZG1hX2J1Zi5jCj4+Pj4+Pj4+PiBAQCAtNDUzLDcgKzQ1Myw3MSBAQCBhbWRn cHVfZG1hX2J1Zl9jcmVhdGVfb2JqKHN0cnVjdAo+Pj4+Pj4+Pj4gZHJtX2RldmljZSAqZGV2LCBz dHJ1Y3QgZG1hX2J1ZiAqZG1hX2J1ZikKPj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoCByZXR1cm4gRVJS X1BUUihyZXQpOwo+Pj4+Pj4+Pj4gICDCoMKgIH0KPj4+Pj4+Pj4+Cj4+Pj4+Pj4+PiArLyoqCj4+ Pj4+Pj4+PiArICogYW1kZ3B1X2RtYV9idWZfbW92ZV9ub3RpZnkgLSAmYXR0YWNoLm1vdmVfbm90 aWZ5IGltcGxlbWVudGF0aW9uCj4+Pj4+Pj4+PiArICoKPj4+Pj4+Pj4+ICsgKiBAYXR0YWNoOiB0 aGUgRE1BLWJ1ZiBhdHRhY2htZW50Cj4+Pj4+Pj4+PiArICoKPj4+Pj4+Pj4+ICsgKiBJbnZhbGlk YXRlIHRoZSBETUEtYnVmIGF0dGFjaG1lbnQsIG1ha2luZyBzdXJlIHRoYXQKPj4+Pj4+Pj4+IHRo ZSB3ZSByZS1jcmVhdGUgdGhlCj4+Pj4+Pj4+PiArICogbWFwcGluZyBiZWZvcmUgdGhlIG5leHQg dXNlLgo+Pj4+Pj4+Pj4gKyAqLwo+Pj4+Pj4+Pj4gK3N0YXRpYyB2b2lkCj4+Pj4+Pj4+PiArYW1k Z3B1X2RtYV9idWZfbW92ZV9ub3RpZnkoc3RydWN0IGRtYV9idWZfYXR0YWNobWVudCAqYXR0YWNo KQo+Pj4+Pj4+Pj4gK3sKPj4+Pj4+Pj4+ICvCoMKgwqAgc3RydWN0IGRybV9nZW1fb2JqZWN0ICpv YmogPSBhdHRhY2gtPmltcG9ydGVyX3ByaXY7Cj4+Pj4+Pj4+PiArwqDCoMKgIHN0cnVjdCB3d19h Y3F1aXJlX2N0eCAqdGlja2V0ID0gZG1hX3Jlc3ZfbG9ja2luZ19jdHgob2JqLT5yZXN2KTsKPj4+ Pj4+Pj4+ICvCoMKgwqAgc3RydWN0IGFtZGdwdV9ibyAqYm8gPSBnZW1fdG9fYW1kZ3B1X2JvKG9i aik7Cj4+Pj4+Pj4+PiArwqDCoMKgIHN0cnVjdCBhbWRncHVfZGV2aWNlICphZGV2ID0gYW1kZ3B1 X3R0bV9hZGV2KGJvLT50Ym8uYmRldik7Cj4+Pj4+Pj4+PiArwqDCoMKgIHN0cnVjdCB0dG1fb3Bl cmF0aW9uX2N0eCBjdHggPSB7IGZhbHNlLCBmYWxzZSB9Owo+Pj4+Pj4+Pj4gK8KgwqDCoCBzdHJ1 Y3QgdHRtX3BsYWNlbWVudCBwbGFjZW1lbnQgPSB7fTsKPj4+Pj4+Pj4+ICvCoMKgwqAgc3RydWN0 IGFtZGdwdV92bV9ib19iYXNlICpib19iYXNlOwo+Pj4+Pj4+Pj4gK8KgwqDCoCBpbnQgcjsKPj4+ Pj4+Pj4+ICsKPj4+Pj4+Pj4+ICvCoMKgwqAgaWYgKGJvLT50Ym8ubWVtLm1lbV90eXBlID09IFRU TV9QTF9TWVNURU0pCj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCByZXR1cm47Cj4+ Pj4+Pj4+PiArCj4+Pj4+Pj4+PiArwqDCoMKgIHIgPSB0dG1fYm9fdmFsaWRhdGUoJmJvLT50Ym8s ICZwbGFjZW1lbnQsICZjdHgpOwo+Pj4+Pj4+Pj4gK8KgwqDCoCBpZiAocikgewo+Pj4+Pj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgRFJNX0VSUk9SKCJGYWlsZWQgdG8gaW52YWxpZGF0ZSBE TUEtYnVmCj4+Pj4+Pj4+PiBpbXBvcnQgKCVkKSlcbiIsIHIpOwo+Pj4+Pj4+Pj4gK8KgwqDCoMKg wqDCoMKgwqDCoMKgwqAgcmV0dXJuOwo+Pj4+Pj4+Pj4gK8KgwqDCoCB9Cj4+Pj4+Pj4+PiArCj4+ Pj4+Pj4+PiArwqDCoMKgIGZvciAoYm9fYmFzZSA9IGJvLT52bV9ibzsgYm9fYmFzZTsgYm9fYmFz ZSA9IGJvX2Jhc2UtPm5leHQpIHsKPj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHN0 cnVjdCBhbWRncHVfdm0gKnZtID0gYm9fYmFzZS0+dm07Cj4+Pj4+Pj4+PiArwqDCoMKgwqDCoMKg wqDCoMKgwqDCoCBzdHJ1Y3QgZG1hX3Jlc3YgKnJlc3YgPSB2bS0+cm9vdC5iYXNlLmJvLT50Ym8u YmFzZS5yZXN2Owo+Pj4+Pj4+Pj4gKwo+Pj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAg aWYgKHRpY2tldCkgewo+Pj4+Pj4+PiBZZWFoIHNvIHRoaXMgaXMga2luZGEgd2h5IEkndmUgYmVl biBhIHRvdGFsIHBhaW4gYWJvdXQgdGhlCj4+Pj4+Pj4+IGV4YWN0IHNlbWFudGljcwo+Pj4+Pj4+ PiBvZiB0aGUgbW92ZV9ub3RpZnkgaG9vay4gSSB0aGluayB3ZSBzaG91bGQgZmxhdC1vdXQgcmVx dWlyZQo+Pj4+Pj4+PiB0aGF0IGltcG9ydGVycwo+Pj4+Pj4+PiBfYWx3YXlzXyBoYXZlIGEgdGlj a2V0IGF0dGFjaCB3aGVuIHRoZXkgY2FsbCB0aGlzLCBhbmQgdGhhdAo+Pj4+Pj4+PiB0aGV5IGNh biBjb3BlCj4+Pj4+Pj4+IHdpdGggYWRkaXRpb25hbCBsb2NrcyBiZWluZyB0YWtlbiAoaS5lLiBm dWxsIEVERUFETENLKSBoYW5kbGluZy4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gU2ltcGxlc3Qgd2F5IHRv IGZvcmNlIHRoYXQgY29udHJhY3QgaXMgdG8gYWRkIGEgZHVtbXkgMm5kCj4+Pj4+Pj4+IHd3X211 dGV4IGxvY2sgdG8KPj4+Pj4+Pj4gdGhlIGRtYV9yZXN2IG9iamVjdCwgd2hpY2ggd2UgdGhlbiBj YW4gdGFrZSAjaWZkZWYKPj4+Pj4+Pj4gQ09ORklHX1dXX01VVEVYX1NMT1dQQVRIX0RFQlVHLiBQ bHVzIG1hYnllIGEgV0FSTl9PTighdGlja2V0KS4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gTm93IHRoZSBy ZWFsIGRpc2FzdGVyIGlzIGhvdyB3ZSBoYW5kbGUgZGVhZGxvY2tzLiBUd28gaXNzdWVzOgo+Pj4+ Pj4+Pgo+Pj4+Pj4+PiAtIElkZWFsbHkgd2UnZCBrZWVwIGFueSBsb2NrIHdlJ3ZlIHRha2VuIGxv Y2tlZCB1bnRpbCB0aGUKPj4+Pj4+Pj4gZW5kLCBpdCBoZWxwcwo+Pj4+Pj4+PiAgIMKgwqDCoCBu ZWVkbGVzcyBiYWNrb2Zmcy4gSSd2ZSBwbGF5ZWQgYXJvdW5kIGEgYml0IHdpdGggdGhhdAo+Pj4+ Pj4+PiBidXQgbm90IGV2ZW4gcG9jCj4+Pj4+Pj4+ICAgwqDCoMKgIGxldmVsLCBqdXN0IGFuIGlk ZWE6Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+IGh0dHBzOi8vY2dpdC5mcmVlZGVza3RvcC5vcmcvfmRhbnZl dC9kcm0vY29tbWl0Lz9pZD1iMTc5OWM1YTBmMDJkZjllMWJiMDhkMjdiZTM3MzMxMjU1YWI3NTgy Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+Cj4+Pj4+Pj4+ICAgwqDCoMKgIElkZWEgaXMgZXNzZW50aWFsbHkg dG8gdHJhY2sgYSBsaXN0IG9mIG9iamVjdHMgd2UgaGFkIHRvCj4+Pj4+Pj4+IGxvY2sgYXMgcGFy dCBvZgo+Pj4+Pj4+PiAgIMKgwqDCoCB0aGUgdHRtX2JvX3ZhbGlkYXRlIG9mIHRoZSBtYWluIG9i amVjdC4KPj4+Pj4+Pj4KPj4+Pj4+Pj4gLSBTZWNvbmQgb25lIGlzIGlmIHdlIGdldCBhIEVERUFE TENLIG9uIG9uZSBvZiB0aGVzZQo+Pj4+Pj4+PiBzdWJsb2NrcyAobGlrZSB0aGUKPj4+Pj4+Pj4g ICDCoMKgwqAgb25lIGhlcmUpLiBXZSBuZWVkIHRvIHBhc3MgdGhhdCB1cCB0aGUgZW50aXJlIGNh bGxjaGFpbiwKPj4+Pj4+Pj4gaW5jbHVkaW5nIGEKPj4+Pj4+Pj4gICDCoMKgwqAgdGVtcG9yYXJ5 IHJlZmVyZW5jZSAod2UgaGF2ZSB0byBkcm9wIGxvY2tzIHRvIGRvIHRoZQo+Pj4+Pj4+PiB3d19t dXRleF9sb2NrX3Nsb3cKPj4+Pj4+Pj4gICDCoMKgwqAgY2FsbCksIGFuZCBuZWVkIGEgY3VzdG9t IGNhbGxiYWNrIHRvIGRyb3AgdGhhdCB0ZW1wb3JhcnkgcmVmZXJlbmNlCj4+Pj4+Pj4+ICAgwqDC oMKgIChzaW5jZSB0aGF0J3MgYWxsIGRyaXZlciBzcGVjaWZpYywgbWlnaHQgZXZlbiBiZQo+Pj4+ Pj4+PiBpbnRlcm5hbCB3d19tdXRleCBhbmQKPj4+Pj4+Pj4gICDCoMKgwqAgbm90IGFueXRoaW5n IHJlbW90ZWx5IGxvb2tpbmcgbGlrZSBhIG5vcm1hbCBkbWFfYnVmKS4KPj4+Pj4+Pj4gVGhpcyBw cm9iYWJseQo+Pj4+Pj4+PiAgIMKgwqDCoCBuZWVkcyB0aGUgZXhlYyB1dGlsIGhlbHBlcnMgZnJv bSB0dG0sIGJ1dCBhdCB0aGUKPj4+Pj4+Pj4gZG1hX3Jlc3YgbGV2ZWwsIHNvIHRoYXQKPj4+Pj4+ Pj4gICDCoMKgwqAgd2UgY2FuIGRvIHNvbWV0aGluZyBsaWtlIHRoaXM6Cj4+Pj4+Pj4+Cj4+Pj4+ Pj4+IHN0cnVjdCBkbWFfcmVzdl90aWNrZXQgewo+Pj4+Pj4+PiAgIMKgwqDCoMKgwqDCoCBzdHJ1 Y3Qgd3dfYWNxdWlyZV9jdHggYmFzZTsKPj4+Pj4+Pj4KPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqAg LyogY2FuIGJlIHNldCBieSBhbnlvbmUgKGluY2x1ZGluZyBvdGhlciBkcml2ZXJzKQo+Pj4+Pj4+ PiB0aGF0IGdvdCBob2xkIG9mCj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoMKgwqAgKiB0aGlzIHRpY2tl dCBhbmQgaGFkIHRvIGFjcXVpcmUgc29tZSBuZXcgbG9jay4gVGhpcwo+Pj4+Pj4+PiBsb2NrIG1p Z2h0Cj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoMKgwqAgKiBwcm90ZWN0IGFueXRoaW5nLCBpbmNsdWRp bmcgZHJpdmVyLWludGVybmFsIHN0dWZmLCBhbmQgaXNuJ3QKPj4+Pj4+Pj4gICDCoMKgwqDCoMKg wqDCoCAqIHJlcXVpcmVkIHRvIGJlIGEgZG1hX2J1ZiBvciBldmVuIGp1c3QgYSBkbWFfcmVzdi4g Ki8KPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqAgc3RydWN0IHd3X211dGV4ICpjb250ZW5kZWRfbG9j azsKPj4+Pj4+Pj4KPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqAgLyogY2FsbGJhY2sgd2hpY2ggdGhl IGRyaXZlciAod2hpY2ggbWlnaHQgYmUgYSBkbWEtYnVmIGV4cG9ydGVyCj4+Pj4+Pj4+ICAgwqDC oMKgwqDCoMKgwqAgKiBhbmQgbm90IG1hdGNoaW5nIHRoZSBkcml2ZXIgdGhhdCBzdGFydGVkIHRo aXMKPj4+Pj4+Pj4gbG9ja2luZyB0aWNrZXQpCj4+Pj4+Pj4+ICAgwqDCoMKgwqDCoMKgwqAgKiBz ZXRzIHRvZ2V0aGVyIHdpdGggQGNvbnRlbmRlZF9sb2NrLCBmb3IgdGhlIG1haW4KPj4+Pj4+Pj4g ZHJpdmVyIHRvIGRyb3AKPj4+Pj4+Pj4gICDCoMKgwqDCoMKgwqDCoCAqIHdoZW4gaXQgY2FsbHMg ZG1hX3Jlc3ZfdW5sb2NrIG9uIHRoZSBjb250ZW5kZWRfbG9jay4gKi8KPj4+Pj4+Pj4gICDCoMKg wqDCoMKgwqAgdm9pZCAoZHJvcF9yZWYqKShzdHJ1Y3Qgd3dfbXV0ZXggKmNvbnRlbmRlZF9sb2Nr KTsKPj4+Pj4+Pj4gfTsKPj4+Pj4+Pj4KPj4+Pj4+Pj4gVGhpcyBpcyBhbGwgc3VwcmVtZWx5IG5h c3R5IChhbHNvIHR0bV9ib192YWxpZGF0ZSB3b3VsZCBuZWVkIHRvIGJlCj4+Pj4+Pj4+IGltcHJv dmVkIHRvIGhhbmRsZSB0aGVzZSBzdWJsb2NrcyBhbmQgcmFuZG9tIG5ldyBvYmplY3RzCj4+Pj4+ Pj4+IHRoYXQgY291bGQgZm9yY2UKPj4+Pj4+Pj4gYSB3d19tdXRleF9sb2NrX3Nsb3cpLgo+Pj4+ Pj4+Pgo+Pj4+Pj4+IEp1c3QgYSBzaG9ydCBjb21tZW50IG9uIHRoaXM6Cj4+Pj4+Pj4KPj4+Pj4+ PiBOZWl0aGVyIHRoZSBjdXJyZW50bHkgdXNlZCB3YWl0LWRpZSBvciB0aGUgd291bmQtd2FpdCBh bGdvcml0aG0KPj4+Pj4+PiAqc3RyaWN0bHkqIHJlcXVpcmVzIGEgc2xvdyBsb2NrIG9uIHRoZSBj b250ZW5kZWQgbG9jay4gRm9yCj4+Pj4+Pj4gd2FpdC1kaWUgaXQncwo+Pj4+Pj4+IGp1c3QgdmVy eSBjb252ZW5pZW50IHNpbmNlIGl0IG1ha2VzIHVzIHNsZWVwIGluc3RlYWQgb2Ygc3Bpbm5pbmcg d2l0aAo+Pj4+Pj4+IC1FREVBRExLIG9uIHRoZSBjb250ZW5kZWQgbG9jay4gRm9yIHdvdW5kLXdh aXQgSUlSQyBvbmUgY291bGQganVzdAo+Pj4+Pj4+IGltbWVkaWF0ZWx5IHJlc3RhcnQgdGhlIHdo b2xlIGxvY2tpbmcgdHJhbnNhY3Rpb24gYWZ0ZXIgYW4KPj4+Pj4+PiAtRURFQURMSywgYW5kCj4+ Pj4+Pj4gdGhlIHRyYW5zYWN0aW9uIHdvdWxkIGF1dG9tYXRpY2FsbHkgZW5kIHVwIHdhaXRpbmcg b24gdGhlIGNvbnRlbmRlZAo+Pj4+Pj4+IGxvY2ssIHByb3ZpZGVkIHRoZSBtdXRleCBsb2NrIHN0 ZWFsaW5nIGlzIG5vdCBhbGxvd2VkLiBUaGVyZSBpcyBob3dldmVyCj4+Pj4+Pj4gYSBwb3NzaWJp bGl0eSB0aGF0IHRoZSB0cmFuc2FjdGlvbiB3aWxsIGJlIHdvdW5kZWQgYWdhaW4gb24gYW5vdGhl cgo+Pj4+Pj4+IGxvY2ssIHRha2VuIGJlZm9yZSB0aGUgY29udGVuZGVkIGxvY2ssIGJ1dCBJIHRo aW5rIHRoZXJlIGFyZSB3YXlzIHRvCj4+Pj4+Pj4gaW1wcm92ZSB0aGUgd291bmQtd2FpdCBhbGdv cml0aG0gdG8gcmVkdWNlIHRoYXQgcHJvYmFiaWxpdHkuCj4+Pj4+Pj4KPj4+Pj4+PiBTbyBpbiBz aG9ydCwgY2hvb3NpbmcgdGhlIHdvdW5kLXdhaXQgYWxnb3JpdGhtIGluc3RlYWQgb2Ygd2FpdC1k aWUgYW5kCj4+Pj4+Pj4gcGVyaGFwcyBtb2RpZnlpbmcgdGhlIHd3IG11dGV4IGNvZGUgc29tZXdo YXQgd291bGQgcHJvYmFibHkgaGVscAo+Pj4+Pj4+IHBhc3NpbmcKPj4+Pj4+PiBhbiAtRURFQURM SyB1cCB0aGUgY2FsbCBjaGFpbiB3aXRob3V0IHJlcXVpcmluZyBwYXNzaW5nIHRoZSBjb250ZW5k ZWQKPj4+Pj4+PiBsb2NrLCBhcyBsb25nIGFzIGVhY2ggbG9ja2VyIHJlbGVhc2VzIGl0cyBvd24g bG9ja3Mgd2hlbiByZWNlaXZpbmcgYW4KPj4+Pj4+PiAtRURFQURMSy4KPj4+Pj4+IEhtIHRoaXMg aXMga2luZGEgdGVtcHRpbmcsIHNpbmNlIHJvbGxpbmcgb3V0IHRoZSBmdWxsIGJhY2tvZmYgdHJp Y2tlcgo+Pj4+Pj4gYWNyb3NzIGRyaXZlciBib3VuZGFyaWVzIGlzIGdvaW5nIHRvIGJlIHJlYWwg cGFpbmZ1bC4KPj4+Pj4+Cj4+Pj4+PiBXaGF0IEknbSBraW5kYSB3b3JyaWVkIGFib3V0IGlzIHRo ZSBkZWJ1Zy92YWxpZGF0aW9uIGNoZWNrcyB3ZSdyZQo+Pj4+Pj4gbG9zaW5nIHdpdGggdGhpcy4g VGhlIHJlcXVpcmVkIGJhY2tvZmYgaGFzIHRoaXMgbmljZSBwcm9wZXJ0eSB0aGF0Cj4+Pj4+PiB3 d19tdXRleCBkZWJ1ZyBjb2RlIGNhbiBjaGVjayB0aGF0IHdlJ3ZlIGZ1bGx5IHVud291bmQgZXZl cnl0aGluZyB3aGVuCj4+Pj4+PiB3ZSBzaG91bGQsIHRoYXQgd2UndmUgYmxvY2tlZCBvbiB0aGUg cmlnaHQgbG9jaywgYW5kIHRoYXQgd2UncmUKPj4+Pj4+IHJlc3RhcnRpbmcgZXZlcnl0aGluZyB3 aXRob3V0IGtlZWxpbmcgb3Zlci4gV2l0aG91dCB0aGF0IEkgdGhpbmsgd2UKPj4+Pj4+IGNvdWxk IGVuZCB1cCB3aXRoIHNpdHVhdGlvbnMgd2hlcmUgYSBkcml2ZXIgaW4gdGhlIG1pZGRsZSBmZWVs cyBsaWtlCj4+Pj4+PiBoYW5kbGluZyB0aGUgRURFQURMQ0ssIHdoaWNoIG1pZ2h0IGdvIHdlbGwg bW9zdCBvZiB0aGUgdGltZXMgKHRoZQo+Pj4+Pj4gZGVhZGxvY2sgd2lsbCBwcm9iYWJseSBiZSBt b3N0bHkgd2l0aGluIGEgZ2l2ZW4gZHJpdmVyLCBub3QgYWNyb3NzKS4KPj4+Pj4+IFJpZ2h0IHVw IHRvIHRoZSBwb2ludCB3aGVyZSBzb21lb25lIGNyZWF0ZXMgYSBkZWFkbG9jayBhY3Jvc3MgZHJp dmVycywKPj4+Pj4+IGFuZCB0aGUgbGFjayBvZiBmdWxsIHJvbGxiYWNrIHdpbGwgYmUgZmVsdC4K Pj4+Pj4+Cj4+Pj4+PiBTbyBub3Qgc3VyZSB3aGV0aGVyIHdlIGNhbiBzdGlsbCBrZWVwIGFsbCB0 aGVzZSBkZWJ1Zy92YWxpZGF0aW9uCj4+Pj4+PiBjaGVja3MsIG9yIHdoZXRoZXIgdGhpcyBpcyBh IHN0ZXAgdG9vIGZhciB0b3dhcmRzIGNsZXZlciB0cmlja3MuCj4+Pj4+IEkgdGhpbmsgd2UgY291 bGQgZGVmaW5pdGVseSBmaW5kIGEgd2F5IHRvIGtlZXAgZGVidWdnaW5nIHRvIG1ha2Ugc3VyZQo+ Pj4+PiBldmVyeXRoaW5nIGlzIHVud291bmQgYmVmb3JlIGF0dGVtcHRpbmcgdG8gcmVzdGFydCB0 aGUgbG9ja2luZwo+Pj4+PiB0cmFuc2FjdGlvbi4gQnV0IHRoZSBkZWJ1ZyBjaGVjayB0aGF0IHdl J3JlIHJlc3RhcnRpbmcgb24gdGhlIGNvbnRlbmRlZAo+Pj4+PiBsb2NrIG9ubHkgcmVhbGx5IG1h a2VzIHNlbnNlIGZvciB3YWl0LWRpZSwgKGFuZCB3ZSBjb3VsZCBlYXNpbHkga2VlcCBpdAo+Pj4+ PiBmb3Igd2FpdC1kaWUpLiBUaGUgbG9jayByZXR1cm5pbmcgLUVERUFETEsgZm9yIHdvdW5kLXdh aXQgbWF5IGFjdHVhbGx5Cj4+Pj4+IG5vdCBiZSB0aGUgY29udGVuZGluZyBsb2NrIGJ1dCBhbiBh cmJpdHJhcnkgbG9jayB0aGF0IHRoZSB3b3VuZGVkCj4+Pj4+IHRyYW5zYWN0aW9uIGF0dGVtcHRz IHRvIHRha2UgYWZ0ZXIgaXQgaXMgd291bmRlZC4KPj4+Pj4KPj4+Pj4gU28gaW4gdGhlIGVuZCBJ TU8gdGhpcyBpcyBhIHRyYWRlb2ZmIGJldHdlZW4gYWRkZWQgKHBvc3NpYmx5IHNldmVyZSkKPj4+ Pj4gbG9ja2luZyBjb21wbGV4aXR5IGludG8gZG1hLWJ1ZiBhbmQgbm90IGJlaW5nIGFibGUgdG8g c3dpdGNoIGJhY2sgdG8KPj4+Pj4gd2FpdC1kaWUgZWZmaWNpZW50bHkgaWYgd2UgbmVlZCAvIHdh bnQgdG8gZG8gdGhhdC4KPj4+Pj4KPj4+Pj4gL1Rob21hcwo+Pj4+IEFuZCBhcyBhIGNvbnNlcXVl bmNlIGFuIGludGVyZmFjZSAqY291bGQqIGJlOgo+Pj4+Cj4+Pj4gKikgV2UgaW50cm9kdWNlIGZ1 bmN0aW9ucwo+Pj4+Cj4+Pj4gdm9pZCB3d19hY3F1aXJlX3JlbGF4KHN0cnVjdCB3d19hY3F1aXJl X2N0eCAqY3R4KTsKPj4+PiBpbnQgd3dfYWNxdWlyZV9yZWxheF9pbnRlcnJ1cHRpYmxlKHN0cnVj dCB3d19hY3F1aXJlX2N0eCAqY3R4KTsKPj4+Pgo+Pj4+IHRoYXQgY2FuIGJlIHVzZWQgaW5zdGVh ZCBvZiB3d19tdXRleF9sb2NrX3Nsb3coKSBpbiB0aGUgYWJzZW5jZSBvZiBhCj4+Pj4gY29udGVu ZGluZyBsb2NrIHRvIGF2b2lkIHNwaW5uaW5nIG9uIC1FREVBRExLLiBXaGlsZSB0cnlpbmcgdG8g dGFrZSB0aGUKPj4+PiBjb250ZW5kaW5nIGxvY2sgaXMgcHJvYmFibHkgdGhlIGJlc3QgY2hvaWNl IHRoZXJlIGFyZSB2YXJpb3VzIHNlY29uZCBiZXN0Cj4+Pj4gYXBwcm9hY2hlcyB0aGF0IGNhbiBi ZSBleHBsb3JlZCwgZm9yIGV4YW1wbGUgd2FpdGluZyBvbiB0aGUgY29udGVuZGluZwo+Pj4+IGFj cXVpcmUgdG8gZmluaXNoIG9yIGluIHRoZSB3b3VuZC13YWl0IGNhc2UsIHBlcmhhcHMgZG8gbm90 aGluZy4gVGhlc2UKPj4+PiBmdW5jdGlvbnMgd2lsbCBhbHNvIGhlbHAgdXMga2VlcCB0aGUgZGVi dWdnaW5nLgo+Pj4gSG0gLi4uIEkgZ3Vlc3MgdGhpcyBjb3VsZCB3b3JrLiBUcm91YmxlIGlzLCBp dCBvbmx5IGdldHMgcmlkIG9mIHRoZQo+Pj4gc2xvd3BhdGggbG9ja2luZyBib29rLWtlZXBpbmcg aGVhZGFjaGVzLCB3ZSBzdGlsbCBoYXZlIHF1aXRlIGEgZmV3IG90aGVycy4KPj4+Cj4+Pj4gKikg QSBmdW5jdGlvbiByZXR1cm5pbmcgLUVERUFETEsgdG8gYSBjYWxsZXIgKm11c3QqIGhhdmUgYWxy ZWFkeSByZWxlYXNlZAo+Pj4+IGl0cyBvd24gbG9ja3MuCj4+PiBTbyB0aGlzIHRpZXMgdG8gYW5v dGhlciBxdWVzdGlvbiwgYXMgaW4gc2hvdWxkIHRoZXNlIGNhbGxiYWNrcyBoYXZlIHRvCj4+PiBk cm9wcyB0aGUgbG9ja3MgdGhlaSBhY3F1aXJlIChtdWNoIHNpbXBsZXIgY29kZSkgb3Igbm90IChs ZXNzIHRocmFzaGluZywKPj4+IGlmIHdlIGRyb3AgbG9ja3Mgd2UgbWlnaHQgZW5kIHVwIGluIGEg c2l0dWF0aW9uIHdoZXJlIHRocmVhZHMgdGhyYXNoCj4+PiBhcm91bmQgaW5zdGVhZCBvZiByZWFs aXppbmcgcXVpY2tlciB0aGF0IHRoZXkncmUgYWN0dWFsbHkgZGVhZGxvY2tpbmcgYW5kCj4+PiBv bmUgb2YgdGhlbSBzaG91bGQgc3RvcCBhbmQgYmFjayBvZmYpLgo+PiBIbW0uLiBDb3VsZCB5b3Ug ZGVzY3JpYmUgc3VjaCBhIHRocmFzaGluZyBjYXNlIHdpdGggYW4gZXhhbXBsZT8KPiBJZ25vcmlu ZyBjcm9zcyBkZXZpY2UgZnVuIGFuZCBhbGwgdGhhdCwganVzdCBhIHNpbXBsaWZpZWQgZXhhbXBs ZSBvZiB3aHkKPiBob2xkaW5nIG9udG8gbG9ja3MgeW91J3ZlIGFjcXVpcmVkIGZvciBldmljdGlv biBpcyB1c2VmdWwsIGF0IGxlYXN0IGluIGEKPiBzbG93IHBhdGguCj4KPiAtIG9uZSB0aHJlYWQg dHJ5aW5nIHRvIGRvIGFuIGV4ZWNidWYgd2l0aCBhIGh1Z2UgYm8KPgo+IHZzLgo+Cj4gLSBhbiBl bnRpcmUgcGlsZSBvZiB0aHJlYWQgdGhhdCB0cnkgdG8gZG8gZXhlY2J1ZiB3aXRoIGp1c3QgYSBm ZXcgc21hbGwgYm8KPgo+IEZpcnN0IHRocmVhZCBpcyBpbiB0aGUgZXZpY3Rpb24gbG9vcCwgc2Vs ZWN0cyBhIGJvLCB3aW5zIGFnYWluc3QgYWxsIHRoZQo+IG90aGVyIHRocmVhZCBzaW5jZSBpdCdz IGJlZW4gZG9pbmcgdGhpcyBmb3JldmVyIGFscmVhZHksIGdldHMgdGhlIGJvIG1vdmVkCj4gb3V0 LCB1bmxvY2tzLgo+Cj4gU2luY2UgaXQncyBjb21wZXRpbmcgYWdhaW5zdCBsb3RzIG9mIG90aGVy IHRocmVhZHMgd2l0aCBzbWFsbCBibywgaXQnbGwKPiBoYXZlIHRvIGRvIHRoYXQgYSBsb3Qgb2Yg dGltZXMuIE9mdGVuIGVub3VnaCB0byBjcmVhdGUgYSBjb250aWd1b3VzIGhvbGUuCj4gSWYgeW91 IGhhdmUgYSBzbWFydGVyIGFsbG9jYXRvciB0aGF0IHRyaWVzIHRvIGNyZWF0ZSB0aGF0IGhvbGUg bW9yZQo+IGFjdGl2ZWx5LCBqdXN0IGFzc3VtZSB0aGF0IHRoZSBzaW5nbGUgaHVnZSBibyBpcyBh IHN1YnN0YW50aWFsIHBhcnQgb2YKPiB0b3RhbCB2cmFtLgo+Cj4gVGhlIG90aGVyIHRocmVhZHMg d2lsbCBiZSBxdWlja2VyIGluIGNyYW1taW5nIG5ldyBzdHVmZiBpbiwgZXZlbiBpZiB0aGV5Cj4g b2NjYXNpb25hbGx5IGxvc2UgdGhlIHd3IGRhbmNlIGFnYWluc3QgdGhlIHNpbmdsZSB0aHJlYWQu IFNvIHRoZSBiaWcKPiB0aHJlYWQgbGl2ZWxvY2tzLgo+Cj4gSWYgb3RvaCB0aGUgYmlnIHRocmVh ZCB3b3VsZCBrZWVwIG9udG8gYWxsIHRoZSBsb2NrcywgZXZlbnR1YWxseSBpdCBoYXZlCj4gdGhl IGVudGlyZSB2cmFtIGxvY2tlZCwgYW5kIGV2ZXJ5IG90aGVyIHRocmVhZCBpcyBndWFyYW50ZWVk IHRvIGxvc2UKPiBhZ2FpbnN0IGl0IGluIHRoZSB3dyBkYW5jZSBhbmQgcXVldWUgdXAgYmVoaW5k LiBBbmQgaXQgY291bGQgZmluYWxseSBidXQKPiBpdHMgaHVnZSBibyBpbnRvIHZyYW0gYW5kIGV4 ZWN1dGUuCgpIbW0sIHllcyB0aGlzIGluZGVlZCBleHBsYWlucyB3aHkgaXQncyBiZW5lZmljaWFs IGluIHNvbWUgY2FzZXMgdG8ga2VlcCAKYSBudW1iZXIgb2bCoCBsb2NrcyBoZWxkIGFjcm9zcyBj ZXJ0YWluIG9wZXJhdGlvbnMsIGJ1dCBJIHN0aWxsIGZhaWwgdG8gCnNlZSB3aHkgd2Ugd291bGQg bGlrZSAqYWxsKiBsb2NrcyBoZWxkIGFjcm9zcyB0aGUgZW50aXJlIHRyYW5zYWN0aW9uPyBJbiAK dGhlIGFib3ZlIGNhc2UgSSdkIGVudmlzaW9uIHVzIGVuZGluZyB1cCB3aXRoIHNvbWV0aGluZyBs aWtlOgoKaW50IHZhbGlkYXRlKGN0eCwgYm8pCnsKCiDCoMKgwqAgZm9yX2VhY2hfc3VpdGFibGVf Ym9fdG9fZXZpY3QoZWJvKSB7CiDCoMKgwqAgwqDCoMKgIHIgPSBsb2NrKGN0eCwgZWJvKTsKIMKg wqDCoCDCoMKgwqAgaWYgKHIgPT0gRURFQURMSykKIMKgwqDCoCDCoMKgwqAgwqDCoMKgIGdvdG8g b3V0X3VubG9jazsKCiDCoMKgwqAgwqDCoMKgIHIgPSBtb3ZlX25vdGlmeShjdHgsIGVibyk7Ly8g bG9ja3MgYW5kIHVubG9ja3MgR1BVIFZNIGJvLgogwqDCoMKgIMKgwqDCoCBpZiAociA9PSBFREVB RExLKQogwqDCoMKgIMKgwqDCoCDCoMKgwqAgZ290byBvdXRfdW5sb2NrOwogwqDCoMKgIMKgwqDC oCBldmljdCgpOwogwqDCoMKgIH0KCiDCoMKgwqAgcGxhY2VfYm8oYm8pOwogwqDCoMKgIC8vUmVw ZWF0IHVudGlsIHN1Y2Nlc3MuCgoKb3V0X3VubG9jazoKIMKgwqDCoCBmb3JfZWFjaF9sb2NrZWRf Ym8oZWJvKQogwqDCoMKgIMKgwqDCoCB1bmxvY2soY3R4LCBlYm8pOwp9CgoKdm9pZCBjb21tYW5k X3N1Ym1pc3Npb24oKQp7CiDCoMKgwqAgYWNxdWlyZV9pbml0KGN0eCk7CgpyZXN0YXJ0OgogwqDC oMKgIGZvcl9lYWNoX2JvX2luX2NzKGJvKSB7CiDCoMKgwqAgwqDCoMKgIHIgPSBsb2NrKGN0eCwg Ym8pOwogwqDCoMKgIMKgwqDCoCBpZiAociA9PSAtRURFQURMSykKIMKgwqDCoCDCoMKgwqAgwqDC oMKgIGdvdG8gb3V0X3VucmVzZXJ2ZTsKIMKgwqDCoCB9CgogwqDCoMKgIGZvcl9lYWNoX2JvX2lu X2NzKGJvKSB7CiDCoMKgwqAgwqDCoMKgIHIgPSB2YWxpZGF0ZShjdHgsIGJvKTsKIMKgwqDCoCDC oMKgwqAgaWYgKHIgPT0gLUVERUFETEspCiDCoMKgwqAgwqDCoMKgIMKgwqDCoCBnb3RvIG91dF91 bnJlc2VydmU7CiDCoMKgwqAgfTsKCiDCoMKgwqAgY3MoKTsKCiDCoMKgwqAgZm9yX2VhY2hfYm9f aW5fY3MoYm8pCiDCoMKgwqAgwqDCoMKgIHVubG9jayhjdHgsIGJvKTsKCiDCoMKgwqAgYWNxdWly ZV9maW5pKGN0eCk7CiDCoMKgwqAgcmV0dXJuIDA7CgpvdXRfdW5yZXNlcnZlOgogwqDCoMKgIGZv cl9lYWNoX2xvY2tlZF9ibygpCiDCoMKgwqAgwqDCoMKgIHVubG9jayhjdHgsIGJvKTsKCiDCoMKg wqAgYWNxdWlyZV9yZWxheCgpOwogwqDCoMKgIGdvdG8gcmVzdGFydDsKfQoKCj4KPiBWYXJ5IGV4 YW1wbGUgZm9yIG11bHRpLWdwdSBhbmQgbW9yZSByZWFsaXNtLCBidXQgdGhhdCdzIHJvdWdobHkg aXQuCj4KPiBBc2lkZSwgYSBsb3Qgb2YgdGhlIHN0dWZmIENocmlzdGlhbiBoYXMgYmVlbiBkb2lu ZyBpbiB0dG0gaXMgdG8gaW1wcm92ZQo+IHRoZSBjaGFuY2VzIHRoYXQgdGhlIGNvbXBldGluZyB0 aHJlYWRzIHdpbGwgaGl0IG9uZSBvZiB0aGUgbG9ja2VkIG9iamVjdHMKPiBvZiB0aGUgYmlnIHRo cmVhZCwgYW5kIGF0IGxlYXN0IGJhY2sgb2ZmIGEgYml0LiBUaGF0J3MgYXQgbGVhc3QgbXkKPiB1 bmRlcnN0YW5kaW5nIG9mIHdoYXQncyBiZWVuIGhhcHBlbmluZy4KPiAtRGFuaWVsCgpPSyB1bnNl cnN0b29kLiBGb3Igdm13Z2Z4IHRoZSBjcnVkZSBzaW1wbGlzdGljIGlkZWEgdG8gYXZvaWQgdGhh dCAKc2l0dWF0aW9uIGhhcyBiZWVuIHRvIGhhdmUgYW4gcndzZW0gYXJvdW5kIGNvbW1hbmQgc3Vi bWlzc2lvbjogV2hlbiB0aGUgCnRocmVhZCB3aXRoIHRoZSBiaWcgYm8gaGFzIHJ1biBhIGZ1bGwg TFJVIHdvcnRoIG9mIGV2aWN0aW9uIHdpdGhvdXQgCnN1Y2NlZWRpbmcgaXQgd291bGQgZ2V0IGFu bm95ZWQgYW5kIHRha2UgdGhlIHJ3c2VtIGluIHdyaXRlIG1vZGUsIApibG9ja2luZyBjb21wZXRp bmcgdGhyZWFkcy4gQnV0IHRoYXQgd291bGQgb2YgY291cnNlIG5ldmVyIHdvcmsgaW4gYSAKZG1h LWJ1ZiBzZXR0aW5nLCBhbmQgSUlSQyB0aGUgaW1wbGVtZW50YXRpb24gaXMgbm90IGNvbXBsZXRl IGVpdGhlci4uLi4KCi9UaG9tYXMKCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fXwpJbnRlbC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVl ZGVza3RvcC5vcmcKaHR0cHM6Ly9saXN0cy5mcmVlZGVza3RvcC5vcmcvbWFpbG1hbi9saXN0aW5m by9pbnRlbC1nZngK 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=-13.1 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, MENTIONS_GIT_HOSTING,SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,USER_AGENT_SANE_1 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 546F1C11D00 for ; Thu, 20 Feb 2020 22:51:19 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 00D19208CD for ; Thu, 20 Feb 2020 22:51:19 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (1024-bit key) header.d=shipmail.org header.i=@shipmail.org header.b="Q3mOx/61" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1729229AbgBTWvS (ORCPT ); Thu, 20 Feb 2020 17:51:18 -0500 Received: from pio-pvt-msa2.bahnhof.se ([79.136.2.41]:57368 "EHLO pio-pvt-msa2.bahnhof.se" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1729006AbgBTWvS (ORCPT ); Thu, 20 Feb 2020 17:51:18 -0500 Received: from localhost (localhost [127.0.0.1]) by pio-pvt-msa2.bahnhof.se (Postfix) with ESMTP id AF7FB3F53F; Thu, 20 Feb 2020 23:51:14 +0100 (CET) Authentication-Results: pio-pvt-msa2.bahnhof.se; dkim=pass (1024-bit key; unprotected) header.d=shipmail.org header.i=@shipmail.org header.b=Q3mOx/61; dkim-atps=neutral X-Virus-Scanned: Debian amavisd-new at bahnhof.se Received: from pio-pvt-msa2.bahnhof.se ([127.0.0.1]) by localhost (pio-pvt-msa2.bahnhof.se [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 0ABT3CG2jHcS; Thu, 20 Feb 2020 23:51:10 +0100 (CET) Received: from mail1.shipmail.org (h-205-35.A357.priv.bahnhof.se [155.4.205.35]) (Authenticated sender: mb878879) by pio-pvt-msa2.bahnhof.se (Postfix) with ESMTPA id BAEEB3F52B; Thu, 20 Feb 2020 23:51:08 +0100 (CET) Received: from localhost.localdomain (h-205-35.A357.priv.bahnhof.se [155.4.205.35]) by mail1.shipmail.org (Postfix) with ESMTPSA id C611C36016F; Thu, 20 Feb 2020 23:51:07 +0100 (CET) DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple; d=shipmail.org; s=mail; t=1582239067; bh=pLR+sI44kJIdfLFqdg9hcOGfLoMfzbAnrGHOm8gHEMk=; h=Subject:To:Cc:References:From:Date:In-Reply-To:From; b=Q3mOx/61hBR+Eb4i2HpqXJ2ZlYrWzKX3nLu2/0U91TRG3+u/sfmffXGUVGuL4PzuY ae7aQA7Wn/1M98H8CtRx7b/KgsoFDAa5ZojZAd+3WTnkD6sXYKz9FyUWWDeggyJFLW GceQ1AJjjYAXEvhPhQmD37H3Weai+ya7NY9NVRcA= Subject: Re: [PATCH 5/5] drm/amdgpu: implement amdgpu_gem_prime_move_notify v2 To: Daniel Vetter Cc: =?UTF-8?Q?Christian_K=c3=b6nig?= , intel-gfx , dri-devel , "moderated list:DMA BUFFER SHARING FRAMEWORK" , "open list:DMA BUFFER SHARING FRAMEWORK" References: <20200217154509.2265-1-christian.koenig@amd.com> <20200217154509.2265-6-christian.koenig@amd.com> <20200217175518.GL2363188@phenom.ffwll.local> <79a0d79f-91bd-2481-740c-20e6c819c7c9@shipmail.org> <20200220180459.GS2363188@phenom.ffwll.local> <20200220200831.GA2363188@phenom.ffwll.local> From: =?UTF-8?Q?Thomas_Hellstr=c3=b6m_=28VMware=29?= Organization: VMware Inc. Message-ID: <501bf409-e4fe-a318-17b4-d5d050b09529@shipmail.org> Date: Thu, 20 Feb 2020 23:51:07 +0100 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:68.0) Gecko/20100101 Thunderbird/68.2.2 MIME-Version: 1.0 In-Reply-To: <20200220200831.GA2363188@phenom.ffwll.local> Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit Content-Language: en-US Sender: linux-media-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-media@vger.kernel.org On 2/20/20 9:08 PM, Daniel Vetter wrote: > On Thu, Feb 20, 2020 at 08:46:27PM +0100, Thomas Hellström (VMware) wrote: >> On 2/20/20 7:04 PM, Daniel Vetter wrote: >>> On Thu, Feb 20, 2020 at 10:39:06AM +0100, Thomas Hellström (VMware) wrote: >>>> On 2/19/20 7:42 AM, Thomas Hellström (VMware) wrote: >>>>> On 2/18/20 10:01 PM, Daniel Vetter wrote: >>>>>> On Tue, Feb 18, 2020 at 9:17 PM Thomas Hellström (VMware) >>>>>> wrote: >>>>>>> On 2/17/20 6:55 PM, Daniel Vetter wrote: >>>>>>>> On Mon, Feb 17, 2020 at 04:45:09PM +0100, Christian König wrote: >>>>>>>>> Implement the importer side of unpinned DMA-buf handling. >>>>>>>>> >>>>>>>>> v2: update page tables immediately >>>>>>>>> >>>>>>>>> Signed-off-by: Christian König >>>>>>>>> --- >>>>>>>>>    drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c | 66 >>>>>>>>> ++++++++++++++++++++- >>>>>>>>>    drivers/gpu/drm/amd/amdgpu/amdgpu_object.c  |  6 ++ >>>>>>>>>    2 files changed, 71 insertions(+), 1 deletion(-) >>>>>>>>> >>>>>>>>> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c >>>>>>>>> b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c >>>>>>>>> index 770baba621b3..48de7624d49c 100644 >>>>>>>>> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c >>>>>>>>> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_dma_buf.c >>>>>>>>> @@ -453,7 +453,71 @@ amdgpu_dma_buf_create_obj(struct >>>>>>>>> drm_device *dev, struct dma_buf *dma_buf) >>>>>>>>>       return ERR_PTR(ret); >>>>>>>>>    } >>>>>>>>> >>>>>>>>> +/** >>>>>>>>> + * amdgpu_dma_buf_move_notify - &attach.move_notify implementation >>>>>>>>> + * >>>>>>>>> + * @attach: the DMA-buf attachment >>>>>>>>> + * >>>>>>>>> + * Invalidate the DMA-buf attachment, making sure that >>>>>>>>> the we re-create the >>>>>>>>> + * mapping before the next use. >>>>>>>>> + */ >>>>>>>>> +static void >>>>>>>>> +amdgpu_dma_buf_move_notify(struct dma_buf_attachment *attach) >>>>>>>>> +{ >>>>>>>>> +    struct drm_gem_object *obj = attach->importer_priv; >>>>>>>>> +    struct ww_acquire_ctx *ticket = dma_resv_locking_ctx(obj->resv); >>>>>>>>> +    struct amdgpu_bo *bo = gem_to_amdgpu_bo(obj); >>>>>>>>> +    struct amdgpu_device *adev = amdgpu_ttm_adev(bo->tbo.bdev); >>>>>>>>> +    struct ttm_operation_ctx ctx = { false, false }; >>>>>>>>> +    struct ttm_placement placement = {}; >>>>>>>>> +    struct amdgpu_vm_bo_base *bo_base; >>>>>>>>> +    int r; >>>>>>>>> + >>>>>>>>> +    if (bo->tbo.mem.mem_type == TTM_PL_SYSTEM) >>>>>>>>> +            return; >>>>>>>>> + >>>>>>>>> +    r = ttm_bo_validate(&bo->tbo, &placement, &ctx); >>>>>>>>> +    if (r) { >>>>>>>>> +            DRM_ERROR("Failed to invalidate DMA-buf >>>>>>>>> import (%d))\n", r); >>>>>>>>> +            return; >>>>>>>>> +    } >>>>>>>>> + >>>>>>>>> +    for (bo_base = bo->vm_bo; bo_base; bo_base = bo_base->next) { >>>>>>>>> +            struct amdgpu_vm *vm = bo_base->vm; >>>>>>>>> +            struct dma_resv *resv = vm->root.base.bo->tbo.base.resv; >>>>>>>>> + >>>>>>>>> +            if (ticket) { >>>>>>>> Yeah so this is kinda why I've been a total pain about the >>>>>>>> exact semantics >>>>>>>> of the move_notify hook. I think we should flat-out require >>>>>>>> that importers >>>>>>>> _always_ have a ticket attach when they call this, and that >>>>>>>> they can cope >>>>>>>> with additional locks being taken (i.e. full EDEADLCK) handling. >>>>>>>> >>>>>>>> Simplest way to force that contract is to add a dummy 2nd >>>>>>>> ww_mutex lock to >>>>>>>> the dma_resv object, which we then can take #ifdef >>>>>>>> CONFIG_WW_MUTEX_SLOWPATH_DEBUG. Plus mabye a WARN_ON(!ticket). >>>>>>>> >>>>>>>> Now the real disaster is how we handle deadlocks. Two issues: >>>>>>>> >>>>>>>> - Ideally we'd keep any lock we've taken locked until the >>>>>>>> end, it helps >>>>>>>>     needless backoffs. I've played around a bit with that >>>>>>>> but not even poc >>>>>>>>     level, just an idea: >>>>>>>> >>>>>>>> https://cgit.freedesktop.org/~danvet/drm/commit/?id=b1799c5a0f02df9e1bb08d27be37331255ab7582 >>>>>>>> >>>>>>>> >>>>>>>>     Idea is essentially to track a list of objects we had to >>>>>>>> lock as part of >>>>>>>>     the ttm_bo_validate of the main object. >>>>>>>> >>>>>>>> - Second one is if we get a EDEADLCK on one of these >>>>>>>> sublocks (like the >>>>>>>>     one here). We need to pass that up the entire callchain, >>>>>>>> including a >>>>>>>>     temporary reference (we have to drop locks to do the >>>>>>>> ww_mutex_lock_slow >>>>>>>>     call), and need a custom callback to drop that temporary reference >>>>>>>>     (since that's all driver specific, might even be >>>>>>>> internal ww_mutex and >>>>>>>>     not anything remotely looking like a normal dma_buf). >>>>>>>> This probably >>>>>>>>     needs the exec util helpers from ttm, but at the >>>>>>>> dma_resv level, so that >>>>>>>>     we can do something like this: >>>>>>>> >>>>>>>> struct dma_resv_ticket { >>>>>>>>        struct ww_acquire_ctx base; >>>>>>>> >>>>>>>>        /* can be set by anyone (including other drivers) >>>>>>>> that got hold of >>>>>>>>         * this ticket and had to acquire some new lock. This >>>>>>>> lock might >>>>>>>>         * protect anything, including driver-internal stuff, and isn't >>>>>>>>         * required to be a dma_buf or even just a dma_resv. */ >>>>>>>>        struct ww_mutex *contended_lock; >>>>>>>> >>>>>>>>        /* callback which the driver (which might be a dma-buf exporter >>>>>>>>         * and not matching the driver that started this >>>>>>>> locking ticket) >>>>>>>>         * sets together with @contended_lock, for the main >>>>>>>> driver to drop >>>>>>>>         * when it calls dma_resv_unlock on the contended_lock. */ >>>>>>>>        void (drop_ref*)(struct ww_mutex *contended_lock); >>>>>>>> }; >>>>>>>> >>>>>>>> This is all supremely nasty (also ttm_bo_validate would need to be >>>>>>>> improved to handle these sublocks and random new objects >>>>>>>> that could force >>>>>>>> a ww_mutex_lock_slow). >>>>>>>> >>>>>>> Just a short comment on this: >>>>>>> >>>>>>> Neither the currently used wait-die or the wound-wait algorithm >>>>>>> *strictly* requires a slow lock on the contended lock. For >>>>>>> wait-die it's >>>>>>> just very convenient since it makes us sleep instead of spinning with >>>>>>> -EDEADLK on the contended lock. For wound-wait IIRC one could just >>>>>>> immediately restart the whole locking transaction after an >>>>>>> -EDEADLK, and >>>>>>> the transaction would automatically end up waiting on the contended >>>>>>> lock, provided the mutex lock stealing is not allowed. There is however >>>>>>> a possibility that the transaction will be wounded again on another >>>>>>> lock, taken before the contended lock, but I think there are ways to >>>>>>> improve the wound-wait algorithm to reduce that probability. >>>>>>> >>>>>>> So in short, choosing the wound-wait algorithm instead of wait-die and >>>>>>> perhaps modifying the ww mutex code somewhat would probably help >>>>>>> passing >>>>>>> an -EDEADLK up the call chain without requiring passing the contended >>>>>>> lock, as long as each locker releases its own locks when receiving an >>>>>>> -EDEADLK. >>>>>> Hm this is kinda tempting, since rolling out the full backoff tricker >>>>>> across driver boundaries is going to be real painful. >>>>>> >>>>>> What I'm kinda worried about is the debug/validation checks we're >>>>>> losing with this. The required backoff has this nice property that >>>>>> ww_mutex debug code can check that we've fully unwound everything when >>>>>> we should, that we've blocked on the right lock, and that we're >>>>>> restarting everything without keeling over. Without that I think we >>>>>> could end up with situations where a driver in the middle feels like >>>>>> handling the EDEADLCK, which might go well most of the times (the >>>>>> deadlock will probably be mostly within a given driver, not across). >>>>>> Right up to the point where someone creates a deadlock across drivers, >>>>>> and the lack of full rollback will be felt. >>>>>> >>>>>> So not sure whether we can still keep all these debug/validation >>>>>> checks, or whether this is a step too far towards clever tricks. >>>>> I think we could definitely find a way to keep debugging to make sure >>>>> everything is unwound before attempting to restart the locking >>>>> transaction. But the debug check that we're restarting on the contended >>>>> lock only really makes sense for wait-die, (and we could easily keep it >>>>> for wait-die). The lock returning -EDEADLK for wound-wait may actually >>>>> not be the contending lock but an arbitrary lock that the wounded >>>>> transaction attempts to take after it is wounded. >>>>> >>>>> So in the end IMO this is a tradeoff between added (possibly severe) >>>>> locking complexity into dma-buf and not being able to switch back to >>>>> wait-die efficiently if we need / want to do that. >>>>> >>>>> /Thomas >>>> And as a consequence an interface *could* be: >>>> >>>> *) We introduce functions >>>> >>>> void ww_acquire_relax(struct ww_acquire_ctx *ctx); >>>> int ww_acquire_relax_interruptible(struct ww_acquire_ctx *ctx); >>>> >>>> that can be used instead of ww_mutex_lock_slow() in the absence of a >>>> contending lock to avoid spinning on -EDEADLK. While trying to take the >>>> contending lock is probably the best choice there are various second best >>>> approaches that can be explored, for example waiting on the contending >>>> acquire to finish or in the wound-wait case, perhaps do nothing. These >>>> functions will also help us keep the debugging. >>> Hm ... I guess this could work. Trouble is, it only gets rid of the >>> slowpath locking book-keeping headaches, we still have quite a few others. >>> >>>> *) A function returning -EDEADLK to a caller *must* have already released >>>> its own locks. >>> So this ties to another question, as in should these callbacks have to >>> drops the locks thei acquire (much simpler code) or not (less thrashing, >>> if we drop locks we might end up in a situation where threads thrash >>> around instead of realizing quicker that they're actually deadlocking and >>> one of them should stop and back off). >> Hmm.. Could you describe such a thrashing case with an example? > Ignoring cross device fun and all that, just a simplified example of why > holding onto locks you've acquired for eviction is useful, at least in a > slow path. > > - one thread trying to do an execbuf with a huge bo > > vs. > > - an entire pile of thread that try to do execbuf with just a few small bo > > First thread is in the eviction loop, selects a bo, wins against all the > other thread since it's been doing this forever already, gets the bo moved > out, unlocks. > > Since it's competing against lots of other threads with small bo, it'll > have to do that a lot of times. Often enough to create a contiguous hole. > If you have a smarter allocator that tries to create that hole more > actively, just assume that the single huge bo is a substantial part of > total vram. > > The other threads will be quicker in cramming new stuff in, even if they > occasionally lose the ww dance against the single thread. So the big > thread livelocks. > > If otoh the big thread would keep onto all the locks, eventually it have > the entire vram locked, and every other thread is guaranteed to lose > against it in the ww dance and queue up behind. And it could finally but > its huge bo into vram and execute. Hmm, yes this indeed explains why it's beneficial in some cases to keep a number of  locks held across certain operations, but I still fail to see why we would like *all* locks held across the entire transaction? In the above case I'd envision us ending up with something like: int validate(ctx, bo) {     for_each_suitable_bo_to_evict(ebo) {         r = lock(ctx, ebo);         if (r == EDEADLK)             goto out_unlock;         r = move_notify(ctx, ebo);// locks and unlocks GPU VM bo.         if (r == EDEADLK)             goto out_unlock;         evict();     }     place_bo(bo);     //Repeat until success. out_unlock:     for_each_locked_bo(ebo)         unlock(ctx, ebo); } void command_submission() {     acquire_init(ctx); restart:     for_each_bo_in_cs(bo) {         r = lock(ctx, bo);         if (r == -EDEADLK)             goto out_unreserve;     }     for_each_bo_in_cs(bo) {         r = validate(ctx, bo);         if (r == -EDEADLK)             goto out_unreserve;     };     cs();     for_each_bo_in_cs(bo)         unlock(ctx, bo);     acquire_fini(ctx);     return 0; out_unreserve:     for_each_locked_bo()         unlock(ctx, bo);     acquire_relax();     goto restart; } > > Vary example for multi-gpu and more realism, but that's roughly it. > > Aside, a lot of the stuff Christian has been doing in ttm is to improve > the chances that the competing threads will hit one of the locked objects > of the big thread, and at least back off a bit. That's at least my > understanding of what's been happening. > -Daniel OK unserstood. For vmwgfx the crude simplistic idea to avoid that situation has been to have an rwsem around command submission: When the thread with the big bo has run a full LRU worth of eviction without succeeding it would get annoyed and take the rwsem in write mode, blocking competing threads. But that would of course never work in a dma-buf setting, and IIRC the implementation is not complete either.... /Thomas