Newsgroups: php.internals Path: news.php.net Xref: news.php.net php.internals:46409 Return-Path: Mailing-List: contact internals-help@lists.php.net; run by ezmlm Delivered-To: mailing list internals@lists.php.net Received: (qmail 28050 invoked from network); 13 Dec 2009 19:06:09 -0000 Received: from unknown (HELO lists.php.net) (127.0.0.1) by localhost with SMTP; 13 Dec 2009 19:06:09 -0000 Authentication-Results: pb1.pair.com header.from=jerome@loyet.net; sender-id=unknown Authentication-Results: pb1.pair.com smtp.mail=jerome@loyet.net; spf=permerror; sender-id=unknown Received-SPF: error (pb1.pair.com: domain loyet.net from 209.85.223.195 cause and error) X-PHP-List-Original-Sender: jerome@loyet.net X-Host-Fingerprint: 209.85.223.195 mail-iw0-f195.google.com Received: from [209.85.223.195] ([209.85.223.195:48514] helo=mail-iw0-f195.google.com) by pb1.pair.com (ecelerity 2.1.1.9-wez r(12769M)) with ESMTP id 02/53-09748-F1B352B4 for ; Sun, 13 Dec 2009 14:06:09 -0500 Received: by iwn33 with SMTP id 33so1536966iwn.29 for ; Sun, 13 Dec 2009 11:06:05 -0800 (PST) MIME-Version: 1.0 Received: by 10.231.170.201 with SMTP id e9mr2657580ibz.16.1260731164987; Sun, 13 Dec 2009 11:06:04 -0800 (PST) Date: Sun, 13 Dec 2009 20:06:04 +0100 Message-ID: <3bea96c40912131106w26f49269i67dd6c8523cccae0@mail.gmail.com> To: php-dev Cc: Antony Dovgal Content-Type: multipart/mixed; boundary=0050450181023f13ae047aa0d995 Subject: [PATCH] fpm/feature: apache_like or dynamic spawning (for testing) From: jerome@loyet.net (=?ISO-8859-1?B?Suly9G1lIExveWV0?=) --0050450181023f13ae047aa0d995 Content-Type: text/plain; charset=ISO-8859-1 Hi all, I spent some time working on the missing apache_like feature in FPM. The attached patch is the first version and is for testing. Changes: 1- rename apache_like to dynamic (in conf file and in source file) 2- add the dynamic spawning algorithm The algorithm is based on the mod_worker from apache httpd Algorihtm: check start_servers, min_spare_servers, max_spare_servers if start_server is not set, set it to (min_spare + (max_spare - min_spare) / 2) for each pool, set a variable spawn_rate to 1 set a 1s timer event to perform idle server maintenance each second for each pool { calculate nb_idle, number of idle process (based on child->time_accepted which is set when a child accept() call returns and reset when it call accept()) if idle > max_spare { kill the oldest idle child set spawn_rate to 1 continue to next pool } if idle < min_spare { set nb_children to MIN(spawn_rate, (min_spare - nb_idle)) create nb_children if (spawn_rate < 32) { spawn_rate * 2 } continue to next next pool } // nothing has been done (no fork and no kill) reset spawn_rate to 1 continue to next pool } spawn_rate is used to increase the number of child to create when there is a lot of children to create at once. The first iteration it will create 1, then 2, then 4, then 8, then 16. I didn't do anything about handling the gracefull restart. I'll check that later. You can test it and make me returns. Hope it helps ++ Jerome --0050450181023f13ae047aa0d995 Content-Type: text/plain; name="php-fpm.apache_like-v3.patch.txt" Content-Disposition: attachment; filename="php-fpm.apache_like-v3.patch.txt" Content-Transfer-Encoding: base64 X-Attachment-Id: f_g366rsiq0 SW5kZXg6IHNhcGkvZnBtL2ZwbS9mcG1fcmVxdWVzdC5oCj09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNhcGkvZnBt L2ZwbS9mcG1fcmVxdWVzdC5oCShy6XZpc2lvbiAyOTIwNjcpCisrKyBzYXBpL2ZwbS9mcG0vZnBt X3JlcXVlc3QuaAkoY29waWUgZGUgdHJhdmFpbCkKQEAgLTE1LDYgKzE1LDcgQEAKIHN0cnVjdCB0 aW1ldmFsOwogCiB2b2lkIGZwbV9yZXF1ZXN0X2NoZWNrX3RpbWVkX291dChzdHJ1Y3QgZnBtX2No aWxkX3MgKmNoaWxkLCBzdHJ1Y3QgdGltZXZhbCAqdHYsIGludCB0ZXJtaW5hdGVfdGltZW91dCwg aW50IHNsb3dsb2dfdGltZW91dCk7CitpbnQgZnBtX3JlcXVlc3RfaXNfaWRsZShzdHJ1Y3QgZnBt X2NoaWxkX3MgKmNoaWxkKTsKIAogZW51bSBmcG1fcmVxdWVzdF9zdGFnZV9lIHsKIAlGUE1fUkVR VUVTVF9BQ0NFUFRJTkcgPSAxLApJbmRleDogc2FwaS9mcG0vZnBtL2ZwbV9jaGlsZHJlbi5oCj09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT0KLS0tIHNhcGkvZnBtL2ZwbS9mcG1fY2hpbGRyZW4uaAkocul2aXNpb24gMjkyMDY3 KQorKysgc2FwaS9mcG0vZnBtL2ZwbV9jaGlsZHJlbi5oCShjb3BpZSBkZSB0cmF2YWlsKQpAQCAt MTUsNiArMTUsNyBAQAogaW50IGZwbV9jaGlsZHJlbl9mcmVlKHN0cnVjdCBmcG1fY2hpbGRfcyAq Y2hpbGQpOwogdm9pZCBmcG1fY2hpbGRyZW5fYnVyeSgpOwogaW50IGZwbV9jaGlsZHJlbl9pbml0 X21haW4oKTsKK2ludCBmcG1fY2hpbGRyZW5fbWFrZShzdHJ1Y3QgZnBtX3dvcmtlcl9wb29sX3Mg KndwLCBpbnQgaW5fZXZlbnRfbG9vcCwgaW50IG5iX3RvX3NwYXduKTsKIAogc3RydWN0IGZwbV9j aGlsZF9zOwogCkBAIC0yNyw2ICsyOCw3IEBACiAJaW50IGZkX3N0ZG91dCwgZmRfc3RkZXJyOwog CXZvaWQgKCp0cmFjZXIpKHN0cnVjdCBmcG1fY2hpbGRfcyAqKTsKIAlzdHJ1Y3QgdGltZXZhbCBz bG93X2xvZ2dlZDsKKwlpbnQgaWRsZV9raWxsOwogCXBpZF90IHBpZDsKIH07CiAKSW5kZXg6IHNh cGkvZnBtL2ZwbS9mcG1fY29uZmlnLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc2FwaS9mcG0vZnBtL2ZwbV9j b25maWcuaAkocul2aXNpb24gMjkyMDY3KQorKysgc2FwaS9mcG0vZnBtL2ZwbV9jb25maWcuaAko Y29waWUgZGUgdHJhdmFpbCkKQEAgLTMyLDYgKzMyLDEwIEBACiAJfSB3aGlsZSAoMCkKICNlbmRp ZgogCisjaWZuZGVmIE1JTgorI2RlZmluZSBNSU4oYSxiKSAoKChhKTwoYikpPyhhKTooYikpCisj ZW5kaWYKKwogI2lmIGRlZmluZWQoSEFWRV9QVFJBQ0UpIHx8IGRlZmluZWQoUFJPQ19NRU1fRklM RSkgfHwgZGVmaW5lZChIQVZFX01BQ0hfVk1fUkVBRCkKICNkZWZpbmUgSEFWRV9GUE1fVFJBQ0Ug MQogI2Vsc2UKSW5kZXg6IHNhcGkvZnBtL2ZwbS9mcG1fcHJvY2Vzc19jdGwuYwo9PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 Ci0tLSBzYXBpL2ZwbS9mcG0vZnBtX3Byb2Nlc3NfY3RsLmMJKHLpdmlzaW9uIDI5MjA2NykKKysr IHNhcGkvZnBtL2ZwbS9mcG1fcHJvY2Vzc19jdGwuYwkoY29waWUgZGUgdHJhdmFpbCkKQEAgLTMw NywxMCArMzA3LDk1IEBACiAJCQl9CiAJCX0KIAl9Ci0JCiB9CiAvKiB9fX0gKi8KIAorc3RhdGlj IHZvaWQgZnBtX3BjdGxfcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZShzdHJ1Y3QgdGlt ZXZhbCAqbm93KSAvKiB7e3sgKi8KK3sKKwlzdHJ1Y3QgZnBtX3dvcmtlcl9wb29sX3MgKndwOwor CXN0cnVjdCBmcG1fY2hpbGRfcyAqbGFzdF9pZGxlX2NoaWxkID0gTlVMTDsKKwlpbnQgaTsKKwor CWZvciAod3AgPSBmcG1fd29ya2VyX2FsbF9wb29sczsgd3A7IHdwID0gd3AtPm5leHQpIHsKKwkJ aW50IHRlcm1pbmF0ZV90aW1lb3V0ID0gd3AtPmNvbmZpZy0+cmVxdWVzdF90ZXJtaW5hdGVfdGlt ZW91dDsKKwkJaW50IHNsb3dsb2dfdGltZW91dCA9IHdwLT5jb25maWctPnJlcXVlc3Rfc2xvd2xv Z190aW1lb3V0OworCQlzdHJ1Y3QgZnBtX2NoaWxkX3MgKmNoaWxkOworCQlpbnQgaWRsZSA9IDA7 CisJCWludCBhY3RpdmUgPSAwOworCQlzdHJ1Y3QgdGltZXZhbCB0djsKKworCQlpZiAod3AtPmNv bmZpZyA9PSBOVUxMKSBjb250aW51ZTsKKwkJaWYgKHdwLT5jb25maWctPnBtLT5zdHlsZSAhPSBQ TV9TVFlMRV9EWU5BTUlDKSBjb250aW51ZTsKKworCQlmb3IgKGNoaWxkID0gd3AtPmNoaWxkcmVu OyBjaGlsZDsgY2hpbGQgPSBjaGlsZC0+bmV4dCkgeworCQkJaW50IHJldCA9IGZwbV9yZXF1ZXN0 X2lzX2lkbGUoY2hpbGQpOworCQkJaWYgKHJldCA9PSAxKSB7CisJCQkJaWYgKGxhc3RfaWRsZV9j aGlsZCA9PSBOVUxMKSB7CisJCQkJCWxhc3RfaWRsZV9jaGlsZCA9IGNoaWxkOworCQkJCX0gZWxz ZSB7CisJCQkJCWlmIChjaGlsZC0+c3RhcnRlZC50dl9zZWMgPCBsYXN0X2lkbGVfY2hpbGQtPnN0 YXJ0ZWQudHZfc2VjKSB7CisJCQkJCQlsYXN0X2lkbGVfY2hpbGQgPSBjaGlsZDsKKwkJCQkJfQor CQkJCX0KKwkJCQlpZGxlKys7CisJCQl9IGVsc2UgaWYgKHJldCA9PSAwKSB7CisJCQkJYWN0aXZl Kys7CisJCQl9CisJCX0KKworCQl6bG9nKFpMT0dfU1RVRkYsIFpMT0dfREVCVUcsICJbJXNdIHJh dGU9JWQgaWRsZT0lZCBhY3RpdmU9JWQgdG90YWw9JWQiLCB3cC0+Y29uZmlnLT5uYW1lLCB3cC0+ aWRsZV9zcGF3bl9yYXRlLCBpZGxlLCBhY3RpdmUsIHdwLT5ydW5uaW5nX2NoaWxkcmVuKTsKKwor CQlpZiAoKGFjdGl2ZSArIGlkbGUpICE9IHdwLT5ydW5uaW5nX2NoaWxkcmVuKSB7CisJCQl6bG9n KFpMT0dfU1RVRkYsIFpMT0dfRVJST1IsICJbJXNdIHVuYWJsZSB0byByZXRyaWV2ZSBzcGF3bmlu ZyBpbmZvcm1hdGlvbnMiLCB3cC0+Y29uZmlnLT5uYW1lKTsKKwkJCWNvbnRpbnVlOworCQl9CisK KwkJaWYgKGlkbGUgPiB3cC0+Y29uZmlnLT5wbS0+ZHluYW1pYy5tYXhfc3BhcmVfc2VydmVycyAm JiBsYXN0X2lkbGVfY2hpbGQpIHsKKwkJCWxhc3RfaWRsZV9jaGlsZC0+aWRsZV9raWxsID0gMTsK KwkJCWZwbV9wY3RsX2tpbGwobGFzdF9pZGxlX2NoaWxkLT5waWQsIEZQTV9QQ1RMX1RFUk0pOwor CQkJd3AtPmlkbGVfc3Bhd25fcmF0ZSA9IDE7CisJCQljb250aW51ZTsKKwkJfQorCisJCWlmIChp ZGxlIDwgd3AtPmNvbmZpZy0+cG0tPmR5bmFtaWMubWluX3NwYXJlX3NlcnZlcnMpIHsKKwkJCWlm ICh3cC0+cnVubmluZ19jaGlsZHJlbiA+PSB3cC0+Y29uZmlnLT5wbS0+bWF4X2NoaWxkcmVuKSB7 CisJCQkJaWYgKCF3cC0+d2Fybl9tYXhfY2hpbGRyZW4pIHsKKwkJCQkJemxvZyhaTE9HX1NUVUZG LCBaTE9HX1dBUk5JTkcsICJwb29sICVzOiBzZXJ2ZXIgcmVhY2hlZCBtYXhfY2hpbGRyZW4gc2V0 dGluZywgY29uc2lkZXIgcmFpc2luZyBpdCIsCisJCQkJCSAgICAgd3AtPmNvbmZpZy0+bmFtZSk7 CisJCQkJCXdwLT53YXJuX21heF9jaGlsZHJlbiA9IDE7CisJCQkJfQorCQkJCXdwLT5pZGxlX3Nw YXduX3JhdGUgPSAxOworCQkJCWNvbnRpbnVlOworCQkJfQorCQkJd3AtPndhcm5fbWF4X2NoaWxk cmVuID0gMDsKKworCQkJaWYgKHdwLT5pZGxlX3NwYXduX3JhdGUgPj0gOCkgeworCQkJCXpsb2co WkxPR19TVFVGRiwgWkxPR19XQVJOSU5HLCAicG9vbCAlcyBzZWVtcyBidXN5ICh5b3UgbWF5IG5l ZWQgdG8gaW5jcmVhc2Ugc3RhcnRfc2VydmVycywgb3IgbWluL21heF9zcGFyZV9zZXJ2ZXJzKSwg c3Bhd25pbmcgJWQgY2hpbGRyZW4sIHRoZXJlIGFyZSAlZCBpZGxlLCBhbmQgJWQgdG90YWwgY2hp bGRyZW4iLCB3cC0+Y29uZmlnLT5uYW1lLCB3cC0+aWRsZV9zcGF3bl9yYXRlLCBpZGxlLCB3cC0+ cnVubmluZ19jaGlsZHJlbik7CisJCQl9CisKKwkJCWkgPSBNSU4od3AtPmlkbGVfc3Bhd25fcmF0 ZSwgd3AtPmNvbmZpZy0+cG0tPmR5bmFtaWMubWluX3NwYXJlX3NlcnZlcnMgLSBpZGxlKTsKKwkJ CWZwbV9jaGlsZHJlbl9tYWtlKHdwLCAxLCBpKTsKKworCQkJLyogaWYgaXQncyBhIGNoaWxkLCBz dG9wIGhlcmUgd2l0aG91dCBjcmVhdGluZyB0aGUgbmV4dCBldmVudAorCQkJICogdGhpcyBldmVu dCBpcyByZXNlcnZlZCB0byB0aGUgbWFzdGVyIHByb2Nlc3MKKwkJCSAqLworCQkJaWYgKGZwbV9n bG9iYWxzLmlzX2NoaWxkKSB7CisJCQkJcmV0dXJuOworCQkJfQorCisJCQl6bG9nKFpMT0dfU1RV RkYsIFpMT0dfTk9USUNFLCAicG9vbCAlczogJWQgY2hpbGQocmVuKSBoYXZlIGJlZW4gY3JlYXRl ZCBiZWNhdXNlIG9mIG5vdCBlbm91Z2ggc3BhcmUgY2hpbGRyZW4iLCB3cC0+Y29uZmlnLT5uYW1l LCBpKTsJCisKKwkJCS8qIERvdWJsZSB0aGUgc3Bhd24gcmF0ZSBmb3IgdGhlIG5leHQgaXRlcmF0 aW9uICovCisJCQlpZiAod3AtPmlkbGVfc3Bhd25fcmF0ZSA8IEZQTV9NQVhfU1BBV05fUkFURSkg eworCQkJCXdwLT5pZGxlX3NwYXduX3JhdGUgKj0gMjsKKwkJCX0KKwkJCWNvbnRpbnVlOworCQl9 CisJCXdwLT5pZGxlX3NwYXduX3JhdGUgPSAxOworCX0KK30KKy8qIH19fSAqLworCiB2b2lkIGZw bV9wY3RsX2hlYXJ0YmVhdChpbnQgZmQsIHNob3J0IHdoaWNoLCB2b2lkICphcmcpIC8qIHt7eyAq LwogewogCXN0YXRpYyBzdHJ1Y3QgZXZlbnQgaGVhcnRiZWF0OwpAQCAtMzI4LDMgKzQxMywyOSBA QAogfQogLyogfX19ICovCiAKK3ZvaWQgZnBtX3BjdGxfcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWlu dGVuYW5jZV9oZWFydGJlYXQoaW50IGZkLCBzaG9ydCB3aGljaCwgdm9pZCAqYXJnKSAvKiB7e3sg Ki8KK3sKKwlzdGF0aWMgc3RydWN0IGV2ZW50IGhlYXJ0YmVhdDsKKwlzdHJ1Y3QgdGltZXZhbCB0 diA9IHsgLnR2X3NlYyA9IDAsIC50dl91c2VjID0gRlBNX0lETEVfU0VSVkVSX01BSU5URU5BTkNF X0hFQVJUQkVBVCB9OworCXN0cnVjdCB0aW1ldmFsIG5vdzsKKworCWlmICh3aGljaCA9PSBFVl9U SU1FT1VUKSB7CisJCWV2dGltZXJfZGVsKCZoZWFydGJlYXQpOworCQlmcG1fY2xvY2tfZ2V0KCZu b3cpOworCQlpZiAoZnBtX3BjdGxfY2FuX3NwYXduX2NoaWxkcmVuKCkpIHsKKwkJCWZwbV9wY3Rs X3BlcmZvcm1faWRsZV9zZXJ2ZXJfbWFpbnRlbmFuY2UoJm5vdyk7CisKKwkJCS8qIGlmIGl0J3Mg YSBjaGlsZCwgc3RvcCBoZXJlIHdpdGhvdXQgY3JlYXRpbmcgdGhlIG5leHQgZXZlbnQKKwkJCSAq IHRoaXMgZXZlbnQgaXMgcmVzZXJ2ZWQgdG8gdGhlIG1hc3RlciBwcm9jZXNzCisJCQkgKi8KKwkJ CWlmIChmcG1fZ2xvYmFscy5pc19jaGlsZCkgeworCQkJCXJldHVybjsKKwkJCX0KKwkJfQorCX0K KworCWV2dGltZXJfc2V0KCZoZWFydGJlYXQsICZmcG1fcGN0bF9wZXJmb3JtX2lkbGVfc2VydmVy X21haW50ZW5hbmNlX2hlYXJ0YmVhdCwgMCk7CisJZXZ0aW1lcl9hZGQoJmhlYXJ0YmVhdCwgJnR2 KTsKK30KKy8qIH19fSAqLworCkluZGV4OiBzYXBpL2ZwbS9mcG0vZnBtX2NvbmYuYwo9PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09Ci0tLSBzYXBpL2ZwbS9mcG0vZnBtX2NvbmYuYwkocul2aXNpb24gMjkyMDY3KQorKysgc2Fw aS9mcG0vZnBtL2ZwbV9jb25mLmMJKGNvcGllIGRlIHRyYXZhaWwpCkBAIC04Miw4ICs4Miw4IEBA CiAKIAlpZiAoIXN0cmNtcCh2YWx1ZSwgInN0YXRpYyIpKSB7CiAJCWMtPnN0eWxlID0gUE1fU1RZ TEVfU1RBVElDOwotCX0gZWxzZSBpZiAoIXN0cmNtcCh2YWx1ZSwgImFwYWNoZS1saWtlIikpIHsK LQkJYy0+c3R5bGUgPSBQTV9TVFlMRV9BUEFDSEVfTElLRTsKKwl9IGVsc2UgaWYgKCFzdHJjbXAo dmFsdWUsICJkeW5hbWljIikpIHsKKwkJYy0+c3R5bGUgPSBQTV9TVFlMRV9EWU5BTUlDOwogCX0g ZWxzZSB7CiAJCXJldHVybiAiaW52YWxpZCB2YWx1ZSBmb3IgJ3N0eWxlJyI7CiAJfQpAQCAtMTM5 LDE5ICsxMzksMTkgQEAKIH0KIC8qIH19fSAqLwogCi1zdGF0aWMgc3RydWN0IHhtbF9jb25mX3Nl Y3Rpb24gZnBtX2NvbmZfc2V0X2FwYWNoZV9saWtlX3N1YnNlY3Rpb25fY29uZiA9IHsKLQkucGF0 aCA9ICJhcGFjaGVfbGlrZSBzb21ld2hlcmUiLCAvKiBmaXhtZSAqLworc3RhdGljIHN0cnVjdCB4 bWxfY29uZl9zZWN0aW9uIGZwbV9jb25mX3NldF9keW5hbWljX3N1YnNlY3Rpb25fY29uZiA9IHsK KwkucGF0aCA9ICJkeW5hbWljIHNvbWV3aGVyZSIsIC8qIGZpeG1lICovCiAJLnBhcnNlcnMgPSAo c3RydWN0IHhtbF92YWx1ZV9wYXJzZXIgW10pIHsKLQkJeyBYTUxfQ09ORl9TQ0FMQVIsICJTdGFy dFNlcnZlcnMiLAkJJnhtbF9jb25mX3NldF9zbG90X2ludGVnZXIsIG9mZnNldG9mKHN0cnVjdCBm cG1fcG1fcywgb3B0aW9uc19hcGFjaGVfbGlrZS5TdGFydFNlcnZlcnMpIH0sCi0JCXsgWE1MX0NP TkZfU0NBTEFSLCAiTWluU3BhcmVTZXJ2ZXJzIiwJJnhtbF9jb25mX3NldF9zbG90X2ludGVnZXIs IG9mZnNldG9mKHN0cnVjdCBmcG1fcG1fcywgb3B0aW9uc19hcGFjaGVfbGlrZS5NaW5TcGFyZVNl cnZlcnMpIH0sCi0JCXsgWE1MX0NPTkZfU0NBTEFSLCAiTWF4U3BhcmVTZXJ2ZXJzIiwJJnhtbF9j b25mX3NldF9zbG90X2ludGVnZXIsIG9mZnNldG9mKHN0cnVjdCBmcG1fcG1fcywgb3B0aW9uc19h cGFjaGVfbGlrZS5NYXhTcGFyZVNlcnZlcnMpIH0sCisJCXsgWE1MX0NPTkZfU0NBTEFSLCAic3Rh cnRfc2VydmVycyIsCQkmeG1sX2NvbmZfc2V0X3Nsb3RfaW50ZWdlciwgb2Zmc2V0b2Yoc3RydWN0 IGZwbV9wbV9zLCBkeW5hbWljLnN0YXJ0X3NlcnZlcnMpIH0sCisJCXsgWE1MX0NPTkZfU0NBTEFS LCAibWluX3NwYXJlX3NlcnZlcnMiLAkmeG1sX2NvbmZfc2V0X3Nsb3RfaW50ZWdlciwgb2Zmc2V0 b2Yoc3RydWN0IGZwbV9wbV9zLCBkeW5hbWljLm1pbl9zcGFyZV9zZXJ2ZXJzKSB9LAorCQl7IFhN TF9DT05GX1NDQUxBUiwgIm1heF9zcGFyZV9zZXJ2ZXJzIiwJJnhtbF9jb25mX3NldF9zbG90X2lu dGVnZXIsIG9mZnNldG9mKHN0cnVjdCBmcG1fcG1fcywgZHluYW1pYy5tYXhfc3BhcmVfc2VydmVy cykgfSwKIAkJeyAwLCAwLCAwLCAwIH0KIAl9CiB9OwogCi1zdGF0aWMgY2hhciAqZnBtX2NvbmZf c2V0X2FwYWNoZV9saWtlX3N1YnNlY3Rpb24odm9pZCAqKmNvbmYsIGNoYXIgKm5hbWUsIHZvaWQg KnhtbF9ub2RlLCBpbnRwdHJfdCBvZmZzZXQpIC8qIHt7eyAqLworc3RhdGljIGNoYXIgKmZwbV9j b25mX3NldF9keW5hbWljX3N1YnNlY3Rpb24odm9pZCAqKmNvbmYsIGNoYXIgKm5hbWUsIHZvaWQg KnhtbF9ub2RlLCBpbnRwdHJfdCBvZmZzZXQpIC8qIHt7eyAqLwogewotCXJldHVybiB4bWxfY29u Zl9wYXJzZV9zZWN0aW9uKGNvbmYsICZmcG1fY29uZl9zZXRfYXBhY2hlX2xpa2Vfc3Vic2VjdGlv bl9jb25mLCB4bWxfbm9kZSk7CisJcmV0dXJuIHhtbF9jb25mX3BhcnNlX3NlY3Rpb24oY29uZiwg JmZwbV9jb25mX3NldF9keW5hbWljX3N1YnNlY3Rpb25fY29uZiwgeG1sX25vZGUpOwogfQogLyog fX19ICovCiAKQEAgLTE5MSw3ICsxOTEsNyBAQAogCS5wYXJzZXJzID0gKHN0cnVjdCB4bWxfdmFs dWVfcGFyc2VyIFtdKSB7CiAJCXsgWE1MX0NPTkZfU0NBTEFSLAkJInN0eWxlIiwJCQkJJmZwbV9j b25mX3NldF9wbV9zdHlsZSwJCQkJCQkwIH0sCiAJCXsgWE1MX0NPTkZfU0NBTEFSLAkJIm1heF9j aGlsZHJlbiIsCQkJJnhtbF9jb25mX3NldF9zbG90X2ludGVnZXIsCQkJCQlvZmZzZXRvZihzdHJ1 Y3QgZnBtX3BtX3MsIG1heF9jaGlsZHJlbikgfSwKLQkJeyBYTUxfQ09ORl9TVUJTRUNUSU9OLAki YXBhY2hlX2xpa2UiLAkJCSZmcG1fY29uZl9zZXRfYXBhY2hlX2xpa2Vfc3Vic2VjdGlvbiwJCW9m ZnNldG9mKHN0cnVjdCBmcG1fcG1fcywgb3B0aW9uc19hcGFjaGVfbGlrZSkgfSwKKwkJeyBYTUxf Q09ORl9TVUJTRUNUSU9OLAkiZHluYW1pYyIsCQkJJmZwbV9jb25mX3NldF9keW5hbWljX3N1YnNl Y3Rpb24sCQlvZmZzZXRvZihzdHJ1Y3QgZnBtX3BtX3MsIGR5bmFtaWMpIH0sCiAJCXsgMCwgMCwg MCwgMCB9CiAJfQogfTsKQEAgLTM5Miw2ICszOTIsNDYgQEAKIAkJCXdwLT5pc190ZW1wbGF0ZSA9 IDE7CiAJCX0KIAorCQlpZiAod3AtPmNvbmZpZy0+cG0gPT0gTlVMTCkgeworCQkJemxvZyhaTE9H X1NUVUZGLCBaTE9HX0FMRVJULCAicG9vbCAlczogdGhlIHByb2Nlc3MgbWFuYWdlciBpcyBtaXNz aW5nIChzdGF0aWMgb3IgZHluYW1pYykiLCB3cC0+Y29uZmlnLT5uYW1lKTsKKwkJCXJldHVybigt MSk7CisJCX0KKworCQlpZiAod3AtPmNvbmZpZy0+cG0tPnN0eWxlID09IFBNX1NUWUxFX0RZTkFN SUMpIHsKKwkJCXN0cnVjdCBmcG1fcG1fcyAqcG0gPSB3cC0+Y29uZmlnLT5wbTsKKworCQkJaWYg KHBtLT5keW5hbWljLm1pbl9zcGFyZV9zZXJ2ZXJzIDw9IDApIHsKKwkJCQl6bG9nKFpMT0dfU1RV RkYsIFpMT0dfQUxFUlQsICJwb29sICVzOiBtaW5fc3BhcmVfc2VydmVycyBtdXN0IGJlIGEgcG9z aXRpdmUgdmFsdWUiLCB3cC0+Y29uZmlnLT5uYW1lKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJfQor CisJCQlpZiAocG0tPmR5bmFtaWMubWF4X3NwYXJlX3NlcnZlcnMgPD0gMCkgeworCQkJCXpsb2co WkxPR19TVFVGRiwgWkxPR19BTEVSVCwgInBvb2wgJXM6IG1heF9zcGFyZV9zZXJ2ZXJzIG11c3Qg YmUgYSBwb3NpdGl2ZSB2YWx1ZSIsIHdwLT5jb25maWctPm5hbWUpOworCQkJCXJldHVybigtMSk7 CisJCQl9CisKKwkJCWlmIChwbS0+ZHluYW1pYy5taW5fc3BhcmVfc2VydmVycyA+IHBtLT5tYXhf Y2hpbGRyZW4gfHwKKwkJCSAgICBwbS0+ZHluYW1pYy5tYXhfc3BhcmVfc2VydmVycyA+IHBtLT5t YXhfY2hpbGRyZW4pIHsKKwkJCQl6bG9nKFpMT0dfU1RVRkYsIFpMT0dfQUxFUlQsICJwb29sICVz OiBtaW5fc3BhcmVfc2VydmVycyglZCkgYW5kIG1heF9zcGFyZV9zZXJ2ZXJzKCVkKSBjYW4ndCBi ZSBncmVhdGVyIHRoYW4gbWF4X2NoaWxkcmVuKCVkKSIsCisJCQkJICAgICB3cC0+Y29uZmlnLT5u YW1lLCBwbS0+ZHluYW1pYy5taW5fc3BhcmVfc2VydmVycywgcG0tPmR5bmFtaWMubWF4X3NwYXJl X3NlcnZlcnMsIHBtLT5tYXhfY2hpbGRyZW4pOworCQkJCXJldHVybigtMSk7CisJCQl9CisKKwkJ CWlmIChwbS0+ZHluYW1pYy5tYXhfc3BhcmVfc2VydmVycyA8IHBtLT5keW5hbWljLm1pbl9zcGFy ZV9zZXJ2ZXJzKSB7CisJCQkJemxvZyhaTE9HX1NUVUZGLCBaTE9HX0FMRVJULCAicG9vbCAlczog bWF4X3NwYXJlX3NlcnZlcnMgbXVzdCBiZSBncmVhdGVyIG9yIGVxdWFsIHRoYW4gbWluX3NwYXJl X3NlcnZlcnMiLCB3cC0+Y29uZmlnLT5uYW1lKTsKKwkJCQlyZXR1cm4oLTEpOworCQkJfQorCisJ CQlpZiAocG0tPmR5bmFtaWMuc3RhcnRfc2VydmVycyA8PSAwKSB7CisJCQkJcG0tPmR5bmFtaWMu c3RhcnRfc2VydmVycyA9IHBtLT5keW5hbWljLm1pbl9zcGFyZV9zZXJ2ZXJzICsgKChwbS0+ZHlu YW1pYy5tYXhfc3BhcmVfc2VydmVycyAtIHBtLT5keW5hbWljLm1pbl9zcGFyZV9zZXJ2ZXJzKSAv IDIpOworCQkJCXpsb2coWkxPR19TVFVGRiwgWkxPR19OT1RJQ0UsICJwb29sICVzOiBzdGFydF9z ZXJ2ZXJzIGhhcyBiZWVuIHNldCB0byAlZCIsIHdwLT5jb25maWctPm5hbWUsIHBtLT5keW5hbWlj LnN0YXJ0X3NlcnZlcnMpOworCQkJfSBlbHNlIGlmIChwbS0+ZHluYW1pYy5zdGFydF9zZXJ2ZXJz IDwgcG0tPmR5bmFtaWMubWluX3NwYXJlX3NlcnZlcnMgfHwgcG0tPmR5bmFtaWMuc3RhcnRfc2Vy dmVycyA+IHBtLT5keW5hbWljLm1heF9zcGFyZV9zZXJ2ZXJzKSB7CisJCQkJemxvZyhaTE9HX1NU VUZGLCBaTE9HX0FMRVJULCAicG9vbCAlczogc3RhcnRfc2VydmVycyBtdXN0IG5vdCBiZSBsZXNz IHRoYW4gbWluX3NwYXJlX3NlcnZlcnMgYW5kIG5vdCBncmVhdGVycyB0aGFuIG1heF9zcGFyZV9z ZXJ2ZXJzIiwgd3AtPmNvbmZpZy0+bmFtZSk7CisJCQkJcmV0dXJuKC0xKTsKKwkJCX0KKwkJfQor CisKIAkJaWYgKHdwLT5jb25maWctPnJlcXVlc3Rfc2xvd2xvZ190aW1lb3V0KSB7CiAjaWYgSEFW RV9GUE1fVFJBQ0UKIAkJCWlmICghICh3cC0+Y29uZmlnLT5zbG93bG9nICYmICp3cC0+Y29uZmln LT5zbG93bG9nKSkgewpJbmRleDogc2FwaS9mcG0vZnBtL2ZwbV9wcm9jZXNzX2N0bC5oCj09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT0KLS0tIHNhcGkvZnBtL2ZwbS9mcG1fcHJvY2Vzc19jdGwuaAkocul2aXNpb24gMjkyMDY3 KQorKysgc2FwaS9mcG0vZnBtL2ZwbV9wcm9jZXNzX2N0bC5oCShjb3BpZSBkZSB0cmF2YWlsKQpA QCAtNSwxMiArNSwxOCBAQAogI2lmbmRlZiBGUE1fUFJPQ0VTU19DVExfSAogI2RlZmluZSBGUE1f UFJPQ0VTU19DVExfSCAxCiAKKy8qIHNwYXduIG1heCAzMiBjaGlsZHJlbiBhdCBvbmNlICovCisj ZGVmaW5lIEZQTV9NQVhfU1BBV05fUkFURSAoMzIpCisvKiAxcyAoaW4gtXMgaGVyZSkgIGhlYXRi ZWF0IGZvciBpZGxlIHNlcnZlciBtYWludGVuYW5jZSAqLworI2RlZmluZSBGUE1fSURMRV9TRVJW RVJfTUFJTlRFTkFOQ0VfSEVBUlRCRUFUICgxMDAwMDAwKQorCiBzdHJ1Y3QgZnBtX2NoaWxkX3M7 CiAKIHZvaWQgZnBtX3BjdGwoaW50IG5ld19zdGF0ZSwgaW50IGFjdGlvbik7CiBpbnQgZnBtX3Bj dGxfY2FuX3NwYXduX2NoaWxkcmVuKCk7CiBpbnQgZnBtX3BjdGxfa2lsbChwaWRfdCBwaWQsIGlu dCBob3cpOwogdm9pZCBmcG1fcGN0bF9oZWFydGJlYXQoaW50IGZkLCBzaG9ydCB3aGljaCwgdm9p ZCAqYXJnKTsKK3ZvaWQgZnBtX3BjdGxfcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZV9o ZWFydGJlYXQoaW50IGZkLCBzaG9ydCB3aGljaCwgdm9pZCAqYXJnKTsKIGludCBmcG1fcGN0bF9j aGlsZF9leGl0ZWQoKTsKIGludCBmcG1fcGN0bF9pbml0X21haW4oKTsKIApJbmRleDogc2FwaS9m cG0vZnBtL2ZwbV9jb25mLmgKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PQotLS0gc2FwaS9mcG0vZnBtL2ZwbV9jb25mLmgJ KHLpdmlzaW9uIDI5MjA2NykKKysrIHNhcGkvZnBtL2ZwbS9mcG1fY29uZi5oCShjb3BpZSBkZSB0 cmF2YWlsKQpAQCAtMjgsMTAgKzI4LDEwIEBACiAJaW50IHN0eWxlOwogCWludCBtYXhfY2hpbGRy ZW47CiAJc3RydWN0IHsKLQkJaW50IFN0YXJ0U2VydmVyczsKLQkJaW50IE1pblNwYXJlU2VydmVy czsKLQkJaW50IE1heFNwYXJlU2VydmVyczsKLQl9IG9wdGlvbnNfYXBhY2hlX2xpa2U7CisJCWlu dCBzdGFydF9zZXJ2ZXJzOworCQlpbnQgbWluX3NwYXJlX3NlcnZlcnM7CisJCWludCBtYXhfc3Bh cmVfc2VydmVyczsKKwl9IGR5bmFtaWM7CiB9OwogCiBzdHJ1Y3QgZnBtX2xpc3Rlbl9vcHRpb25z X3MgewpAQCAtNjIsNyArNjIsNyBAQAogCXVuc2lnbmVkIGNhdGNoX3dvcmtlcnNfb3V0cHV0OjE7 CiB9OwogCi1lbnVtIHsgUE1fU1RZTEVfU1RBVElDID0gMSwgUE1fU1RZTEVfQVBBQ0hFX0xJS0Ug PSAyIH07CitlbnVtIHsgUE1fU1RZTEVfU1RBVElDID0gMSwgUE1fU1RZTEVfRFlOQU1JQyA9IDIg fTsKIAogaW50IGZwbV9jb25mX2luaXRfbWFpbigpOwogaW50IGZwbV93b3JrZXJfcG9vbF9jb25m aWdfZnJlZShzdHJ1Y3QgZnBtX3dvcmtlcl9wb29sX2NvbmZpZ19zICp3cGMpOwpJbmRleDogc2Fw aS9mcG0vZnBtL2ZwbV93b3JrZXJfcG9vbC5jCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNhcGkvZnBtL2ZwbS9m cG1fd29ya2VyX3Bvb2wuYwkocul2aXNpb24gMjkyMDY3KQorKysgc2FwaS9mcG0vZnBtL2ZwbV93 b3JrZXJfcG9vbC5jCShjb3BpZSBkZSB0cmF2YWlsKQpAQCAtNTMsNiArNTMsNyBAQAogCiAJZnBt X2FycmF5X2luaXQoJnJldC0+c2xvdHNfdXNlZCwgc2l6ZW9mKHN0cnVjdCBmcG1fc2htX3Nsb3Rf cHRyX3MpLCA1MCk7CiAJZnBtX2FycmF5X2luaXQoJnJldC0+c2xvdHNfZnJlZSwgc2l6ZW9mKHN0 cnVjdCBmcG1fc2htX3Nsb3RfcHRyX3MpLCA1MCk7CisJcmV0LT5pZGxlX3NwYXduX3JhdGUgPSAx OwogCXJldHVybiByZXQ7CiB9CiAvKiB9fX0gKi8KSW5kZXg6IHNhcGkvZnBtL2ZwbS9mcG1fZXZl bnRzLmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PQotLS0gc2FwaS9mcG0vZnBtL2ZwbV9ldmVudHMuYwkocul2aXNpb24g MjkyMDY3KQorKysgc2FwaS9mcG0vZnBtL2ZwbV9ldmVudHMuYwkoY29waWUgZGUgdHJhdmFpbCkK QEAgLTEwMCw2ICsxMDAsNyBAQAogCWV2ZW50X3NldCgmc2lnbmFsX2ZkX2V2ZW50LCBmcG1fc2ln bmFsc19nZXRfZmQoKSwgRVZfUEVSU0lTVCB8IEVWX1JFQUQsICZmcG1fZ290X3NpZ25hbCwgMCk7 CiAJZXZlbnRfYWRkKCZzaWduYWxfZmRfZXZlbnQsIDApOwogCWZwbV9wY3RsX2hlYXJ0YmVhdCgt MSwgMCwgMCk7CisJZnBtX3BjdGxfcGVyZm9ybV9pZGxlX3NlcnZlcl9tYWludGVuYW5jZV9oZWFy dGJlYXQoLTEsIDAsIDApOwogCXpsb2coWkxPR19TVFVGRiwgWkxPR19OT1RJQ0UsICJsaWJldmVu dDogZW50ZXJpbmcgbWFpbiBsb29wIik7CiAJZXZlbnRfbG9vcCgwKTsKIAlyZXR1cm4gMDsKSW5k ZXg6IHNhcGkvZnBtL2ZwbS9mcG1fd29ya2VyX3Bvb2wuaAo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzYXBpL2Zw bS9mcG0vZnBtX3dvcmtlcl9wb29sLmgJKHLpdmlzaW9uIDI5MjA2NykKKysrIHNhcGkvZnBtL2Zw bS9mcG1fd29ya2VyX3Bvb2wuaAkoY29waWUgZGUgdHJhdmFpbCkKQEAgLTM1LDYgKzM1LDggQEAK IAkvKiBydW50aW1lICovCiAJc3RydWN0IGZwbV9jaGlsZF9zICpjaGlsZHJlbjsKIAlpbnQgcnVu bmluZ19jaGlsZHJlbjsKKwlpbnQgaWRsZV9zcGF3bl9yYXRlOworCWludCB3YXJuX21heF9jaGls ZHJlbjsKIH07CiAKIHN0cnVjdCBmcG1fd29ya2VyX3Bvb2xfcyAqZnBtX3dvcmtlcl9wb29sX2Fs bG9jKCk7CkluZGV4OiBzYXBpL2ZwbS9mcG0vZmFzdGNnaS5jCj09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIHNhcGkv ZnBtL2ZwbS9mYXN0Y2dpLmMJKHLpdmlzaW9uIDI5MjA2NykKKysrIHNhcGkvZnBtL2ZwbS9mYXN0 Y2dpLmMJKGNvcGllIGRlIHRyYXZhaWwpCkBAIC05ODYsMTMgKzk4NiwxMyBAQAogCQkJCQkJaW50 IG4gPSAwOwogCQkJCQkJaW50IGFsbG93ZWQgPSAwOwogCi0JCQkJCQkJd2hpbGUgKGFsbG93ZWRf Y2xpZW50c1tuXSAhPSBJTkFERFJfTk9ORSkgewotCQkJCQkJCQlpZiAoYWxsb3dlZF9jbGllbnRz W25dID09IHNhLnNhX2luZXQuc2luX2FkZHIuc19hZGRyKSB7Ci0JCQkJCQkJCQlhbGxvd2VkID0g MTsKLQkJCQkJCQkJCWJyZWFrOwotCQkJCQkJCQl9Ci0JCQkJCQkJCW4rKzsKKwkJCQkJCXdoaWxl IChhbGxvd2VkX2NsaWVudHNbbl0gIT0gSU5BRERSX05PTkUpIHsKKwkJCQkJCQlpZiAoYWxsb3dl ZF9jbGllbnRzW25dID09IHNhLnNhX2luZXQuc2luX2FkZHIuc19hZGRyKSB7CisJCQkJCQkJCWFs bG93ZWQgPSAxOworCQkJCQkJCQlicmVhazsKIAkJCQkJCQl9CisJCQkJCQkJbisrOworCQkJCQkJ fQogCQkJCQkJaWYgKCFhbGxvd2VkKSB7CiAJCQkJCQkJZnByaW50ZihzdGRlcnIsICJDb25uZWN0 aW9uIGZyb20gZGlzYWxsb3dlZCBJUCBhZGRyZXNzICclcycgaXMgZHJvcHBlZC5cbiIsIGluZXRf bnRvYShzYS5zYV9pbmV0LnNpbl9hZGRyKSk7CiAJCQkJCQkJY2xvc2Vzb2NrZXQocmVxLT5mZCk7 CkluZGV4OiBzYXBpL2ZwbS9mcG0vZnBtX3JlcXVlc3QuYwo9PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzYXBpL2Zw bS9mcG0vZnBtX3JlcXVlc3QuYwkocul2aXNpb24gMjkyMDY3KQorKysgc2FwaS9mcG0vZnBtL2Zw bV9yZXF1ZXN0LmMJKGNvcGllIGRlIHRyYXZhaWwpCkBAIC0xNDgsMyArMTQ4LDE4IEBACiB9CiAv KiB9fX0gKi8KIAoraW50IGZwbV9yZXF1ZXN0X2lzX2lkbGUoc3RydWN0IGZwbV9jaGlsZF9zICpj aGlsZCkgLyoge3t7ICovCit7CisJc3RydWN0IGZwbV9zaG1fc2xvdF9zICpzbG90OworCXN0cnVj dCBmcG1fc2htX3Nsb3RfcyBzbG90X2M7CisKKwlzbG90ID0gZnBtX3NobV9zbG90KGNoaWxkKTsK KwlpZiAoIWZwbV9zaG1fc2xvdHNfYWNxdWlyZShzbG90LCAxKSkgeworCQlyZXR1cm4oLTEpOwor CX0KKworCXNsb3RfYyA9ICpzbG90OworCWZwbV9zaG1fc2xvdHNfcmVsZWFzZShzbG90KTsKKwly ZXR1cm4oIXNsb3RfYy5hY2NlcHRlZC50dl9zZWMgJiYgIXNsb3RfYy5hY2NlcHRlZC50dl91c2Vj ID8gMSA6IDApOworfQorLyogfX19ICovCkluZGV4OiBzYXBpL2ZwbS9mcG0vZnBtX2NoaWxkcmVu LmMKPT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PQotLS0gc2FwaS9mcG0vZnBtL2ZwbV9jaGlsZHJlbi5jCShy6XZpc2lvbiAy OTIwNjcpCisrKyBzYXBpL2ZwbS9mcG0vZnBtX2NoaWxkcmVuLmMJKGNvcGllIGRlIHRyYXZhaWwp CkBAIC0zMiw4ICszMiw2IEBACiBzdGF0aWMgdGltZV90ICpsYXN0X2ZhdWx0czsKIHN0YXRpYyBp bnQgZmF1bHQ7CiAKLXN0YXRpYyBpbnQgZnBtX2NoaWxkcmVuX21ha2Uoc3RydWN0IGZwbV93b3Jr ZXJfcG9vbF9zICp3cCwgaW50IGluX2V2ZW50X2xvb3ApOwotCiBzdGF0aWMgdm9pZCBmcG1fY2hp bGRyZW5fY2xlYW51cChpbnQgd2hpY2gsIHZvaWQgKmFyZykgLyoge3t7ICovCiB7CiAJZnJlZShs YXN0X2ZhdWx0cyk7CkBAIC0xODAsNiArMTc4LDcgQEAKIAl3aGlsZSAoIChwaWQgPSB3YWl0cGlk KC0xLCAmc3RhdHVzLCBXTk9IQU5HIHwgV1VOVFJBQ0VEKSkgPiAwKSB7CiAJCWNoYXIgYnVmWzEy OF07CiAJCWludCBzZXZlcml0eSA9IFpMT0dfTk9USUNFOworCQlpbnQgcmVzdGFydF9jaGlsZCA9 IDE7CiAKIAkJY2hpbGQgPSBmcG1fY2hpbGRfZmluZChwaWQpOwogCkBAIC0xODcsNiArMTg2LDEz IEBACiAKIAkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJ3aXRoIGNvZGUgJWQiLCBXRVhJ VFNUQVRVUyhzdGF0dXMpKTsKIAorCQkJLyogaWYgaXQncyBiZWVuIGtpbGxlZCBiZWNhdXNlIG9m IGR5bmFtaWMgcHJvY2VzcyBtYW5hZ2VtZW50CisJCQkgKiBkb24ndCByZXN0YXJ0IGl0IGF1dG9t YXRpY2FseQorCQkJICovCisJCQlpZiAoY2hpbGQgJiYgY2hpbGQtPmlkbGVfa2lsbCkgeworCQkJ CXJlc3RhcnRfY2hpbGQgPSAwOworCQkJfQorCiAJCQlpZiAoV0VYSVRTVEFUVVMoc3RhdHVzKSAh PSAwKSB7CiAJCQkJc2V2ZXJpdHkgPSBaTE9HX1dBUk5JTkc7CiAJCQl9CkBAIC0yMDEsNiArMjA3 LDEzIEBACiAKIAkJCXNucHJpbnRmKGJ1Ziwgc2l6ZW9mKGJ1ZiksICJvbiBzaWduYWwgJWQgJXMl cyIsIFdURVJNU0lHKHN0YXR1cyksIHNpZ25hbWUsIGhhdmVfY29yZSk7CiAKKwkJCS8qIGlmIGl0 J3MgYmVlbiBraWxsZWQgYmVjYXVzZSBvZiBkeW5hbWljIHByb2Nlc3MgbWFuYWdlbWVudAorCQkJ ICogZG9uJ3QgcmVzdGFydCBpdCBhdXRvbWF0aWNhbHkKKwkJCSAqLworCQkJaWYgKGNoaWxkICYm IGNoaWxkLT5pZGxlX2tpbGwgJiYgV1RFUk1TSUcoc3RhdHVzKSA9PSBTSUdURVJNKSB7CisJCQkJ cmVzdGFydF9jaGlsZCA9IDA7CisJCQl9CisKIAkJCWlmIChXVEVSTVNJRyhzdGF0dXMpICE9IFNJ R1FVSVQpIHsgLyogcG9zc2libGUgcmVxdWVzdCBsb3NzICovCiAJCQkJc2V2ZXJpdHkgPSBaTE9H X1dBUk5JTkc7CiAJCQl9CkBAIC0yMjcsOCArMjQwLDEzIEBACiAKIAkJCXRpbWVyc3ViKCZ0djEs ICZjaGlsZC0+c3RhcnRlZCwgJnR2Mik7CiAKLQkJCXpsb2coWkxPR19TVFVGRiwgc2V2ZXJpdHks ICJjaGlsZCAlZCAocG9vbCAlcykgZXhpdGVkICVzIGFmdGVyICVsZC4lMDZkIHNlY29uZHMgZnJv bSBzdGFydCIsIChpbnQpIHBpZCwKLQkJCQkJCWNoaWxkLT53cC0+Y29uZmlnLT5uYW1lLCBidWYs IHR2Mi50dl9zZWMsIChpbnQpIHR2Mi50dl91c2VjKTsKKwkJCWlmIChyZXN0YXJ0X2NoaWxkKSB7 CisJCQkJemxvZyhaTE9HX1NUVUZGLCBzZXZlcml0eSwgImNoaWxkICVkIChwb29sICVzKSBleGl0 ZWQgJXMgYWZ0ZXIgJWxkLiUwNmQgc2Vjb25kcyBmcm9tIHN0YXJ0IiwgKGludCkgcGlkLAorCQkJ CSAgICAgY2hpbGQtPndwLT5jb25maWctPm5hbWUsIGJ1ZiwgdHYyLnR2X3NlYywgKGludCkgdHYy LnR2X3VzZWMpOworCQkJfSBlbHNlIHsKKwkJCQl6bG9nKFpMT0dfU1RVRkYsIHNldmVyaXR5LCAi Y2hpbGQgJWQgKHBvb2wgJXMpIGhhcyBiZWVuIGtpbGxlZCBieSB0aGUgcHJvY2VzcyBtYW5hZ21l bnQgYWZ0ZXIgJWxkLiUwNmQgc2Vjb25kcyBmcm9tIHN0YXJ0IiwgKGludCkgcGlkLAorCQkJCSAg ICAgY2hpbGQtPndwLT5jb25maWctPm5hbWUsIHR2Mi50dl9zZWMsIChpbnQpIHR2Mi50dl91c2Vj KTsKKwkJCX0KIAogCQkJZnBtX2NoaWxkX2Nsb3NlKGNoaWxkLCAxIC8qIGluIGV2ZW50X2xvb3Ag Ki8pOwogCkBAIC0yNjEsMTEgKzI3OSwxMyBAQAogCQkJCX0KIAkJCX0KIAotCQkJZnBtX2NoaWxk cmVuX21ha2Uod3AsIDEgLyogaW4gZXZlbnQgbG9vcCAqLyk7CisJCQlpZiAocmVzdGFydF9jaGls ZCkgeworICAgICAgICBmcG1fY2hpbGRyZW5fbWFrZSh3cCwgMSAvKiBpbiBldmVudCBsb29wICov LCAxKTsKIAotCQkJaWYgKGZwbV9nbG9iYWxzLmlzX2NoaWxkKSB7Ci0JCQkJYnJlYWs7Ci0JCQl9 CisgIAkJCWlmIChmcG1fZ2xvYmFscy5pc19jaGlsZCkgeworCSAgCQkJYnJlYWs7CisJCSAgCX0K KyAgICAgIH0KIAkJfSBlbHNlIHsKIAkJCXpsb2coWkxPR19TVFVGRiwgWkxPR19BTEVSVCwgIm9v cHMsIHVua25vd24gY2hpbGQgZXhpdGVkICVzIiwgYnVmKTsKIAkJfQpAQCAtMzI2LDE0ICszNDYs MjQgQEAKIH0KIC8qIH19fSAqLwogCi1zdGF0aWMgaW50IGZwbV9jaGlsZHJlbl9tYWtlKHN0cnVj dCBmcG1fd29ya2VyX3Bvb2xfcyAqd3AsIGludCBpbl9ldmVudF9sb29wKSAvKiB7e3sgKi8KK2lu dCBmcG1fY2hpbGRyZW5fbWFrZShzdHJ1Y3QgZnBtX3dvcmtlcl9wb29sX3MgKndwLCBpbnQgaW5f ZXZlbnRfbG9vcCwgaW50IG5iX3RvX3NwYXduKSAvKiB7e3sgKi8KIHsKIAlpbnQgZW5vdWdoID0g MDsKIAlwaWRfdCBwaWQ7CiAJc3RydWN0IGZwbV9jaGlsZF9zICpjaGlsZDsKKwlpbnQgbWF4Owog Ci0Jd2hpbGUgKCFlbm91Z2ggJiYgZnBtX3BjdGxfY2FuX3NwYXduX2NoaWxkcmVuKCkgJiYgd3At PnJ1bm5pbmdfY2hpbGRyZW4gPCB3cC0+Y29uZmlnLT5wbS0+bWF4X2NoaWxkcmVuKSB7CisJaWYg KHdwLT5jb25maWctPnBtLT5zdHlsZSA9PSBQTV9TVFlMRV9EWU5BTUlDKSB7CisJCWlmICghaW5f ZXZlbnRfbG9vcCkgeyAvKiBzdGF0aW5nICovCisJCQltYXggPSB3cC0+Y29uZmlnLT5wbS0+ZHlu YW1pYy5zdGFydF9zZXJ2ZXJzOworCQl9IGVsc2UgeworCQkJbWF4ID0gd3AtPnJ1bm5pbmdfY2hp bGRyZW4gKyBuYl90b19zcGF3bjsKKwkJfQorCX0gZWxzZSB7IC8qIFBNX1NUWUxFX1NUQVRJQyAq LworCQltYXggPSB3cC0+Y29uZmlnLT5wbS0+bWF4X2NoaWxkcmVuOworCX0KIAorCXdoaWxlICgh ZW5vdWdoICYmIGZwbV9wY3RsX2Nhbl9zcGF3bl9jaGlsZHJlbigpICYmIHdwLT5ydW5uaW5nX2No aWxkcmVuIDwgbWF4KSB7CiAJCWNoaWxkID0gZnBtX3Jlc291cmNlc19wcmVwYXJlKHdwKTsKIAog CQlpZiAoIWNoaWxkKSB7CkBAIC0zNzgsNyArNDA4LDcgQEAKIAogaW50IGZwbV9jaGlsZHJlbl9j cmVhdGVfaW5pdGlhbChzdHJ1Y3QgZnBtX3dvcmtlcl9wb29sX3MgKndwKSAvKiB7e3sgKi8KIHsK LQlyZXR1cm4gZnBtX2NoaWxkcmVuX21ha2Uod3AsIDAgLyogbm90IGluIGV2ZW50IGxvb3AgeWV0 ICovKTsKKwlyZXR1cm4gZnBtX2NoaWxkcmVuX21ha2Uod3AsIDAgLyogbm90IGluIGV2ZW50IGxv b3AgeWV0ICovLCAwKTsKIH0KIC8qIH19fSAqLwogCkluZGV4OiBzYXBpL2ZwbS9jb25mL3BocC1m cG0uY29uZi5pbgo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09Ci0tLSBzYXBpL2ZwbS9jb25mL3BocC1mcG0uY29uZi5pbgko cul2aXNpb24gMjkyMDY3KQorKysgc2FwaS9mcG0vY29uZi9waHAtZnBtLmNvbmYuaW4JKGNvcGll IGRlIHRyYXZhaWwpCkBAIC03Miw3ICs3Miw3IEBACiAJCQk8dmFsdWUgbmFtZT0icG0iPgogCiAJ CQkJU2V0cyBzdHlsZSBvZiBjb250cm9saW5nIHdvcmtlciBwcm9jZXNzIGNvdW50LgotCQkJCVZh bGlkIHZhbHVlcyBhcmUgJ3N0YXRpYycgYW5kICdhcGFjaGUtbGlrZScKKwkJCQlWYWxpZCB2YWx1 ZXMgYXJlICdzdGF0aWMnIGFuZCAnZHluYW1pYycKIAkJCQk8dmFsdWUgbmFtZT0ic3R5bGUiPnN0 YXRpYzwvdmFsdWU+CiAKIAkJCQlTZXRzIHRoZSBsaW1pdCBvbiB0aGUgbnVtYmVyIG9mIHNpbXVs dGFuZW91cyByZXF1ZXN0cyB0aGF0IHdpbGwgYmUgc2VydmVkLgpAQCAtODEsMjAgKzgxLDIwIEBA CiAJCQkJVXNlZCB3aXRoIGFueSBwbV9zdHlsZS4KIAkJCQk8dmFsdWUgbmFtZT0ibWF4X2NoaWxk cmVuIj41PC92YWx1ZT4KIAotCQkJCVNldHRpbmdzIGdyb3VwIGZvciAnYXBhY2hlLWxpa2UnIHBt IHN0eWxlCi0JCQkJPHZhbHVlIG5hbWU9ImFwYWNoZV9saWtlIj4KKwkJCQlTZXR0aW5ncyBncm91 cCBmb3IgJ2R5bmFtaWMnIHBtIHN0eWxlCisJCQkJPHZhbHVlIG5hbWU9ImR5bmFtaWMiPgogCiAJ CQkJCVNldHMgdGhlIG51bWJlciBvZiBzZXJ2ZXIgcHJvY2Vzc2VzIGNyZWF0ZWQgb24gc3RhcnR1 cC4KLQkJCQkJVXNlZCBvbmx5IHdoZW4gJ2FwYWNoZS1saWtlJyBwbV9zdHlsZSBpcyBzZWxlY3Rl ZAotCQkJCQk8dmFsdWUgbmFtZT0iU3RhcnRTZXJ2ZXJzIj4yMDwvdmFsdWU+CisJCQkJCVVzZWQg b25seSB3aGVuICdkeW5hbWljJyBwbV9zdHlsZSBpcyBzZWxlY3RlZAorCQkJCQk8dmFsdWUgbmFt ZT0ic3RhcnRfc2VydmVycyI+MjA8L3ZhbHVlPgogCiAJCQkJCVNldHMgdGhlIGRlc2lyZWQgbWlu aW11bSBudW1iZXIgb2YgaWRsZSBzZXJ2ZXIgcHJvY2Vzc2VzLgotCQkJCQlVc2VkIG9ubHkgd2hl biAnYXBhY2hlLWxpa2UnIHBtX3N0eWxlIGlzIHNlbGVjdGVkCi0JCQkJCTx2YWx1ZSBuYW1lPSJN aW5TcGFyZVNlcnZlcnMiPjU8L3ZhbHVlPgorCQkJCQlVc2VkIG9ubHkgd2hlbiAnZHluYW1pYycg cG1fc3R5bGUgaXMgc2VsZWN0ZWQKKwkJCQkJPHZhbHVlIG5hbWU9Im1pbl9zcGFyZV9zZXJ2ZXJz Ij41PC92YWx1ZT4KIAogCQkJCQlTZXRzIHRoZSBkZXNpcmVkIG1heGltdW0gbnVtYmVyIG9mIGlk bGUgc2VydmVyIHByb2Nlc3Nlcy4KLQkJCQkJVXNlZCBvbmx5IHdoZW4gJ2FwYWNoZS1saWtlJyBw bV9zdHlsZSBpcyBzZWxlY3RlZAotCQkJCQk8dmFsdWUgbmFtZT0iTWF4U3BhcmVTZXJ2ZXJzIj4z NTwvdmFsdWU+CisJCQkJCVVzZWQgb25seSB3aGVuICdkeW5hbWljJyBwbV9zdHlsZSBpcyBzZWxl Y3RlZAorCQkJCQk8dmFsdWUgbmFtZT0ibWF4X3NwYXJlX3NlcnZlcnMiPjM1PC92YWx1ZT4KIAog CQkJCTwvdmFsdWU+CiAK --0050450181023f13ae047aa0d995--