From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1751189AbVHQS3c (ORCPT ); Wed, 17 Aug 2005 14:29:32 -0400 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1751200AbVHQS3c (ORCPT ); Wed, 17 Aug 2005 14:29:32 -0400 Received: from tierw.net.avaya.com ([198.152.13.100]:49852 "EHLO tierw.net.avaya.com") by vger.kernel.org with ESMTP id S1751189AbVHQS3b (ORCPT ); Wed, 17 Aug 2005 14:29:31 -0400 Subject: [PATCH 2.6.12.5] NPTL signal delivery deadlock fix From: "Bhavesh P. Davda" Reply-To: bhavesh@avaya.com To: linux-kernel@vger.kernel.org, torvalds@osdl.org Cc: "Glass, Kathleen K (Kathy)" , "Rhodes, James E (James)" Content-Type: multipart/mixed; boundary="=-NbyBznkjenk0Qrz1hI0k" Organization: Avaya, Inc. Date: Wed, 17 Aug 2005 12:26:33 -0600 Message-Id: <1124303193.11458.16.camel@cof110earth.dr.avaya.com> Mime-Version: 1.0 X-Mailer: Evolution 2.0.2 (2.0.2-16) Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org --=-NbyBznkjenk0Qrz1hI0k Content-Type: text/plain Content-Transfer-Encoding: 7bit This bug is quite subtle and only happens in a very interesting situation where a real-time threaded process is in the middle of a coredump when someone whacks it with a SIGKILL. However, this deadlock leaves the system pretty hosed and you have to reboot to recover. Not good for real-time priority-preemption applications like our telephony application, with 90+ real-time (SCHED_FIFO and SCHED_RR) processes, many of them multi-threaded, interacting with each other for high volume call processing. - Bhavesh Also, for your reading pleasure, a complete analysis of how the system gets into a deadlock due to this bug. I wanted to post it because I spent several hours analysing this. -- Bhavesh P. Davda | Distinguished Member of Technical Staff | Avaya | 1300 West 120th Avenue | B3-B03 | Westminster, CO 80234 | U.S.A. | Voice/Fax: 303.538.4438 | bhavesh@avaya.com --=-NbyBznkjenk0Qrz1hI0k Content-Disposition: attachment; filename=nptl-sigfix.patch Content-Type: text/x-patch; name=nptl-sigfix.patch; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 ZGlmZiAtTmF1ciBsaW51eC0yLjYuMTIuNS9rZXJuZWwvc2lnbmFsLmMgbGludXgtMi42LjEyLjUt c2lnZml4L2tlcm5lbC9zaWduYWwuYw0KLS0tIGxpbnV4LTIuNi4xMi41L2tlcm5lbC9zaWduYWwu YwkyMDA1LTA4LTE0IDE4OjIwOjE4LjAwMDAwMDAwMCAtMDYwMA0KKysrIGxpbnV4LTIuNi4xMi41 LXNpZ2ZpeC9rZXJuZWwvc2lnbmFsLmMJMjAwNS0wOC0xNyAxMTozNjoyMC41NDc2MDAwOTIgLTA2 MDANCkBAIC02ODYsNyArNjg2LDcgQEANCiB7DQogCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsNCiAN Ci0JaWYgKHAtPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpDQorCWlmIChwLT5zaWduYWwtPmZs YWdzICYgU0lHTkFMX0dST1VQX0VYSVQpDQogCQkvKg0KIAkJICogVGhlIHByb2Nlc3MgaXMgaW4g dGhlIG1pZGRsZSBvZiBkeWluZyBhbHJlYWR5Lg0KIAkJICovDQo= --=-NbyBznkjenk0Qrz1hI0k Content-Disposition: attachment; filename=nptl-deadlock.txt Content-Type: text/plain; name=nptl-deadlock.txt; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 V2hlbiBiYXNoIHNlbmRzIFNJR0FCUlQgdG8gcnQtcHRocmVhZGVkLWFwcCBtYWluIHRocmVhZDoN Cg0KYmFzaDogc3lzX2tpbGwocGlkLCBTSUdBQlJUKQ0KICAgICAga2lsbF9zb21ldGhpbmdfaW5m byhTSUdBQlJULCAmaW5mbywgcGlkKQ0KICAgICAga2lsbF9wcm9jX2luZm8oU0lHQUJSVCwgaW5m bywgcGlkKQ0KICAgICAgcCA9IGZpbmRfdGFza19ieV9waWQocGlkKSwgZ3JvdXBfc2VuZF9zaWdf aW5mbyhTSUdBQlJULCBpbmZvLCBwKQ0KICAgICAgX19ncm91cF9zZW5kX3NpZ19pbmZvKFNJR0FC UlQsIGluZm8sIHApDQogICAgICBfX2dyb3VwX2NvbXBsZXRlX3NpZ25hbChTSUdBQlJULCBwKQ0K U3RpbGwgYmFzaCwgcD09cnQtcHRocmVhZGVkLWFwcCBtYWluIHRocmVhZDoNCg0Kc3RhdGljIHZv aWQgX19ncm91cF9jb21wbGV0ZV9zaWduYWwoaW50IHNpZywgc3RydWN0IHRhc2tfc3RydWN0ICpw KQ0Kew0KCXVuc2lnbmVkIGludCBtYXNrOw0KCXN0cnVjdCB0YXNrX3N0cnVjdCAqdDsNCg0KCS8q DQoJICogRG9uJ3QgYm90aGVyIHRyYWNlZCBhbmQgc3RvcHBlZCB0YXNrcyAoYnV0DQoJICogU0lH S0lMTCB3aWxsIHB1bmNoIHRocm91Z2ggdGhhdCkuDQoJICovDQoJbWFzayA9IFRBU0tfU1RPUFBF RCB8IFRBU0tfVFJBQ0VEOw0KCWlmIChzaWcgPT0gU0lHS0lMTCkNCgkJbWFzayA9IDA7DQoNCj09 PiBtYXNrID09IFRBU0tfU1RPUFBFRHxUQVNLX1RSQUNFRA0KCS8qDQoJICogTm93IGZpbmQgYSB0 aHJlYWQgd2UgY2FuIHdha2UgdXAgdG8gdGFrZSB0aGUgc2lnbmFsIG9mZiB0aGUgcXVldWUuDQoJ ICoNCgkgKiBJZiB0aGUgbWFpbiB0aHJlYWQgd2FudHMgdGhlIHNpZ25hbCwgaXQgZ2V0cyBmaXJz dCBjcmFjay4NCgkgKiBQcm9iYWJseSB0aGUgbGVhc3Qgc3VycHJpc2luZyB0byB0aGUgYXZlcmFn ZSBiZWFyLg0KCSAqLw0KCWlmICh3YW50c19zaWduYWwoc2lnLCBwLCBtYXNrKSkNCgkJdCA9IHA7 DQo9PT4gdCA9IHAgKHJ0LXB0aHJlYWRlZC1hcHAgbWFpbiB0aHJlYWQpDQoJZWxzZSBpZiAodGhy ZWFkX2dyb3VwX2VtcHR5KHApKQ0KCQkvKg0KCQkgKiBUaGVyZSBpcyBqdXN0IG9uZSB0aHJlYWQg YW5kIGl0IGRvZXMgbm90IG5lZWQgdG8gYmUgd29rZW4uDQoJCSAqIEl0IHdpbGwgZGVxdWV1ZSB1 bmJsb2NrZWQgc2lnbmFscyBiZWZvcmUgaXQgcnVucyBhZ2Fpbi4NCgkJICovDQoJCXJldHVybjsN CgllbHNlIHsNCgkJLyoNCgkJICogT3RoZXJ3aXNlIHRyeSB0byBmaW5kIGEgc3VpdGFibGUgdGhy ZWFkLg0KCQkgKi8NCgkJdCA9IHAtPnNpZ25hbC0+Y3Vycl90YXJnZXQ7DQoJCWlmICh0ID09IE5V TEwpDQoJCQkvKiByZXN0YXJ0IGJhbGFuY2luZyBhdCB0aGlzIHRocmVhZCAqLw0KCQkJdCA9IHAt PnNpZ25hbC0+Y3Vycl90YXJnZXQgPSBwOw0KCQlCVUdfT04odC0+dGdpZCAhPSBwLT50Z2lkKTsN Cg0KCQl3aGlsZSAoIXdhbnRzX3NpZ25hbChzaWcsIHQsIG1hc2spKSB7DQoJCQl0ID0gbmV4dF90 aHJlYWQodCk7DQoJCQlpZiAodCA9PSBwLT5zaWduYWwtPmN1cnJfdGFyZ2V0KQ0KCQkJCS8qDQoJ CQkJICogTm8gdGhyZWFkIG5lZWRzIHRvIGJlIHdva2VuLg0KCQkJCSAqIEFueSBlbGlnaWJsZSB0 aHJlYWRzIHdpbGwgc2VlDQoJCQkJICogdGhlIHNpZ25hbCBpbiB0aGUgcXVldWUgc29vbi4NCgkJ CQkgKi8NCgkJCQlyZXR1cm47DQoJCX0NCgkJcC0+c2lnbmFsLT5jdXJyX3RhcmdldCA9IHQ7DQoJ fQ0KDQoJLyoNCgkgKiBGb3VuZCBhIGtpbGxhYmxlIHRocmVhZC4gIElmIHRoZSBzaWduYWwgd2ls bCBiZSBmYXRhbCwNCgkgKiB0aGVuIHN0YXJ0IHRha2luZyB0aGUgd2hvbGUgZ3JvdXAgZG93biBp bW1lZGlhdGVseS4NCgkgKi8NCglpZiAoc2lnX2ZhdGFsKHAsIHNpZykgJiYgIShwLT5zaWduYWwt PmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpICYmDQoJICAgICFzaWdpc21lbWJlcigmdC0+cmVh bF9ibG9ja2VkLCBzaWcpICYmDQoJICAgIChzaWcgPT0gU0lHS0lMTCB8fCAhKHQtPnB0cmFjZSAm IFBUX1BUUkFDRUQpKSkgew0KPT0+IHNpZ19mYXRhbChwLCBTSUdBQlJUKSB0cnVlDQo9PT4gU0lH TkFMX0dST1VQX0VYSVQgaXMgbm90IHNldCB5ZXQNCj09PiBTSUdBQlJUIGlzIG5vdCBibG9ja2Vk DQo9PT4gcCBpcyBub3QgUFRfUFRSQUNFRA0KCQkvKg0KCQkgKiBUaGlzIHNpZ25hbCB3aWxsIGJl IGZhdGFsIHRvIHRoZSB3aG9sZSBncm91cC4NCgkJICovDQoJCWlmICghc2lnX2tlcm5lbF9jb3Jl ZHVtcChzaWcpKSB7DQo9PT4gU0lHQUJSVCBpcyBzaWdfa2VybmVsX2NvcmVkdW1wKCksIHNraXAN CgkJCS8qDQoJCQkgKiBTdGFydCBhIGdyb3VwIGV4aXQgYW5kIHdha2UgZXZlcnlib2R5IHVwLg0K CQkJICogVGhpcyB3YXkgd2UgZG9uJ3QgaGF2ZSBvdGhlciB0aHJlYWRzDQoJCQkgKiBydW5uaW5n IGFuZCBkb2luZyB0aGluZ3MgYWZ0ZXIgYSBzbG93ZXINCgkJCSAqIHRocmVhZCBoYXMgdGhlIGZh dGFsIHNpZ25hbCBwZW5kaW5nLg0KCQkJICovDQoJCQlwLT5zaWduYWwtPmZsYWdzID0gU0lHTkFM X0dST1VQX0VYSVQ7DQoJCQlwLT5zaWduYWwtPmdyb3VwX2V4aXRfY29kZSA9IHNpZzsNCgkJCXAt PnNpZ25hbC0+Z3JvdXBfc3RvcF9jb3VudCA9IDA7DQoJCQl0ID0gcDsNCgkJCWRvIHsNCgkJCQlz aWdhZGRzZXQoJnQtPnBlbmRpbmcuc2lnbmFsLCBTSUdLSUxMKTsNCgkJCQlzaWduYWxfd2FrZV91 cCh0LCAxKTsNCgkJCQl0ID0gbmV4dF90aHJlYWQodCk7DQoJCQl9IHdoaWxlICh0ICE9IHApOw0K CQkJcmV0dXJuOw0KCQl9DQoNCgkJLyoNCgkJICogVGhlcmUgd2lsbCBiZSBhIGNvcmUgZHVtcC4g IFdlIG1ha2UgYWxsIHRocmVhZHMgb3RoZXINCgkJICogdGhhbiB0aGUgY2hvc2VuIG9uZSBnbyBp bnRvIGEgZ3JvdXAgc3RvcCBzbyB0aGF0IG5vdGhpbmcNCgkJICogaGFwcGVucyB1bnRpbCBpdCBn ZXRzIHNjaGVkdWxlZCwgdGFrZXMgdGhlIHNpZ25hbCBvZmYNCgkJICogdGhlIHNoYXJlZCBxdWV1 ZSwgYW5kIGRvZXMgdGhlIGNvcmUgZHVtcC4gIFRoaXMgaXMgYQ0KCQkgKiBsaXR0bGUgbW9yZSBj b21wbGljYXRlZCB0aGFuIHN0cmljdGx5IG5lY2Vzc2FyeSwgYnV0IGl0DQoJCSAqIGtlZXBzIHRo ZSBzaWduYWwgc3RhdGUgdGhhdCB3aW5kcyB1cCBpbiB0aGUgY29yZSBkdW1wDQoJCSAqIHVuY2hh bmdlZCBmcm9tIHRoZSBkZWF0aCBzdGF0ZSwgZS5nLiB3aGljaCB0aHJlYWQgaGFkDQoJCSAqIHRo ZSBjb3JlLWR1bXAgc2lnbmFsIHVuYmxvY2tlZC4NCgkJICovDQoJCXJtX2Zyb21fcXVldWUoU0lH X0tFUk5FTF9TVE9QX01BU0ssICZ0LT5wZW5kaW5nKTsNCgkJcm1fZnJvbV9xdWV1ZShTSUdfS0VS TkVMX1NUT1BfTUFTSywgJnAtPnNpZ25hbC0+c2hhcmVkX3BlbmRpbmcpOw0KCQlwLT5zaWduYWwt Pmdyb3VwX3N0b3BfY291bnQgPSAwOw0KCQlwLT5zaWduYWwtPmdyb3VwX2V4aXRfdGFzayA9IHQ7 DQoJCXQgPSBwOw0KPT0+IFN0YXJ0IHdpdGggdGhyZWFkIGJlaW5nIGtpbGxlZA0KCQlkbyB7DQoJ CQlwLT5zaWduYWwtPmdyb3VwX3N0b3BfY291bnQrKzsNCj09PiBGb3IgcnQtcHRocmVhZGVkLWFw cCB0aGlzIHdpbGwgYmUgZG9uZSB0d2ljZSAoZm9yIHRoZSAyIHN1YnRocmVhZHMpDQoJCQlzaWdu YWxfd2FrZV91cCh0LCAwKTsNCj09PiBUaGlzIGlzIGEgbm8tb3Agc28gZmFyLCBiZWNhdXNlIHRo ZSBzdWJ0aHJlYWQgInQiIGRvZXNuJ3QgaGF2ZSBhIHNpZ25hbA0KCQkJdCA9IG5leHRfdGhyZWFk KHQpOw0KCQl9IHdoaWxlICh0ICE9IHApOw0KCQl3YWtlX3VwX3Byb2Nlc3MocC0+c2lnbmFsLT5n cm91cF9leGl0X3Rhc2spOw0KPT0+IFRoaXMgd2FrZXMgdXAgdGhlIG1haW4gcnQtcHRocmVhZGVk LWFwcCB0aHJlYWQuIEF0IHRoaXMgcG9pbnQgaW4gdGltZSwNCj09PiBncm91cF9zdG9wX2NvdW50 ID09IDIsIGJ1dCBTSUdOQUxfR1JPVVBfRVhJVCBpcyBzdGlsbCBub3Qgc2V0DQoJCXJldHVybjsN Cj09PiBCQVNIIElTIERPTkUuDQoJfQ0KDQoJLyoNCgkgKiBUaGUgc2lnbmFsIGlzIGFscmVhZHkg aW4gdGhlIHNoYXJlZC1wZW5kaW5nIHF1ZXVlLg0KCSAqIFRlbGwgdGhlIGNob3NlbiB0aHJlYWQg dG8gd2FrZSB1cCBhbmQgZGVxdWV1ZSBpdC4NCgkgKi8NCglzaWduYWxfd2FrZV91cCh0LCBzaWcg PT0gU0lHS0lMTCk7DQoJcmV0dXJuOw0KfQ0KDQoNCnJ0LXB0aHJlYWRlZC1hcHAgbWFpbiB0aHJl YWQ6DQo9PT09PT09PT09PT09PT09PT09PT09DQpDb21pbmcgb3V0IG9mIHNjaGVkdWxlKCksIGl0 IHdpbGwgbG9vayBmb3IgcGVuZGluZyBzaWduYWxzDQoNCmRvX25vdGlmeV9yZXN1bWUoKQ0KZG9f c2lnbmFsKCkNCglzaWduciA9IGdldF9zaWduYWxfdG9fZGVsaXZlcigmaW5mbywgJmthLCByZWdz LCBOVUxMKTsNCmdldF9zaWduYWxfdG9fZGVsaXZlcigpDQoJaWYgKHVubGlrZWx5KGN1cnJlbnQt PnNpZ25hbC0+Z3JvdXBfc3RvcF9jb3VudCA+IDApICYmDQoJCWhhbmRsZV9ncm91cF9zdG9wKCkp DQo9PT4gZ3JvdXBfc3RvcF9jb3VudCBpcyAyLCBzbyBjYWxsIGhhbmRsZV9ncm91cF9zdG9wKCkN CmhhbmRsZV9ncm91cF9zdG9wKCkNCglpZiAoY3VycmVudC0+c2lnbmFsLT5ncm91cF9leGl0X3Rh c2sgPT0gY3VycmVudCkgew0KPT0+IFRoaXMgaXMgdHJ1ZQ0KCQkvKiBHcm91cCBzdG9wIGlzIHNv IHdlIGNhbiBkbyBhIGNvcmUgZHVtcCwNCgkgCSAqIFdlIGFyZSB0aGUgaW5pdGlhdGluZyB0aHJl YWQsIHNvIGdldCBvbiB3aXRoIGl0LiAqLw0KCQljdXJyZW50LT5zaWduYWwtPmdyb3VwX2V4aXRf dGFzayA9IE5VTEw7DQoJCXJldHVybiAwOw0KCX0NCj09PiBiYWNrIHRvIGdldF9zaWduYWxfdG9f ZGVsaXZlcigpDQoJCXNpZ25yID0gZGVxdWV1ZV9zaWduYWwoY3VycmVudCwgbWFzaywgaW5mbyk7 DQo9PT4gc2lnbnIgPT0gU0lHQUJSVA0KCWlmICghc2lnbnIpIGJyZWFrOyAvKiB3aWxsIHJldHVy biAwICovIChub3QgdHJ1ZSwgc2lnbnI9PVNJR0FCUlQpDQoJaWYgKChjdXJyZW50LT5wdHJhY2Ug JiBQVF9QVFJBQ0VEKSAmJiBzaWduciAhPSBTSUdLSUxMKSB7DQoJKG5vdCB0cnVlLCBza2lwKQ0K CWthID0gJmN1cnJlbnQtPnNpZ2hhbmQtPmFjdGlvbltzaWduci0xXTsNCglpZiAoa2EtPnNhLnNh X2hhbmRsZXIgPT0gU0lHX0lHTikgLyogRG8gbm90aGluZy4gICovDQoJCWNvbnRpbnVlOyAobm90 IHRydWUsIGhhbmRsZXIgPT0gU0lHX0RGTCkNCglpZiAoa2EtPnNhLnNhX2hhbmRsZXIgIT0gU0lH X0RGTCkgew0KCShub3QgdHJ1ZSwgc2tpcCkNCglpZiAoc2lnX2tlcm5lbF9pZ25vcmUoc2lnbnIp KSAvKiBEZWZhdWx0IGlzIG5vdGhpbmcuICovIGNvbnRpbnVlOw0KCShub3QgdHJ1ZSwgc2tpcCkN CglpZiAoY3VycmVudC0+cGlkID09IDEpIGNvbnRpbnVlOyAobm90IHRydWUsIHNraXApDQoJaWYg KHNpZ19rZXJuZWxfc3RvcChzaWducikpIHsgKG5vdCB0cnVlLCBza2lwKQ0KCS8qIEFueXRoaW5n IGVsc2UgaXMgZmF0YWwsIG1heWJlIHdpdGggYSBjb3JlIGR1bXAuICovDQoJY3VycmVudC0+Zmxh Z3MgfD0gUEZfU0lHTkFMRUQ7DQoJaWYgKHNpZ19rZXJuZWxfY29yZWR1bXAoc2lnbnIpKSB7DQo9 PT4gVFJVRQ0KCQlkb19jb3JlZHVtcCgobG9uZylzaWduciwgc2lnbnIsIHJlZ3MpOw0KDQpkb19j b3JlZHVtcChTSUdBQlJULCBTSUdBQlJULCByZWdzKQ0KCWN1cnJlbnQtPnNpZ25hbC0+ZmxhZ3Mg PSBTSUdOQUxfR1JPVVBfRVhJVDsNCj09PiBGaW5hbGx5IHdlIHNldCBTSUdOQUxfR1JPVVBfRVhJ VCBoZXJlDQoJY3VycmVudC0+c2lnbmFsLT5ncm91cF9leGl0X2NvZGUgPSBleGl0X2NvZGU7DQo9 PT4gZ3JvdXBfZXhpdF9jb2RlID09IFNJR0FCUlQNCgljb3JlZHVtcF93YWl0KG1tKTsNCg0KY29y ZWR1bXBfd2FpdChtbSkNCgltbS0+Y29yZV93YWl0ZXJzKys7IC8qIGxldCBvdGhlciB0aHJlYWRz IGJsb2NrICovDQoJLyogZ2l2ZSBvdGhlciB0aHJlYWRzIGEgY2hhbmNlIHRvIHJ1bjogKi8NCgl5 aWVsZCgpOw0KCXphcF90aHJlYWRzKG1tKTsNCg0KDQp6YXBfdGhyZWFkcyhtbSkNCglkb19lYWNo X3RocmVhZChnLHApDQoJCWlmIChtbSA9PSBwLT5tbSAmJiBwICE9IHRzaykgew0KCQkJZm9yY2Vf c2lnX3NwZWNpZmljKFNJR0tJTEwsIHApOw0KPT0+IFRoaXMgaXMgd2hlcmUgdGhlIHJ0LXB0aHJl YWRlZC1hcHAgc3VidGhyZWFkcyBhcmUgc2VudCBhIFNJR0tJTEwNCg0KZm9yY2Vfc2lnX3NwZWNp ZmljKFNJR0tJTEwsIHApDQoJc3BlY2lmaWNfc2VuZF9zaWdfaW5mbyhTSUdLSUxMLCAodm9pZCAq KTIsIHQpOw0Kc3BlY2lmaWNfc2VuZF9zaWdfaW5mbyhTSUdLSUxMLCAyLCB0KQ0KCXJldCA9IHNl bmRfc2lnbmFsKFNJR0tJTEwsIDIsIHQsICZ0LT5wZW5kaW5nKTsNCnNlbmRfc2lnbmFsKFNJR0tJ TEwsIDIsIHQsICZ0LT5wZW5kaW5nKQ0KCS8qDQoJICogZmFzdC1wYXRoZWQgc2lnbmFscyBmb3Ig a2VybmVsLWludGVybmFsIHRoaW5ncyBsaWtlIFNJR1NUT1ANCgkgKiBvciBTSUdLSUxMLg0KCSAq Lw0KCWlmICgodW5zaWduZWQgbG9uZylpbmZvID09IDIpIGdvdG8gb3V0X3NldDsNCgkoVHJ1ZSkN CglzaWdhZGRzZXQoJnNpZ25hbHMtPnNpZ25hbCwgc2lnKTsNCglyZXR1cm4gcmV0OyAvLyByZXR1 cm5zIDANCkJhY2sgdG8gc3BlY2lmaWNfc2VuZF9zaWdfaW5mbyhTSUdLSUxMLCAyLCB0KQ0KCWlm ICghcmV0ICYmICFzaWdpc21lbWJlcigmdC0+YmxvY2tlZCwgc2lnKSkNCgkJc2lnbmFsX3dha2Vf dXAodCwgc2lnID09IFNJR0tJTEwpOw0KCShUcnVlKQ0Kc2lnbmFsX3dha2VfdXAodCwgVFJVRSkN CglzZXRfdHNrX3RocmVhZF9mbGFnKHQsIFRJRl9TSUdQRU5ESU5HKTsNCgltYXNrID0gVEFTS19J TlRFUlJVUFRJQkxFOw0KCWlmIChyZXN1bWUpIChUcnVlKQ0KCQltYXNrIHw9IFRBU0tfU1RPUFBF RCB8IFRBU0tfVFJBQ0VEOw0KCWlmICghd2FrZV91cF9zdGF0ZSh0LCBtYXNrKSkNCgkJa2lja19w cm9jZXNzKHQpDQo9PT4gVGhpcyB3aWxsIHdha2UgdXAgcnQtcHRocmVhZGVkLWFwcCBzdWJ0aHJl YWRzIHdoZXRoZXIgdGhleSBhcmUgaW4NCj09PiBUQVNLX0lOVEVSUlVQVElCTEUsIFRBU0tfU1RP UFBFRCwgb3IgVEFTS19UUkFDRUQgc3RhdGVzDQo9PT4gVEhJUyBXT04nVCBXQUtFIFVQIFRBU0tf VU5JTlRFUlJVUFRJQkxFIFRIUkVBRFMNCg0KPT0+IEF0IHRoaXMgcG9pbnQgaW4gdGltZToNCj09 PiBncm91cF9zdG9wX2NvdW50ID09IDIsIFNJR05BTF9HUk9VUF9FWElUIGlzIHNldCBpbiBhbGwg dGhyZWFkcw0KCQkJbW0tPmNvcmVfd2FpdGVycysrOw0KPT0+IFRoaXMgZmluYWxseSBiZWNvbWVz IDMgKG1haW4gKyAyIHN1YnRocmVhZHMpDQoJCX0NCgl3aGlsZV9lYWNoX3RocmVhZChnLHApOw0K DQpCYWNrIHRvIGNvcmVkdW1wX3dhaXQoKQ0KCWlmICgtLW1tLT5jb3JlX3dhaXRlcnMpIHsNCj09 PiBNYWluIHRocmVhZCBkZWNyZW1lbnRzIGNvcmVfd2FpdGVycyBiYWNrIHRvIDIuDQoJCXVwX3dy aXRlKCZtbS0+bW1hcF9zZW0pOw0KCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZzdGFydHVwX2RvbmUp Ow0KDQoNCk5PVywgSUYgVEhFIE1BSU4gcnQtcHRocmVhZGVkLWFwcCBUSFJFQUQgSVMgU0VOVCBB IFNJR0tJTEwgV0hJTEUgV0FJVElORw0KDQpoYW5kbGVfc3RvcF9zaWduYWwoKQ0KCWlmIChwLT5m bGFncyAmIFNJR05BTF9HUk9VUF9FWElUKSByZXR1cm47DQoqKioqKiBXUk9ORyBDSEVDSyEgU0hP VUxEIEJFIChwLT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpICoqKioqDQoJZWxz ZSBpZiAoc2lnID09IFNJR0tJTEwpIHsNCgkJcC0+c2lnbmFsLT5mbGFncyA9IDA7DQoJfQ0KKioq KioqKioqIFdIT09QUyEgSnVzdCBjbGVhcmVkIFNJR05BTF9HUk9VUF9FWElUICoqKioqKioqKioq KioqDQoNCnJ0LXB0aHJlYWRlZC1hcHAgc3VidGhyZWFkOg0KPT09PT09PT09PT09PT09PT09PT0N CkNvbWluZyBvdXQgb2Ygc2NoZWR1bGUoKSwgaXQgd2lsbCBsb29rIGZvciBwZW5kaW5nIHNpZ25h bHMNCg0KZG9fbm90aWZ5X3Jlc3VtZSgpDQpkb19zaWduYWwoKQ0KCXNpZ25yID0gZ2V0X3NpZ25h bF90b19kZWxpdmVyKCZpbmZvLCAma2EsIHJlZ3MsIE5VTEwpOw0KZ2V0X3NpZ25hbF90b19kZWxp dmVyKCkNCglpZiAodW5saWtlbHkoY3VycmVudC0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50ID4g MCkgJiYNCgkJaGFuZGxlX2dyb3VwX3N0b3AoKSkNCj09PiBncm91cF9zdG9wX2NvdW50IGlzIDIs IHNvIGNhbGwgaGFuZGxlX2dyb3VwX3N0b3AoKQ0KaGFuZGxlX2dyb3VwX3N0b3AoKQ0KCWlmIChj dXJyZW50LT5zaWduYWwtPmdyb3VwX2V4aXRfdGFzayA9PSBjdXJyZW50KSB7DQoJKEZhbHNlKQ0K CWlmIChjdXJyZW50LT5zaWduYWwtPmZsYWdzICYgU0lHTkFMX0dST1VQX0VYSVQpIHJldHVybjsN CgkoU0hPVUxEIEhBVkUgQkVFTiBUUlVFLCBCVVQgV0FTIENMRUFSRUQgQlkgTUFJTiBUSFJFQUQp DQoJc3RvcF9jb3VudCA9IC0tY3VycmVudC0+c2lnbmFsLT5ncm91cF9zdG9wX2NvdW50Ow0KPT0+ IGdyb3VwX3N0b3BfY291bnQgaXMgbm93IDENCglpZiAoc3RvcF9jb3VudCA9PSAwKQ0KCQljdXJy ZW50LT5zaWduYWwtPmZsYWdzID0gU0lHTkFMX1NUT1BfU1RPUFBFRDsNCgljdXJyZW50LT5leGl0 X2NvZGUgPSBjdXJyZW50LT5zaWduYWwtPmdyb3VwX2V4aXRfY29kZTsNCj09PiBleGl0X2NvZGUg PT0gU0lHQUJSVA0KCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfU1RPUFBFRCk7DQo9PT4gVGFzayBl bnRlcnMgVEFTS19TVE9QUEVEIHN0YXRlDQoJZmluaXNoX3N0b3Aoc3RvcF9jb3VudCk7DQoNCkRF QURMT0NLIQ0K --=-NbyBznkjenk0Qrz1hI0k--