From mboxrd@z Thu Jan 1 00:00:00 1970 From: Rusty Russell Subject: Re: [RFCv2 00/12] Introduce host-side virtio queue and CAIF Virtio. Date: Fri, 21 Dec 2012 16:41:23 +1030 Message-ID: <877goc0wac.fsf@rustcorp.com.au> References: <871ug75vp1.fsf@rustcorp.com.au> <1354718230-4486-1-git-send-email-sjur@brendeland.net> <20121206102750.GF10837@redhat.com> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20121206102750.GF10837@redhat.com> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Sender: virtualization-bounces@lists.linux-foundation.org Errors-To: virtualization-bounces@lists.linux-foundation.org To: "Michael S. Tsirkin" , Sjur =?utf-8?Q?Br=C3=A6ndeland?= Cc: Linus Walleij , Sjur =?utf-8?Q?Br=C3=A6ndeland?= , virtualization@lists.linux-foundation.org List-Id: virtualization@lists.linuxfoundation.org Ik1pY2hhZWwgUy4gVHNpcmtpbiIgPG1zdEByZWRoYXQuY29tPiB3cml0ZXM6Cgo+IE9uIFdlZCwg RGVjIDA1LCAyMDEyIGF0IDAzOjM2OjU4UE0gKzAxMDAsIFNqdXIgQnLDpm5kZWxhbmQgd3JvdGU6 Cj4+IEZlZWRiYWNrIG9uIHRoaXMgcGF0Y2gtc2V0IGlzIGFwcHJlY2lhdGVkLCBwYXJ0aWN1bGFy bHkgb24gc3RydWN0dXJlCj4+IGFuZCBjb2RlLXJldXNlIGJldHdlZW4gdmhvc3QuYyBhbmQgdGhl IGhvc3Qtc2lkZSB2aXJ0aW8tcXVldWUuCj4+IEknZCBhbHNvIGxpa2Ugc29tZSBzdWdnZXN0aW9u cyBvbiBob3cgdG8gaGFuZGxlIHRoZSBidWlsZCBjb25maWd1cmF0aW9uCj4+IGJldHRlciAtIGN1 cnJlbnRseSB0aGVyZSBhcmUgc29tZSB1bm5lY2Vzc2FyeSBidWlsZCBkZXBlbmRlbmNpZXMuCj4K PiBSdXN0eSBzZWVtcyB0byBkaXNhZ3JlZSBidXQgb25lIG9mIHRoZSBjb25jZXJucyBwZW9wbGUg aGF2ZSBhYm91dCB2aG9zdAo+IGlzIHNlY3VyaXR5OyBzbyBJIHZhbHVlIGdldHRpbmcgYXMgbXVj aCBzdGF0aWMgY2hlY2tpbmcgYXMgd2UgY2FuLiAgVGhpcwo+IGRpc2NhcmRzIF9fdXNlciBhbm5v dGF0aW9ucyBzbyB0aGlzIGRvZXNuJ3Qgd29yayBmb3IgbWUuCgpTb21ldGltZXMsIHdoZW4gd2Ug Z2VuZXJhbGl6ZSBjb2RlLCB3ZSBsb3NlIHNvbWUgdHlwZSBzYWZldHkuICBDYWxsYmFja3MKdGFr ZSB2b2lkICosIGZvciBleGFtcGxlLiAgQW5kIGl0IGhhcHBlbnMgKmFsbCB0aGUgdGltZSogd2l0 aCBjb25zdC4gIFdlCmRvbid0IGNyZWF0ZSBhIHNldCBvZiBwYXJhbGxlbCBjb25zdC1zYWZlIHJv dXRpbmVzLgoKRXh0cmFjdGluZyBjb21tb24gY29kZSB3aGVyZSBpdCBjYW4gYmUgc2hhcmVkIHBy b3ZpZGVzIGJldHRlciwgbm90IHdvcnNlCnNlY3VyaXR5LCBiZWNhdXNlIG1vcmUgcGVvcGxlIHdp bGwgcmVhZCBpdC4gIEkndmUgbmV2ZXIgYXVkaXRlZCB0aGUKdmhvc3QgY29kZSwgZm9yIGV4YW1w bGUuCgpXZSBhbHJlYWR5IGhhdmUgYSAnc3RydWN0IHZyaW5nJywgd2Ugc2hvdWxkIGp1c3QgdXNl IHRoYXQuCgpJIG1lYW50IHRvIGRvIG1vcmUgd29yayBvbiB0aGlzLCBidXQgSSd2ZSBydW4gb3V0 IG9mIHRpbWUgOiggSSB3YXMKdGhpbmtpbmcgb2YgYSBkcml2ZXJzL3ZpcnRpby92aXJ0aW9fcmlu Zy5jLCBhbmQgaW4gdGhhdCB3ZSdkIHB1dCB0aGUKd3JhcHBlcnMgZm9yIHZob3N0X25ldC9ibGss IGFuZCBmb3IgQ0FJRiwgZXRjLiAgV2UgY291bGQgYXQgbGVhc3QgaGF2ZSBhCnZhcmlhbnQgd2hp Y2ggZGlkIHRoZSBfX3VzZXIgZXRjIHRoaW5nLCBldmVuIGlmIHlvdSBoYXZlIHRvIHBhc3MgaW4K Z2V0ZGVzYygpLgoKZ2V0dTE2OiBnZXRfdXNlciBvciBhc3NpZ25tZW50LgpnZXRkZXNjOiBjb3B5 IChhbmQgY2hlY2ssIHRyYW5zbGF0ZSkgdGhlIGRlc2NyaXB0b3IuCmdldG1lbS9wdXRtZW06IG1l bWNweSBvciBjb3B5X3RvL2Zyb21fdXNlci4KCihDb21wbGV0ZWx5IHVudGVzdGVkLCBvZiBjb3Vy c2UuLi4pCgpUaG91Z2h0cz8KUnVzdHkuCgoKLyoKICogSGVscGVycyBmb3IgdGhlIGhvc3Qgc2lk ZSBvZiBhIHZpcnRpbyByaW5nLgogKgogKiBTaW5jZSB0aGVzZSBtYXkgYmUgaW4gdXNlcnNwYWNl LCB3ZSB1c2UgKGlubGluZSkgYWNjZXNzb3JzLgogKi8KI2luY2x1ZGUgPHVhcGkvbGludXgvdmly dGlvX3JpbmcuaD4KCi8qIFJldHVybnMgdnJpbmctPm51bSBpZiBlbXB0eSwgLXZlIG9uIGVycm9y LiAqLwpzdGF0aWMgaW5saW5lIGludCBfX3ZyaW5naF9nZXRfaGVhZChjb25zdCBzdHJ1Y3QgdnJp bmcgKnZyaW5nLAoJCQkJICBpbnQgKCpnZXR1MTYpKHUxNiAqdmFsLCB1MTYgKnApKQp7Cgl1MTYg bGFzdF9hdmFpbF9pZHgsIGF2YWlsX2lkeCwgaSwgaGVhZDsKCWludCBlcnI7CgoJZXJyID0gZ2V0 dTE2KCZhdmFpbF9pZHgsICZ2cmluZy0+YXZhaWwtPmlkeCk7CglpZiAoZXJyKSB7CgkJdnJpbmdo X2JhZCgiRmFpbGVkIHRvIGFjY2VzcyBhdmFpbCBpZHggYXQgJXAiLCAmdnEtPmF2YWlsLT5pZHgp OwoJCXJldHVybiBlcnI7Cgl9CgoJZXJyID0gZ2V0dTE2KCZsYXN0X2F2YWlsX2lkeCwgJnZyaW5n X2F2YWlsX2V2ZW50KHZyaW5nKSk7CglpZiAoZXJyKSB7CgkJdnJpbmdoX2JhZCgiRmFpbGVkIHRv IGFjY2VzcyBsYXN0IGF2YWlsIGlkeCBhdCAlcCIsCgkJCSAgICZ2cmluZ19hdmFpbF9ldmVudCh2 cmluZykpOwoJCXJldHVybiBlcnI7Cgl9CgoJaWYgKGxhc3RfYXZhaWxfaWR4ID09IGF2YWlsX2lk eCkKCQlyZXR1cm4gdnJpbmctPm51bTsKCgkvKiBPbmx5IGdldCBhdmFpbCByaW5nIGVudHJpZXMg YWZ0ZXIgdGhleSBoYXZlIGJlZW4gZXhwb3NlZCBieSBndWVzdC4gKi8KCXNtcF9ybWIoKTsKCglp ID0gbGFzdF9hdmFpbF9pZHggJiAodnJpbmctPm51bSAtIDEpOwoKCWVyciA9IGdldHUxNigmaGVh ZCwgJnZxLT5hdmFpbC0+cmluZ1tpXSk7CglpZiAoZXJyKSB7CgkJdnJpbmdoX2JhZCgiRmFpbGVk IHRvIHJlYWQgaGVhZDogaWR4ICVkIGFkZHJlc3MgJXAiLAoJCQkgICBsYXN0X2F2YWlsX2lkeCwg JnZxLT5hdmFpbC0+cmluZ1tpXSk7CgkJcmV0dXJuIGVycjsKCX0KCglpZiAoaGVhZCA+PSB2cmlu Zy0+bnVtKSB7CgkJdnJpbmdoX2JhZCgiR3Vlc3Qgc2F5cyBpbmRleCAldSA+ICV1IGlzIGF2YWls YWJsZSIsCgkJCSAgIGhlYWQsIHZyaW5nLT5udW0pOwoJCXJldHVybiAtRUlOVkFMOwoJfQoJcmV0 dXJuIGhlYWQ7Cn0KCnN0cnVjdCB2cmluZ2hfYWNjZXNzIHsKCS8qIFN0YXJ0IGFkZHJlc3MuICov CglzdHJ1Y3QgdnJpbmdfZGVzYyAqc3RhcnQ7CgkvKiBNYXhpbXVtIG51bWJlciBvZiBlbnRyaWVz LiAqLwoJdTMyIG1heDsKCgkvKiBDYWNoZWQgZGVzY3JpcHRvci4gKi8KCXN0cnVjdCB2cmluZ19k ZXNjIGRlc2M7Cn07CgovKgogKiBJbml0aWFsaXplIHRoZSB2cmluZ2hfYWNjZXNzIHN0cnVjdHVy ZSBmb3IgdGhpcyBoZWFkLgogKgogKiBGb3IgZGlyZWN0IGJ1ZmZlcnMsIHRoZSByYW5nZSBpcyBz aW1wbHkgdGhlIGRlc2NbXSBhcnJheSBpbiB0aGUgdnJpbmcuCiAqCiAqIEZvciBpbmRpcmVjdCBi dWZmZXJzLCB0aGUgcmFuZ2UgaXMgdGhlIGluZGlyZWN0IGVudHJ5OyBjaGVjaygpIGlzIGNhbGxl ZAogKiB0byB2bGlkYXRlIHRoaXMgcmFuZ2UuCiAqCiAqIC1lcnJvciBvdGhlcndpc2UuCiAqLwpz dGF0aWMgaW5saW5lIGludCBfX3ZyaW5naF9nZXRfYWNjZXNzKGNvbnN0IHN0cnVjdCB2cmluZyAq dnJpbmcsIHUxNiBoZWFkLAoJCQkJICAgIGludCAoKmdldGRlc2MpKHN0cnVjdCB2cmluZ19kZXNj ICpkc3QsCgkJCQkJCSAgIGNvbnN0IHN0cnVjdCB2cmluZ19kZXNjICpzcmMsCgkJCQkJCSAgIHZv aWQgKmFyZyksCgkJCQkgICAgdm9pZCAqYXJnLAoJCQkJICAgIHN0cnVjdCB2cmluZ2hfYWNjZXNz ICphY2MpCnsKCWludCBlcnI7CgoJZXJyID0gZ2V0ZGVzYygmYWNjLT5kZXNjLCAmdnJpbmctPmRl c2NbaGVhZF0sIGFyZyk7CglpZiAodW5saWtlbHkoZXJyKSkKCQlyZXR1cm4gZXJyOwoKCWlmIChh Y2MtPmRlc2MuZmxhZ3MgJiBWUklOR19ERVNDX0ZfSU5ESVJFQ1QpIHsKCQkvKiBXZSBkb24ndCBz dXBwb3J0IGNoYWluZWQgaW5kaXJlY3RzLiAqLwoJCWlmIChhY2MtPmRlc2MuZmxhZ3MgJiBWUklO R19ERVNDX0ZfTkVYVCkKCQkJcmV0dXJuIC1FSU5WQUw7CgkJaWYgKHVubGlrZWx5KGFjYy0+ZGVz Yy5sZW4gJSBzaXplb2YgZGVzYykpCgkJCXJldHVybiAtRUlOVkFMOwoKCQlhY2MtPnN0YXJ0ID0g KHZvaWQgKikobG9uZylhY2MtPmRlc2MuYWRkcjsKCQlhY2MtPm1heCA9IGFjYy0+ZGVzYy5sZW4g LyBzaXplb2YoZGVzYyk7CgoJCWlmIChhY2MtPm1heCA+IHZyaW5nLT5udW0pCgkJCXJldHVybiAt RUlOVkFMOwoKCQkvKiBGb3JjZSB1cyB0byByZWFkIGZpcnN0IGRlc2MgbmV4dCB0aW1lLiAqLwoJ CWFjYy0+ZGVzYy5sZW4gPSAwOwoJCWFjYy0+ZGVzYy5uZXh0ID0gMDsKCQlhY2MtPmRlc2MuZmxh Z3MgPSBWUklOR19ERVNDX0ZfTkVYVDsKCX0gZWxzZSB7CgkJYWNjLT5hZGRyID0gdnJpbmctPmRl c2M7CgkJYWNjLT5tYXggPSB2cmluZy0+bnVtOwoJCWFjYy0+aGVhZCA9IGhlYWQ7Cgl9CglyZXR1 cm4gMDsKfQoKLyoKICogQ29weSBzb21lIGJ5dGVzIGZyb20gdGhlIHZyaW5nIGRlc2NyaXB0b3Iu ICBSZXR1cm5zIG51bSBjb3BpZWQuCiAqCiAqIFlvdSBhcmUgZXhwZWN0ZWQgdG8gZXhoYXVzdCB0 aGUgcmVhZGFibGUgZGVzY3JpcHRvcnMgKGllLiBzdHVmZiBvdXRwdXQKICogZnJvbSB0aGUgb3Ro ZXIgc2lkZSkgYmVmb3JlIGxvb2tpbmcgZm9yIHdyaXRhYmxlIGRlc2NyaXB0b3JzLgogKi8Kc3Rh dGljIGlubGluZSBpbnQgX192cmluZ2hfcHVsbChzdHJ1Y3QgdnJpbmdoX2FjY2VzcyAqYWNjLCB2 b2lkICpkc3QsIHUzMiBsZW4sCgkJCSAgICAgIGludCAoKmdldGRlc2MpKHN0cnVjdCB2cmluZ19k ZXNjICpkc3QsCgkJCQkJICAgICBjb25zdCBzdHJ1Y3QgdnJpbmdfZGVzYyAqc3JjLAoJCQkJCSAg ICAgdm9pZCAqYXJnKSwKCQkJICAgICAgaW50ICgqZ2V0bWVtKSh2b2lkICpkc3QsIGNvbnN0IHZv aWQgKnNyYywgc2l6ZV90LAoJCQkJCSAgICB2b2lkICphcmcpLAoJCQkgICAgICB2b2lkICphcmcp CnsKCWludCBlcnIsIGRvbmUgPSAwOwoKCXdoaWxlIChsZW4pIHsKCQl2b2lkICpzcmM7CgkJdTMy IHJsZW47CgoJCS8qIEV4aGF1c3RlZCB0aGlzIGRlc2NyaXB0b3I/ICBSZWFkIG5leHQuICovCgkJ aWYgKGFjYy0+ZGVzYy5sZW4gPT0gMCkgewoJCQlpZiAoIShhY2MtPmRlc2MuZmxhZ3MgJiBWUklO R19ERVNDX0ZfTkVYVCkpCgkJCQlyZXR1cm4gZG9uZTsKCgkJCWlmIChhY2MtPmRlc2MubmV4dCA+ PSBhY2MtPm1heCkgewoJCQkJdnJpbmdoX2JhZCgiR3Vlc3QgY2hhaW5lZCBpbmRleCAldSA+ICV1 IiwKCQkJCQkgICBkZXNjLm5leHQsIGFjYy0+bWF4KTsKCQkJCXJldHVybiAtRUlOVkFMOwoJCQl9 CgoJCQlhY2MtPmhlYWQgPSBhY2MtPmRlc2MubmV4dDsKCQkJZXJyID0gZ2V0ZGVzYygmYWNjLT5k ZXNjLCBhY2MtPnN0YXJ0ICsgYWNjLT5oZWFkLCBhcmcpOwoJCQlpZiAodW5saWtlbHkoZXJyKSkK CQkJCXJldHVybiBlcnI7CgoJCQkvKiBObyBtb3JlIHJlYWRhYmxlIGRlc2NyaXB0b3JzPyAqLwoJ CQlpZiAodW5saWtlbHkoYWNjLT5kZXNjLmZsYWdzICYgVlJJTkdfREVTQ19GX1dSSVRFKSkKCQkJ CXJldHVybiBkb25lOwoJCX0KCgkJaWYgKGxlbiA8IGFjYy0+ZGVzYy5sZW4pCgkJCXJsZW4gPSBs ZW47CgkJZWxzZQoJCQlybGVuID0gYWNjLT5kZXNjLmxlbjsKCgkJc3JjID0gKHZvaWQgKikobG9u ZylhY2MtPmRlc2MuYWRkcjsKCQlpZiAodW5saWtlbHkoZ2V0bWVtKGRzdCwgc3JjLCBybGVuLCBh cmcpKSkKCQkJcmV0dXJuIC1FRkFVTFQ7CgoJCWFjYy0+ZGVzYy5sZW4gLT0gcmxlbjsKCQlhY2Mt PmRlc2MuYWRkciArPSBybGVuOwoJCWxlbiAtPSBybGVuOwoJCWRvbmUgKz0gcmxlbjsKCX0KCgly ZXR1cm4gZG9uZTsKfQoKLyogRmlsbCBpbiBpb3ZlYyBjb250YWluaW5nIHJlbWFpbmluZyByZWFk YWJsZSBkZXNjcmlwdG9ycywgcmV0dXJuIG51bQogKiAoY2FuIGJlIG5vIG1vcmUgdGhhbiB2cmlu Zy0+bnVtKS4gKi8Kc3RhdGljIGlubGluZSBpbnQgX192cmluZ2hfcmlvdihzdHJ1Y3QgdnJpbmdo X2FjY2VzcyAqYWNjLAoJCQkgICAgICBzdHJ1Y3QgaW92ZWMgcmlvdltdLAoJCQkgICAgICBpbnQg KCpnZXRkZXNjKShzdHJ1Y3QgdnJpbmdfZGVzYyAqZHN0LAoJCQkJCSAgICAgY29uc3Qgc3RydWN0 IHZyaW5nX2Rlc2MgKnNyYywKCQkJCQkgICAgIHZvaWQgKmFyZyksCgkJCSAgICAgIHZvaWQgKmFy ZykKewoJaW50IGVyciwgY291bnQgPSAwOwoKCXdoaWxlICghKGFjYy0+ZGVzYy5mbGFncyAmIFZS SU5HX0RFU0NfRl9XUklURSkpIHsKCQlpZiAoYWNjLT5kZXNjLmxlbiAhPSAwKSB7CgkJCWlmIChj b3VudCA9PSBhY2MtPm1heCkKCQkJCXJldHVybiAtRUxPT1A7CgkJCXJpb3YtPmlvdl9iYXNlID0g KHZvaWQgKiBfX3VzZXIpKGxvbmcpYWNjLT5kZXNjLmFkZHI7CgkJCXJpb3YtPmlvdl9sZW4gPSBh Y2MtPmRlc2MubGVuOwoJCQlyaW92Kys7CgkJCWNvdW50Kys7CgkJfQoJCWlmICghKGFjYy0+ZGVz Yy5mbGFncyAmIFZSSU5HX0RFU0NfRl9ORVhUKSkKCQkJYnJlYWs7CgkJaWYgKGFjYy0+ZGVzYy5u ZXh0ID49IGFjYy0+bWF4KQoJCQlyZXR1cm4gLUVJTlZBTDsKCgkJYWNjLT5oZWFkID0gYWNjLT5k ZXNjLm5leHQ7CgkJZXJyID0gZ2V0ZGVzYygmYWNjLT5kZXNjLCBhY2MtPnN0YXJ0ICsgYWNjLT5o ZWFkLCBhcmcpOwoJCWlmICh1bmxpa2VseShlcnIpKQoJCQlyZXR1cm4gZXJyOwoJfQoJcmV0dXJu IGNvdW50Owp9CgpzdGF0aWMgaW5saW5lIGludCBfX3ZyaW5naF9wdXNoKHN0cnVjdCB2cmluZ2hf YWNjZXNzICphY2MsCgkJCSAgICAgIGNvbnN0IHZvaWQgKnNyYywgdTMyIGxlbiwKCQkJICAgICAg aW50ICgqZ2V0ZGVzYykoc3RydWN0IHZyaW5nX2Rlc2MgKmRzdCwKCQkJCQkgICAgIGNvbnN0IHN0 cnVjdCB2cmluZ19kZXNjICpzcmMsCgkJCQkJICAgICB2b2lkICphcmcpLAoJCQkgICAgICBpbnQg KCpwdXRtZW0pKHZvaWQgKmRzdCwgY29uc3Qgdm9pZCAqc3JjLCBzaXplX3QsCgkJCQkJICAgIHZv aWQgKmFyZyksCgkJCSAgICAgIHZvaWQgKmFyZykKewoJaW50IGVyciwgZG9uZSA9IDA7CgoJd2hp bGUgKGxlbikgewoJCXZvaWQgKmRzdDsKCQl1MzIgd2xlbjsKCgkJLyogRXhoYXVzdGVkIHRoaXMg ZGVzY3JpcHRvcj8gIFJlYWQgbmV4dC4gKi8KCQlpZiAoYWNjLT5kZXNjLmxlbiA9PSAwKSB7CgkJ CWlmICghKGFjYy0+ZGVzYy5mbGFncyAmIFZSSU5HX0RFU0NfRl9ORVhUKSkKCQkJCXJldHVybiBk b25lOwoKCQkJaWYgKGFjYy0+ZGVzYy5uZXh0ID49IGFjYy0+bWF4KSB7CgkJCQl2cmluZ2hfYmFk KCJHdWVzdCBjaGFpbmVkIGluZGV4ICV1ID4gJXUiLAoJCQkJCSAgIGRlc2MubmV4dCwgYWNjLT5t YXgpOwoJCQkJcmV0dXJuIC1FSU5WQUw7CgkJCX0KCgkJCWFjYy0+aGVhZCA9IGFjYy0+ZGVzYy5u ZXh0OwoJCQllcnIgPSBnZXRkZXNjKCZhY2MtPmRlc2MsIGFjYy0+c3RhcnQgKyBhY2MtPmhlYWQs IGFyZyk7CgkJCWlmICh1bmxpa2VseShlcnIpKQoJCQkJcmV0dXJuIGVycjsKCgkJCS8qIE5vbi13 cml0YWJsZSBkZXNjcmlwdG9yIG91dCBvZiBvcmRlcj8gKi8KCQkJaWYgKHVubGlrZWx5KCEoYWNj LT5kZXNjLmZsYWdzICYgVlJJTkdfREVTQ19GX1dSSVRFKSkpCgkJCQlyZXR1cm4gLUVJTlZBTDsK CQl9CgoJCWlmIChsZW4gPCBhY2MtPmRlc2MubGVuKQoJCQl3bGVuID0gbGVuOwoJCWVsc2UKCQkJ d2xlbiA9IGFjYy0+ZGVzYy5sZW47CgoJCWRzdCA9ICh2b2lkICopKGxvbmcpYWNjLT5kZXNjLmFk ZHI7CgkJaWYgKHVubGlrZWx5KHB1dG1lbShkc3QsIHNyYywgd2xlbiwgYXJnKSkpCgkJCXJldHVy biAtRUZBVUxUOwoKCQlhY2MtPmRlc2MubGVuIC09IHdsZW47CgkJYWNjLT5kZXNjLmFkZHIgKz0g d2xlbjsKCQlsZW4gLT0gd2xlbjsKCQlkb25lICs9IHdsZW47Cgl9CgoJcmV0dXJuIGRvbmU7Cn0K Ci8qIEZpbGwgaW4gaW92ZWMgY29udGFpbmluZyByZW1haW5pbmcgd3JpdGFibGUgZGVzY3JpcHRv cnMsIHJldHVybiBudW0KICogKGNhbiBiZSBubyBtb3JlIHRoYW4gdnJpbmctPm51bSkuICovCnN0 YXRpYyBpbmxpbmUgaW50IF9fdnJpbmdoX3dpb3Yoc3RydWN0IHZyaW5naF9hY2Nlc3MgKmFjYywK CQkJICAgICAgc3RydWN0IGlvdmVjIHdpb3ZbXSwKCQkJICAgICAgaW50ICgqZ2V0ZGVzYykoc3Ry dWN0IHZyaW5nX2Rlc2MgKmRzdCwKCQkJCQkgICAgIGNvbnN0IHN0cnVjdCB2cmluZ19kZXNjICpz cmMsCgkJCQkJICAgICB2b2lkICphcmcpLAoJCQkgICAgICB2b2lkICphcmcpCnsKCWludCBlcnIs IGNvdW50ID0gMDsKCgl3aGlsZSAoIShhY2MtPmRlc2MuZmxhZ3MgJiBWUklOR19ERVNDX0ZfV1JJ VEUpKSB7CgkJaWYgKGFjYy0+ZGVzYy5sZW4gIT0gMCkgewoJCQlpZiAoY291bnQgPT0gYWNjLT5t YXgpCgkJCQlyZXR1cm4gLUVMT09QOwoJCQl3aW92LT5pb3ZfYmFzZSA9ICh2b2lkICogX191c2Vy KShsb25nKWFjYy0+ZGVzYy5hZGRyOwoJCQl3aW92LT5pb3ZfbGVuID0gYWNjLT5kZXNjLmxlbjsK CQkJd2lvdisrOwoJCQljb3VudCsrOwoJCX0KCQlpZiAoIShhY2MtPmRlc2MuZmxhZ3MgJiBWUklO R19ERVNDX0ZfTkVYVCkpCgkJCWJyZWFrOwoJCWlmIChhY2MtPmRlc2MubmV4dCA+PSBhY2MtPm1h eCkKCQkJcmV0dXJuIC1FSU5WQUw7CgoJCWFjYy0+aGVhZCA9IGFjYy0+ZGVzYy5uZXh0OwoJCWVy ciA9IGdldGRlc2MoJmFjYy0+ZGVzYywgYWNjLT5zdGFydCArIGFjYy0+aGVhZCwgYXJnKTsKCQlp ZiAodW5saWtlbHkoZXJyKSkKCQkJcmV0dXJuIGVycjsKCX0KCXJldHVybiBjb3VudDsKfQpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpWaXJ0dWFsaXphdGlv biBtYWlsaW5nIGxpc3QKVmlydHVhbGl6YXRpb25AbGlzdHMubGludXgtZm91bmRhdGlvbi5vcmcK aHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3JnL21haWxtYW4vbGlzdGluZm8vdmlydHVh bGl6YXRpb24=