From mboxrd@z Thu Jan 1 00:00:00 1970 From: Ville =?iso-8859-1?Q?Syrj=E4l=E4?= Subject: Re: [PATCH v2 1/6] drm/i915: Eliminate vmap overhead for cmd parser Date: Fri, 20 Nov 2015 16:41:53 +0200 Message-ID: <20151120144153.GL4437@intel.com> References: <1448016961-25331-1-git-send-email-chris@chris-wilson.co.uk> <1448016961-25331-2-git-send-email-chris@chris-wilson.co.uk> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mga03.intel.com (mga03.intel.com [134.134.136.65]) by gabe.freedesktop.org (Postfix) with ESMTP id 531366E6B8 for ; Fri, 20 Nov 2015 06:41:57 -0800 (PST) Content-Disposition: inline In-Reply-To: <1448016961-25331-2-git-send-email-chris@chris-wilson.co.uk> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: intel-gfx-bounces@lists.freedesktop.org Sender: "Intel-gfx" To: Chris Wilson Cc: intel-gfx@lists.freedesktop.org List-Id: intel-gfx@lists.freedesktop.org T24gRnJpLCBOb3YgMjAsIDIwMTUgYXQgMTA6NTU6NTZBTSArMDAwMCwgQ2hyaXMgV2lsc29uIHdy b3RlOgo+IFdpdGggYSBsaXR0bGUgY29tcGxleGl0eSB0byBoYW5kbGUgY21kcyBzdHJhZGRsaW5n IHBhZ2UgYm91bmRhcmllcywgd2UKPiBjYW4gY29tcGxldGVseSBhdm9pZGluZyBoYXZpbmcgdG8g dm1hcCB0aGUgYmF0Y2ggYW5kIHRoZSBzaGFkb3cgYmF0Y2gKPiBvYmplY3RzIHdoaWxzdCBydW5u aW5nIHRoZSBjb21tYW5kIHBhcnNlci4KPiAKPiBPbiBpdmIgaTctMzcyME1ROgo+IAo+IHgxMXBl cmYgLWRvdCBiZWZvcmUgNTQuM00sIGFmdGVyIDUzLjJNIChtYXggMjAzTSkKPiBnbHhnZWFycyBi ZWZvcmUgNzExMCBmcHMsIGFmdGVyIDczMDAgZnBzIChtYXggNzg2MCBmcHMpCj4gCj4gQmVmb3Jl Ogo+IFRpbWUgdG8gYmx0IDE2Mzg0IGJ5dGVzIHggICAgICAxOgkgMTIuNDAwwrVzLCAxLjJHaUIv cwo+IFRpbWUgdG8gYmx0IDE2Mzg0IGJ5dGVzIHggICA0MDk2OgkgIDMuMDU1wrVzLCA1LjBHaUIv cwo+IAo+IEFmdGVyOgo+IFRpbWUgdG8gYmx0IDE2Mzg0IGJ5dGVzIHggICAgICAxOgkgIDguNjAw wrVzLCAxLjhHaUIvcwo+IFRpbWUgdG8gYmx0IDE2Mzg0IGJ5dGVzIHggICA0MDk2OgkgIDIuNDU2 wrVzLCA2LjJHaUIvcwo+IAo+IFJlbW92aW5nIHRoZSB2bWFwIGlzIG1vc3RseSBhIHdpbiwgZXhj ZXB0IHdlIGxvc2UgaW4gYSBmZXcgY2FzZXMgd2hlcmUKPiB0aGUgYmF0Y2ggc2l6ZSBpcyBncmVh dGVyIHRoYW4gYSBwYWdlIGR1ZSB0byB0aGUgZXh0cmEgY29tcGxleGl0eSAobG9zcwo+IG9mIGEg c2ltcGxlIGNhY2hlIGVmZmljaWVudCBsYXJnZSBjb3B5LCBhbmQgYm91bmRhcnkgaGFuZGxpbmcp Lgo+IAo+IHYyOiBSZW9yZGVyIHNvIHRoYXQgd2UgZG8gY2hlY2sgb2Fjb250cm9sIHJlbWFpbmlu ZyBzZXQgYXQgZW5kLW9mLWJhdGNoCj4gdjM6IFN0YWdlIHRoZSBjb3B5IHRocm91Z2ggYSB0ZW1w b3JhcnkgcGFnZSBzbyB0aGF0IHdlIG9ubHkgY29weSBpbnRvCj4gZHN0IGNvbW1hbmRzIHRoYXQg aGF2ZSBiZWVuIHZlcmlmaWVkLgo+IAo+IFNpZ25lZC1vZmYtYnk6IENocmlzIFdpbHNvbiA8Y2hy aXNAY2hyaXMtd2lsc29uLmNvLnVrPgo+IENjOiBWaWxsZSBTeXJqw6Rsw6QgPHZpbGxlLnN5cmph bGFAbGludXguaW50ZWwuY29tPgo+IC0tLQo+ICBkcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2Nt ZF9wYXJzZXIuYyB8IDMwNSArKysrKysrKysrKysrKysrKy0tLS0tLS0tLS0tLS0tLS0KPiAgMSBm aWxlIGNoYW5nZWQsIDE1MyBpbnNlcnRpb25zKCspLCAxNTIgZGVsZXRpb25zKC0pCj4gCj4gZGlm ZiAtLWdpdCBhL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfY21kX3BhcnNlci5jIGIvZHJpdmVy cy9ncHUvZHJtL2k5MTUvaTkxNV9jbWRfcGFyc2VyLmMKPiBpbmRleCA4MTRkODk0ZWQ5MjUuLmRi M2EwNGVhMDM2YSAxMDA2NDQKPiAtLS0gYS9kcml2ZXJzL2dwdS9kcm0vaTkxNS9pOTE1X2NtZF9w YXJzZXIuYwo+ICsrKyBiL2RyaXZlcnMvZ3B1L2RybS9pOTE1L2k5MTVfY21kX3BhcnNlci5jCj4g QEAgLTg2MCwxMDAgKzg2MCw2IEBAIGZpbmRfcmVnKGNvbnN0IHN0cnVjdCBkcm1faTkxNV9yZWdf ZGVzY3JpcHRvciAqdGFibGUsCj4gIAlyZXR1cm4gTlVMTDsKPiAgfQo+ICAKPiAtc3RhdGljIHUz MiAqdm1hcF9iYXRjaChzdHJ1Y3QgZHJtX2k5MTVfZ2VtX29iamVjdCAqb2JqLAo+IC0JCSAgICAg ICB1bnNpZ25lZCBzdGFydCwgdW5zaWduZWQgbGVuKQo+IC17Cj4gLQlpbnQgaTsKPiAtCXZvaWQg KmFkZHIgPSBOVUxMOwo+IC0Jc3RydWN0IHNnX3BhZ2VfaXRlciBzZ19pdGVyOwo+IC0JaW50IGZp cnN0X3BhZ2UgPSBzdGFydCA+PiBQQUdFX1NISUZUOwo+IC0JaW50IGxhc3RfcGFnZSA9IChsZW4g KyBzdGFydCArIDQwOTUpID4+IFBBR0VfU0hJRlQ7Cj4gLQlpbnQgbnBhZ2VzID0gbGFzdF9wYWdl IC0gZmlyc3RfcGFnZTsKPiAtCXN0cnVjdCBwYWdlICoqcGFnZXM7Cj4gLQo+IC0JcGFnZXMgPSBk cm1fbWFsbG9jX2FiKG5wYWdlcywgc2l6ZW9mKCpwYWdlcykpOwo+IC0JaWYgKHBhZ2VzID09IE5V TEwpIHsKPiAtCQlEUk1fREVCVUdfRFJJVkVSKCJGYWlsZWQgdG8gZ2V0IHNwYWNlIGZvciBwYWdl c1xuIik7Cj4gLQkJZ290byBmaW5pc2g7Cj4gLQl9Cj4gLQo+IC0JaSA9IDA7Cj4gLQlmb3JfZWFj aF9zZ19wYWdlKG9iai0+cGFnZXMtPnNnbCwgJnNnX2l0ZXIsIG9iai0+cGFnZXMtPm5lbnRzLCBm aXJzdF9wYWdlKSB7Cj4gLQkJcGFnZXNbaSsrXSA9IHNnX3BhZ2VfaXRlcl9wYWdlKCZzZ19pdGVy KTsKPiAtCQlpZiAoaSA9PSBucGFnZXMpCj4gLQkJCWJyZWFrOwo+IC0JfQo+IC0KPiAtCWFkZHIg PSB2bWFwKHBhZ2VzLCBpLCAwLCBQQUdFX0tFUk5FTCk7Cj4gLQlpZiAoYWRkciA9PSBOVUxMKSB7 Cj4gLQkJRFJNX0RFQlVHX0RSSVZFUigiRmFpbGVkIHRvIHZtYXAgcGFnZXNcbiIpOwo+IC0JCWdv dG8gZmluaXNoOwo+IC0JfQo+IC0KPiAtZmluaXNoOgo+IC0JaWYgKHBhZ2VzKQo+IC0JCWRybV9m cmVlX2xhcmdlKHBhZ2VzKTsKPiAtCXJldHVybiAodTMyKilhZGRyOwo+IC19Cj4gLQo+IC0vKiBS ZXR1cm5zIGEgdm1hcCdkIHBvaW50ZXIgdG8gZGVzdF9vYmosIHdoaWNoIHRoZSBjYWxsZXIgbXVz dCB1bm1hcCAqLwo+IC1zdGF0aWMgdTMyICpjb3B5X2JhdGNoKHN0cnVjdCBkcm1faTkxNV9nZW1f b2JqZWN0ICpkZXN0X29iaiwKPiAtCQkgICAgICAgc3RydWN0IGRybV9pOTE1X2dlbV9vYmplY3Qg KnNyY19vYmosCj4gLQkJICAgICAgIHUzMiBiYXRjaF9zdGFydF9vZmZzZXQsCj4gLQkJICAgICAg IHUzMiBiYXRjaF9sZW4pCj4gLXsKPiAtCWludCBuZWVkc19jbGZsdXNoID0gMDsKPiAtCXZvaWQg KnNyY19iYXNlLCAqc3JjOwo+IC0Jdm9pZCAqZHN0ID0gTlVMTDsKPiAtCWludCByZXQ7Cj4gLQo+ IC0JaWYgKGJhdGNoX2xlbiA+IGRlc3Rfb2JqLT5iYXNlLnNpemUgfHwKPiAtCSAgICBiYXRjaF9s ZW4gKyBiYXRjaF9zdGFydF9vZmZzZXQgPiBzcmNfb2JqLT5iYXNlLnNpemUpCj4gLQkJcmV0dXJu IEVSUl9QVFIoLUUyQklHKTsKPiAtCj4gLQlpZiAoV0FSTl9PTihkZXN0X29iai0+cGFnZXNfcGlu X2NvdW50ID09IDApKQo+IC0JCXJldHVybiBFUlJfUFRSKC1FTk9ERVYpOwo+IC0KPiAtCXJldCA9 IGk5MTVfZ2VtX29ial9wcmVwYXJlX3NobWVtX3JlYWQoc3JjX29iaiwgJm5lZWRzX2NsZmx1c2gp Owo+IC0JaWYgKHJldCkgewo+IC0JCURSTV9ERUJVR19EUklWRVIoIkNNRDogZmFpbGVkIHRvIHBy ZXBhcmUgc2hhZG93IGJhdGNoXG4iKTsKPiAtCQlyZXR1cm4gRVJSX1BUUihyZXQpOwo+IC0JfQo+ IC0KPiAtCXNyY19iYXNlID0gdm1hcF9iYXRjaChzcmNfb2JqLCBiYXRjaF9zdGFydF9vZmZzZXQs IGJhdGNoX2xlbik7Cj4gLQlpZiAoIXNyY19iYXNlKSB7Cj4gLQkJRFJNX0RFQlVHX0RSSVZFUigi Q01EOiBGYWlsZWQgdG8gdm1hcCBiYXRjaFxuIik7Cj4gLQkJcmV0ID0gLUVOT01FTTsKPiAtCQln b3RvIHVucGluX3NyYzsKPiAtCX0KPiAtCj4gLQlyZXQgPSBpOTE1X2dlbV9vYmplY3Rfc2V0X3Rv X2NwdV9kb21haW4oZGVzdF9vYmosIHRydWUpOwo+IC0JaWYgKHJldCkgewo+IC0JCURSTV9ERUJV R19EUklWRVIoIkNNRDogRmFpbGVkIHRvIHNldCBzaGFkb3cgYmF0Y2ggdG8gQ1BVXG4iKTsKPiAt CQlnb3RvIHVubWFwX3NyYzsKPiAtCX0KPiAtCj4gLQlkc3QgPSB2bWFwX2JhdGNoKGRlc3Rfb2Jq LCAwLCBiYXRjaF9sZW4pOwo+IC0JaWYgKCFkc3QpIHsKPiAtCQlEUk1fREVCVUdfRFJJVkVSKCJD TUQ6IEZhaWxlZCB0byB2bWFwIHNoYWRvdyBiYXRjaFxuIik7Cj4gLQkJcmV0ID0gLUVOT01FTTsK PiAtCQlnb3RvIHVubWFwX3NyYzsKPiAtCX0KPiAtCj4gLQlzcmMgPSBzcmNfYmFzZSArIG9mZnNl dF9pbl9wYWdlKGJhdGNoX3N0YXJ0X29mZnNldCk7Cj4gLQlpZiAobmVlZHNfY2xmbHVzaCkKPiAt CQlkcm1fY2xmbHVzaF92aXJ0X3JhbmdlKHNyYywgYmF0Y2hfbGVuKTsKPiAtCj4gLQltZW1jcHko ZHN0LCBzcmMsIGJhdGNoX2xlbik7Cj4gLQo+IC11bm1hcF9zcmM6Cj4gLQl2dW5tYXAoc3JjX2Jh c2UpOwo+IC11bnBpbl9zcmM6Cj4gLQlpOTE1X2dlbV9vYmplY3RfdW5waW5fcGFnZXMoc3JjX29i aik7Cj4gLQo+IC0JcmV0dXJuIHJldCA/IEVSUl9QVFIocmV0KSA6IGRzdDsKPiAtfQo+IC0KPiAg LyoqCj4gICAqIGk5MTVfbmVlZHNfY21kX3BhcnNlcigpIC0gc2hvdWxkIGEgZ2l2ZW4gcmluZyB1 c2Ugc29mdHdhcmUgY29tbWFuZCBwYXJzaW5nPwo+ICAgKiBAcmluZzogdGhlIHJpbmcgaW4gcXVl c3Rpb24KPiBAQCAtMTA5Nyw2ICsxMDAzLDcgQEAgc3RhdGljIGJvb2wgY2hlY2tfY21kKGNvbnN0 IHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCj4gIH0KPiAgCj4gICNkZWZpbmUgTEVOR1RI X0JJQVMgMgo+ICsjZGVmaW5lIE1BWF9QQVJUSUFMIDI1Ngo+ICAKPiAgLyoqCj4gICAqIGk5MTVf cGFyc2VfY21kcygpIC0gcGFyc2UgYSBzdWJtaXR0ZWQgYmF0Y2ggYnVmZmVyIGZvciBwcml2aWxl Z2UgdmlvbGF0aW9ucwo+IEBAIC0xMTIwLDg2ICsxMDI3LDE4MCBAQCBpbnQgaTkxNV9wYXJzZV9j bWRzKHN0cnVjdCBpbnRlbF9lbmdpbmVfY3MgKnJpbmcsCj4gIAkJICAgIHUzMiBiYXRjaF9sZW4s Cj4gIAkJICAgIGJvb2wgaXNfbWFzdGVyKQo+ICB7Cj4gLQl1MzIgKmNtZCwgKmJhdGNoX2Jhc2Us ICpiYXRjaF9lbmQ7Cj4gKwljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgKmRl c2M7Cj4gKwl1bnNpZ25lZCBkc3RfaXRlciwgc3JjX2l0ZXI7Cj4gKwlpbnQgbmVlZHNfY2xmbHVz aCA9IDA7Cj4gKwlzdHJ1Y3QgZ2V0X3BhZ2UgcmV3aW5kOwo+ICsJdm9pZCAqc3JjLCAqZHN0LCAq dG1wOwo+ICsJdTMyIHBhcnRpYWwsIGxlbmd0aDsKPiArCXVuc2lnbmVkIGluLCBvdXQ7Cj4gIAlz dHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgZGVmYXVsdF9kZXNjID0geyAwIH07Cj4gIAli b29sIG9hY29udHJvbF9zZXQgPSBmYWxzZTsgLyogT0FDT05UUk9MIHRyYWNraW5nLiBTZWUgY2hl Y2tfY21kKCkgKi8KPiAgCWludCByZXQgPSAwOwo+ICAKPiAtCWJhdGNoX2Jhc2UgPSBjb3B5X2Jh dGNoKHNoYWRvd19iYXRjaF9vYmosIGJhdGNoX29iaiwKPiAtCQkJCWJhdGNoX3N0YXJ0X29mZnNl dCwgYmF0Y2hfbGVuKTsKPiAtCWlmIChJU19FUlIoYmF0Y2hfYmFzZSkpIHsKPiAtCQlEUk1fREVC VUdfRFJJVkVSKCJDTUQ6IEZhaWxlZCB0byBjb3B5IGJhdGNoXG4iKTsKPiAtCQlyZXR1cm4gUFRS X0VSUihiYXRjaF9iYXNlKTsKPiArCWlmIChiYXRjaF9sZW4gPiBzaGFkb3dfYmF0Y2hfb2JqLT5i YXNlLnNpemUgfHwKCkFGQUlLIHRoYXQgY2FuJ3QgYWN0YXVsbHkgaGFwcGVuIHNpbmNlIHdlIGFs bG9jYXRlIHRoZSBzaGFkb3cgYmF0Y2gKYmFzZWQgb24gYmF0Y2hfbGVuLiBCdXQgSSBzZWUgaXQg d2FzIGFscmVhZHkgbGlrZSB0aGlzIGluIHRoZSBvbGQgY29kZS4KCj4gKwkgICAgYmF0Y2hfbGVu ICsgYmF0Y2hfc3RhcnRfb2Zmc2V0ID4gYmF0Y2hfb2JqLT5iYXNlLnNpemUpCgpUaGlzIHdvcnJp ZXMgbWUgbW9yZS4gU2hvdWxkbid0IHdlIGFsc28gaGF2ZSB0aGlzIGNoZWNrIHNvbWV3aGVyZSBm b3IKdGhlIG5vbi1jbWRfcGFyc2VyIGNhc2VzPyBOb3IgY2FuIEkgc2VlIGFueSBvdmVyZmxvdyBj aGVjayBmb3IKJ2JhdGNoX2xlbitiYXRjaF9zdGFydF9vZmZzZXQnLgoKPiArCQlyZXR1cm4gLUUy QklHOwo+ICsKPiArCWlmIChXQVJOX09OKHNoYWRvd19iYXRjaF9vYmotPnBhZ2VzX3Bpbl9jb3Vu dCA9PSAwKSkKPiArCQlyZXR1cm4gLUVOT0RFVjsKPiArCj4gKwlyZXQgPSBpOTE1X2dlbV9vYmpf cHJlcGFyZV9zaG1lbV9yZWFkKGJhdGNoX29iaiwgJm5lZWRzX2NsZmx1c2gpOwo+ICsJaWYgKHJl dCkgewo+ICsJCURSTV9ERUJVR19EUklWRVIoIkNNRDogZmFpbGVkIHRvIHByZXBhcmUgc2hhZG93 IGJhdGNoXG4iKTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQo+ICsKPiArCXJldCA9IGk5MTVfZ2Vt X29iamVjdF9zZXRfdG9fY3B1X2RvbWFpbihzaGFkb3dfYmF0Y2hfb2JqLCB0cnVlKTsKPiArCWlm IChyZXQpIHsKPiArCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IEZhaWxlZCB0byBzZXQgc2hhZG93 IGJhdGNoIHRvIENQVVxuIik7Cj4gKwkJZ290byB1bnBpbjsKPiAgCX0KPiAgCj4gKwl0bXAgPSBr bWFsbG9jKFBBR0VfU0laRSArIE1BWF9QQVJUSUFMLCBHRlBfS0VSTkVMKTsKCkdGUF9URU1QT1JB UlkgcGVyaGFwcz8KCj4gKwlpZiAodG1wID09IE5VTEwpCj4gKwkJcmV0dXJuIC1FTk9NRU07Cj4g Kwo+ICAJLyoKPiAgCSAqIFdlIHVzZSB0aGUgYmF0Y2ggbGVuZ3RoIGFzIHNpemUgYmVjYXVzZSB0 aGUgc2hhZG93IG9iamVjdCBpcyBhcwo+ICAJICogbGFyZ2Ugb3IgbGFyZ2VyIGFuZCBjb3B5X2Jh dGNoKCkgd2lsbCB3cml0ZSBNSV9OT1BzIHRvIHRoZSBleHRyYQoKY29weV9iYXRjaCgpIGlzIGdv bmUuCgo+ICAJICogc3BhY2UuIFBhcnNpbmcgc2hvdWxkIGJlIGZhc3RlciBpbiBzb21lIGNhc2Vz IHRoaXMgd2F5Lgo+ICAJICovCj4gLQliYXRjaF9lbmQgPSBiYXRjaF9iYXNlICsgKGJhdGNoX2xl biAvIHNpemVvZigqYmF0Y2hfZW5kKSk7Cj4gKwlyZXQgPSAtRUlOVkFMOwo+ICsJcmV3aW5kID0g YmF0Y2hfb2JqLT5nZXRfcGFnZTsKClNob3VsZG4ndCB0aGUgZ2V0X3BhZ2Ugd29yayBqdXN0IGZp bmUgd2l0aG91dCB0aGlzIHJld2luZCB0cmljaz8gQXMgaW4gaWYKc29tZSBvdGhlciB1c2VyIHdh bnRzIG9uZSBvZiB0aGUgcHJldmlvdXMgcGFnZXMgaXQgcmVzdGFydHMgaXRlcmF0aW5nCmZyb20g MD8KCj4gKwo+ICsJZHN0X2l0ZXIgPSAwOwo+ICsJZHN0ID0ga21hcF9hdG9taWMoaTkxNV9nZW1f b2JqZWN0X2dldF9wYWdlKHNoYWRvd19iYXRjaF9vYmosIGRzdF9pdGVyKSk7Cj4gKwlvdXQgPSAw Owo+ICsKPiArCWluID0gb2Zmc2V0X2luX3BhZ2UoYmF0Y2hfc3RhcnRfb2Zmc2V0KTsKPiArCXBh cnRpYWwgPSAwOwo+ICsJZm9yIChzcmNfaXRlciA9IGJhdGNoX3N0YXJ0X29mZnNldCA+PiBQQUdF X1NISUZUOwo+ICsJICAgICBzcmNfaXRlciA8IGJhdGNoX29iai0+YmFzZS5zaXplID4+IFBBR0Vf U0hJRlQ7Cj4gKwkgICAgIHNyY19pdGVyKyspIHsKPiArCQl1MzIgKmNtZCwgKnBhZ2VfZW5kLCAq YmF0Y2hfZW5kOwo+ICsJCXUzMiB0aGlzOwo+ICsKPiArCQl0aGlzID0gYmF0Y2hfbGVuOwo+ICsJ CWlmICh0aGlzID4gUEFHRV9TSVpFIC0gaW4pCj4gKwkJCXRoaXMgPSBQQUdFX1NJWkUgLSBpbjsK PiArCj4gKwkJc3JjID0ga21hcF9hdG9taWMoaTkxNV9nZW1fb2JqZWN0X2dldF9wYWdlKGJhdGNo X29iaiwgc3JjX2l0ZXIpKTsKPiArCQlpZiAobmVlZHNfY2xmbHVzaCkKPiArCQkJZHJtX2NsZmx1 c2hfdmlydF9yYW5nZShzcmMgKyBpbiwgdGhpcyk7Cj4gKwo+ICsJCWlmICh0aGlzID09IFBBR0Vf U0laRSAmJiBwYXJ0aWFsID09IDApCj4gKwkJCWNvcHlfcGFnZSh0bXAsIHNyYyk7Cj4gKwkJZWxz ZQo+ICsJCQltZW1jcHkodG1wK3BhcnRpYWwsIHNyYytpbiwgdGhpcyk7Cj4gKwo+ICsJCWNtZCA9 IHRtcDsKPiArCQlwYWdlX2VuZCA9IHRtcCArIHRoaXMgKyBwYXJ0aWFsOwo+ICsJCWJhdGNoX2Vu ZCA9IHRtcCArIGJhdGNoX2xlbiArIHBhcnRpYWw7Cj4gKwkJcGFydGlhbCA9IDA7Cj4gKwo+ICsJ CWRvIHsKPiArCQkJaWYgKCpjbWQgPT0gTUlfQkFUQ0hfQlVGRkVSX0VORCkgewo+ICsJCQkJaWYg KG9hY29udHJvbF9zZXQpIHsKPiArCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJDTUQ6IGJhdGNoIHNl dCBPQUNPTlRST0wgYnV0IGRpZCBub3QgY2xlYXIgaXRcbiIpOwo+ICsJCQkJCWdvdG8gdW5tYXA7 Cj4gKwkJCQl9Cj4gIAo+IC0JY21kID0gYmF0Y2hfYmFzZTsKPiAtCXdoaWxlIChjbWQgPCBiYXRj aF9lbmQpIHsKPiAtCQljb25zdCBzdHJ1Y3QgZHJtX2k5MTVfY21kX2Rlc2NyaXB0b3IgKmRlc2M7 Cj4gLQkJdTMyIGxlbmd0aDsKPiArCQkJCWNtZCsrOyAvKiBjb3B5IHRoaXMgY21kIHRvIGRzdCAq Lwo+ICsJCQkJYmF0Y2hfbGVuID0gdGhpczsgLyogbm8gbW9yZSBzcmMgKi8KPiArCQkJCXJldCA9 IDA7Cj4gKwkJCQlicmVhazsKPiArCQkJfQo+ICAKPiAtCQlpZiAoKmNtZCA9PSBNSV9CQVRDSF9C VUZGRVJfRU5EKQo+IC0JCQlicmVhazsKPiArCQkJZGVzYyA9IGZpbmRfY21kKHJpbmcsICpjbWQs ICZkZWZhdWx0X2Rlc2MpOwo+ICsJCQlpZiAoIWRlc2MpIHsKPiArCQkJCURSTV9ERUJVR19EUklW RVIoIkNNRDogVW5yZWNvZ25pemVkIGNvbW1hbmQ6IDB4JTA4WFxuIiwKPiArCQkJCQkJICpjbWQp Owo+ICsJCQkJZ290byB1bm1hcDsKPiArCQkJfQo+ICAKPiAtCQlkZXNjID0gZmluZF9jbWQocmlu ZywgKmNtZCwgJmRlZmF1bHRfZGVzYyk7Cj4gLQkJaWYgKCFkZXNjKSB7Cj4gLQkJCURSTV9ERUJV R19EUklWRVIoIkNNRDogVW5yZWNvZ25pemVkIGNvbW1hbmQ6IDB4JTA4WFxuIiwKPiAtCQkJCQkg KmNtZCk7Cj4gLQkJCXJldCA9IC1FSU5WQUw7Cj4gLQkJCWJyZWFrOwo+IC0JCX0KCkl0J3MgcXVp dGUgaGFyZCB0byBzZWUgd2hhdCdzIGNoYW5nZWQgZHVlIHRvIHRoZSByZWluZGVudC4gQW55IGNo YW5jZQp5b3UgY291bGQgZG8gdGhlIHJlaW5kZW50IGluIGEgcHJlcCBwYXRjaCBqdXN0IGhlbHAg bXkgcG9vciBicmFpbiBhIGJpdD8KCj4gKwkJCS8qCj4gKwkJCSAqIElmIHRoZSBiYXRjaCBidWZm ZXIgY29udGFpbnMgYSBjaGFpbmVkIGJhdGNoLCByZXR1cm4gYW4KPiArCQkJICogZXJyb3IgdGhh dCB0ZWxscyB0aGUgY2FsbGVyIHRvIGFib3J0IGFuZCBkaXNwYXRjaCB0aGUKPiArCQkJICogd29y a2xvYWQgYXMgYSBub24tc2VjdXJlIGJhdGNoLgo+ICsJCQkgKi8KPiArCQkJaWYgKGRlc2MtPmNt ZC52YWx1ZSA9PSBNSV9CQVRDSF9CVUZGRVJfU1RBUlQpIHsKPiArCQkJCXJldCA9IC1FQUNDRVM7 Cj4gKwkJCQlnb3RvIHVubWFwOwo+ICsJCQl9Cj4gIAo+IC0JCS8qCj4gLQkJICogSWYgdGhlIGJh dGNoIGJ1ZmZlciBjb250YWlucyBhIGNoYWluZWQgYmF0Y2gsIHJldHVybiBhbgo+IC0JCSAqIGVy cm9yIHRoYXQgdGVsbHMgdGhlIGNhbGxlciB0byBhYm9ydCBhbmQgZGlzcGF0Y2ggdGhlCj4gLQkJ ICogd29ya2xvYWQgYXMgYSBub24tc2VjdXJlIGJhdGNoLgo+IC0JCSAqLwo+IC0JCWlmIChkZXNj LT5jbWQudmFsdWUgPT0gTUlfQkFUQ0hfQlVGRkVSX1NUQVJUKSB7Cj4gLQkJCXJldCA9IC1FQUND RVM7Cj4gLQkJCWJyZWFrOwo+IC0JCX0KPiArCQkJaWYgKGRlc2MtPmZsYWdzICYgQ01EX0RFU0Nf RklYRUQpCj4gKwkJCQlsZW5ndGggPSBkZXNjLT5sZW5ndGguZml4ZWQ7Cj4gKwkJCWVsc2UKPiAr CQkJCWxlbmd0aCA9ICgoKmNtZCAmIGRlc2MtPmxlbmd0aC5tYXNrKSArIExFTkdUSF9CSUFTKTsK PiAgCj4gLQkJaWYgKGRlc2MtPmZsYWdzICYgQ01EX0RFU0NfRklYRUQpCj4gLQkJCWxlbmd0aCA9 IGRlc2MtPmxlbmd0aC5maXhlZDsKPiAtCQllbHNlCj4gLQkJCWxlbmd0aCA9ICgoKmNtZCAmIGRl c2MtPmxlbmd0aC5tYXNrKSArIExFTkdUSF9CSUFTKTsKPiAtCj4gLQkJaWYgKChiYXRjaF9lbmQg LSBjbWQpIDwgbGVuZ3RoKSB7Cj4gLQkJCURSTV9ERUJVR19EUklWRVIoIkNNRDogQ29tbWFuZCBs ZW5ndGggZXhjZWVkcyBiYXRjaCBsZW5ndGg6IDB4JTA4WCBsZW5ndGg9JXUgYmF0Y2hsZW49JXRk XG4iLAo+IC0JCQkJCSAqY21kLAo+IC0JCQkJCSBsZW5ndGgsCj4gLQkJCQkJIGJhdGNoX2VuZCAt IGNtZCk7Cj4gLQkJCXJldCA9IC1FSU5WQUw7Cj4gLQkJCWJyZWFrOwo+IC0JCX0KPiArCQkJaWYg KHVubGlrZWx5KGNtZCArIGxlbmd0aCA+IHBhZ2VfZW5kKSkgewo+ICsJCQkJaWYgKHVubGlrZWx5 KGNtZCArIGxlbmd0aCA+IGJhdGNoX2VuZCkpIHsKPiArCQkJCQlEUk1fREVCVUdfRFJJVkVSKCJD TUQ6IENvbW1hbmQgbGVuZ3RoIGV4Y2VlZHMgYmF0Y2ggbGVuZ3RoOiAweCUwOFggbGVuZ3RoPSV1 IGJhdGNobGVuPSV0ZFxuIiwKPiArCQkJCQkJCSAqY21kLCBsZW5ndGgsIGJhdGNoX2VuZCAtIGNt ZCk7Cj4gKwkJCQkJZ290byB1bm1hcDsKPiArCQkJCX0KPiAgCj4gLQkJaWYgKCFjaGVja19jbWQo cmluZywgZGVzYywgY21kLCBsZW5ndGgsIGlzX21hc3RlciwKPiAtCQkJICAgICAgICZvYWNvbnRy b2xfc2V0KSkgewo+IC0JCQlyZXQgPSAtRUlOVkFMOwo+IC0JCQlicmVhazsKPiAtCQl9Cj4gKwkJ CQlpZiAoV0FSTl9PTihsZW5ndGggPiBNQVhfUEFSVElBTCkpIHsKPiArCQkJCQlyZXQgPSAtRU5P REVWOwo+ICsJCQkJCWdvdG8gdW5tYXA7Cj4gKwkJCQl9Cj4gIAo+IC0JCWNtZCArPSBsZW5ndGg7 Cj4gLQl9Cj4gKwkJCQlwYXJ0aWFsID0gNCoocGFnZV9lbmQgLSBjbWQpOwo+ICsJCQkJYnJlYWs7 Cj4gKwkJCX0KPiAgCj4gLQlpZiAob2Fjb250cm9sX3NldCkgewo+IC0JCURSTV9ERUJVR19EUklW RVIoIkNNRDogYmF0Y2ggc2V0IE9BQ09OVFJPTCBidXQgZGlkIG5vdCBjbGVhciBpdFxuIik7Cj4g LQkJcmV0ID0gLUVJTlZBTDsKPiAtCX0KPiArCQkJaWYgKCFjaGVja19jbWQocmluZywgZGVzYywg Y21kLCBsZW5ndGgsIGlzX21hc3RlciwKPiArCQkJCSAgICAgICAmb2Fjb250cm9sX3NldCkpCj4g KwkJCQlnb3RvIHVubWFwOwo+ICsKPiArCQkJY21kICs9IGxlbmd0aDsKPiArCQl9IHdoaWxlIChj bWQgPCBwYWdlX2VuZCk7Cj4gKwo+ICsJCS8qIENvcHkgdGhlIHZhbGlkYXRlZCBwYWdlIHRvIHRo ZSBHUFUgYmF0Y2ggKi8KPiArCQl7Cj4gKwkJCS8qIGV4Y2x1ZGUgcGFydGlhbCBjbWQsIHdlIGNv cHkgaXQgbmV4dCB0aW1lICovCj4gKwkJCXVuc2lnbmVkIGRzdF9sZW5ndGggPSAodm9pZCAqKWNt ZCAtIHRtcDsKPiArCQkJaW4gPSAwOwo+ICsJCQlkbyB7Cj4gKwkJCQlpbnQgbGVuOwo+ICsKPiAr CQkJCWlmIChvdXQgPT0gUEFHRV9TSVpFKSB7Cj4gKwkJCQkJa3VubWFwX2F0b21pYyhkc3QpOwo+ ICsJCQkJCWRzdCA9IGttYXBfYXRvbWljKGk5MTVfZ2VtX29iamVjdF9nZXRfcGFnZShzaGFkb3df YmF0Y2hfb2JqLCArK2RzdF9pdGVyKSk7Cj4gKwkJCQkJb3V0ID0gMDsKPiArCQkJCX0KPiAgCj4g LQlpZiAoY21kID49IGJhdGNoX2VuZCkgewo+IC0JCURSTV9ERUJVR19EUklWRVIoIkNNRDogR290 IHRvIHRoZSBlbmQgb2YgdGhlIGJ1ZmZlciB3L28gYSBCQkUgY21kIVxuIik7Cj4gLQkJcmV0ID0g LUVJTlZBTDsKPiAtCX0KPiArCQkJCWxlbiA9IGRzdF9sZW5ndGg7Cj4gKwkJCQlpZiAobGVuICsg b3V0ID4gUEFHRV9TSVpFKQo+ICsJCQkJCWxlbiA9IFBBR0VfU0laRSAtIG91dDsKPiArCQkJCWlm IChsZW4gPT0gUEFHRV9TSVpFKQo+ICsJCQkJCWNvcHlfcGFnZShkc3QsIHRtcCArIGluKTsKPiAr CQkJCWVsc2UKPiArCQkJCQltZW1jcHkoZHN0ICsgb3V0LCB0bXAgKyBpbiwgbGVuKTsKPiArCQkJ CWluICs9IGxlbjsKPiArCQkJCW91dCArPSBsZW47Cj4gKwkJCQlkc3RfbGVuZ3RoIC09IGxlbjsK PiArCQkJfSB3aGlsZSAoZHN0X2xlbmd0aCk7Cj4gKwkJfQo+ICsKPiArCQliYXRjaF9sZW4gLT0g dGhpczsKPiArCQlpZiAoYmF0Y2hfbGVuID09IDApCj4gKwkJCWJyZWFrOwo+ICAKPiAtCXZ1bm1h cChiYXRjaF9iYXNlKTsKPiArCQlpZiAocGFydGlhbCkKPiArCQkJbWVtbW92ZSh0bXAsIGNtZCwg cGFydGlhbCk7Cj4gIAo+ICsJCWt1bm1hcF9hdG9taWMoc3JjKTsKPiArCQlpbiA9IDA7Cj4gKwl9 Cj4gK3VubWFwOgo+ICsJa3VubWFwX2F0b21pYyhzcmMpOwo+ICsJa3VubWFwX2F0b21pYyhkc3Qp Owo+ICsJYmF0Y2hfb2JqLT5nZXRfcGFnZSA9IHJld2luZDsKPiArCWtmcmVlKHRtcCk7Cj4gK3Vu cGluOgo+ICsJaTkxNV9nZW1fb2JqZWN0X3VucGluX3BhZ2VzKGJhdGNoX29iaik7Cj4gIAlyZXR1 cm4gcmV0Owo+ICB9Cj4gIAo+IC0tIAo+IDIuNi4yCgotLSAKVmlsbGUgU3lyasOkbMOkCkludGVs IE9UQwpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpJbnRl bC1nZnggbWFpbGluZyBsaXN0CkludGVsLWdmeEBsaXN0cy5mcmVlZGVza3RvcC5vcmcKaHR0cDov L2xpc3RzLmZyZWVkZXNrdG9wLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2ludGVsLWdmeAo=