From mboxrd@z Thu Jan 1 00:00:00 1970 From: akepner@sgi.com Subject: Re: [RFC/TOY]Extensible hashing and RCU Date: Mon, 5 Feb 2007 10:41:39 -0800 (PST) Message-ID: References: <20070204074143.26312.qmail@science.horizon.com> Mime-Version: 1.0 Content-Type: MULTIPART/MIXED; BOUNDARY="8323328-1998195601-1170700899=:26852" Cc: davem@davemloft.net, netdev@vger.kernel.org To: linux@horizon.com Return-path: Received: from omx2-ext.sgi.com ([192.48.171.19]:59852 "EHLO omx2.sgi.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S933330AbXBESvX (ORCPT ); Mon, 5 Feb 2007 13:51:23 -0500 In-Reply-To: <20070204074143.26312.qmail@science.horizon.com> Sender: netdev-owner@vger.kernel.org List-Id: netdev.vger.kernel.org This message is in MIME format. The first part should be readable text, while the remaining parts are likely unreadable without MIME-aware tools. --8323328-1998195601-1170700899=:26852 Content-Type: TEXT/PLAIN; charset=US-ASCII; format=flowed On Sat, 4 Feb 2007 linux@horizon.com wrote: > I noticed in an LCA talk mention that apprently extensible hashing > with RCU access is an unsolved problem. Here's an idea for solving it. > > I'm assuming the table is a power of 2 in size with open chaining > for collisions. When the chains get too long, the table is doubled. > When the chains get too short, the table size is halved. > ..... For purposes of discussion, I've attached a "toy" implementation for doing dynamic resizing of a hashtable. It is useless, except as a proof of concept. I think this is very similar to what you are describing, no? -- Arthur --8323328-1998195601-1170700899=:26852 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="nethash.c" Content-Transfer-Encoding: BASE64 Content-ID: Content-Description: resizable hashtable toy implementation Content-Disposition: attachment; filename="nethash.c" DQojaW5jbHVkZSA8bGludXgvaW5pdC5oPg0KI2luY2x1ZGUgPGxpbnV4L21v ZHVsZS5oPg0KI2luY2x1ZGUgPGxpbnV4L2tlcm5lbC5oPg0KI2luY2x1ZGUg PGxpbnV4L3ZtYWxsb2MuaD4NCiNpbmNsdWRlIDxsaW51eC9zZXFsb2NrLmg+ DQojaW5jbHVkZSA8bGludXgvcmN1cGRhdGUuaD4NCiNpbmNsdWRlIDxsaW51 eC9uZXRkZXZpY2UuaD4NCiNpbmNsdWRlIDxsaW51eC9wcm9jX2ZzLmg+DQoj aW5jbHVkZSA8bGludXgvc2VxX2ZpbGUuaD4NCg0KI2luY2x1ZGUgPGFzbS91 YWNjZXNzLmg+DQoNCiNkZWZpbmUgX05FVEhBU0hfQlVGU1pfIDE2DQojZGVm aW5lIE1PRFVMRV9OQU1FICJuZXRoYXNoIg0KDQojZGVmaW5lIF9ERUJVR19J VF8NCiNpZmRlZiAgX0RFQlVHX0lUXw0KI2RlZmluZSBucHJpbnRrKHguLi4p IHByaW50ayhLRVJOX0FMRVJUIHgpOw0KI2Vsc2UgIC8qICFfREVCVUdfSVRf ICovDQojZGVmaW5lIG5wcmludGsoeCkNCiNlbmRpZiAvKiBfREVCVUdfSVRf ICovDQoNCnN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50cnkgKm5oX3Byb2Nf ZGlyOw0KDQplbnVtIG5oX3R5cGUgeyBOSF9FTlRSWSwgTkhfSEVBRCB9Ow0K DQoNCnN0cnVjdCBuaF9pdGVtIHsNCgkvKiB0aGUgbGlzdCBoZWFkIG11c3Qg YmUgZmlyc3QgZm9sbG93ZWQgYnkgbmhfdHlwZSAqLw0KCXN0cnVjdCBsaXN0 X2hlYWQJbmhfbGlzdDsNCgllbnVtIG5oX3R5cGUJCW5oX3R5cGU7DQp9Ow0K DQpzdHJ1Y3QgbmhfZW50cnkgew0KCS8qIHRoZSBsaXN0IGhlYWQgbXVzdCBi ZSBmaXJzdCBmb2xsb3dlZCBieSBuaF90eXBlICovDQoJc3RydWN0IGxpc3Rf aGVhZAluaF9saXN0Ow0KCWVudW0gbmhfdHlwZQkJbmhfdHlwZTsNCgl1bnNp Z25lZCBsb25nCQlkYXRhOw0KCXN0cnVjdCByY3VfaGVhZAkJcmN1X2hlYWQ7 DQp9Ow0KDQpzdHJ1Y3QgbmhfaGVhZCB7DQoJLyogdGhlIGxpc3QgaGVhZCBt dXN0IGJlIGZpcnN0IGZvbGxvd2VkIGJ5IG5oX3R5cGUgKi8NCglzdHJ1Y3Qg bGlzdF9oZWFkCWxpc3Q7DQoJZW51bSBuaF90eXBlCQluaF90eXBlOw0KCXNw aW5sb2NrX3QJCWxvY2s7DQp9Ow0KDQpzdHJ1Y3Qgbmggew0KCXVuc2lnbmVk IGxvbmcJbmVudHJpZXM7DQoJc3RydWN0IG5oX2hlYWQqCWhhc2g7DQoJc3Ry dWN0IHJjdV9oZWFkCXJjdV9oZWFkOw0KfTsNCg0KDQpzdGF0aWMgc3RydWN0 IG5oICogX19uaDsNCg0Kc3RhdGljIERFRklORV9TRVFMT0NLKG5ldGhhc2hf c2VxKTsNCnN0YXRpYyBERUZJTkVfTVVURVgobmV0aGFzaF9yZXNpemVfbXV0 ZXgpOw0KDQpleHRlcm4gdm9pZCAqIHN5c3RlbV9oYXNoX2FsbG9jKHVuc2ln bmVkIGxvbmcgc3opOw0KZXh0ZXJuIHZvaWQgc3lzdGVtX2hhc2hfZnJlZSh2 b2lkICogdiwgdW5zaWduZWQgbG9uZyBzeik7DQoNCi8qIFhYWCBuaF9kdW1w KCkgaXMgZm9yIGZvciBkZWJ1ZyBvbmx5IA0KICogaXQgbXVzdCBiZSBjYWxs ZWQgdW5kZXIgcmN1X3JlYWRfbG9jaygpICovDQpzdGF0aWMgaW50IG5oX2R1 bXAoc3RydWN0IG5oICogbmgsIGNvbnN0IGNoYXIgKiBkZWJ1Z19zdHIpOw0K DQpzdGF0aWMgc3RydWN0IG5oICogZ2V0X25oKHZvaWQpOw0KDQpzdGF0aWMg dW5zaWduZWQgbG9uZyBuaF9oYXNodmFsKHVuc2lnbmVkIGxvbmcgZGF0YSkN CnsNCglyZXR1cm4gZGF0YTsNCn0NCg0Kc3RhdGljIHZvaWQgbmhfZW50cnlf ZnJlZShzdHJ1Y3QgcmN1X2hlYWQgKiBoZWFkKQ0Kew0KCXN0cnVjdCBuaF9l bnRyeSAqIGVudHJ5ID0gY29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBuaF9l bnRyeSwgcmN1X2hlYWQpOw0KCW5wcmludGsoIiVzOiBmcmVlaW5nIGVudHJ5 IHdpdGggZGF0YSAlbHVcbiIsIF9fRlVOQ1RJT05fXywgZW50cnktPmRhdGEp Ow0KCWtmcmVlKGVudHJ5KTsNCn0NCg0Kc3RhdGljIHZvaWQgbmhfZnJlZShz dHJ1Y3QgcmN1X2hlYWQgKiBoZWFkKQ0Kew0KCXN0cnVjdCBuaCAqIG5oID0g Y29udGFpbmVyX29mKGhlYWQsIHN0cnVjdCBuaCwgcmN1X2hlYWQpOw0KCXVu c2lnbmVkIGxvbmcgbmVudHJpZXMgPSBuaC0+bmVudHJpZXM7DQoJdW5zaWdu ZWQgbG9uZyBzaXplID0gc2l6ZW9mIChzdHJ1Y3QgbmhfaGVhZCkgKiBuZW50 cmllczsNCglucHJpbnRrKCIlczogZnJlZWluZyBuaCBvZiBzaXplICVsdVxu IiwgX19GVU5DVElPTl9fLCBzaXplKTsNCglzeXN0ZW1faGFzaF9mcmVlKCh2 b2lkICopbmgtPmhhc2gsIHNpemUpOw0KCW5wcmludGsoIiVzOiBmcmVlaW5n IG5oXG4iLCBfX0ZVTkNUSU9OX18pOw0KCWtmcmVlKG5oKTsNCn0NCg0KLyog Y2FsbGVkIHdpdGggaGVhZCdzIHNwaW5fbG9jayBoZWxkICovDQpzdGF0aWMg aW50IF9fbmhfaW5zZXJ0KHN0cnVjdCBuaF9lbnRyeSAqIGVudHJ5LCANCgkJ ICAgICAgIHN0cnVjdCBuaF9oZWFkICogaGVhZCwNCgkJICAgICAgIHVuc2ln bmVkIGxvbmcgbmVudHJpZXMpDQp7DQoJc3RydWN0IGxpc3RfaGVhZCAqIHBy ZXY7IC8qIGluc2VydCBlbnRyeSBhZnRlciBwcmV2ICovDQoJc3RydWN0IGxp c3RfaGVhZCAqIGxpc3Q7DQoNCglucHJpbnRrKCIlczogbGlua2luZyBlbnRy eSB3aXRoIGRhdGEgJWx1XG4iLCBfX0ZVTkNUSU9OX18sIA0KCQllbnRyeS0+ ZGF0YSk7DQoNCgkvKiBmaW5kIHRoZSBhcHByb3ByaWF0ZSBzcG90IHRvIHBs YWNlIGVudHJ5ICovDQoJcHJldiA9ICZoZWFkLT5saXN0Ow0KCWlmICggbmhf aGFzaHZhbChlbnRyeS0+ZGF0YSkgJiBuZW50cmllcyApIHsNCgkJbGlzdF9m b3JfZWFjaF9yY3UobGlzdCwgJmhlYWQtPmxpc3QpIHsNCgkJCXN0cnVjdCBu aF9lbnRyeSAqIHRtcDsNCgkJCXN0cnVjdCBuaF9pdGVtICogaXRlbSA9IChz dHJ1Y3QgbmhfaXRlbSAqKWxpc3Q7DQoJCQlpZiAoaXRlbS0+bmhfdHlwZSAh PSBOSF9FTlRSWSkNCgkJCQljb250aW51ZTsNCgkJCXRtcCA9IGxpc3RfZW50 cnkobGlzdCwgc3RydWN0IG5oX2VudHJ5LCBuaF9saXN0KTsNCgkJCXByZXYg PSAmdG1wLT5uaF9saXN0Ow0KCQkJaWYgKG5oX2hhc2h2YWwodG1wLT5kYXRh KSAmIG5lbnRyaWVzKSB7DQoJCQkJLyogcHV0IGVudHJ5IGFmdGVyIG5oICov DQoJCQkJYnJlYWs7DQoJCQl9DQoJCX0NCgl9DQoJbGlzdF9hZGRfcmN1KCZl bnRyeS0+bmhfbGlzdCwgcHJldik7DQoNCglyZXR1cm4gMDsNCg0KfQ0KDQov KiBjYWxsZWQgd2l0aCBoZWFkJ3MgbG9jayBoZWxkICovDQpzdGF0aWMgdm9p ZCBfX25oX3NvcnRfY2hhaW4oc3RydWN0IG5oX2hlYWQgKiBoZWFkLCB1bnNp Z25lZCBsb25nIG5lbnRyaWVzKQ0Kew0KCXN0cnVjdCBsaXN0X2hlYWQgdG1w LCAqbGlzdCA9ICZoZWFkLT5saXN0Ow0KCXN0cnVjdCBuaF9lbnRyeSogZW50 cnk7DQoNCglJTklUX0xJU1RfSEVBRCgmdG1wKTsNCglsaXN0X3NwbGljZV9p bml0KGxpc3QsICZ0bXApOw0KCXdoaWxlICggIWxpc3RfZW1wdHkoJnRtcCkg KSB7DQoJCXN0cnVjdCBsaXN0X2hlYWQgKiBmaXJzdCA9IHRtcC5uZXh0Ow0K DQoJCWxpc3RfZGVsKGZpcnN0KTsNCgkJZW50cnkgPSAoc3RydWN0IG5oX2Vu dHJ5KilmaXJzdDsNCg0KCQlfX25oX2luc2VydChlbnRyeSwgaGVhZCwgbmVu dHJpZXMpOw0KCX0NCg0KfQ0KDQpzdGF0aWMgdm9pZCBuaF9maXh1cF9ncm93 KHN0cnVjdCByY3VfaGVhZCAqIGhlYWQpDQp7DQoJc3RydWN0IG5oICogbmg7 DQoJc3RydWN0IG5oICogb2ggPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0 IG5oLCByY3VfaGVhZCk7DQoJdW5zaWduZWQgbG9uZyBpLCBvZW50cmllcyA9 IG9oLT5uZW50cmllczsNCg0KCXJjdV9yZWFkX2xvY2soKTsNCgluaCA9IGdl dF9uaCgpOw0KDQoJLyogdGhpcyBpcyBhbiByY3VfY2FsbGJhY2sgLSBvbmx5 IHRoZSAibmV3IiBuaCBpcyANCgkgKiB2aXNpYmxlIGVsc2V3aGVyZSBub3cs IHNvIG1ha2Ugc3VyZSB0byBhY2Nlc3MgDQoJICogdGhlIGhhc2h0YWJsZSB1 c2luZyB0aGUgcHJvcGVyIChuZXcpIGxvY2tzLC4uLiAqLw0KCWZvciAoaSA9 IDA7IGkgPCBvZW50cmllczsgaSsrKSB7DQoJCXN0cnVjdCBuaF9oZWFkICog bmhlYWQxID0gJm5oLT5oYXNoW2ldOw0KCQlzdHJ1Y3QgbmhfaGVhZCAqIG5o ZWFkMiA9ICZuaC0+aGFzaFtpICsgb2VudHJpZXNdOw0KCQlzdHJ1Y3QgbGlz dF9oZWFkICpvbGlzdCwgKnRhaWwxLCAqdGFpbDI7DQoNCgkJLyogZ3JhYiBs b2NrcyBpbiBvcmRlciAqLw0KCQlzcGluX2xvY2soJm5oZWFkMS0+bG9jayk7 DQoJCXNwaW5fbG9jaygmbmhlYWQyLT5sb2NrKTsNCg0KCQlvbGlzdCA9ICZv aC0+aGFzaFtpXS5saXN0Ow0KDQoJCWxpc3RfZGVsKG9saXN0KTsgLyogZG9u J3QgbmVlZCByY3UgdmFyaWFudCBoZXJlICovDQoNCgkJdGFpbDEgPSBuaGVh ZDItPmxpc3QucHJldjsNCgkJdGFpbDIgPSBuaGVhZDEtPmxpc3QucHJldjsN Cg0KCQluaGVhZDEtPmxpc3QucHJldiA9IHRhaWwxOw0KCQluaGVhZDItPmxp c3QucHJldiA9IHRhaWwyOw0KDQoJCXRhaWwxLT5uZXh0ID0gJm5oZWFkMS0+ bGlzdDsNCgkJdGFpbDItPm5leHQgPSAmbmhlYWQyLT5saXN0Ow0KDQoJCV9f bmhfc29ydF9jaGFpbihuaGVhZDEsIG9lbnRyaWVzIDw8IDEpOw0KCQlfX25o X3NvcnRfY2hhaW4obmhlYWQyLCBvZW50cmllcyA8PCAxKTsNCg0KCQlzcGlu X3VubG9jaygmbmhlYWQyLT5sb2NrKTsNCgkJc3Bpbl91bmxvY2soJm5oZWFk MS0+bG9jayk7DQoJfQ0KCXJjdV9yZWFkX3VubG9jaygpOw0KCW5oX2ZyZWUo aGVhZCk7DQp9DQoNCg0Kc3RhdGljIHZvaWQgbmhfZml4dXBfc2hyaW5rKHN0 cnVjdCByY3VfaGVhZCAqIGhlYWQpDQp7DQoJc3RydWN0IG5oICogbmg7DQoJ c3RydWN0IG5oICogb2ggPSBjb250YWluZXJfb2YoaGVhZCwgc3RydWN0IG5o LCByY3VfaGVhZCk7DQoJdW5zaWduZWQgbG9uZyBpLCBuZW50cmllczsNCg0K CXJjdV9yZWFkX2xvY2soKTsNCgluaCA9IGdldF9uaCgpOw0KDQoJbmVudHJp ZXMgPSBuaC0+bmVudHJpZXM7DQoNCgkvKiB0aGlzIGlzIGFuIHJjdV9jYWxs YmFjayAtIG9ubHkgdGhlICJuZXciIG5oIGlzIA0KCSAqIHZpc2libGUgZWxz ZXdoZXJlIG5vdywgc28gbWFrZSBzdXJlIHRvIGFjY2VzcyANCgkgKiB0aGUg aGFzaHRhYmxlIHVzaW5nIHRoZSBwcm9wZXIgKG5ldykgbG9ja3MsLi4uICov DQoJZm9yIChpID0gMDsgaSA8IG5oLT5uZW50cmllczsgaSsrKSB7DQoJCXN0 cnVjdCBuaF9oZWFkICogbmhlYWQgPSAmbmgtPmhhc2hbaV07DQoJCXN0cnVj dCBsaXN0X2hlYWQgKiBvbGlzdDEgPSAmb2gtPmhhc2hbaV0ubGlzdDsNCgkJ c3RydWN0IGxpc3RfaGVhZCAqIG9saXN0MiA9ICZvaC0+aGFzaFtpICsgbmVu dHJpZXNdLmxpc3Q7DQoJCXNwaW5fbG9jaygmbmhlYWQtPmxvY2spOw0KCQls aXN0X2RlbChvbGlzdDEpOyAvKiBkb24ndCBuZWVkIFJDVSB2YXJpYW50cyBo ZXJlICovDQoJCWxpc3RfZGVsKG9saXN0Mik7DQoJCV9fbmhfc29ydF9jaGFp bihuaGVhZCwgbmVudHJpZXMpOw0KCQlzcGluX3VubG9jaygmbmhlYWQtPmxv Y2spOw0KCX0NCglyY3VfcmVhZF91bmxvY2soKTsNCgluaF9mcmVlKGhlYWQp Ow0KfQ0KDQoNCi8qIGNhbGxlZCB1bmRlciByY3VfcmVhZF9sb2NrICovDQpz dGF0aWMgc3RydWN0IG5oICogZ2V0X25oKHZvaWQpDQp7DQoJdW5zaWduZWQg bG9uZyBzZXE7DQoJc3RydWN0IG5oICogbmggPSBOVUxMOw0KDQoJZG8gew0K CQlzZXEgPSByZWFkX3NlcWJlZ2luKCZuZXRoYXNoX3NlcSk7DQoJCW5oID0g X19uaDsNCgl9IHdoaWxlIChyZWFkX3NlcXJldHJ5KCZuZXRoYXNoX3NlcSwg c2VxKSk7DQoNCglyZXR1cm4gbmg7DQp9DQoNCi8qIHVzZSByZXR1cm5lZCB2 YWx1ZSBvbmx5IHVuZGVyIHJjdV9yZWFkX2xvY2sgKi8NCnN0YXRpYyBzdHJ1 Y3QgbmggKiBuaF9yZXBsYWNlKHN0cnVjdCBuaCAqIG5ldykNCnsNCglzdHJ1 Y3QgbmggKiBvbGQgPSBOVUxMOw0KDQoJd3JpdGVfc2VxbG9jaygmbmV0aGFz aF9zZXEpOw0KCW9sZCA9IF9fbmg7DQoJX19uaCA9IG5ldzsNCgl3cml0ZV9z ZXF1bmxvY2soJm5ldGhhc2hfc2VxKTsNCglyZXR1cm4gb2xkOw0KfQ0KDQoN Cg0Kc3RhdGljIHZvaWQgbmhfZGVzdHJveSh2b2lkKQ0Kew0KCXVuc2lnbmVk IGxvbmcgaTsNCglzdHJ1Y3QgbmggKiBuaDsNCg0KCXJjdV9yZWFkX2xvY2so KTsgDQoNCgluaCA9IG5oX3JlcGxhY2UoTlVMTCk7DQoNCglpZiAoIW5oKQ0K CQlnb3RvIG91dF91bmxvY2s7DQoNCglmb3IgKGkgPSAwOyBpIDwgbmgtPm5l bnRyaWVzOyBpKyspIHsNCgkJc3RydWN0IG5oX2hlYWQgKiBoZWFkID0gJm5o LT5oYXNoW2ldOw0KCQlzdHJ1Y3QgbGlzdF9oZWFkICpsaXN0Ow0KDQoJCXNw aW5fbG9jaygmaGVhZC0+bG9jayk7DQoJCWxpc3RfZm9yX2VhY2hfcmN1KGxp c3QsICZoZWFkLT5saXN0KSB7DQoJCQlzdHJ1Y3QgbmhfaXRlbSAqIGl0ZW0g PSAoc3RydWN0IG5oX2l0ZW0gKilsaXN0Ow0KCQkJc3RydWN0IG5oX2VudHJ5 ICplbnRyeTsNCgkJCWlmIChpdGVtLT5uaF90eXBlICE9IE5IX0VOVFJZKQ0K CQkJCWNvbnRpbnVlOw0KCQkJZW50cnkgPSBsaXN0X2VudHJ5KGxpc3QsIHN0 cnVjdCBuaF9lbnRyeSwgbmhfbGlzdCk7DQoJCQlsaXN0X2RlbF9yY3UoJmVu dHJ5LT5uaF9saXN0KTsNCgkJCW5wcmludGsoIiVzOiBkZWxpbmtpbmcgZW50 cnkgd2l0aCBkYXRhICVsdVxuIiwgDQoJCQkJX19GVU5DVElPTl9fLCBlbnRy eS0+ZGF0YSkNCgkJCWNhbGxfcmN1KCZlbnRyeS0+cmN1X2hlYWQsIG5oX2Vu dHJ5X2ZyZWUpOw0KCQl9DQoJCXNwaW5fdW5sb2NrKCZoZWFkLT5sb2NrKTsN Cgl9DQoJDQoJY2FsbF9yY3UoJm5oLT5yY3VfaGVhZCwgbmhfZnJlZSk7DQoN Cm91dF91bmxvY2s6DQoJcmN1X3JlYWRfdW5sb2NrKCk7DQp9DQoNCnN0YXRp YyB2b2lkIG5oX2luaXQoc3RydWN0IG5oKiBuaCwgDQoJCSAgICBzdHJ1Y3Qg bmhfaGVhZCAqIGhhc2gsDQoJCSAgICB1bnNpZ25lZCBsb25nIG5lbnRyaWVz KQ0Kew0KCXVuc2lnbmVkIGxvbmcgaTsNCg0KCWZvciAoaSA9IDA7IGkgPCBu ZW50cmllczsgaSsrKSB7DQoJCUlOSVRfTElTVF9IRUFEKCZoYXNoW2ldLmxp c3QpOw0KCQloYXNoW2ldLm5oX3R5cGUgPSBOSF9IRUFEOw0KCQlzcGluX2xv Y2tfaW5pdCgmaGFzaFtpXS5sb2NrKTsNCgl9DQoNCgluaC0+aGFzaCA9IGhh c2g7DQoJbmgtPm5lbnRyaWVzID0gbmVudHJpZXM7DQp9DQoNCnN0YXRpYyBz dHJ1Y3QgbmggKiBuaF9hbGxvYyh1bnNpZ25lZCBsb25nIG5lbnRyaWVzKQ0K ew0KDQoJc3RydWN0IG5oICogbmg7DQoJdW5zaWduZWQgbG9uZyBzejsNCglz dHJ1Y3QgbmhfaGVhZCAqIGhhc2g7DQoJLyogbmVudHJpZXMgbXVzdCBiZSBh IHBvd2VyIG9mIDIgKi8NCgluZW50cmllcyA9IHJvdW5kdXBfcG93X29mX3R3 byhuZW50cmllcyk7DQoJc3ogPSBuZW50cmllcyAqIHNpemVvZihzdHJ1Y3Qg bmhfaGVhZCk7DQoNCglucHJpbnRrKCIlczogY3JlYXRpbmcgaGFzaCBvZiAl bHUgZW50cmllcywgc2l6ZSAlbHUgYnl0ZXNcbiIsIA0KCQlfX0ZVTkNUSU9O X18sIG5lbnRyaWVzLCBzeik7DQoNCgluaCA9IGttYWxsb2Moc2l6ZW9mKHN0 cnVjdCBuaCksIEdGUF9LRVJORUwpOw0KCWlmICghbmgpIHsNCgkJbnByaW50 aygiJXM6IGZhaWxlZCB0byBhbGxvY2F0ZSBoYXNoIG9mIHNpemUgJWx1XG4i LCANCgkJCV9fRlVOQ1RJT05fXywgc3opOw0KCQlyZXR1cm4gTlVMTDsNCgl9 DQoNCgloYXNoID0gc3lzdGVtX2hhc2hfYWxsb2Moc3opOw0KCWlmICghaGFz aCkgew0KCQlucHJpbnRrKCIlczogZmFpbGVkIHRvIGFsbG9jYXRlIGhhc2gg b2Ygc2l6ZSAlbHVcbiIsIA0KCQkJX19GVU5DVElPTl9fLCBzeik7DQoJCWtm cmVlKG5oKTsNCgkJcmV0dXJuIE5VTEw7DQoJfQ0KDQoJbmhfaW5pdChuaCwg aGFzaCwgbmVudHJpZXMpOw0KDQoJcmV0dXJuIG5oOw0KfQ0KDQpzdGF0aWMg aW50IG5oX2NyZWF0ZSh1bnNpZ25lZCBsb25nIG5lbnRyaWVzKQ0Kew0KCXN0 cnVjdCBuaCAqIG5oOw0KDQoJbmhfZGVzdHJveSgpOw0KDQoJbmggPSBuaF9h bGxvYyhuZW50cmllcyk7DQoNCglpZiAoIW5oKQ0KCQlyZXR1cm4gLUVOT01F TTsNCg0KCW5oX3JlcGxhY2UobmgpOw0KDQoJcmV0dXJuIDA7DQp9DQoNCnN0 YXRpYyB1bnNpZ25lZCBsb25nIG5oX2J1Y2tldCh1bnNpZ25lZCBsb25nIGhh c2h2YWwsIHVuc2lnbmVkIGxvbmcgbmVudHJpZXMpDQp7DQoJLyogbmVudHJp ZXMgaXMgYSBwb3dlciBvZiAyICovDQoJcmV0dXJuIChoYXNodmFsICYgKG5l bnRyaWVzIC0gMSkpOw0KfQ0KDQpzdGF0aWMgaW50IG5oX2FkZCh1bnNpZ25l ZCBsb25nIGRhdGEpIA0Kew0KCXN0cnVjdCBuaF9lbnRyeSAqIGVudHJ5Ow0K CXN0cnVjdCBuaCAqIG5oID0gTlVMTDsNCglpbnQgcmV0ID0gMDsNCg0KCWVu dHJ5ID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IG5oX2VudHJ5KSwgR0ZQX0tF Uk5FTCk7DQoJaWYgKCFlbnRyeSkgcmV0dXJuIC1FTk9NRU07DQoNCgllbnRy eS0+ZGF0YSA9IGRhdGE7DQoJZW50cnktPm5oX3R5cGUgPSBOSF9FTlRSWTsN Cg0KCXJjdV9yZWFkX2xvY2soKTsNCg0KCW5oID0gZ2V0X25oKCk7DQoNCglp ZiAobmgpIHsNCgkJc3RydWN0IG5oX2hlYWQgKmhhc2ggPSBuaC0+aGFzaDsN CgkJdW5zaWduZWQgbG9uZyBuZW50cmllcyA9IG5oLT5uZW50cmllczsNCgkJ dW5zaWduZWQgbG9uZyBoYXNodmFsID0gbmhfaGFzaHZhbChkYXRhKTsNCgkJ dW5zaWduZWQgbG9uZyBidWNrZXQgID0gbmhfYnVja2V0KGhhc2h2YWwsIG5l bnRyaWVzKTsNCgkJc3RydWN0IG5oX2hlYWQgKiBoZWFkID0gJmhhc2hbYnVj a2V0XTsNCg0KCQlzcGluX2xvY2soJmhlYWQtPmxvY2spOw0KCQlyZXQgPSBf X25oX2luc2VydChlbnRyeSwgaGVhZCwgbmVudHJpZXMpOw0KCQlzcGluX3Vu bG9jaygmaGVhZC0+bG9jayk7DQoJfQ0KDQoJcmN1X3JlYWRfdW5sb2NrKCk7 DQoNCglyZXR1cm4gcmV0Ow0KfQ0KDQpzdGF0aWMgdm9pZCBuaF9taWdyYXRl X2dyb3coc3RydWN0IG5oICogb2xkLCBzdHJ1Y3QgbmggKiBuZXcpDQp7DQoJ dW5zaWduZWQgbG9uZyBpLCBvZW50cmllcyAgPSBvbGQtPm5lbnRyaWVzOw0K DQoJLyogdGhpcyBpcyBjYWxsZWQgcHJpb3IgdG8gY2FsbGluZyByZXBsYWNl X25oKCksIHNvIA0KCSAqIG9ubHkgdGhlICJvbGQiIG5oIGlzIHZpc2libGUg ZWxzZXdoZXJlIC0gb25seSANCgkgKiBhY2Nlc3MgdGhlIGhhc2h0YWJsZSB1 bmRlciB0aGUgYXBwcm9wcmlhdGUgIm9sZCIgDQoJICogbG9ja3MgKi8NCglm b3IgKCBpID0gMDsgaSA8IG9lbnRyaWVzOyBpKysgKSB7DQoNCgkJc3RydWN0 IG5oX2hlYWQgKiBvaGVhZCAgICAgPSAmb2xkLT5oYXNoW2ldOw0KCQlzdHJ1 Y3QgbGlzdF9oZWFkICAqIG9saXN0ICA9ICZvaGVhZC0+bGlzdDsNCgkJc3Ry dWN0IGxpc3RfaGVhZCAgKiBubGlzdDEgPSAmbmV3LT5oYXNoW2ldLmxpc3Q7 DQoJCXN0cnVjdCBsaXN0X2hlYWQgICogbmxpc3QyID0gJm5ldy0+aGFzaFtp ICsgb2VudHJpZXNdLmxpc3Q7DQoJCXN0cnVjdCBuaF9lbnRyeSAqZW50cnk7 DQoJCXN0cnVjdCBsaXN0X2hlYWQgKiBsaXN0LCAqIHByZXYgPSBOVUxMOw0K DQoJCW5wcmludGsoIiVzOiBtaWdyYXRpbmcgYnVja2V0ICVsdVxuIiwgX19G VU5DVElPTl9fLCBpKTsNCg0KCQlzcGluX2xvY2soJm9oZWFkLT5sb2NrKTsN Cg0KCQlsaXN0X2FkZF9yY3Uobmxpc3QxLCBvbGlzdCk7DQoNCgkJLyogZmlu ZCB3aGVyZSB0byBzcGxpdCBjaGFpbiAqLw0KCQlsaXN0X2Zvcl9lYWNoX3Jj dShsaXN0LCBvbGlzdCkgew0KCQkJc3RydWN0IG5oX2l0ZW0gKiBpdGVtID0g KHN0cnVjdCBuaF9pdGVtICopbGlzdDsNCgkJCWlmIChpdGVtLT5uaF90eXBl ICE9IE5IX0VOVFJZKSB7DQoJCQkJcHJldiA9IGxpc3Q7DQoJCQkJY29udGlu dWU7DQoJCQl9DQoJCQllbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0 IG5oX2VudHJ5LCBuaF9saXN0KTsNCgkJCWlmIChuaF9oYXNodmFsKGVudHJ5 LT5kYXRhKSAmIG9lbnRyaWVzKSB7DQoJCQkJYnJlYWs7DQoJCQl9DQoJCQlw cmV2ID0gbGlzdDsNCgkJfQ0KDQoJCUJVR19PTihwcmV2ID09IE5VTEwpOw0K DQoJCWxpc3RfYWRkX3JjdShubGlzdDIsIHByZXYpOw0KDQoJCXNwaW5fdW5s b2NrKCZvaGVhZC0+bG9jayk7DQoNCgl9DQp9DQoNCnN0YXRpYyB2b2lkIG5o X21pZ3JhdGVfc2hyaW5rKHN0cnVjdCBuaCAqIG9sZCwgc3RydWN0IG5oICog bmV3KQ0Kew0KCXVuc2lnbmVkIGxvbmcgaSwgb2VudHJpZXMgPSBvbGQtPm5l bnRyaWVzOw0KDQoJLyogdGhpcyBpcyBjYWxsZWQgcHJpb3IgdG8gY2FsbGlu ZyByZXBsYWNlX25oKCksIHNvIA0KCSAqIG9ubHkgdGhlICJvbGQiIG5oIGlz IHZpc2libGUgZWxzZXdoZXJlIC0gb25seSANCgkgKiBhY2Nlc3MgdGhlIGhh c2h0YWJsZSB1bmRlciB0aGUgYXBwcm9wcmlhdGUgIm9sZCIgDQoJICogbG9j a3MgKi8NCglmb3IgKCBpID0gMDsgaSA8IG9lbnRyaWVzID4+IDE7IGkrKyAp IHsNCg0KCQlzdHJ1Y3QgbGlzdF9oZWFkICogbmxpc3QgID0gJm5ldy0+aGFz aFtpXS5saXN0Ow0KCQlzdHJ1Y3QgbmhfaGVhZCAqIG9oZWFkMSAgID0gJm9s ZC0+aGFzaFtpXTsNCgkJc3RydWN0IG5oX2hlYWQgKiBvaGVhZDIgICA9ICZv bGQtPmhhc2hbaSArIChvZW50cmllcz4+MSldOw0KCQlzdHJ1Y3QgbGlzdF9o ZWFkICogb2xpc3QxLCAqIG9saXN0MiwgdG1wOw0KDQoJCW5wcmludGsoIiVz OiBtaWdyYXRpbmcgYnVja2V0ICVsdVxuIiwgX19GVU5DVElPTl9fLCBpKTsN Cg0KCQkvKiBhY3F1aXJlIGxvY2tzIGluIG9yZGVyICovDQoJCXNwaW5fbG9j aygmb2hlYWQxLT5sb2NrKTsNCgkJc3Bpbl9sb2NrKCZvaGVhZDItPmxvY2sp Ow0KDQoJCW9saXN0MSA9ICZvaGVhZDEtPmxpc3Q7DQoJCW9saXN0MiA9ICZv aGVhZDItPmxpc3Q7DQoNCgkJSU5JVF9MSVNUX0hFQUQoJnRtcCk7DQoJCWxp c3RfYWRkX3RhaWxfcmN1KCZ0bXAsIG9saXN0Mik7DQoJCWxpc3Rfc3BsaWNl X2luaXQoJnRtcCwgb2xpc3QxLT5wcmV2KTsNCg0KCQlsaXN0X2FkZF90YWls X3JjdShubGlzdCwgb2xpc3QxKTsNCg0KCQlzcGluX3VubG9jaygmb2hlYWQy LT5sb2NrKTsNCgkJc3Bpbl91bmxvY2soJm9oZWFkMS0+bG9jayk7DQoNCgl9 DQoNCn0NCg0KdW5zaWduZWQgbG9uZyBuaF9uZW50cmllc19ncm93KHZvaWQp IHsNCgl1bnNpZ25lZCBsb25nIG5lbnRyaWVzID0gMDsNCgkvKiB3ZSdyZSBj YWxsZWQgdW5kZXIgcmN1X3JlYWRfbG9jayAqLw0KCXN0cnVjdCBuaCAqIG5o ID0gZ2V0X25oKCk7DQoNCglpZiAobmgpIA0KCQluZW50cmllcyA9IG5oLT5u ZW50cmllcyA8PCAxOw0KCQ0KCXJldHVybiBuZW50cmllczsNCn0NCg0KdW5z aWduZWQgbG9uZyBuaF9uZW50cmllc19zaHJpbmsodm9pZCkgew0KCXVuc2ln bmVkIGxvbmcgbmVudHJpZXMgPSAwOw0KCS8qIHdlJ3JlIGNhbGxlZCB1bmRl ciByY3VfcmVhZF9sb2NrICovDQoJc3RydWN0IG5oICogbmggPSBnZXRfbmgo KTsNCg0KCWlmIChuaCkgDQoJCW5lbnRyaWVzID0gbmgtPm5lbnRyaWVzID4+ IDE7DQoJDQoJcmV0dXJuIG5lbnRyaWVzOw0KfQ0KDQplbnVtIHsgTkhfR1JP V19PUFMsIE5IX1NIUklOS19PUFMsIE5IX01BWF9PUFMgfTsNCi8qIGFsbCBv ZiB0aGUgbmhfcmVzaXplX29wcyBtdXN0IGJlIGNhbGxlZCB1bmRlciB0aGUg DQogKiBuZXRoYXNoX3Jlc2l6ZV9tdXRleCBhbmQgcmN1X3JlYWRfbG9jaw0K ICovDQpzdHJ1Y3QgbmhfcmVzaXplX29wcyB7DQoJdW5zaWduZWQgbG9uZyAo Km5oX25lbnRyaWVzX29wKSAodm9pZCk7DQoJdm9pZCAoKm5oX21pZ3JhdGVf b3ApIChzdHJ1Y3QgbmggKm9sZCwgc3RydWN0IG5oICpuZXcpOw0KCXZvaWQg KCpuaF9maXh1cF9vcCkgKHN0cnVjdCByY3VfaGVhZCAqaGVhZCk7DQp9IG5o X3Jlc2l6ZV9vcHMgW05IX01BWF9PUFNdID0gew0KCXsNCgkJbmhfbmVudHJp ZXNfZ3JvdywNCgkJbmhfbWlncmF0ZV9ncm93LA0KCQluaF9maXh1cF9ncm93 LA0KCX0sDQoJew0KCQluaF9uZW50cmllc19zaHJpbmssDQoJCW5oX21pZ3Jh dGVfc2hyaW5rLA0KCQluaF9maXh1cF9zaHJpbmssDQoJfSwNCn07DQoNCnN0 YXRpYyBpbnQgbmhfcmVzaXplKGxvbmcgZGlyKQ0Kew0KCXN0cnVjdCBuaCAq bmgsICpuZXdfbmg7DQoJdW5zaWduZWQgbG9uZyBuZXdfbmVudHJpZXM7DQoJ aW50IGVyciA9IDA7DQoNCglzdHJ1Y3QgbmhfcmVzaXplX29wcyAqIG5oX29w czsNCg0KCWlmIChkaXIgPiAwKQ0KCQluaF9vcHMgPSAmbmhfcmVzaXplX29w c1tOSF9HUk9XX09QU107DQoJZWxzZSBpZiAoZGlyIDwgMCkNCgkJbmhfb3Bz ID0gJm5oX3Jlc2l6ZV9vcHNbTkhfU0hSSU5LX09QU107DQoJZWxzZQ0KCQly ZXR1cm4gLUVJTlZBTDsNCg0KCW11dGV4X2xvY2soJm5ldGhhc2hfcmVzaXpl X211dGV4KTsNCglyY3VfcmVhZF9sb2NrKCk7DQoNCgluaCA9IGdldF9uaCgp Ow0KDQoJaWYgKCFuaCkgDQoJCWdvdG8gb3V0X3VubG9jazsNCg0KCW5ld19u ZW50cmllcyA9IG5oX29wcy0+bmhfbmVudHJpZXNfb3AoKTsNCg0KCW5wcmlu dGsoIiVzOiByZXNpemluZyBuaCB0byAlbHUgYnVja2V0c1xuIiwgX19GVU5D VElPTl9fLCANCgkJbmV3X25lbnRyaWVzKTsNCg0KCW5ld19uaCA9IG5oX2Fs bG9jKG5ld19uZW50cmllcyk7DQoNCglpZiAoIW5ld19uaCkgew0KCQllcnIg PSAtRU5PTUVNOw0KCQlnb3RvIG91dF91bmxvY2s7DQoJfQ0KDQoJbmhfb3Bz LT5uaF9taWdyYXRlX29wKG5oLCBuZXdfbmgpOw0KDQoJbmhfZHVtcChuaCwg Im9sZCBuaCBbcG9zdCBtaWdyYXRpb25dIik7DQoNCgluaF9kdW1wKG5ld19u aCwgIm5ldyBuaCBbbmV3Ym9ybl0iKTsNCg0KCW5oID0gbmhfcmVwbGFjZShu ZXdfbmgpOw0KCS8qIG5vdyBjYWxsZXJzIG9mIGdldF9uaCgpIHdpbGwgZ2V0 IHRoZSB1cGRhdGVkIA0KCSAqIHZlcnNpb24sIGJ1dCByZWZlcmVuY2VzIHRv IHRoZSBvbGQgbmggY2FuIHN0aWxsIA0KCSAqIGJlIGluIHVzZS4gSXQgbXVz dCBiZSBwb3NzaWJsZSBmb3IgdXNlcnMgdG8gc2VlIA0KCSAqIGFsbCBlbGVt ZW50cyBvZiB0aGUgdGFibGUgdXNpbmcgZWl0aGVyIHRoZSBvbGQgDQoJICog b3IgbmV3IG5oICovDQoJDQoJY2FsbF9yY3UoJm5oLT5yY3VfaGVhZCwgbmhf b3BzLT5uaF9maXh1cF9vcCk7DQoNCglyY3VfcmVhZF91bmxvY2soKTsNCg0K CXN5bmNocm9uaXplX25ldCgpOw0KCS8qIGJ5IGhvbGRpbmcgdGhlIG5ldGhh c2hfcmVzaXplX211dGV4IHVudGlsIGFmdGVyIA0KCSAqIHN5bmNocm9uaXpl X25ldCgpIHdlIGFyZSBzdXJlIHRoYXQgdGhlcmUgYXJlIGF0IA0KCSAqIG1v c3QgMiBuaCBzdHJ1Y3R1cmVzIHRoYXQgd2UgbmVlZCB0byBiZSANCgkgKiBj b25jZXJuZWQgd2l0aCAqLw0KDQoJbXV0ZXhfdW5sb2NrKCZuZXRoYXNoX3Jl c2l6ZV9tdXRleCk7DQoNCglyY3VfcmVhZF9sb2NrKCk7DQoJbmhfZHVtcChu ZXdfbmgsICJuZXcgbmggW2RvbmVdIik7DQoJcmN1X3JlYWRfdW5sb2NrKCk7 DQoNCglyZXR1cm4gZXJyOw0KDQpvdXRfdW5sb2NrOg0KCXJjdV9yZWFkX3Vu bG9jaygpOw0KCW11dGV4X3VubG9jaygmbmV0aGFzaF9yZXNpemVfbXV0ZXgp Ow0KCXJldHVybiBlcnI7DQoNCn0NCg0Kc3RhdGljIGludCBuaF9nZXRhbG9u Zyhjb25zdCBjaGFyIF9fdXNlciAqYnVmLCBzaXplX3QgY291bnQsIGxvbmcg KnJlcykNCnsNCgljaGFyIGtidWZbX05FVEhBU0hfQlVGU1pfKzFdOw0KDQoJ aWYgKGNvdW50ID4gX05FVEhBU0hfQlVGU1pfKQ0KCQlyZXR1cm4gLUVJTlZB TDsNCglpZiAoY29weV9mcm9tX3VzZXIoJmtidWYsIGJ1ZiwgY291bnQpKQ0K CQlyZXR1cm4gLUVGQVVMVDsNCglrYnVmW19ORVRIQVNIX0JVRlNaX10gPSAn XDAnOw0KDQoJaWYgKHNzY2FuZihrYnVmLCAiJWxkIiwgcmVzKSAhPSAxKQ0K CQlyZXR1cm4gLUVJTlZBTDsNCg0KCXJldHVybiAwOw0KfQ0KDQpzc2l6ZV90 IG5oX2NyZWF0ZV93cml0ZShzdHJ1Y3QgZmlsZSAqZmlsZSwgY29uc3QgY2hh ciBfX3VzZXIgKmJ1ZiwNCgkJCXNpemVfdCBjb3VudCwgbG9mZl90ICpwcG9z KQ0Kew0KCWxvbmcgcmVzOw0KCWludCByZXQ7DQoNCglpZiAoKHJldCA9IG5o X2dldGFsb25nKGJ1ZiwgY291bnQsICZyZXMpKSAhPSAwKQ0KCQlyZXR1cm4g cmV0Ow0KDQoJaWYocmVzIDw9IDApDQoJCXJldHVybiAtRUlOVkFMOw0KDQoJ aWYgKChyZXQgPSBuaF9jcmVhdGUoKHVuc2lnbmVkIGxvbmcpcmVzKSkgIT0g MCkNCgkJcmV0dXJuIHJldDsNCg0KCXJldHVybiBjb3VudDsNCn0NCg0KDQpz dGF0aWMgc3RydWN0IGZpbGVfb3BlcmF0aW9ucyBuaF9jcmVhdGVfZm9wcyA9 IHsNCgkud3JpdGUJPSBuaF9jcmVhdGVfd3JpdGUsDQp9Ow0KDQoNCnNzaXpl X3QgbmhfYWRkX3dyaXRlKHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFy IF9fdXNlciAqYnVmLA0KCSAJICAgICBzaXplX3QgY291bnQsIGxvZmZfdCAq cHBvcykNCnsNCglsb25nIHJlczsNCglpbnQgcmV0Ow0KDQoJaWYgKChyZXQg PSBuaF9nZXRhbG9uZyhidWYsIGNvdW50LCAmcmVzKSkgIT0gMCkNCgkJcmV0 dXJuIHJldDsNCg0KCWlmKHJlcyA8PSAwKQ0KCQlyZXR1cm4gLUVJTlZBTDsN Cg0KCWlmICgocmV0ID0gbmhfYWRkKCh1bnNpZ25lZCBsb25nKXJlcykpICE9 IDApDQoJCXJldHVybiByZXQ7DQoNCglyZXR1cm4gY291bnQ7DQp9DQoNCnN0 YXRpYyBzdHJ1Y3QgZmlsZV9vcGVyYXRpb25zIG5oX2FkZF9mb3BzID0gew0K CS53cml0ZQk9IG5oX2FkZF93cml0ZSwNCn07DQoNCg0Kc3NpemVfdCBuaF9y ZXNpemVfd3JpdGUoc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgX191 c2VyICpidWYsDQoJCQlzaXplX3QgY291bnQsIGxvZmZfdCAqcHBvcykNCnsN Cglsb25nIHJlczsNCglpbnQgcmV0Ow0KDQoJaWYgKChyZXQgPSBuaF9nZXRh bG9uZyhidWYsIGNvdW50LCAmcmVzKSkgIT0gMCkNCgkJcmV0dXJuIHJldDsN Cg0KCWlmICgocmV0ID0gbmhfcmVzaXplKHJlcykpICE9IDApDQoJCXJldHVy biByZXQ7DQoNCglyZXR1cm4gY291bnQ7DQp9DQoNCg0KDQpzdGF0aWMgc3Ry dWN0IGZpbGVfb3BlcmF0aW9ucyBuaF9yZXNpemVfZm9wcyA9IHsNCgkud3Jp dGUJPSBuaF9yZXNpemVfd3JpdGUsDQp9Ow0KDQpzdGF0aWMgdm9pZCAqIGRf c3RhcnQgKHN0cnVjdCBzZXFfZmlsZSAqbSwgbG9mZl90ICpwb3MpDQp7DQoJ c3RydWN0IG5oICogbmg7DQoNCglyY3VfcmVhZF9sb2NrKCk7DQoNCgluaCA9 IGdldF9uaCgpOw0KDQoJaWYgKG5oKSB7DQoJCXN0cnVjdCBuaF9oZWFkICpo YXNoID0gbmgtPmhhc2g7DQoJCXVuc2lnbmVkIGxvbmcgbmVudHJpZXMgPSBu aC0+bmVudHJpZXM7DQoNCgkJaWYgKG5lbnRyaWVzID4gKnBvcykgew0KCQkJ c2VxX3ByaW50ZihtLCAiJWx1OiAiLCAodW5zaWduZWQgbG9uZykqcG9zKTsN CgkJCXJldHVybiAoJmhhc2hbKnBvc10pOw0KCQl9DQoJfQ0KCQ0KCXJldHVy biBOVUxMOw0KfQ0KDQpzdGF0aWMgdm9pZCAqIGRfbmV4dCAoc3RydWN0IHNl cV9maWxlICptLCB2b2lkICp2LCBsb2ZmX3QgKnBvcykNCnsNCglzdHJ1Y3Qg bmggKiBuaDsNCg0KCSgqcG9zKSsrOw0KDQoJLyogcmN1X3JlYWRfbG9jayBp cyBzdGlsbCBoZWxkICovDQoJbmggPSBnZXRfbmgoKTsNCg0KCWlmIChuaCkg ew0KCQlzdHJ1Y3QgbmhfaGVhZCAqaGFzaCA9IG5oLT5oYXNoOw0KCQl1bnNp Z25lZCBsb25nIG5lbnRyaWVzID0gbmgtPm5lbnRyaWVzOw0KDQoJCWlmIChu ZW50cmllcyA+ICpwb3MpIHsNCgkJCXNlcV9wcmludGYobSwgIiVsdTogIiwg KHVuc2lnbmVkIGxvbmcpKnBvcyk7DQoJCQlyZXR1cm4gKCZoYXNoWypwb3Nd KTsNCgkJfQ0KCX0NCglyZXR1cm4gTlVMTDsNCn0NCg0Kc3RhdGljIHZvaWQg ZF9zdG9wIChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpDQp7DQoJcmN1 X3JlYWRfdW5sb2NrKCk7DQp9DQoNCnN0YXRpYyBpbnQgZF9zaG93IChzdHJ1 Y3Qgc2VxX2ZpbGUgKm0sIHZvaWQgKnYpDQp7DQoJc3RydWN0IG5oX2hlYWQg KmhlYWQgPSB2Ow0KCXN0cnVjdCBuaF9lbnRyeSAqZW50cnk7DQoJc3RydWN0 IGxpc3RfaGVhZCAqIGxpc3Q7DQoNCglyY3VfcmVhZF9sb2NrKCk7DQoJbGlz dF9mb3JfZWFjaF9yY3UobGlzdCwgJmhlYWQtPmxpc3QpIHsNCgkJc3RydWN0 IG5oX2l0ZW0gKiBpdGVtID0gKHN0cnVjdCBuaF9pdGVtICopbGlzdDsNCgkJ c3dpdGNoIChpdGVtLT5uaF90eXBlKSB7DQoJCWNhc2UgTkhfRU5UUlk6DQoJ CQllbnRyeSA9IGxpc3RfZW50cnkobGlzdCwgc3RydWN0IG5oX2VudHJ5LCBu aF9saXN0KTsNCgkJCXNlcV9wcmludGYobSwgIiVsdSIsIGVudHJ5LT5kYXRh KTsNCgkJCXNlcV9wcmludGYobSwgIiVzIiwgIiAtPiAiKTsNCgkJCWJyZWFr Ow0KCQljYXNlIE5IX0hFQUQ6DQoJCQlzZXFfcHJpbnRmKG0sICIlcyIsICIg Li4gIik7DQoJCQlicmVhazsNCgkJZGVmYXVsdDoNCgkJCXNlcV9wcmludGYo bSwgIiVzIiwgImJhZCBuaF90eXBlIVxuIik7DQoJCX0NCgl9DQoJcmN1X3Jl YWRfdW5sb2NrKCk7DQoJc2VxX3ByaW50ZihtLCAiJXMiLCAiXG4iKTsNCg0K CXJldHVybiAwOw0KfQ0KDQpzdHJ1Y3Qgc2VxX29wZXJhdGlvbnMgbmhfZHVt cF9vcCA9IHsNCgkuc3RhcnQJPQlkX3N0YXJ0LA0KCS5uZXh0CT0JZF9uZXh0 LA0KCS5zdG9wCT0JZF9zdG9wLA0KCS5zaG93CT0JZF9zaG93LA0KfTsNCg0K c3RhdGljIGludCBuaF9kdW1wX29wZW4oc3RydWN0IGlub2RlICppbm9kZSwg c3RydWN0IGZpbGUgKmZpbGUpDQp7DQoJcmV0dXJuIHNlcV9vcGVuKGZpbGUs ICZuaF9kdW1wX29wKTsNCn0NCg0Kc3RhdGljIHN0cnVjdCBmaWxlX29wZXJh dGlvbnMgcHJvY19uaF9kdW1wX29wZXJhdGlvbnMgPSB7DQoJLm9wZW4JCT0g bmhfZHVtcF9vcGVuLA0KCS5yZWFkCQk9IHNlcV9yZWFkLA0KCS5sbHNlZWsJ CT0gc2VxX2xzZWVrLA0KCS5yZWxlYXNlCT0gc2VxX3JlbGVhc2UsDQp9Ow0K DQovKiBYWFggbmhfZHVtcCgpIGlzIGZvciBmb3IgZGVidWcgb25seSANCiAq IGl0IG11c3QgYmUgY2FsbGVkIHVuZGVyIHJjdV9yZWFkX2xvY2soKSAqLw0K c3RhdGljIGludCBuaF9kdW1wKHN0cnVjdCBuaCAqIG5oLCBjb25zdCBjaGFy ICogZGVidWdfc3RyKQ0Kew0KCXVuc2lnbmVkIGxvbmcgaTsNCglzdHJ1Y3Qg bmhfaGVhZCAqIGhlYWQ7DQoJc3RydWN0IG5oX2VudHJ5ICplbnRyeTsNCglz dHJ1Y3QgbGlzdF9oZWFkICogbGlzdDsNCg0KCW5wcmludGsoIiVzOiAlc1xu IiwgX19GVU5DVElPTl9fLCBkZWJ1Z19zdHIpOw0KDQoJZm9yIChpID0gMDsg aSA8IG5oLT5uZW50cmllczsgaSsrICkgew0KCQloZWFkID0gJm5oLT5oYXNo W2ldOw0KCQkNCgkJbnByaW50aygiWyVsdV06ICglcCkiLCBpLCBoZWFkKTsN CgkJbGlzdF9mb3JfZWFjaF9yY3UobGlzdCwgJmhlYWQtPmxpc3QpIHsNCgkJ CXN0cnVjdCBuaF9pdGVtICogaXRlbSA9IChzdHJ1Y3QgbmhfaXRlbSAqKWxp c3Q7DQoJCQlucHJpbnRrKCIgJXAgIiwgbGlzdCk7DQoJCQlzd2l0Y2ggKGl0 ZW0tPm5oX3R5cGUpIHsNCgkJCWNhc2UgTkhfRU5UUlk6DQoJCQkJZW50cnkg PSBsaXN0X2VudHJ5KGxpc3QsIHN0cnVjdCBuaF9lbnRyeSwgDQoJCQkJCQkJ bmhfbGlzdCk7DQoJCQkJbnByaW50aygiJWx1IC0+ICIsIGVudHJ5LT5kYXRh KTsNCgkJCQlicmVhazsNCgkJCWNhc2UgTkhfSEVBRDoNCgkJCQlucHJpbnRr KCIgLi4gIik7DQoJCQkJYnJlYWs7DQoJCQlkZWZhdWx0Og0KCQkJCW5wcmlu dGsoImJhZCBuaF90eXBlIVxuIik7DQoJCQl9DQoJCX0NCgkJbnByaW50aygi XG4iKTsNCg0KCX0NCg0KCXJldHVybiAwOw0KfQ0KDQoNCnN0YXRpYyBpbnQg bmV0aGFzaF9tb2R1bGVfaW5pdCh2b2lkKQ0Kew0KCXN0cnVjdCBwcm9jX2Rp cl9lbnRyeSAqZW50cnk7DQoNCgluaF9wcm9jX2RpciA9IHByb2NfbWtkaXIo TU9EVUxFX05BTUUsIE5VTEwpOw0KDQoJaWYgKCFuaF9wcm9jX2RpcikgcmV0 dXJuIC1FTk9ERVY7DQoNCgkvKiBmaXJzdCB0aGUgZW50cnkgdG8gY3JlYXRl IHRoZSBoYXNodGFibGUgKi8NCgllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5 KCJjcmVhdGUiLCAwNjQ0LCBuaF9wcm9jX2Rpcik7DQoJaWYgKCFlbnRyeSkg cmV0dXJuIC1FTk9ERVY7DQoJZW50cnktPnByb2NfZm9wcyA9ICZuaF9jcmVh dGVfZm9wczsNCg0KCS8qIGFuZCB0aGUgZW50cnkgdG8gYWRkIGFuIGVsZW1l bnQgdG8gdGhlIGhhc2h0YWJsZSAqLw0KCWVudHJ5ID0gY3JlYXRlX3Byb2Nf ZW50cnkoImFkZCIsIDA2NDQsIG5oX3Byb2NfZGlyKTsNCglpZiAoIWVudHJ5 KSByZXR1cm4gLUVOT0RFVjsNCgllbnRyeS0+cHJvY19mb3BzID0gJm5oX2Fk ZF9mb3BzOw0KDQoJLyogdGhlIGVudHJ5IHRvIGR1bXAgdGhlIGhhc2h0YWJs ZSAqLw0KCWVudHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoImR1bXAiLCAwNDQ0 LCBuaF9wcm9jX2Rpcik7DQoJaWYgKCFlbnRyeSkgcmV0dXJuIC1FTk9ERVY7 DQoJZW50cnktPnByb2NfZm9wcyA9ICZwcm9jX25oX2R1bXBfb3BlcmF0aW9u czsNCg0KCS8qIGFuZCB0byByZXNpemUgdGhlIGhhc2h0YWJsZSAqLw0KCWVu dHJ5ID0gY3JlYXRlX3Byb2NfZW50cnkoInJlc2l6ZSIsIDA2NDQsIG5oX3By b2NfZGlyKTsNCglpZiAoIWVudHJ5KSByZXR1cm4gLUVOT0RFVjsNCgllbnRy eS0+cHJvY19mb3BzID0gJm5oX3Jlc2l6ZV9mb3BzOw0KDQoJcmV0dXJuIDA7 CQ0KfQ0KDQpzdGF0aWMgdm9pZCBuZXRoYXNoX21vZHVsZV9leGl0KHZvaWQp DQp7DQoJbmhfZGVzdHJveSgpOw0KCXJjdV9iYXJyaWVyKCk7IC8qIGRvbid0 IHVubG9hZCB1bnRpbCByY3UgY2FsbGJhY2tzIGFyZSBkb25lIA0KCQkJKiBY WFggaXMgdGhpcyByZWFsbHkgc2FmZT8gKi8NCg0KCWlmIChuaF9wcm9jX2Rp cikgew0KCQlyZW1vdmVfcHJvY19lbnRyeSgicmVzaXplIiwgbmhfcHJvY19k aXIpOw0KCQlyZW1vdmVfcHJvY19lbnRyeSgiZHVtcCIsIG5oX3Byb2NfZGly KTsNCgkJcmVtb3ZlX3Byb2NfZW50cnkoImFkZCIsIG5oX3Byb2NfZGlyKTsN CgkJcmVtb3ZlX3Byb2NfZW50cnkoImNyZWF0ZSIsIG5oX3Byb2NfZGlyKTsN Cgl9DQoJcmVtb3ZlX3Byb2NfZW50cnkoTU9EVUxFX05BTUUsIE5VTEwpOw0K CXByaW50aygiJXMgcmVtb3ZlZFxuIiwgTU9EVUxFX05BTUUpOw0KfQ0KDQpt b2R1bGVfaW5pdChuZXRoYXNoX21vZHVsZV9pbml0KTsNCm1vZHVsZV9leGl0 KG5ldGhhc2hfbW9kdWxlX2V4aXQpOw0KDQpNT0RVTEVfTElDRU5TRSgiR1BM Iik7DQpNT0RVTEVfQVVUSE9SKCJha2VwbmVyQHNnaS5jb20iKTsNCg0K --8323328-1998195601-1170700899=:26852--