From mboxrd@z Thu Jan 1 00:00:00 1970 From: Wang Jian Subject: [RFC] QoS: new per flow queue Date: Tue, 05 Apr 2005 23:25:28 +0800 Message-ID: <20050405224956.0258.LARK@linux.net.cn> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="------_4252A594050B033D6C20_MULTIPART_MIXED_" Content-Transfer-Encoding: 7bit Return-path: To: netdev@oss.sgi.com Sender: netdev-bounce@oss.sgi.com Errors-to: netdev-bounce@oss.sgi.com List-Id: netdev.vger.kernel.org --------_4252A594050B033D6C20_MULTIPART_MIXED_ Content-Type: text/plain; charset="US-ASCII" Content-Transfer-Encoding: 7bit Hi, I write a per flow rate control qdisc. I posted it to LARTC list. Some discussion about it is here http://mailman.ds9a.nl/pipermail/lartc/2005q2/015381.html I think I need more feedback and suggestion on it so I repost the patch here. Please read the thread and get a picture about why and how. The kernel patch is agains kernel 2.6.11, the iproute2 patch is against iproute2-2.6.11-050314. The test scenario is like this www server <- [ eth0 eth1 ] -> www clients The attached t.sh is used to generate test rules. Clients download a big ISO file from www server, so flows' rate can be estimated by view progress. I have some test on it and it works well. It provides good fairness. When all slot being used, in most time, the real rate can keep at specified guaranteed rate. But I know it should receive more test. I have some consideration though 1. In the test sometimes there a pair of unbalanced stream and don't get balanced quickly. One stream get 8.4kbps and another get 11.5kbps. How to find the flow with highest traffic and punish it most? 2. The default ceil equals to rate. Should I calculate it as ceil = rate * 1.05 * limit, or ceil = rate * 1.05? 3. when flow slots are full, optionally reclassify untraceable traffic into another specified class, instead of dropping it? TODO: 1. rtnetlink related code should be improved; 2. dump() and dump_stat(); Regards -- lark --------_4252A594050B033D6C20_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="t.sh" Content-Disposition: attachment; filename="t.sh" Content-Transfer-Encoding: base64 Li90YyBxZGlzYyBkZWwgZGV2IGV0aDEgcm9vdAouL3RjIHFkaXNjIGFkZCBkZXYgZXRoMSByb290 IGhhbmRsZSAxOiBodGIgZGVmYXVsdCAxMAouL3RjIGNsYXNzIGFkZCBkZXYgZXRoMSBwYXJlbnQg MTogY2xhc3NpZCAxOjEgaHRiIHJhdGUgMTAwTWJpdCBjZWlsIDEwME1iaXQKCi4vdGMgY2xhc3Mg YWRkIGRldiBldGgxIHBhcmVudCAxOjEgY2xhc3NpZCAxOjEwIGh0YiByYXRlIDgwa2JwcyBjZWls IDgwa2JwcwoKLi90YyBjbGFzcyBhZGQgZGV2IGV0aDEgcGFyZW50IDE6MSBjbGFzc2lkIDE6MTIg aHRiIHJhdGUgODBrYnBzIGNlaWwgODBrYnBzCi4vdGMgcWRpc2MgYWRkIGRldiBldGgxIHBhcmVu dCAxOjEyIGhhbmRsZSAyMDogcGVyZmxvdyByYXRlIDEwa2JwcyBjZWlsIDE1a2JwcyBsaW1pdCA3 Ci4vdGMgZmlsdGVyIGFkZCBkZXYgZXRoMSBwYXJlbnQgMTowIHByb3RvY29sIGlwIHUzMiBtYXRj aCBpcCBzcG9ydCA4MCAweGZmZmYgZmxvd2lkIDE6MTIK --------_4252A594050B033D6C20_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="iproute2-2.6.11-050314-perflow.diff" Content-Disposition: attachment; filename="iproute2-2.6.11-050314-perflow.diff" Content-Transfer-Encoding: base64 SW5kZXg6IGlwcm91dGUyLTIuNi4xMS13L2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKPT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PQotLS0gaXByb3V0ZTItMi42LjExLXcvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaAkocmV2 aXNpb24gMSkKKysrIGlwcm91dGUyLTIuNi4xMS13L2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgJ KHdvcmtpbmcgY29weSkKQEAgLTI3Miw2ICsyNzIsMjggQEAKIAlfX3UzMiBjdG9rZW5zOwogfTsK IAorCisvKiBQRVJGTE9XIHNlY3Rpb24gKi8KKworI2RlZmluZSBUQ19QRVJGTE9XX0RFRkFVTFRM SU1JVAkxMDI0CisKK3N0cnVjdCB0Y19wZXJmbG93X3FvcHQKK3sKKwlzdHJ1Y3QgdGNfcmF0ZXNw ZWMgCXJhdGU7CisJc3RydWN0IHRjX3JhdGVzcGVjIAljZWlsOworCV9fdTMyICBsaW1pdDsKKwlf X3UzMiAgcWxlbjsKK307CitlbnVtCit7CisJVENBX1BFUkZMT1dfVU5TUEVDLAorCVRDQV9QRVJG TE9XX1BBUk1TLAorCV9fVENBX1BFUkZMT1dfTUFYLAorfTsKKworI2RlZmluZSBUQ0FfUEVSRkxP V19NQVgJKF9fVENBX1BFUkZMT1dfTUFYIC0gMSkKKworCiAvKiBIRlNDIHNlY3Rpb24gKi8KIAog c3RydWN0IHRjX2hmc2NfcW9wdApJbmRleDogaXByb3V0ZTItMi42LjExLXcvdGMvcV9wZXJmbG93 LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gaXByb3V0ZTItMi42LjExLXcvdGMvcV9wZXJmbG93LmMJKHJldmlz aW9uIDApCisrKyBpcHJvdXRlMi0yLjYuMTEtdy90Yy9xX3BlcmZsb3cuYwkocmV2aXNpb24gMCkK QEAgLTAsMCArMSwxNTMgQEAKKy8qCisgKiBxX3BlcmZsb3cuYwkJUEVSRkxPVy4KKyAqCisgKgkJ VGhpcyBwcm9ncmFtIGlzIGZyZWUgc29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFu ZC9vcgorICoJCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVybXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1 YmxpYyBMaWNlbnNlCisgKgkJYXMgcHVibGlzaGVkIGJ5IHRoZSBGcmVlIFNvZnR3YXJlIEZvdW5k YXRpb247IGVpdGhlciB2ZXJzaW9uCisgKgkJMiBvZiB0aGUgTGljZW5zZSwgb3IgKGF0IHlvdXIg b3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4KKyAqCisgKiBBdXRob3JzOglXYW5nIEppYW4gPGxh cmtAbGludXgubmV0LmNuPiwgMjAwNQorICoKKyAqLworCisjaW5jbHVkZSA8c3RkaW8uaD4KKyNp bmNsdWRlIDxzdGRsaWIuaD4KKyNpbmNsdWRlIDx1bmlzdGQuaD4KKyNpbmNsdWRlIDxzeXNsb2cu aD4KKyNpbmNsdWRlIDxmY250bC5oPgorI2luY2x1ZGUgPHN5cy9zb2NrZXQuaD4KKyNpbmNsdWRl IDxuZXRpbmV0L2luLmg+CisjaW5jbHVkZSA8YXJwYS9pbmV0Lmg+CisjaW5jbHVkZSA8c3RyaW5n Lmg+CisKKyNpbmNsdWRlICJ1dGlscy5oIgorI2luY2x1ZGUgInRjX3V0aWwuaCIKKworc3RhdGlj IHZvaWQgZXhwbGFpbih2b2lkKQoreworCWZwcmludGYoc3RkZXJyLAorIlVzYWdlOiAuLi4gcGVy ZmxvdyByYXRlIFJBVEUgWyBjZWlsIENFSUwgXSBbIGxpbWl0IExJTUlUIF0gWyBxbGVuIFFMRU4g XVxuIgorIlxuIgorInJhdGUgICAgcmF0ZSBhbGxvY2F0ZWQgdG8gZWFjaCBmbG93IChmbG93IGNh biBzdGlsbCBib3Jyb3cpXG4iCisiY2VpbCAgICB1cHBlciBsaW1pdCBmb3IgZWFjaCBmbG93IChm bG93IGNhbiBub3QgYm9ycm93KVxuIgorImxpbWl0ICAgbWF4aW11bSBjb25jdXJyZW50IGZsb3dz XG4iCisicWxlbiAgICBtYXhpbXVtIHF1ZXVlIGxlbmd0aFxuIgorCSk7Cit9CisKKyNkZWZpbmUg dXNhZ2UoKSByZXR1cm4oLTEpCisKK3N0YXRpYyBpbnQgcGVyZmxvd19wYXJzZV9vcHQoc3RydWN0 IHFkaXNjX3V0aWwgKnF1LCBpbnQgYXJnYywgY2hhciAqKmFyZ3YsIHN0cnVjdCBubG1zZ2hkciAq bikKK3sKKwlzdHJ1Y3QgdGNfcGVyZmxvd19xb3B0IG9wdDsKKwlzdHJ1Y3QgcnRhdHRyICp0YWls OworCWludCBvayA9IDA7CisKKwltZW1zZXQoJm9wdCwgMCwgc2l6ZW9mKG9wdCkpOworCisJd2hp bGUgKGFyZ2MgPiAwKSB7CisJCWlmIChzdHJjbXAoKmFyZ3YsICJyYXRlIikgPT0gMCkgeworCQkJ TkVYVF9BUkcoKTsKKwkJCWlmIChvcHQucmF0ZS5yYXRlKSB7CisJCQkJZnByaW50ZihzdGRlcnIs ICJEb3VibGUgXCJjZWlsXCIgc3BlY1xuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJaWYg KGdldF9yYXRlKCZvcHQucmF0ZS5yYXRlLCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwg IklsbGVnYWwgXCJyYXRlXCJcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCW9rKys7CisJ CX0gZWxzZSBpZiAoc3RyY21wKCphcmd2LCAiY2VpbCIpID09IDApIHsKKwkJCU5FWFRfQVJHKCk7 CisJCQlpZiAob3B0LmNlaWwucmF0ZSkgeworCQkJCWZwcmludGYoc3RkZXJyLCAiRG91YmxlIFwi Y2VpbFwiIHNwZWNcbiIpOworCQkJCXJldHVybiAtMTsKKwkJCX0KKwkJCWlmIChnZXRfcmF0ZSgm b3B0LmNlaWwucmF0ZSwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJbGxlZ2FsIFwi Y2VpbFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVsc2UgaWYg KHN0cmNtcCgqYXJndiwgImxpbWl0IikgPT0gMCkgeworCQkJTkVYVF9BUkcoKTsKKwkJCWlmIChn ZXRfc2l6ZSgmb3B0LmxpbWl0LCAqYXJndikpIHsKKwkJCQlmcHJpbnRmKHN0ZGVyciwgIklsbGVn YWwgXCJsaW1pdFwiXG4iKTsKKwkJCQlyZXR1cm4gLTE7CisJCQl9CisJCQlvaysrOworCQl9IGVs c2UgaWYgKHN0cmNtcCgqYXJndiwgInFsZW4iKSA9PSAwKSB7CisJCQlORVhUX0FSRygpOworCQkJ aWYgKGdldF9zaXplKCZvcHQucWxlbiwgKmFyZ3YpKSB7CisJCQkJZnByaW50ZihzdGRlcnIsICJJ bGxlZ2FsIFwibGltaXRcIlxuIik7CisJCQkJcmV0dXJuIC0xOworCQkJfQorCQkJb2srKzsKKwkJ fSBlbHNlIGlmIChzdHJjbXAoKmFyZ3YsICJoZWxwIikgPT0gMCkgeworCQkJZXhwbGFpbigpOwor CQkJcmV0dXJuIC0xOworCQl9IGVsc2UgeworCQkJZnByaW50ZihzdGRlcnIsICJXaGF0IGlzIFwi JXNcIj9cbiIsICphcmd2KTsKKwkJCWV4cGxhaW4oKTsKKwkJCXJldHVybiAtMTsKKwkJfQorCQlh cmdjLS07IGFyZ3YrKzsKKwl9CisKKwlpZiAoIW9rKQorCQlyZXR1cm4gMDsKKworCWlmIChvcHQu cmF0ZS5yYXRlID09IDApIHsKKwkJZnByaW50ZihzdGRlcnIsICJcInJhdGVcIiBpcyByZXF1aXJl ZC5cbiIpOworCQlyZXR1cm4gLTE7CisJfQorCisJaWYgKG9wdC5jZWlsLnJhdGUgPT0gMCkKKwkJ b3B0LmNlaWwgPSBvcHQucmF0ZTsKKworCWlmIChvcHQuY2VpbC5yYXRlIDwgb3B0LnJhdGUucmF0 ZSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlwiY2VpbFwiIG11c3QgYmUgPj0gXCJyYXRlXCIuXG4i KTsKKwkJcmV0dXJuIC0xOworCX0KKworCWlmIChvcHQubGltaXQgPT0gMCkKKwkJb3B0LmxpbWl0 ID0gVENfUEVSRkxPV19ERUZBVUxUTElNSVQ7CisKKwlpZiAob3B0LnFsZW4gPiAwICYmIG9wdC5x bGVuIDwgNSkgeworCQlmcHJpbnRmKHN0ZGVyciwgIlwicWxlblwiIG11c3QgYmUgPj0gNS5cbiIp OworCQlyZXR1cm4gLTE7CisJfQorCisJdGFpbCA9IE5MTVNHX1RBSUwobik7CisJLy9hZGRhdHRy X2wobiwgMTAyNCwgVENBX09QVElPTlMsIE5VTEwsIDApOworCS8vYWRkYXR0cl9sKG4sIDEwMjQs IFRDQV9QRVJGTE9XX1BBUk1TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJYWRkYXR0cl9sKG4sIDEw MjQsIFRDQV9PUFRJT05TLCAmb3B0LCBzaXplb2Yob3B0KSk7CisJdGFpbC0+cnRhX2xlbiA9ICh2 b2lkICopIE5MTVNHX1RBSUwobikgLSAodm9pZCAqKSB0YWlsOworCisJcmV0dXJuIDA7Cit9CisK K3N0YXRpYyBpbnQgcGVyZmxvd19wcmludF9vcHQoc3RydWN0IHFkaXNjX3V0aWwgKnF1LCBGSUxF ICpmLCBzdHJ1Y3QgcnRhdHRyICpvcHQpCit7CisJc3RydWN0IHRjX3BlcmZsb3dfcW9wdCAqcW9w dDsKKworCWlmIChvcHQgPT0gTlVMTCkKKwkJcmV0dXJuIDA7CisKKwlpZiAoUlRBX1BBWUxPQUQo b3B0KSA8IHNpemVvZigqcW9wdCkpCisJCXJldHVybiAtMTsKKworCXFvcHQgPSBSVEFfREFUQShv cHQpOworCisJU1BSSU5UX0JVRihiMSk7CisJZnByaW50ZihmLCAicmF0ZSAlcyAiLCBzcHJpbnRf cmF0ZShxb3B0LT5yYXRlLnJhdGUsIGIxKSk7CisJZnByaW50ZihmLCAiY2VpbCAlcyAiLCBzcHJp bnRfcmF0ZShxb3B0LT5jZWlsLnJhdGUsIGIxKSk7CisJZnByaW50ZihmLCAibGltaXQgJXMgIiwg c3ByaW50X3NpemUocW9wdC0+cmF0ZS5yYXRlLCBiMSkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0 cnVjdCBxZGlzY191dGlsIHBlcmZsb3dfcWRpc2NfdXRpbCA9IHsKKwkuaWQJCT0gInBlcmZsb3ci LAorCS5wYXJzZV9xb3B0CT0gcGVyZmxvd19wYXJzZV9vcHQsCisJLnByaW50X3FvcHQJPSBwZXJm bG93X3ByaW50X29wdCwKK307CkluZGV4OiBpcHJvdXRlMi0yLjYuMTEtdy90Yy9NYWtlZmlsZQo9 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09Ci0tLSBpcHJvdXRlMi0yLjYuMTEtdy90Yy9NYWtlZmlsZQkocmV2aXNpb24gMSkK KysrIGlwcm91dGUyLTIuNi4xMS13L3RjL01ha2VmaWxlCSh3b3JraW5nIGNvcHkpCkBAIC03LDYg KzcsNyBAQAogVENNT0RVTEVTICs9IHFfZmlmby5vCiBUQ01PRFVMRVMgKz0gcV9zZnEubwogVENN T0RVTEVTICs9IHFfcmVkLm8KK1RDTU9EVUxFUyArPSBxX3BlcmZsb3cubwogVENNT0RVTEVTICs9 IHFfcHJpby5vCiBUQ01PRFVMRVMgKz0gcV90YmYubwogVENNT0RVTEVTICs9IHFfY2JxLm8K --------_4252A594050B033D6C20_MULTIPART_MIXED_ Content-Type: application/octet-stream; name="linux-2.6.11-perflow-r3.diff" Content-Disposition: attachment; filename="linux-2.6.11-perflow-r3.diff" Content-Transfer-Encoding: base64 SW5kZXg6IGxpbnV4LTIuNi4xMS13L2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgKPT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PQotLS0gbGludXgtMi42LjExLXcvaW5jbHVkZS9saW51eC9wa3Rfc2NoZWQuaAkocmV2aXNpb24g MikKKysrIGxpbnV4LTIuNi4xMS13L2luY2x1ZGUvbGludXgvcGt0X3NjaGVkLmgJKHJldmlzaW9u IDMpCkBAIC0yNzIsNiArMjcyLDI4IEBACiAJX191MzIgY3Rva2VuczsKIH07CiAKKworLyogUEVS RkxPVyBzZWN0aW9uICovCisKKyNkZWZpbmUgVENfUEVSRkxPV19ERUZBVUxUTElNSVQJMTAyNAor CitzdHJ1Y3QgdGNfcGVyZmxvd19xb3B0Cit7CisJc3RydWN0IHRjX3JhdGVzcGVjIAlyYXRlOwor CXN0cnVjdCB0Y19yYXRlc3BlYyAJY2VpbDsKKwlfX3UzMiAgbGltaXQ7CisJX191MzIgIHFsZW47 Cit9OworZW51bQoreworCVRDQV9QRVJGTE9XX1VOU1BFQywKKwlUQ0FfUEVSRkxPV19QQVJNUywK KwlfX1RDQV9QRVJGTE9XX01BWCwKK307CisKKyNkZWZpbmUgVENBX1BFUkZMT1dfTUFYCShfX1RD QV9QRVJGTE9XX01BWCAtIDEpCisKKwogLyogSEZTQyBzZWN0aW9uICovCiAKIHN0cnVjdCB0Y19o ZnNjX3FvcHQKSW5kZXg6IGxpbnV4LTIuNi4xMS13L25ldC9zY2hlZC9LY29uZmlnCj09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT0KLS0tIGxpbnV4LTIuNi4xMS13L25ldC9zY2hlZC9LY29uZmlnCShyZXZpc2lvbiAyKQorKysg bGludXgtMi42LjExLXcvbmV0L3NjaGVkL0tjb25maWcJKHJldmlzaW9uIDMpCkBAIC0xOTIsNiAr MTkyLDE1IEBACiAJICBUbyBjb21waWxlIHRoaXMgY29kZSBhcyBhIG1vZHVsZSwgY2hvb3NlIE0g aGVyZTogdGhlCiAJICBtb2R1bGUgd2lsbCBiZSBjYWxsZWQgc2NoX2dyZWQuCiAKK2NvbmZpZyBO RVRfU0NIX1BFUkZMT1cKKwl0cmlzdGF0ZSAiUEVSRkxPVyBxdWV1ZSIKKwlkZXBlbmRzIG9uIE5F VF9TQ0hFRAorCS0tLWhlbHAtLS0KKwkgIFNheSBZIGhlcmUgaWYgeW91IHdhbnQgdG8gdXNlIHBl ciBmbG93IHJhdGUgY29udHJvbC4KKworCSAgVG8gY29tcGlsZSB0aGlzIGNvZGUgYXMgYSBtb2R1 bGUsIGNob29zZSBNIGhlcmU6IHRoZQorCSAgbW9kdWxlIHdpbGwgYmUgY2FsbGVkIHNjaF9wZXJm bG93LgorCiBjb25maWcgTkVUX1NDSF9EU01BUksKIAl0cmlzdGF0ZSAiRGlmZnNlcnYgZmllbGQg bWFya2VyIgogCWRlcGVuZHMgb24gTkVUX1NDSEVECkluZGV4OiBsaW51eC0yLjYuMTEtdy9uZXQv c2NoZWQvTWFrZWZpbGUKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gbGludXgtMi42LjExLXcvbmV0L3NjaGVkL01h a2VmaWxlCShyZXZpc2lvbiAyKQorKysgbGludXgtMi42LjExLXcvbmV0L3NjaGVkL01ha2VmaWxl CShyZXZpc2lvbiAzKQpAQCAtMTksNiArMTksNyBAQAogb2JqLSQoQ09ORklHX05FVF9TQ0hfSEZT QykJKz0gc2NoX2hmc2Mubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfUkVEKQkrPSBzY2hfcmVkLm8K IG9iai0kKENPTkZJR19ORVRfU0NIX0dSRUQpCSs9IHNjaF9ncmVkLm8KK29iai0kKENPTkZJR19O RVRfU0NIX1BFUkZMT1cpCSs9IHNjaF9wZXJmbG93Lm8KIG9iai0kKENPTkZJR19ORVRfU0NIX0lO R1JFU1MpCSs9IHNjaF9pbmdyZXNzLm8gCiBvYmotJChDT05GSUdfTkVUX1NDSF9EU01BUkspCSs9 IHNjaF9kc21hcmsubwogb2JqLSQoQ09ORklHX05FVF9TQ0hfU0ZRKQkrPSBzY2hfc2ZxLm8KSW5k ZXg6IGxpbnV4LTIuNi4xMS13L25ldC9zY2hlZC9zY2hfcGVyZmxvdy5jCj09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0t IGxpbnV4LTIuNi4xMS13L25ldC9zY2hlZC9zY2hfcGVyZmxvdy5jCShyZXZpc2lvbiAwKQorKysg bGludXgtMi42LjExLXcvbmV0L3NjaGVkL3NjaF9wZXJmbG93LmMJKHJldmlzaW9uIDMpCkBAIC0w LDAgKzEsNTU1IEBACisvKgorICogbmV0L3NjaGVkL3NjaF9wZXJmbG93LmMJUGVyIGZsb3cgcmF0 ZSBjb250cm9sIHF1ZXVlLgorICoKKyAqCVRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IKKyAqCW1vZGlmeSBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlCisgKglhcyBwdWJsaXNoZWQgYnkg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24KKyAqCTIgb2YgdGhl IExpY2Vuc2UsIG9yIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCisgKgorICog QXV0aG9yczoJV2FuZyBKaWFuIDxsYXJrQGxpbnV4Lm5ldC5jbj4sIDIwMDUKKyAqCisgKi8KKwor I2luY2x1ZGUgPGxpbnV4L2NvbmZpZy5oPgorI2luY2x1ZGUgPGxpbnV4L21vZHVsZS5oPgorI2lu Y2x1ZGUgPGFzbS91YWNjZXNzLmg+CisjaW5jbHVkZSA8bGludXgvYml0b3BzLmg+CisjaW5jbHVk ZSA8bGludXgvdHlwZXMuaD4KKyNpbmNsdWRlIDxsaW51eC9rZXJuZWwuaD4KKyNpbmNsdWRlIDxs aW51eC9zY2hlZC5oPgorI2luY2x1ZGUgPGxpbnV4L3N0cmluZy5oPgorI2luY2x1ZGUgPGxpbnV4 L21tLmg+CisjaW5jbHVkZSA8bGludXgvc29ja2V0Lmg+CisjaW5jbHVkZSA8bGludXgvc29ja2lv cy5oPgorI2luY2x1ZGUgPGxpbnV4L2luLmg+CisjaW5jbHVkZSA8bGludXgvZXJybm8uaD4KKyNp bmNsdWRlIDxsaW51eC9pbnRlcnJ1cHQuaD4KKyNpbmNsdWRlIDxsaW51eC9pZl9ldGhlci5oPgor I2luY2x1ZGUgPGxpbnV4L2luZXQuaD4KKyNpbmNsdWRlIDxsaW51eC9uZXRkZXZpY2UuaD4KKyNp bmNsdWRlIDxsaW51eC9ldGhlcmRldmljZS5oPgorI2luY2x1ZGUgPGxpbnV4L25vdGlmaWVyLmg+ CisjaW5jbHVkZSA8bGludXgvamhhc2guaD4KKyNpbmNsdWRlIDxsaW51eC90aW1lci5oPgorI2lu Y2x1ZGUgPG5ldC9pcC5oPgorI2luY2x1ZGUgPG5ldC9yb3V0ZS5oPgorI2luY2x1ZGUgPGxpbnV4 L3NrYnVmZi5oPgorI2luY2x1ZGUgPG5ldC9zb2NrLmg+CisjaW5jbHVkZSA8bmV0L3BrdF9zY2hl ZC5oPgorI2luY2x1ZGUgPG5ldC9pbmV0X2Vjbi5oPgorI2luY2x1ZGUgPG5ldC9kc2ZpZWxkLmg+ CisKKy8qIFBlciBmbG93IHJhdGUgY29udHJvbCBhbGdvcml0aG0KKworRGVzY3JpcHRpb24KKy0t LS0tLS0tLS0tCisKKwlXaGVuIGEgbmV3IHBhY2tldCBhcnJpdmVzLCB3ZSBsb29rdXAgaW4gdGhl IHRhYmxlIHRvIHNlZSBpZiBpdAorCWJlbG9uZ3MgdG8gYSBmbG93IGJlaW5nIHRyYWNlZC4gSWYg bm90LCB3ZSBjcmVhdGUgbmV3IGVudHJ5IGZvciBpdC4KKworCUZvciBhIHBhY2tldCBiZWxvbmdz IHRvIGEgZmxvdyBiZWluZyB0cmFjZWQsIHdlIHNlZSBpZiBpdCBoYXMKKwlhdmFpbGFibGUgdG9r ZW4gdG8gc2VuZCBpdCBvdXQuCisKKwlUaGUgJ3JhdGUnIGFuZCAnY2VpbCcgaGF2ZSBzYW1lIG1l YW5pbmcgb2YgSFRCIHFkaXNjLiBUaGUgJ2xpbWl0JworCXBhcmFtZXRlciBkZWZpbmVkIGhvdyBt YW55IGZsb3dzIHdlIHdpbGwgdHJhY2UsIHdoaWNoIGRlZmF1bHRzIHRvCisJMTAyNC4KKworCUFu eSBmbG93IGVudHJ5IHdpdGhvdXQgdHJhZmZpYyBpbiBMSUZFVElNRSBzZWNvbmRzIHdpbGwgYmUg d2lwZWQKKwl0byBmcmVlIHNsb3QuCisKKworQWxnb3JpdGhtCistLS0tLS0tLS0KKworCVRoZSBh bGdvcml0aG0gaXMgc2ltcGxlIGFuZCBuYWl2ZS4gV2UgaGF2ZSBhIHRva2VuIGJ1Y2tldCwgd2hp Y2gKKwlnZW5lcmF0ZSBncmF0ZS8xMCAoPSByYXRlICogbGltaXQgLyAxMCkgdG9rZW4gaW4gMS8x MCBzZWNvbmRzLgorCisJQSBmbG93IGNhbiBhbHdheXMgc2VuZCB3aGVuIGl0IGlzIHVuZGVyIHJh dGUuIFdoZW4gYSBmbG93IGlzIG92ZXIKKwlyYXRlIGJ1dCB1bmRlciBjZWlsLCBldmVyeSB0aW1l IGl0IGJvcnJvd3MsIGl0IGlzIHB1dCBpbnRvIGJvcnJvdworCWxpc3QsIHNvIGl0IG1heSByZWNl aXZlIHBlbmFsdHkuCisKKwlXaGVuIGEgdW5kZXItcmF0ZSBmbG93IHNlbmRzIGJ1dCB0b2tlbiBp cyBzaG9ydCwgcGVuYWx0eSBpcyBhZGRlZAorCXRvIG9uZSBvZiBmbG93cyBpbiBib3Jyb3cgbGlz dCwgYW5kIHRoaXMgcHVuaXNoZWQgZmxvdyBpcworCXJlbW92ZWQgZnJvbSBib3Jyb3cgbGlzdC4K KworCVdoZW4gYSBmbG93IGNhcnJ5aW5nIHBlbmFsdHkgaGFzIHBhY2tldCwgdGhlIHBlbmFsdHkg aXMKKwlhZGRlZCB0byB1c2VkIHRva2VuLiBUaGlzIG1lYW5zLCB0aGlzIGZsb3cgY2FuIGJvcnJv dyBsZXNzIHRoYW4KKwlsYXN0IHRpbWUgKGlmIGluIGEgbmV3IHRpbWUgc2xvdCksIG9yIGNhbiBi b3Jyb3cgbGVzcyAKKwkoY2VpbCAtIHJhdGUgLSBwZW5hbHR5KS4KKworCVRoZXJlIGFyZSBvdGhl ciBydWxlcyB0aGF0IGhhbmRsZSBmYWlybmVzcyBhbmQgbG93IHJhdGUgc2l0dWF0aW9uLgorCVNl ZSBjb2RlIGZvciBkZXRhaWxzLgorCisJTk9URTogdGhlIGltcGxlbWVudGF0aW9uIG9mIGFsZ29y aXRobSBpcyBub3QgdGltZXIgZHJpdmVuLCBidXQKKwlwYWNrZXQgZHJpdmVuLgorCisJVGhlIGlk ZWFzIGJlaGluZCB0aGlzIGFsZ29yaXRobSBhcmUKKworCTEuIFdlIGFzc3VtZSB0aGF0IHBlcmZs b3cgcWRpc2MgaGFzIHJhdGUgKiBsaW1pdCBndWFyYW50ZWVkLgorCTIuIFdlIGNhbid0IGFmZmVj dCBwYXN0LiBXZSBjYW4gb25seSBhZmZlY3QgZnV0dXJlLgorCTMuIElmIGEgZmxvdydzIGJvcnJv d2luZyBsZWFkcyB0byBvdmVybGltaXQsIHdlIGxldCB0aGlzIGZsb3cKKwkgICBib3Jyb3cgbGVz cyBpbiBmdXR1cmUuCisJNC4gV2l0aCBhIHJvdW5kIHJvYmluIHB1bmlzaG1lbnQgc3R5bGUsIGEg ZmxvdyBib3Jyb3dzIG1vcmUgdGltZXMsCisJICAgaXQgc3RheXMgaW4gYm9ycm93IGxpc3QgbW9y ZSB0aW1lcywgYW5kIHNvIHJlY2VpdmVzIG1vcmUgcGVuYWx0eS4KKwkgICAoQnV0IHdlIHNob3Vs ZCBjb25zaWRlciBtb3JlIGFib3V0IHRoaXMsIEkgdGhpbmsgdGhlIGZhaXJuZXNzCisJICAgc2hv dWxkIGJlIGltcHJvdmVkIGJ5IHNvcnQgYm9ycm93IGxpc3QuKQorCisKK1NlY3VyaXR5IENvbnNp ZGVyYXRpb24KKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KKworCUl0J3MgZGFuZ2Vyb3VzIHRvIGNy ZWF0ZSBuZXcgZW50cnkgZm9yIGFueSBuZXcgcGFja2V0cyBub3QgYmVsb25ncworCXRvIGEgZmxv dyBiZWluZyB0cmFjZWQuIEZvciBleGFtcGxlLCBzeW4gZmxvb2QgYXR0YWNrIG9uIGEgc2luZ2xl CisJcG9ydCBtYXkgY2F1c2UgdGhvdXNhbmRzIG9mIGVudHJpZXMgY3JlYXRlZC4gVGhlICdsaW1p dCcgcGFyYW1ldGVyCisJaXMgdXNlZCB0byBzZXQgbGltaXQgb24gbWF4aW11bSBlbnRyaWVzIHdl IHdpbGwgY3JlYXRlLgorCisJQnV0IGV2ZW4gd2l0aCAnbGltaXQnLCBwb3J0IHNjYW4gY2FuIGZp bGwgdGhlIHNsb3RzIGFuZCBtYWtlIHZhbGlkCisJbmV3IGZsb3cgaGFzIG5vIHNsb3QgYXZhaWxh YmxlIGFuZCBub3QgYmUgdHJhY2VkLgorCisJT25lIG9mIHNvbHV0aW9uIGlzIHRvIHVzZSBuZXRm aWx0ZXIgTUFSSyBmb3IgY2xhc3NpZmljYXRpb24gCisJKGEuay5hLiBjbHNfZncuYykuIE9ubHkg ZXN0YWJsaXNoZWQgc2Vzc2lvbiBpcyBnaXZlbiBhIGZ3IG1hcmssIGFuZAorCXRoZW4sIGlmIHBv cnQgc2NhbiB1c2UgYSBzcG9vZmluZyBzb3VyY2UgYWRkcmVzcywgbm8gZncgbWFyayBnb3R0ZW4u CisKKworQXBwbGljYXRpb24KKy0tLS0tLS0tLS0tCisKKwlZb3Ugc2hvdWxkIHVzZSBIVEIgb3Ig b3RoZXIgY2xhc3NmdWwgcWRpc2MgdG8gZW5jbG9zZSB0aGlzIHFkaXNjLgorCisgKi8KKworCisj ZGVmaW5lIFBFUkZMT1dfSFNJWkUJCTI1MQorI2RlZmluZSBQRVJGTE9XX0xJRkVUSU1FCSgxMCpI WikKKworc3RydWN0IHBlcmZsb3dfZW50cnkKK3sKKwl1MzIJc3JjOworCXUzMglkc3Q7CisJdTE2 CXNwb3J0OworCXUxNglkcG9ydDsKKworCXN0cnVjdAlsaXN0X2hlYWQgaGxpc3Q7CisJc3RydWN0 CWxpc3RfaGVhZCBib3Jyb3c7IAorCXN0cnVjdAl0aW1lcl9saXN0IHRpbWVyOworCXN0cnVjdAlw ZXJmbG93X3NjaGVkX2RhdGEgKnE7CisJdTMyCWppZmZpZXM7CisJdTMyCXVzZWQ7CisJdTMyCXBl bmFsdHk7CisKKwl1OAlwcm90b2NvbDsKK307CisKK3N0cnVjdCBwZXJmbG93X3NjaGVkX2RhdGEK K3sKKwkvKiBwYXJhbWV0ZXJzICovCisJdTMyCXJhdGU7CQkJLyogZ3VhcmFudGVkIHJhdGUgKi8K Kwl1MzIJY2VpbDsJCQkvKiB1cHBlciBib3VuZCAqLworCXUzMglsaW1pdDsJCQkvKiBtYXhpbXVt IGZsb3dzIHdlIHRyYWNlICovCisJdTMyCXFsZW47CQkJLyogbWF4aW11bSBxdWV1ZSBsZW5ndGgg Ki8KKworCS8qIHZhcmlhYmxlcyAqLworCXUzMglncmF0ZTsJCQkvKiBhZ2dyZWdhdGl2ZSByYXRl ICovCisKKwl1MzIJamlmZmllczsKKwl1MzIJdG9rZW47CisJdTMyCWZsb3dfY291bnQ7CQkvKiBo b3cgbWFueSBmbG93cyB3ZSBhcmUgdHJhY2luZyAqLworCXN0cnVjdAlsaXN0X2hlYWQgaHRbUEVS RkxPV19IU0laRV07CS8qIGhhc2ggdGFibGUgKi8KKwlzdHJ1Y3QJbGlzdF9oZWFkIGJvcnJvdzsJ LyogbGlzdHMgb2YgYm9ycm93aW5nIGZsb3cgKi8KK307CisKK3N0cnVjdCBjb21tb25oZHIKK3sK Kwl1MTYJc291cmNlOworCXUxNglkZXN0OworfTsKKworc3RhdGljIF9faW5saW5lX18gdTMyIHBl cmZsb3dfaGFzaChzdHJ1Y3QgcGVyZmxvd19lbnRyeSAqdHVwbGUpCit7CisJcmV0dXJuIChqaGFz aF8zd29yZHModHVwbGUtPnNyYyBeIHR1cGxlLT5wcm90b2NvbCwKKwkJCQl0dXBsZS0+ZHN0LAor CQkJCSh0dXBsZS0+c3BvcnQgPDwgMTYgfCB0dXBsZS0+ZHBvcnQpLAorCQkJCTB4NUU4M0FEMDMp ICUgUEVSRkxPV19IU0laRSk7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIGludCBwZXJmbG93X2lz X3ZhbGlkKHN0cnVjdCBza19idWZmICpza2IpCit7CisJc3RydWN0IGlwaGRyICppcGggPSBza2It Pm5oLmlwaDsKKworCWlmIChza2ItPnByb3RvY29sICE9IF9fY29uc3RhbnRfaHRvbnMoRVRIX1Bf SVApKQorCQlyZXR1cm4gMDsKKworCWlmIChpcGgtPnByb3RvY29sICE9IElQUFJPVE9fVENQICYm IGlwaC0+cHJvdG9jb2wgIT0gSVBQUk9UT19UQ1AKKwkJCSYmIGlwaC0+cHJvdG9jb2wgIT0gSVBQ Uk9UT19TQ1RQKQorCQlyZXR1cm4gMDsKKworCXJldHVybiAxOworfQorCitzdGF0aWMgX19pbmxp bmVfXyB2b2lkIHBlcmZsb3dfZmxvd190aW1lcih1bnNpZ25lZCBsb25nIGFyZykKK3sKKwlzdHJ1 Y3QgcGVyZmxvd19lbnRyeSAqZSA9IChzdHJ1Y3QgcGVyZmxvd19lbnRyeSAqKSBhcmc7CisKKwll LT5xLT5mbG93X2NvdW50LS07CisJbGlzdF9kZWxfaW5pdCgmZS0+aGxpc3QpOworCWlmICghbGlz dF9lbXB0eSgmZS0+Ym9ycm93KSkKKwkJbGlzdF9kZWxfaW5pdCgmZS0+Ym9ycm93KTsKKwlrZnJl ZShlKTsKK30KKworc3RhdGljIF9faW5saW5lX18gc3RydWN0IHBlcmZsb3dfZW50cnkgKgorcGVy Zmxvd19uZXdfZmxvdyh1MzIgaGFzaCwgc3RydWN0IHBlcmZsb3dfZW50cnkgKnR1cGxlLCBzdHJ1 Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgcGVyZmxvd19zY2hlZF9kYXRhICpxID0gcWRpc2Nf cHJpdihzY2gpOworCXN0cnVjdCBwZXJmbG93X2VudHJ5ICplOworCisJaWYgKHEtPmZsb3dfY291 bnQgPj0gcS0+bGltaXQpCisJCXJldHVybiBOVUxMOworCisJZSA9IGttYWxsb2Moc2l6ZW9mKCpl KSwgR0ZQX0tFUk5FTCk7CisJaWYgKCFlKQorCQlyZXR1cm4gTlVMTDsKKworCXEtPmZsb3dfY291 bnQrKzsKKworCW1lbXNldChlLCAwLCBzaXplb2YoKmUpKTsKKworCWUtPnNyYyA9IHR1cGxlLT5z cmM7CisJZS0+ZHN0ID0gdHVwbGUtPmRzdDsKKwllLT5zcG9ydCA9IHR1cGxlLT5zcG9ydDsKKwll LT5kcG9ydCA9IHR1cGxlLT5kcG9ydDsKKwllLT5wcm90b2NvbCA9IHR1cGxlLT5wcm90b2NvbDsK KworCUlOSVRfTElTVF9IRUFEKCZlLT5obGlzdCk7CisJSU5JVF9MSVNUX0hFQUQoJmUtPmJvcnJv dyk7CisJaW5pdF90aW1lcigmZS0+dGltZXIpOworCWUtPnRpbWVyLmZ1bmN0aW9uID0gcGVyZmxv d19mbG93X3RpbWVyOworCWUtPnRpbWVyLmRhdGEgPSAodW5zaWduZWQgbG9uZykgZTsKKwkvKiBz eW5jIGZsb3cncyB0aWNrIHRvIHF1ZXVlJ3MgdGljayAqLworCWUtPmppZmZpZXMgPSBxLT5qaWZm aWVzOworCWUtPnEgPSBxOworCisJbGlzdF9hZGQoJmUtPmhsaXN0LCBxLT5odCArIGhhc2gpOwor CisJcmV0dXJuIGU7Cit9CisKK3N0YXRpYyBfX2lubGluZV9fIHZvaWQKK3BlcmZsb3dfZmlsbF90 dXBsZShzdHJ1Y3QgcGVyZmxvd19lbnRyeSAqdHVwbGUsIHN0cnVjdCBza19idWZmICpza2IpCit7 CisJc3RydWN0IGlwaGRyICppcGggPSBza2ItPm5oLmlwaDsKKwlzdHJ1Y3QgY29tbW9uaGRyICpj aDsKKworCW1lbXNldCh0dXBsZSwgMCwgc2l6ZW9mKHN0cnVjdCBwZXJmbG93X2VudHJ5KSk7Cisj aWYgMQorCS8qIG5vdCBhIHRyYWNlYWJsZSBmbG93LCBkbyBub3RoaW5nICovCisJaWYgKCFwZXJm bG93X2lzX3ZhbGlkKHNrYikpCisJCXJldHVybjsKKyNlbmRpZgorCisJY2ggPSAoc3RydWN0IGNv bW1vbmhkciAqKSgodm9pZCAqKWlwaCArIChpcGgtPmlobCA8PCAyKSk7CisJdHVwbGUtPnNyYyA9 IGlwaC0+c2FkZHI7CisJdHVwbGUtPmRzdCA9IGlwaC0+ZGFkZHI7CisJdHVwbGUtPnNwb3J0ID0g Y2gtPnNvdXJjZTsKKwl0dXBsZS0+ZHBvcnQgPSBjaC0+ZGVzdDsKKwl0dXBsZS0+cHJvdG9jb2wg PSBpcGgtPnByb3RvY29sOworfQorCitzdGF0aWMgc3RydWN0IHBlcmZsb3dfZW50cnkgKgorcGVy Zmxvd19maW5kX2Zsb3codTMyICpoYXNoLCBzdHJ1Y3QgcGVyZmxvd19lbnRyeSAqZmxvdywgc3Ry dWN0IFFkaXNjICpzY2gpCit7CisJc3RydWN0IHBlcmZsb3dfc2NoZWRfZGF0YSAqcSA9IHFkaXNj X3ByaXYoc2NoKTsKKwlzdHJ1Y3QgbGlzdF9oZWFkICpoLCAqaGVhZDsKKwlzdHJ1Y3QgcGVyZmxv d19lbnRyeSAqZTsKKyAgICAgICAKKwkqaGFzaCA9IHBlcmZsb3dfaGFzaChmbG93KTsKKwloZWFk ID0gcS0+aHQgKyAoKmhhc2gpOworCisJbGlzdF9mb3JfZWFjaChoLCBoZWFkKSB7CisJCWUgPSBs aXN0X2VudHJ5KGgsIHN0cnVjdCBwZXJmbG93X2VudHJ5LCBobGlzdCk7CisJCWlmIChlLT5zcmMg PT0gZmxvdy0+c3JjCisJCQkJJiYgZS0+ZHN0ID09IGZsb3ctPmRzdAorCQkJCSYmIGUtPnNwb3J0 ID09IGZsb3ctPnNwb3J0CisJCQkJJiYgZS0+ZHBvcnQgPT0gZmxvdy0+ZHBvcnQKKwkJCQkmJiBl LT5wcm90b2NvbCA9PSBmbG93LT5wcm90b2NvbCkKKwkJCWRlbF90aW1lcigmZS0+dGltZXIpOwor CQkJcmV0dXJuIGU7CisJfQorCXJldHVybiBOVUxMOworfQorCitzdGF0aWMgdm9pZCBwZXJmbG93 X3B1bmlzaChpbnQgcGVuYWx0eSwgc3RydWN0IGxpc3RfaGVhZCAqYm9ycm93KQoreworCXN0cnVj dCBwZXJmbG93X2VudHJ5ICplOworCXN0cnVjdCBsaXN0X2hlYWQgKmg7CisKKwlpZiAoIWxpc3Rf ZW1wdHkoYm9ycm93KSkgeworCQloID0gYm9ycm93LT5uZXh0OworCQlsaXN0X2RlbF9pbml0KGgp OworCQllID0gbGlzdF9lbnRyeShoLCBzdHJ1Y3QgcGVyZmxvd19lbnRyeSwgaGxpc3QpOworCQll LT5wZW5hbHR5ICs9IHBlbmFsdHk7CisJfQorfQorCitzdGF0aWMgX19pbmxpbmVfXyB2b2lkCitw ZXJmbG93X2FkanVzdF91c2VkKHN0cnVjdCBwZXJmbG93X2VudHJ5ICpmbG93LCB1MzIgcmF0ZSwg dTMyIGNlaWwpCit7CisJaW50IGN5Y2xlczsKKworCS8qIHN0aWxsIGluIHRoaXMgdGltZSBzbG90 ICovCisJaWYgKChqaWZmaWVzIC0gZmxvdy0+amlmZmllcykgPD0gSFopIHsKKwkJaWYgKChjZWls IC0gZmxvdy0+dXNlZCkgPiBmbG93LT5wZW5hbHR5KSB7CisJCQlmbG93LT51c2VkICs9IGZsb3ct PnBlbmFsdHk7CisJCQlmbG93LT5wZW5hbHR5ID0gMDsKKwkJfSBlbHNlIHsKKwkJCWZsb3ctPnVz ZWQgPSBjZWlsOworCQkJZmxvdy0+cGVuYWx0eSAtPSBjZWlsIC0gZmxvdy0+dXNlZDsKKwkJfQor CQlyZXR1cm47CisJfQorCisJLyogdGhlIHBhY2tldCBhcnJpdmVzIGFmdGVyIGN5Y2xlcyBzbG90 cyAqLworCWN5Y2xlcyA9IChqaWZmaWVzIC0gZmxvdy0+amlmZmllcykgLyBIWjsKKwlmbG93LT5q aWZmaWVzICs9IGN5Y2xlcyAqIEhaOworCisJaWYgKChjeWNsZXMgKiBjZWlsIC0gZmxvdy0+dXNl ZCkgPiBmbG93LT5wZW5hbHR5KSB7CisJCWZsb3ctPnVzZWQgPSAwOworCQlmbG93LT5wZW5hbHR5 ID0gMDsKKwl9IGVsc2UgeworCQlmbG93LT51c2VkID0gZmxvdy0+cGVuYWx0eSArIGZsb3ctPnVz ZWQgLSBjeWNsZXMgKiBjZWlsOworCQlpZiAoZmxvdy0+dXNlZCA+IGNlaWwpIHsKKwkJCWZsb3ct PnVzZWQgPSBjZWlsOworCQkJZmxvdy0+cGVuYWx0eSAtPSBjZWlsOworCQl9CisJfQorfQorCitz dGF0aWMgaW50IHBlcmZsb3dfZW5xdWV1ZShzdHJ1Y3Qgc2tfYnVmZiAqc2tiLCBzdHJ1Y3QgUWRp c2MgKnNjaCkKK3sKKwlzdHJ1Y3QgcGVyZmxvd19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihz Y2gpOworCXN0cnVjdCBwZXJmbG93X2VudHJ5IHR1cGxlLCAqZmxvdzsKKwl1MzIgaGFzaDsKKwor CS8qIG5vdCBhIHRyYWNlYWJsZSBmbG93ICovCisJaWYgKCFwZXJmbG93X2lzX3ZhbGlkKHNrYikp CisJCWdvdG8gZHJvcDsKKworCS8qIGlmIG1heCBxbGVuIGlzIHNldCBhbmQgY3VycmVudCBxdWV1 ZSBpcyBmdWxsLCBkcm9wICovCisJaWYgKHEtPnFsZW4gJiYgc2NoLT5xLnFsZW4gPj0gcS0+cWxl bikgeworCQlwcmludGsoS0VSTl9XQVJOSU5HICJxbGVuIG92ZXJsaW1pdCBkcm9wXG4iKTsKKwkJ Z290byBkcm9wOworCX0KKworCXBlcmZsb3dfZmlsbF90dXBsZSgmdHVwbGUsIHNrYik7CisJZmxv dyA9IHBlcmZsb3dfZmluZF9mbG93KCZoYXNoLCAmdHVwbGUsIHNjaCk7CisKKwlpZiAoZmxvdyA9 PSBOVUxMKSB7CisJCWZsb3cgPSBwZXJmbG93X25ld19mbG93KGhhc2gsICZ0dXBsZSwgc2NoKTsK KwkJaWYgKGZsb3cgPT0gTlVMTCkKKwkJCWdvdG8gZHJvcDsKKwl9CisKKwkvKiByZW5ldyB0aW1l ciBmb3IgZmxvdyAqLworCWZsb3ctPnRpbWVyLmV4cGlyZXMgPSBqaWZmaWVzICsgUEVSRkxPV19M SUZFVElNRTsKKwlhZGRfdGltZXIoJmZsb3ctPnRpbWVyKTsKKworCWlmICgoamlmZmllcyAtIHEt PmppZmZpZXMpID4gSFopIHsKKwkJcS0+dG9rZW4gPSBxLT5ncmF0ZTsKKwkJcS0+amlmZmllcyAr PSAoamlmZmllcyAtIHEtPmppZmZpZXMpIC8gSFogKiBIWjsKKwl9CisKKwkvKiByZW5ldyB1c2Vk IGZvciB0aGlzIGZsb3cgKi8KKwlwZXJmbG93X2FkanVzdF91c2VkKGZsb3csIHEtPnJhdGUsIHEt PmNlaWwpOworCisJLyogd2UgYWx3YXlzIHNhdGlzZnkgZmxvdyB1bmRlciByYXRlICovCisJaWYg KGZsb3ctPnVzZWQgPCBxLT5yYXRlKSB7CisJCWZsb3ctPnVzZWQgKz0gc2tiLT5sZW47CisJCWlm IChmbG93LT51c2VkID4gcS0+cmF0ZSkgeworCQkJLyogaWYgd2UgYm9ycm93LCB3ZSBtYXkgcmVj ZWl2ZSBwZW5hbHR5ICovCisJCQlpZiAobGlzdF9lbXB0eSgmZmxvdy0+Ym9ycm93KSkKKwkJCQls aXN0X2FkZF90YWlsKCZmbG93LT5ib3Jyb3csICZxLT5ib3Jyb3cpOworCQl9CisJCWlmIChmbG93 LT51c2VkID4gcS0+Y2VpbCkKKwkJCWZsb3ctPnBlbmFsdHkgKz0gZmxvdy0+dXNlZCAtIHEtPmNl aWw7CisJCWlmIChxLT50b2tlbiA8IHNrYi0+bGVuKSB7CisJCQlxLT50b2tlbiA9IDA7CisJCQlw ZXJmbG93X3B1bmlzaChza2ItPmxlbiAtIHEtPnRva2VuLCAmcS0+Ym9ycm93KTsKKwkJfSBlbHNl IHsKKwkJCXEtPnRva2VuIC09IHNrYi0+bGVuOworCQl9CisJfSBlbHNlIHsKKwkJaWYgKHEtPnRv a2VuIDwgc2tiLT5sZW4gfHwgZmxvdy0+dXNlZCA+PSBxLT5jZWlsKQorCQkJZ290byBkcm9wOwor CisJCWZsb3ctPnVzZWQgKz0gc2tiLT5sZW47CisJCXEtPnRva2VuIC09IHNrYi0+bGVuOworCisJ CWlmIChsaXN0X2VtcHR5KCZmbG93LT5ib3Jyb3cpKQorCQkJbGlzdF9hZGRfdGFpbCgmZmxvdy0+ Ym9ycm93LCAmcS0+Ym9ycm93KTsKKwkJZWxzZQorCQkJbGlzdF9tb3ZlKCZmbG93LT5ib3Jyb3cs ICZxLT5ib3Jyb3cpOworCisJCWlmIChmbG93LT51c2VkID4gcS0+Y2VpbCkKKwkJCWZsb3ctPnBl bmFsdHkgKz0gZmxvdy0+dXNlZCAtIHEtPmNlaWw7CisJfQorCitlbnF1ZXVlOgorCXNjaC0+cXN0 YXRzLmJhY2tsb2cgKz0gc2tiLT5sZW47CisJc2NoLT5ic3RhdHMuYnl0ZXMgKz0gc2tiLT5sZW47 CisJc2NoLT5ic3RhdHMucGFja2V0cysrOworCV9fc2tiX3F1ZXVlX3RhaWwoJnNjaC0+cSwgc2ti KTsKKwlyZXR1cm4gTkVUX1hNSVRfU1VDQ0VTUzsKKworZHJvcDoKKwlzY2gtPnFzdGF0cy5vdmVy bGltaXRzKys7CisJa2ZyZWVfc2tiKHNrYik7CisJc2NoLT5xc3RhdHMuZHJvcHMrKzsKKwlyZXR1 cm4gTkVUX1hNSVRfQ047Cit9CisKK3N0YXRpYyBpbnQgcGVyZmxvd19yZXF1ZXVlKHN0cnVjdCBz a19idWZmICpza2IsIHN0cnVjdCBRZGlzYyAqc2NoKQoreworCV9fc2tiX3F1ZXVlX2hlYWQoJnNj aC0+cSwgc2tiKTsKKwlzY2gtPnFzdGF0cy5iYWNrbG9nICs9IHNrYi0+bGVuOworCXNjaC0+cXN0 YXRzLnJlcXVldWVzKys7CisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyBzdHJ1Y3Qgc2tfYnVmZiAq cGVyZmxvd19kZXF1ZXVlKHN0cnVjdCBRZGlzYyAqc2NoKQoreworCXN0cnVjdCBza19idWZmICpz a2I7CisKKwlza2IgPSBfX3NrYl9kZXF1ZXVlKCZzY2gtPnEpOworCWlmIChza2IpIHsKKwkJc2No LT5xc3RhdHMuYmFja2xvZyAtPSBza2ItPmxlbjsKKwl9CisJcmV0dXJuIHNrYjsKK30KKworc3Rh dGljIHVuc2lnbmVkIGludCBwZXJmbG93X2Ryb3Aoc3RydWN0IFFkaXNjICpzY2gpCit7CisJc3Ry dWN0IHNrX2J1ZmYgKnNrYjsKKworCXNrYiA9IF9fc2tiX2RlcXVldWVfdGFpbCgmc2NoLT5xKTsK KwlpZiAoc2tiKSB7CisJCXVuc2lnbmVkIGludCBsZW4gPSBza2ItPmxlbjsKKwkJc2NoLT5xc3Rh dHMuYmFja2xvZyAtPSBsZW47CisJCXNjaC0+cXN0YXRzLmRyb3BzKys7CisJCWtmcmVlX3NrYihz a2IpOworCQlyZXR1cm4gbGVuOworCX0KKwlyZXR1cm4gMDsKK30KKworc3RhdGljIHZvaWQgcGVy Zmxvd19yZXNldChzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlza2JfcXVldWVfcHVyZ2UoJnNjaC0+ cSk7CisJc2NoLT5xc3RhdHMuYmFja2xvZyA9IDA7Cit9CisKK3N0YXRpYyBpbnQgcGVyZmxvd19j aGFuZ2Uoc3RydWN0IFFkaXNjICpzY2gsIHN0cnVjdCBydGF0dHIgKm9wdCkKK3sKKwlzdHJ1Y3Qg cGVyZmxvd19zY2hlZF9kYXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCB0Y19wZXJm bG93X3FvcHQgKmN0bDsKKworCS8qIGlmIGxpbWl0IGFuZCBxbGVuIGFyZSBsb3dlcmVkLCBhbmQg d2UgYXJlIGluIGEgb3ZlciBsaW1pdAorCSAqIHN0YXRlLCB3ZSBzdGlsbCBkb24ndCBkcm9wIGZs b3cgb3IgZHJvcCBwYWNrZXQuCisJICogc2NoLT5xIHdpbGwgZGVjcmVhc2UgdG8gYWxsb3dlZCBs ZW5ndGgKKwkgKiBxLT5mbG93X2NvdW50IHdpbGwgZGVjcmVhc2UgYmVjYXVzZSBubyBuZXcgZmxv dyBpcyB0cmFjZWQKKwkgKi8KKwlpZiAob3B0ID09IE5VTEwpIHsKKwkJcmV0dXJuIC1FSU5WQUw7 CisJfSBlbHNlIHsKKwkJY3RsID0gUlRBX0RBVEEob3B0KTsKKwkJaWYgKG9wdC0+cnRhX2xlbiA8 IFJUQV9MRU5HVEgoc2l6ZW9mKCpjdGwpKSkKKwkJCXJldHVybiAtRUlOVkFMOworCisJCXEtPnJh dGUgPSBjdGwtPnJhdGUucmF0ZTsKKwkJcS0+Y2VpbCA9IGN0bC0+Y2VpbC5yYXRlOworCQlxLT5s aW1pdCA9IGN0bC0+bGltaXQ7CisJCXEtPnFsZW4gPSBjdGwtPnFsZW47CisKKwkJaWYgKHEtPmxp bWl0ID09IDApCisJCQlxLT5saW1pdCA9IDEwMjQ7CisJCS8qIGFnZ3JlZ2F0aXZlIHJhdGUgaXMg KHJhdGUgKiAxLjA1ICogbGltaXQpICovCisJCXEtPmdyYXRlID0gKHEtPnJhdGUgKyBxLT5yYXRl LzIwKSAqIHEtPmxpbWl0OworCisJCXEtPmppZmZpZXMgPSBqaWZmaWVzOworCX0KKworCXJldHVy biAwOworfQorCitzdGF0aWMgaW50IHBlcmZsb3dfaW5pdChzdHJ1Y3QgUWRpc2MgKnNjaCwgc3Ry dWN0IHJ0YXR0ciAqb3B0KQoreworCXN0cnVjdCBwZXJmbG93X3NjaGVkX2RhdGEgKnEgPSBxZGlz Y19wcml2KHNjaCk7CisJaW50IGksIHJldDsKKworCXJldCA9IHBlcmZsb3dfY2hhbmdlKHNjaCwg b3B0KTsKKwlpZiAocmV0KQorCQlyZXR1cm4gcmV0OworCisJSU5JVF9MSVNUX0hFQUQoJnEtPmJv cnJvdyk7CisKKwlmb3IgKGkgPSAwOyBpIDwgUEVSRkxPV19IU0laRTsgaSsrKQorCQlJTklUX0xJ U1RfSEVBRChxLT5odCArIGkpOworCisJcmV0dXJuIDA7Cit9CisKK3N0YXRpYyB2b2lkIHBlcmZs b3dfZGVzdHJveShzdHJ1Y3QgUWRpc2MgKnNjaCkKK3sKKwlzdHJ1Y3QgcGVyZmxvd19zY2hlZF9k YXRhICpxID0gcWRpc2NfcHJpdihzY2gpOworCXN0cnVjdCBsaXN0X2hlYWQgKmgsICpuOworCXN0 cnVjdCBwZXJmbG93X2VudHJ5ICplOworCWludCBpOworCisJZm9yIChpID0gMDsgaSA8IFBFUkZM T1dfSFNJWkU7IGkrKykgeworCQlsaXN0X2Zvcl9lYWNoX3NhZmUgKGgsIG4sIHEtPmh0ICsgaSkg eworCQkJZSA9IGxpc3RfZW50cnkoaCwgc3RydWN0IHBlcmZsb3dfZW50cnksIGhsaXN0KTsKKwkJ CWRlbF90aW1lcigmZS0+dGltZXIpOworCQkJaWYgKCFsaXN0X2VtcHR5KCZlLT5ib3Jyb3cpKQor CQkJCWxpc3RfZGVsX2luaXQoJmUtPmJvcnJvdyk7CisJCQlsaXN0X2RlbChoKTsKKwkJCWtmcmVl KGUpOworCQl9CisJfQorfQorCitzdGF0aWMgaW50IHBlcmZsb3dfZHVtcChzdHJ1Y3QgUWRpc2Mg KnNjaCwgc3RydWN0IHNrX2J1ZmYgKnNrYikKK3sKKwlyZXR1cm4gLTE7Cit9CisKK3N0YXRpYyBz dHJ1Y3QgUWRpc2Nfb3BzIHBlcmZsb3dfcWRpc2Nfb3BzID0geworCS5uZXh0CQk9IE5VTEwsCisJ LmNsX29wcwkJPSBOVUxMLAorCS5pZAkJPSAicGVyZmxvdyIsCisJLnByaXZfc2l6ZQk9IHNpemVv ZihzdHJ1Y3QgcGVyZmxvd19zY2hlZF9kYXRhKSwKKwkuZW5xdWV1ZQk9IHBlcmZsb3dfZW5xdWV1 ZSwKKwkuZGVxdWV1ZQk9IHBlcmZsb3dfZGVxdWV1ZSwKKwkucmVxdWV1ZQk9IHBlcmZsb3dfcmVx dWV1ZSwKKwkuZHJvcAkJPSBwZXJmbG93X2Ryb3AsCisJLmluaXQJCT0gcGVyZmxvd19pbml0LAor CS5yZXNldAkJPSBwZXJmbG93X3Jlc2V0LAorCS5kZXN0cm95CT0gcGVyZmxvd19kZXN0cm95LAor CS5jaGFuZ2UJCT0gcGVyZmxvd19jaGFuZ2UsCisJLmR1bXAJCT0gcGVyZmxvd19kdW1wLAorCS5v d25lcgkJPSBUSElTX01PRFVMRSwKK307CisKK3N0YXRpYyBpbnQgX19pbml0IHBlcmZsb3dfbW9k dWxlX2luaXQodm9pZCkKK3sKKwlyZXR1cm4gcmVnaXN0ZXJfcWRpc2MoJnBlcmZsb3dfcWRpc2Nf b3BzKTsKK30KKworc3RhdGljIHZvaWQgX19leGl0IHBlcmZsb3dfbW9kdWxlX2V4aXQodm9pZCkK K3sKKwl1bnJlZ2lzdGVyX3FkaXNjKCZwZXJmbG93X3FkaXNjX29wcyk7Cit9CisKK21vZHVsZV9p bml0KHBlcmZsb3dfbW9kdWxlX2luaXQpOworbW9kdWxlX2V4aXQocGVyZmxvd19tb2R1bGVfZXhp dCk7CisKK01PRFVMRV9MSUNFTlNFKCJHUEwiKTsKK01PRFVMRV9BVVRIT1IoIldhbmcgSmlhbiA8 bGFya0BsaW51eC5uZXQuY24+Iik7Cg== --------_4252A594050B033D6C20_MULTIPART_MIXED_--