From mboxrd@z Thu Jan 1 00:00:00 1970 From: Juergen Gross Subject: Re: [PATCH 3/3] xen: optimize xenbus driver for multiple concurrent xenstore accesses Date: Tue, 10 Jan 2017 07:18:35 +0100 Message-ID: <9f84b972-9a76-aae2-ece6-b292bf9796cd__8443.02575937963$1484029199$gmane$org@suse.com> References: <20170106150544.10836-1-jgross@suse.com> <20170106150544.10836-4-jgross@suse.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: Received: from mail6.bemta5.messagelabs.com ([195.245.231.135]) by lists.xenproject.org with esmtp (Exim 4.84_2) (envelope-from ) id 1cQplW-0006Lc-WD for xen-devel@lists.xenproject.org; Tue, 10 Jan 2017 06:18:39 +0000 In-Reply-To: List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Errors-To: xen-devel-bounces@lists.xen.org Sender: "Xen-devel" To: Boris Ostrovsky , linux-kernel@vger.kernel.org, xen-devel@lists.xenproject.org List-Id: xen-devel@lists.xenproject.org T24gMDkvMDEvMTcgMjI6MTcsIEJvcmlzIE9zdHJvdnNreSB3cm90ZToKPiBPbiAwMS8wNi8yMDE3 IDEwOjA1IEFNLCBKdWVyZ2VuIEdyb3NzIHdyb3RlOgo+PiBIYW5kbGluZyBvZiBtdWx0aXBsZSBj b25jdXJyZW50IFhlbnN0b3JlIGFjY2Vzc2VzIHRocm91Z2ggeGVuYnVzIGRyaXZlcgo+PiBlaXRo ZXIgZnJvbSB0aGUga2VybmVsIG9yIHVzZXIgbGFuZCBpcyByYXRoZXIgbGFtZSB0b2RheTogeGVu YnVzIGlzCj4+IGNhcGFibGUgdG8gaGF2ZSBvbmUgYWNjZXNzIGFjdGl2ZSBvbmx5IGF0IG9uZSBw b2ludCBvZiB0aW1lLgo+Pgo+PiBSZXdyaXRlIHhlbmJ1cyB0byBoYW5kbGUgbXVsdGlwbGUgcmVx dWVzdHMgY29uY3VycmVudGx5IGJ5IG1ha2luZyB1c2UKPj4gb2YgdGhlIHJlcXVlc3QgaWQgb2Yg dGhlIFhlbnN0b3JlIHByb3RvY29sLiBUaGlzIHJlcXVpcmVzIHRvOgo+Pgo+PiAtIEluc3RlYWQg b2YgYmxvY2tpbmcgaW5zaWRlIHhiX3JlYWQoKSB3aGVuIHRyeWluZyB0byByZWFkIGRhdGEgZnJv bQo+PiAgIHRoZSB4ZW5zdG9yZSByaW5nIGJ1ZmZlciBkbyBzbyBvbmx5IGluIHRoZSBtYWluIGxv b3Agb2YKPj4gICB4ZW5idXNfdGhyZWFkKCkuCj4+Cj4+IC0gSW5zdGVhZCBvZiBkb2luZyB3cml0 ZXMgdG8gdGhlIHhlbnN0b3JlIHJpbmcgYnVmZmVyIGluIHRoZSBjb250ZXh0IG9mCj4+ICAgdGhl IGNhbGxlciBqdXN0IHF1ZXVlIHRoZSByZXF1ZXN0IGFuZCBkbyB0aGUgd3JpdGUgaW4gdGhlIGRl ZGljYXRlZAo+PiAgIHhlbmJ1cyB0aHJlYWQuCj4+Cj4+IC0gSW5zdGVhZCBvZiBqdXN0IGZvcndh cmRpbmcgdGhlIHJlcXVlc3QgaWQgc3BlY2lmaWVkIGJ5IHRoZSBjYWxsZXIgb2YKPj4gICB4ZW5i dXMgdG8geGVuc3RvcmUgdXNlIGEgeGVuYnVzIGludGVybmFsIHVuaXF1ZSByZXF1ZXN0IGlkLiBU aGlzIHdpbGwKPj4gICBhbGxvdyBtdWx0aXBsZSBvdXRzdGFuZGluZyByZXF1ZXN0cy4KPj4KPj4g LSBNb2RpZnkgdGhlIGxvY2tpbmcgc2NoZW1lIGluIG9yZGVyIHRvIGFsbG93IG11bHRpcGxlIHJl cXVlc3RzIGJlaW5nCj4+ICAgYWN0aXZlIGluIHBhcmFsbGVsLgo+Pgo+PiAtIEluc3RlYWQgb2Yg d2FpdGluZyBmb3IgdGhlIHJlcGx5IG9mIGEgdXNlcidzIHhlbnN0b3JlIHJlcXVlc3QgYWZ0ZXIK Pj4gICB3cml0aW5nIHRoZSByZXF1ZXN0IHRvIHRoZSB4ZW5zdG9yZSByaW5nIGJ1ZmZlciByZXR1 cm4gZGlyZWN0bHkgdG8KPj4gICB0aGUgY2FsbGVyIGFuZCBkbyB0aGUgd2FpdGluZyBpbiB0aGUg cmVhZCBwYXRoLgo+Pgo+PiBBZGRpdGlvbmFsbHkgc2lnbmFsIGhhbmRsaW5nIHdhcyBvcHRpbWl6 ZWQgYnkgYXZvaWRpbmcgd2FraW5nIHVwIHRoZQo+PiB4ZW5idXMgdGhyZWFkIG9yIHNlbmRpbmcg YW4gZXZlbnQgdG8gWGVuc3RvcmUgaW4gY2FzZSB0aGUgYWRkcmVzc2VkCj4+IGVudGl0eSBpcyBr bm93biB0byBiZSBydW5uaW5nIGFscmVhZHkuCj4+Cj4+IEFzIGEgcmVzdWx0IGNvbW11bmljYXRp b24gd2l0aCBYZW5zdG9yZSBpcyBzcGVkIHVwIGJ5IGEgZmFjdG9yIG9mIHVwCj4+IHRvIDU6IGRl cGVuZGluZyBvbiB0aGUgcmVxdWVzdCB0eXBlIChyZWFkIG9yIHdyaXRlKSBhbmQgdGhlIGFtb3Vu dCBvZgo+PiBkYXRhIHRyYW5zZmVycmVkIHRoZSBnYWluIHdhcyBhdCBsZWFzdCAyMCUgKHNtYWxs IHJlYWRzKSBhbmQgd2VudCB1cCB0bwo+PiBhIGZhY3RvciBvZiA1IGZvciBsYXJnZSB3cml0ZXMu Cj4+Cj4+IEluIHRoZSBlbmQgc29tZSBtb3JlIHJvdWdoIGVkZ2VzIG9mIHhlbmJ1cyBoYXZlIGJl ZW4gc21vb3RoZWQ6Cj4+Cj4+IC0gSGFuZGxpbmcgb2YgbWVtb3J5IHNob3J0YWdlIHdoZW4gcmVh ZGluZyBmcm9tIHhlbnN0b3JlIHJpbmcgYnVmZmVyIGluCj4+ICAgdGhlIHhlbmJ1cyBkcml2ZXIg d2FzIG5vdCBvcHRpbWFsOiBpdCB3YXMgYnVzeSBsb29waW5nIGFuZCBpc3N1aW5nIGEKPj4gICB3 YXJuaW5nIGluIGVhY2ggbG9vcC4KPj4KPj4gLSBJbiBjYXNlIG9mIHhlbnN0b3JlIG5vdCBydW5u aW5nIGluIGRvbTAgYnV0IGluIGEgc3R1YmRvbSB3ZSBlbmQgdXAKPj4gICB3aXRoIHR3byB4ZW5i dXMgdGhyZWFkcyBydW5uaW5nIGFzIHRoZSBpbml0aWFsaXphdGlvbiBvZiB4ZW5idXMgaW4KPj4g ICBkb20wIGV4cGVjdGluZyBhIGxvY2FsIHhlbnN0b3JlZCB3aWxsIGJlIHJlZG9uZSBsYXRlciB3 aGVuIGNvbm5lY3RpbmcKPj4gICB0byB0aGUgeGVuc3RvcmUgZG9tYWluLiBVcCB0byBub3cgdGhp cyB3YXMgbm8gcHJvYmxlbSBhcyBsb2NraW5nCj4+ICAgd291bGQgcHJldmVudCB0aGUgdHdvIHhl bmJ1cyB0aHJlYWRzIGludGVyZmVyaW5nIHdpdGggZWFjaCBvdGhlciwgYnV0Cj4+ICAgdGhpcyB3 YXMganVzdCBhIHdhc3RlIG9mIGtlcm5lbCByZXNvdXJjZXMuCj4+Cj4+IC0gQW4gb3V0IG9mIG1l bW9yeSBzaXR1YXRpb24gd2hpbGUgd3JpdGluZyB0byBvciByZWFkaW5nIGZyb20gdGhlCj4+ICAg eGVuc3RvcmUgcmluZyBidWZmZXIgbm8gbG9uZ2VyIHdpbGwgbGVhZCB0byBhIHBvc3NpYmxlIGxv c3Mgb2YKPj4gICBzeW5jaHJvbml6YXRpb24gd2l0aCB4ZW5zdG9yZS4KPj4KPj4gLSBUaGUgdXNl ciByZWFkIGFuZCB3cml0ZSBwYXJ0IGFyZSBub3cgaW50ZXJydXB0aWJsZSBieSBzaWduYWxzLgo+ Pgo+PiBTaWduZWQtb2ZmLWJ5OiBKdWVyZ2VuIEdyb3NzIDxqZ3Jvc3NAc3VzZS5jb20+Cj4+IC0t LQo+PiBJJ20gYXdhcmUgdGhhdCB0aGUgY2hhbmdlcyBhcmUgcXVpdGUgbGFyZ2UuIEkgdGhvdWdo dCBhYm91dCBzZW5kaW5nIGEKPj4gdmVyc2lvbiBzcGxpdCBpbnRvIG11bHRpcGxlIHBhdGNoZXMs IGJ1dCBhIGxvdCBvZiBsaW5lcyB3b3VsZCBoYXZlIGJlZW4KPj4gdG91Y2hlZCBieSBtb3JlIHRo YW4gb25lIHBhdGNoLiBJIHN0aWxsIGhhdmUgdGhlIG11bHRpcGxlIHBhdGNoIHZhcmlhbnQKPj4g bHlpbmcgYXJvdW5kIC0gdGhpcyBwYXRjaCBpcyBzcGxpdCBpbnRvIDExIHNtYWxsZXIgb25lcy4g V2hpbGUgYWxsCj4+IHN0ZXBzIG9mIHRoaXMgbGFyZ2VyIHNlcmllcyBpcyBvcGVyYXRpb25hbCBz b21lIHN0ZXBzIGFyZSBub3Qgb3B0aW1hbAo+PiBhcyB0aGV5IGFyZSBldmVuIHNsb3dlciB0aGFu IHRoZSBvcmlnaW5hbCB2ZXJzaW9uIG9mIHhlbmJ1cy4KPj4KPj4gTmV2ZXJ0aGVsZXNzIEkgY2Fu IHNlbmQgdGhlIGxhcmdlIHNlcmllcyBpZiB0aGVyZSBhcmUgcmVxdWVzdHMgZm9yIGl0Lgo+IAo+ IEkgd2lsbCBjb21tZW50IG9ubHkgb24geGVuX2NvbW1zIGNoYW5nZXMgZm9yIG5vdyBzaW5jZSBv dGhlcndpc2UgSSBhbQo+IGFmcmFpZCBpdCBtYXkgYmUgZGlmZmljdWx0IHRvIGtlZXAgdHJhY2sg b2YgY29udmVyc2F0aW9uLgoKT2theS4KCj4+IGRpZmYgLS1naXQgYS9kcml2ZXJzL3hlbi94ZW5i dXMveGVuYnVzX2NvbW1zLmMgYi9kcml2ZXJzL3hlbi94ZW5idXMveGVuYnVzX2NvbW1zLmMKPj4g aW5kZXggYzIxZWMwMi4uZmEwNTRjYSAxMDA2NDQKPj4gLS0tIGEvZHJpdmVycy94ZW4veGVuYnVz L3hlbmJ1c19jb21tcy5jCj4+ICsrKyBiL2RyaXZlcnMveGVuL3hlbmJ1cy94ZW5idXNfY29tbXMu Ywo+PiBAQCAtMzQsNiArMzQsNyBAQAo+PiAgCj4+ICAjaW5jbHVkZSA8bGludXgvd2FpdC5oPgo+ PiAgI2luY2x1ZGUgPGxpbnV4L2ludGVycnVwdC5oPgo+PiArI2luY2x1ZGUgPGxpbnV4L2t0aHJl YWQuaD4KPj4gICNpbmNsdWRlIDxsaW51eC9zY2hlZC5oPgo+PiAgI2luY2x1ZGUgPGxpbnV4L2Vy ci5oPgo+PiAgI2luY2x1ZGUgPHhlbi94ZW5idXMuaD4KPj4gQEAgLTQyLDExICs0Myw0MCBAQAo+ PiAgI2luY2x1ZGUgPHhlbi9wYWdlLmg+Cj4+ICAjaW5jbHVkZSAieGVuYnVzLmgiCj4+ICAKPj4g K3N0cnVjdCB4c190aHJlYWRfc3RhdGVfd3JpdGUgewo+PiArCXN0cnVjdCB4Yl9yZXFfZGF0YSAq cmVxOwo+PiArCWludCBpZHg7Cj4+ICsJdW5zaWduZWQgaW50IHVzZWQ7Cj4gCj4gIndyaXR0ZW4i IG9yICJzZW50Ij8KCkkgZG9uJ3QgbWluZC4KCj4+ICt9Owo+PiArCj4+ICtzdHJ1Y3QgeHNfdGhy ZWFkX3N0YXRlX3JlYWQgewo+PiArCXN0cnVjdCB4c2Rfc29ja21zZyBtc2c7Cj4+ICsJY2hhciAq Ym9keTsKPj4gKwl1bmlvbiB7Cj4+ICsJCXZvaWQgKmFsbG9jOwo+PiArCQlzdHJ1Y3QgeHNfd2F0 Y2hfZXZlbnQgKndhdGNoOwo+PiArCX07Cj4+ICsJYm9vbCBpbl9tc2c7Cj4+ICsJYm9vbCBpbl9o ZHI7Cj4gCj4gSXQgbWF5IGJlIGJldHRlciB0byBrZWVwIHRyYWNrIG9mIHdoaWNoIHN0YXRlIHdl IGFyZSBpbiB1c2luZyBhIGJpdG1hcC4KPiBPdGhlcndpc2UgaXQgZWFzeSB0byBsb3NlIHRyYWNr IG9mIG9uZSBvciB0aGUgb3RoZXIuCgpIbW0sIHJlYWxseT8gSXQncyByYXRoZXIgZWFzeToKaW5f bXNnOiBhcmUgd2UgcHJvY2Vzc2luZyBhbnkgbWVzc2FnZT8KaW5faGRyOiBhcmUgd2UgcHJvY2Vz c2luZyB0aGUgbWVzc2FnZSBoZWFkZXIgKGluX21zZyBpcyB0cnVlKT8KCj4+ICsJdW5zaWduZWQg aW50IHVzZWQ7Cj4gCj4gInJlYWQiIG9yInJlY2VpdmVkIj8KClN1cmUsIGNhbiBjaGFuZ2UuCgo+ PiArfTsKPiAKPiBCb3RoIG9mIHRoZXNlIGFyZSBwcml2YXRlIHRvIHByb2Nlc3NfbXNnL3Byb2Nl c3Nfd3JpdGUgc28gcGVyaGFwcyB0aGV5Cj4gY2FuIGJlIGRlY2xhcmVkIGluIHRob3NlIHJvdXRp bmVzJyBzY29wZXMuCgpJIGNhbiBkbyB0aGlzIGlmIHlvdSB3YW50LgoKPj4gIAkJLyogUmVhZCBp bmRleGVzLCB0aGVuIHZlcmlmeS4gKi8KPj4gIAkJY29ucyA9IGludGYtPnJlcV9jb25zOwo+PiAg CQlwcm9kID0gaW50Zi0+cmVxX3Byb2Q7Cj4+IEBAIC0xMTUsNTkgKzE0Niw1NyBAQCBpbnQgeGJf d3JpdGUoY29uc3Qgdm9pZCAqZGF0YSwgdW5zaWduZWQgbGVuKQo+PiAgCQkJaW50Zi0+cmVxX2Nv bnMgPSBpbnRmLT5yZXFfcHJvZCA9IDA7Cj4+ICAJCQlyZXR1cm4gLUVJTzsKPj4gIAkJfQo+PiAt Cj4+IC0JCWRzdCA9IGdldF9vdXRwdXRfY2h1bmsoY29ucywgcHJvZCwgaW50Zi0+cmVxLCAmYXZh aWwpOwo+PiAtCQlpZiAoYXZhaWwgPT0gMCkKPj4gLQkJCWNvbnRpbnVlOwo+PiAtCQlpZiAoYXZh aWwgPiBsZW4pCj4+IC0JCQlhdmFpbCA9IGxlbjsKPj4gKwkJaWYgKCF4Yl9kYXRhX3RvX3dyaXRl KCkpCj4+ICsJCQlyZXR1cm4gYnl0ZXM7Cj4+ICAKPj4gIAkJLyogTXVzdCB3cml0ZSBkYXRhIC9h ZnRlci8gcmVhZGluZyB0aGUgY29uc3VtZXIgaW5kZXguICovCj4+ICAJCXZpcnRfbWIoKTsKPj4g IAo+PiArCQlkc3QgPSBnZXRfb3V0cHV0X2NodW5rKGNvbnMsIHByb2QsIGludGYtPnJlcSwgJmF2 YWlsKTsKPj4gKwkJaWYgKGF2YWlsID09IDApCj4+ICsJCQljb250aW51ZTsKPiAKPiBTaG91bGQg d2UgY29udGludWUgdGhlIGxvb3AgaGVyZSBvciByZXR1cm4/IFdlIGFyZSB3YWl0aW5nIGZvciB0 aGUKPiByZWFkZXIgdG8gZ2V0IHN0dWZmIG9mZiB0aGUgcmluZy4KCmF2YWlsID09IDAgY2FuIGhh cHBlbiBvbmx5IGlmIHRoZSByZWFkZXIganVzdCBtb2RpZmllZCByZXFfY29ucwpiZXR3ZWVuIHVz IHJlYWRpbmcgaXQgdG8gY29ucyBhbmQgdGVzdGluZyBmb3IgZnJlZSBzcGFjZSB2aWEKeGJfZGF0 YV90b193cml0ZSgpLiBTbyB0aGUgKGxvY2FsKSByZXRyeSBzaG91bGQgaGFwcGVuIG9ubHkgdmVy eQpyYXJlbHkgYW5kIGV4YWN0bHkgb25jZSBiZXR3ZWVuIHdyaXRpbmcgYW55IGZ1cnRoZXIgYnl0 ZXMuIFdlCmNvdWxkIHJldHVybiwgb2YgY291cnNlLCBidXQgdGhlbiB0aGUgcmV0cnkgd291bGQg aGFwcGVuIGFueXdheQp2aWEgdGhlIG1haW4gdGhyZWFkIGxvb3AuCgo+PiArc3RhdGljIGludCBw cm9jZXNzX21zZyh2b2lkKQo+PiArewo+PiArCXN0YXRpYyBzdHJ1Y3QgeHNfdGhyZWFkX3N0YXRl X3JlYWQgc3RhdGU7Cj4+ICsJc3RydWN0IHhiX3JlcV9kYXRhICpyZXE7Cj4+ICsJaW50IGVycjsK Pj4gKwl1bnNpZ25lZCBpbnQgbGVuOwo+PiArCj4+ICsJaWYgKCFzdGF0ZS5pbl9tc2cpIHsKPj4g KwkJc3RhdGUuaW5fbXNnID0gdHJ1ZTsKPj4gKwkJc3RhdGUuaW5faGRyID0gdHJ1ZTsKPj4gKwkJ c3RhdGUudXNlZCA9IDA7Cj4+ICsKPj4gKwkJLyoKPj4gKwkJICogV2UgbXVzdCBkaXNhbGxvdyBz YXZlL3Jlc3RvcmUgd2hpbGUgcmVhZGluZyBhIG1lc3NhZ2UuCj4+ICsJCSAqIEEgcGFydGlhbCBy ZWFkIGFjcm9zcyBzL3IgbGVhdmVzIHVzIG91dCBvZiBzeW5jIHdpdGgKPj4gKwkJICogeGVuc3Rv cmVkLgo+PiArCQkgKi8KPj4gKwkJbXV0ZXhfbG9jaygmeHNfcmVzcG9uc2VfbXV0ZXgpOwo+PiAr Cj4+ICsJCWlmICgheGJfZGF0YV90b19yZWFkKCkpIHsKPj4gKwkJCS8qIFdlIHJhY2VkIHdpdGgg c2F2ZS9yZXN0b3JlOiBwZW5kaW5nIGRhdGEgJ2dvbmUnLiAqLwo+PiArCQkJbXV0ZXhfdW5sb2Nr KCZ4c19yZXNwb25zZV9tdXRleCk7Cj4+ICsJCQlzdGF0ZS5pbl9tc2cgPSBmYWxzZTsKPj4gKwkJ CXJldHVybiAwOwo+PiArCQl9Cj4+ICsJfQo+PiArCj4+ICsJaWYgKHN0YXRlLmluX2hkcikgewo+ PiArCQlpZiAoc3RhdGUudXNlZCAhPSBzaXplb2Yoc3RhdGUubXNnKSkgewo+PiArCQkJZXJyID0g eGJfcmVhZCgodm9pZCAqKSZzdGF0ZS5tc2cgKyBzdGF0ZS51c2VkLAo+PiArCQkJCSAgICAgIHNp emVvZihzdGF0ZS5tc2cpIC0gc3RhdGUudXNlZCk7Cj4+ICsJCQlpZiAoZXJyIDwgMCkKPj4gKwkJ CQlnb3RvIG91dDsKPj4gKwkJCXN0YXRlLnVzZWQgKz0gZXJyOwo+PiArCQkJaWYgKHN0YXRlLnVz ZWQgIT0gc2l6ZW9mKHN0YXRlLm1zZykpCj4+ICsJCQkJcmV0dXJuIDA7Cj4gCj4gV291bGQgaXQg YmUgcG9zc2libGUgdG8gZG8gbG9ja2luZyBhdCB0aGUgY2FsbGVyPyBJIHVuZGVyc3RhbmQgdGhh dCB5b3UKPiBhcmUgdHJ5aW5nIHRvIGhvbGQgdGhlIGxvY2sgYWNyb3NzIG11bHRpcGxlIGludm9j YXRpb25zIG9mIHRoaXMgZnVuY3Rpb24KPiBidXQgaXQgZmVlbHMgc29tZXdoYXQgY291bnRlci1p bnR1aXRpdmUgYW5kIGJ1Zy1wcm9uZS4KCkkgdGhpbmsgdGhhdCB3b3VsZCBiZSBkaWZmaWN1bHQu Cgo+IElmIGl0J3Mgbm90IHBvc3NpYmxlIHRoZW4gYXQgbGVhc3QgcGxlYXNlIGFkZCBhIGNvbW1l bnQgZXhwbGFpbmluZwo+IGxvY2tpbmcgYWxnb3JpdGhtLgoKT2theS4gU29tZXRoaW5nIGxpa2U6 CgovKgogKiB4c19yZXNwb25zZV9tdXRleCBpcyBsb2NrZWQgYXMgbG9uZyBhcyB3ZSBhcmUgcHJv Y2Vzc2luZyBvbmUKICogbWVzc2FnZS4gc3RhdGUuaW5fbXNnIHdpbGwgYmUgdHJ1ZSBhcyBsb25n IGFzIHdlIGFyZSBob2xkaW5nIHRoZQogKiBsb2NrIGluIHByb2Nlc3NfbXNnKCkuCiAqLwoKPj4g KwkJCWlmIChzdGF0ZS5tc2cubGVuID4gWEVOU1RPUkVfUEFZTE9BRF9NQVgpIHsKPj4gKwkJCQll cnIgPSAtRUlOVkFMOwo+PiArCQkJCWdvdG8gb3V0Owo+PiArCQkJfQo+PiArCQl9Cj4+ICsKPj4g KwkJbGVuID0gc3RhdGUubXNnLmxlbiArIDE7Cj4+ICsJCWlmIChzdGF0ZS5tc2cudHlwZSA9PSBY U19XQVRDSF9FVkVOVCkKPj4gKwkJCWxlbiArPSBzaXplb2YoKnN0YXRlLndhdGNoKTsKPj4gKwo+ PiArCQlzdGF0ZS5hbGxvYyA9IGttYWxsb2MobGVuLCBHRlBfTk9JTyB8IF9fR0ZQX0hJR0gpOwo+ IAo+IFdoeSBjYW4ndCB5b3Uga21hbGxvYyB0byBzdGF0ZS5ib2R5IG9ubHkgd2hlbiB0eXBlIT1Y U19XQVRDSF9FVkVOVCA/CgpJIG5lZWQgdG8gcmVhZCB0aGUgd2F0Y2ggZGF0YSwgdG9vLgoKPj4g KwkJaWYgKCFzdGF0ZS5hbGxvYykKPj4gKwkJCXJldHVybiAtRU5PTUVNOwo+PiArCj4+ICsJCWlm IChzdGF0ZS5tc2cudHlwZSA9PSBYU19XQVRDSF9FVkVOVCkKPj4gKwkJCXN0YXRlLmJvZHkgPSBz dGF0ZS53YXRjaC0+Ym9keTsKPj4gKwkJZWxzZQo+PiArCQkJc3RhdGUuYm9keSA9IHN0YXRlLmFs bG9jOwo+PiArCQlzdGF0ZS5pbl9oZHIgPSBmYWxzZTsKPj4gKwkJc3RhdGUudXNlZCA9IDA7Cj4+ ICsJfQoKPj4gK3N0YXRpYyBpbnQgcHJvY2Vzc193cml0ZXModm9pZCkKPj4gK3sKPj4gKwlzdGF0 aWMgc3RydWN0IHhzX3RocmVhZF9zdGF0ZV93cml0ZSBzdGF0ZTsKPj4gKwl2b2lkICpiYXNlOwo+ PiArCXVuc2lnbmVkIGludCBsZW47Cj4+ICsJaW50IGVyciA9IDA7Cj4+ICsKPj4gKwlpZiAoIXhi X2RhdGFfdG9fd3JpdGUoKSkKPj4gKwkJcmV0dXJuIDA7Cj4+ICsKPj4gKwltdXRleF9sb2NrKCZ4 Yl93cml0ZV9tdXRleCk7Cj4+ICsKPj4gKwlpZiAoIXN0YXRlLnJlcSkgewo+PiArCQlzdGF0ZS5y ZXEgPSBsaXN0X2ZpcnN0X2VudHJ5KCZ4Yl93cml0ZV9saXN0LAo+PiArCQkJCQkgICAgIHN0cnVj dCB4Yl9yZXFfZGF0YSwgbGlzdCk7Cj4+ICsJCXN0YXRlLmlkeCA9IC0xOwo+PiArCQlzdGF0ZS51 c2VkID0gMDsKPj4gKwl9Cj4+ICsKPj4gKwlpZiAoc3RhdGUucmVxLT5zdGF0ZSA9PSB4Yl9yZXFf c3RhdGVfYWJvcnRlZCkKPj4gKwkJZ290byBvdXRfZXJyOwo+PiArCj4+ICsJd2hpbGUgKHN0YXRl LmlkeCA8IHN0YXRlLnJlcS0+bnVtX3ZlY3MpIHsKPj4gKwkJaWYgKHN0YXRlLmlkeCA8IDApIHsK Pj4gKwkJCWJhc2UgPSAmc3RhdGUucmVxLT5tc2c7Cj4+ICsJCQlsZW4gPSBzaXplb2Yoc3RhdGUu cmVxLT5tc2cpOwo+PiArCQl9IGVsc2Ugewo+PiArCQkJYmFzZSA9IHN0YXRlLnJlcS0+dmVjW3N0 YXRlLmlkeF0uaW92X2Jhc2U7Cj4+ICsJCQlsZW4gPSBzdGF0ZS5yZXEtPnZlY1tzdGF0ZS5pZHhd Lmlvdl9sZW47Cj4+ICsJCX0KPj4gKwkJZXJyID0geGJfd3JpdGUoYmFzZSArIHN0YXRlLnVzZWQs IGxlbiAtIHN0YXRlLnVzZWQpOwo+PiArCQlpZiAoZXJyIDwgMCkKPj4gKwkJCWdvdG8gb3V0X2Vy cjsKPj4gKwkJc3RhdGUudXNlZCArPSBlcnI7Cj4+ICsJCWlmIChzdGF0ZS51c2VkICE9IGxlbikK Pj4gKwkJCWdvdG8gb3V0Owo+PiArCj4+ICsJCXN0YXRlLmlkeCsrOwo+PiArCQlzdGF0ZS51c2Vk ID0gMDsKPj4gKwl9Cj4+ICsKPj4gKwkvKgo+PiArCSAqIFlvdSB3b3VsZCBleHBlY3QgdGhlIGZv bGxvd2luZyB0byBiZSByYWN5LCBidXQgYXMgdGhlIHJlc3BvbnNlIGlzCj4+ICsJICogYmVpbmcg cmVhZCBieSBvdXIgdGhyZWFkIHRoZXJlIGlzIG5vIHJpc2sgb2YgcmVxIGJlaW5nIGZyZWVkCj4+ ICsJICogdW5kZXIgb3VyIGZlZXQuCj4+ICsJICovCj4gCj4gSSBkb24ndCB0aGluayBJIHVuZGVy c3RhbmQgdGhpcyAoYW5kIGl0J3MgbWlzc2luZyBhICJzbyIgb3Igc29tZXRoaW5nCj4gbGlrZSB0 aGF0IGJldHdlZW4gInRocmVhZCIgYW5kICJ0aGVyZSIpLiBJZiB0aGlzIGlzIG5vdCByYWN5LCB3 aHkgYXJlIHdlCj4gZG9pbmcgdGhpcyB1bmRlciB4Yl93cml0ZV9tdXRleD8KCllvdSBhcmUgcmln aHQuIFRoaXMgd2FzIGEgcHJvYmxlbSBpbiBhbiBpbnRlcm1lZGlhdGUgc3RhZ2Ugb2YKZGV2ZWxv cG1lbnQsIGJ1dCBub3cgdGhlIGZyZWVpbmcgb2YgcmVxIGlzIGRvbmUgd2l0aCB4Yl93cml0ZV9t dXRleApoZWxkLiBJJ2xsIHJlbW92ZSB0aGUgY29tbWVudC4KCj4+ICsJbGlzdF9kZWwoJnN0YXRl LnJlcS0+bGlzdCk7Cj4+ICsJc3RhdGUucmVxLT5zdGF0ZSA9IHhiX3JlcV9zdGF0ZV93YWl0X3Jl cGx5Owo+PiArCWxpc3RfYWRkX3RhaWwoJnN0YXRlLnJlcS0+bGlzdCwgJnhzX3JlcGx5X2xpc3Qp Owo+PiArCXN0YXRlLnJlcSA9IE5VTEw7Cj4+ICsKPj4gKyBvdXQ6Cj4+ICsJbXV0ZXhfdW5sb2Nr KCZ4Yl93cml0ZV9tdXRleCk7Cj4+ICsKPj4gKwlyZXR1cm4gMDsKPj4gKwo+PiArIG91dF9lcnI6 Cj4+ICsJc3RhdGUucmVxLT5tc2cudHlwZSA9IFhTX0VSUk9SOwo+PiArCXN0YXRlLnJlcS0+ZXJy ID0gZXJyOwo+IAo+IFlvdSBkb24ndCBzZWVtIHRvIG5lZWQgdGhpcyBmb3IgeGJfcmVxX3N0YXRl X2Fib3J0ZWQgc2luY2UgeW91IGFyZQo+IGZyZWVpbmcgc3RhdGVfcmVxLiBPVE9ILCB3aHkgc2hv dWxkbid0IGFib3J0ZWQgcmVxdWVzdHMgZ2VuZXJhdGUgYW4KPiBlcnJvciByZXBseSBhcyB3ZWxs PwoKVGhleSBkby4gQmVmb3JlIHNldHRpbmcgeGJfcmVxX3N0YXRlX2Fib3J0ZWQgYSBwb3NzaWJs ZSBlcnJvcgppcyB0YWtlbiBmcm9tIHJlcSAoc2VlIHhzX3dhaXRfZm9yX3JlcGx5KCkpLiBJbiBj YXNlIG9mIGFuCmVhcmx5IGVycm9yIHJldHVybmVkIChFSU8gaW4gcmVhZF9yZXBseSgpKSB0aGVy ZSBpcyBub2JvZHkKd2FpdGluZyBmb3IgKGFub3RoZXIpIHJlc3BvbnNlLgoKPj4gKwlsaXN0X2Rl bCgmc3RhdGUucmVxLT5saXN0KTsKPj4gKwlpZiAoc3RhdGUucmVxLT5zdGF0ZSA9PSB4Yl9yZXFf c3RhdGVfYWJvcnRlZCkKPj4gKwkJa2ZyZWUoc3RhdGUucmVxKTsKPj4gKwllbHNlIHsKPj4gKwkJ c3RhdGUucmVxLT5zdGF0ZSA9IHhiX3JlcV9zdGF0ZV9nb3RfcmVwbHk7Cj4+ICsJCXdha2VfdXAo JnN0YXRlLnJlcS0+d3EpOwo+PiArCX0KPj4gKwo+PiArCW11dGV4X3VubG9jaygmeGJfd3JpdGVf bXV0ZXgpOwo+PiArCj4+ICsJc3RhdGUucmVxID0gTlVMTDsKPj4gKwo+PiArCXJldHVybiBlcnI7 Cj4+ICt9Cj4+ICsKPj4gK3N0YXRpYyBpbnQgeGJfdGhyZWFkX3dvcmsodm9pZCkKPj4gK3sKPj4g KwlyZXR1cm4geGJfZGF0YV90b19yZWFkKCkgfHwgeGJfZGF0YV90b193cml0ZSgpOwo+PiArfQo+ PiArCj4+ICtzdGF0aWMgaW50IHhlbmJ1c190aHJlYWQodm9pZCAqdW51c2VkKQo+PiArewo+PiAr CWludCBlcnI7Cj4+ICsKPj4gKwl3aGlsZSAoIWt0aHJlYWRfc2hvdWxkX3N0b3AoKSkgewo+PiAr CQlpZiAod2FpdF9ldmVudF9pbnRlcnJ1cHRpYmxlKHhiX3dhaXRxLCB4Yl90aHJlYWRfd29yaygp KSkKPj4gKwkJCWNvbnRpbnVlOwo+PiArCj4+ICsJCWVyciA9IHByb2Nlc3NfbXNnKCk7Cj4+ICsJ CWlmIChlcnIgPT0gLUVOT01FTSkKPj4gKwkJCXNjaGVkdWxlKCk7Cj4+ICsJCWVsc2UgaWYgKGVy cikKPj4gKwkJCXByX3dhcm4oImVycm9yICVkIHdoaWxlIHJlYWRpbmcgbWVzc2FnZVxuIiwgZXJy KTsKPj4gKwo+PiArCQllcnIgPSBwcm9jZXNzX3dyaXRlcygpOwo+PiArCQlpZiAoZXJyKQo+PiAr CQkJcHJfd2FybigiZXJyb3IgJWQgd2hpbGUgd3JpdGluZyBtZXNzYWdlXG4iLCBlcnIpOwo+IAo+ IElzIHRoZXJlIGEgY2hhbmNlIHRoYXQgZXJyb3JzIGFyZSBwZXJzaXN0ZW50IGFuZCB5b3UgdGhl biBzcGFtIHRoZSBsb2c/CgpPbmx5IGluIGNhc2UgeGVuc3RvcmVkIGlzIHNwYW1taW5nIHRoZSBy aW5nIGJ1ZmZlciB3aXRoIGlsbGVnYWwgZGF0YS4KSSBiZWxpZXZlIHRoaXMgaXMgcmF0aGVyIGlt cHJvYmFibGUgYW5kIHdlIGFyZSBkb29tZWQgaW4gdGhpcyBjYXNlCmFueXdheS4gT1RPSCBpdCBk b2Vzbid0IGh1cnQgdG8gc3dpdGNoIHRvIHByX3dhcm5fcmF0ZWxpbWl0ZWQoKS4KCj4gLWJvcmlz CgpUaGFua3MgZm9yIHRoZSBjb21tZW50cyEKCgpKdWVyZ2VuCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwpYZW4tZGV2ZWwgbWFpbGluZyBsaXN0Clhlbi1k ZXZlbEBsaXN0cy54ZW4ub3JnCmh0dHBzOi8vbGlzdHMueGVuLm9yZy94ZW4tZGV2ZWwK