From owner-freebsd-wireless@FreeBSD.ORG Sat Sep 10 12:24:29 2011 Return-Path: Delivered-To: freebsd-wireless@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id 92523106566B for ; Sat, 10 Sep 2011 12:24:29 +0000 (UTC) (envelope-from adrian.chadd@gmail.com) Received: from mail-yi0-f54.google.com (mail-yi0-f54.google.com [209.85.218.54]) by mx1.freebsd.org (Postfix) with ESMTP id 52ECB8FC08 for ; Sat, 10 Sep 2011 12:24:29 +0000 (UTC) Received: by yib19 with SMTP id 19so1822799yib.13 for ; Sat, 10 Sep 2011 05:24:28 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=gamma; h=mime-version:sender:date:x-google-sender-auth:message-id:subject :from:to:content-type; bh=gMIXUgwjW5+dA53BnXh71SCAOLTGqq9Iy+d5yYyQGO4=; b=hq7a10LYwJD4giFqFl8j/hjnD3VNTf7NwafYRTn1GwfEZEhU2yam21J4v2Gjdvo5aU 3ygVjFx7nsA0d4lnFd+akJDAA/BqAzTFWpBAHxKlCU4fxYeTghdy7+Nl0m4qPtTuXNSM dZiZrrZebjDIbfol1iyhtEhNQ0u8UPJlyCBk8= MIME-Version: 1.0 Received: by 10.236.200.137 with SMTP id z9mr17292762yhn.27.1315657468775; Sat, 10 Sep 2011 05:24:28 -0700 (PDT) Sender: adrian.chadd@gmail.com Received: by 10.236.103.6 with HTTP; Sat, 10 Sep 2011 05:24:28 -0700 (PDT) Date: Sat, 10 Sep 2011 20:24:28 +0800 X-Google-Sender-Auth: G6jyNEKQLjds7g1Nr6l5JIhpokw Message-ID: From: Adrian Chadd To: freebsd-wireless@freebsd.org Content-Type: multipart/mixed; boundary=20cf30563dc1128eb404ac9560ca Subject: [patch] if_ath_tx: change interrupt scheduling deferral X-BeenThere: freebsd-wireless@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Discussions of 802.11 stack, tools device driver development." List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sat, 10 Sep 2011 12:24:29 -0000 --20cf30563dc1128eb404ac9560ca Content-Type: text/plain; charset=ISO-8859-1 Hi, This patch changes how the deferred interrupt handling works. It's likely I'll have to change things a bit before I commit it so I won't be (yet) committing this. It brings the interrupt handling in line with how ath9k and the reference driver works. It eliminates a possible race condition: * ath_intr() and ath_hal_getisr() set AH5212(ah)->ah_intrTxqs, which is a bitmap of TXQs which need servicing; * The ath TX processes call txqactive() which check the above bitmap and clear the bit that's been tested. The interrupt handler ath_intr() can be called during the TX completion task, so I think it's possible that the interrupt could occur, setting a TXQ bit, in between txqactive()'s "check bit X" and "clear bit X". My testing was only showing up one queue hang every 20-50 million packets where the TXQ had active packets in it which were completed, but hadn't been processed. I've only just begun testing this. I'll post updates as they're needed. Thanks, Adrian --20cf30563dc1128eb404ac9560ca Content-Type: application/octet-stream; name="ar5416-int-sched.diff" Content-Disposition: attachment; filename="ar5416-int-sched.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_gsekhd1l0 SW5kZXg6IGlmX2F0aHZhci5oCj09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09PT09PT0KLS0tIGlmX2F0aHZhci5oCShyZXZpc2lvbiAy MjU0NjcpCisrKyBpZl9hdGh2YXIuaAkod29ya2luZyBjb3B5KQpAQCAtNDExLDYgKzQxMSw3IEBA CiAJdV9pbnQJCQlzY19mZnR4cW1heDsJLyogbWF4IGZyYW1lcyBiZWZvcmUgZHJvcCAqLwogCXVf aW50CQkJc2NfdHhhbnRlbm5hOwkvKiB0eCBhbnRlbm5hIChmaXhlZCBvciBhdXRvKSAqLwogCUhB TF9JTlQJCQlzY19pbWFzazsJLyogaW50ZXJydXB0IG1hc2sgY29weSAqLworCUhBTF9JTlQJCQlz Y19pbnRyc3RhdHVzOwkvKiBjdXJyZW50IGludGVycnVwdCBzdGF0dXMgKi8KIAl1X2ludAkJCXNj X2tleW1heDsJLyogc2l6ZSBvZiBrZXkgY2FjaGUgKi8KIAl1X2ludDhfdAkJc2Nfa2V5bWFwW0FU SF9LRVlCWVRFU107Lyoga2V5IHVzZSBiaXQgbWFwICovCiAKQEAgLTQyOSw3ICs0MzAsNiBAQAog CWF0aF9idWZoZWFkCQlzY19yeGJ1ZjsJLyogcmVjZWl2ZSBidWZmZXIgKi8KIAlzdHJ1Y3QgbWJ1 ZgkJKnNjX3J4cGVuZGluZzsJLyogcGVuZGluZyByZWNlaXZlIGRhdGEgKi8KIAl1X2ludDMyX3QJ CSpzY19yeGxpbms7CS8qIGxpbmsgcHRyIGluIGxhc3QgUlggZGVzYyAqLwotCXN0cnVjdCB0YXNr CQlzY19yeHRhc2s7CS8qIHJ4IGludCBwcm9jZXNzaW5nICovCiAJdV9pbnQ4X3QJCXNjX2RlZmFu dDsJLyogY3VycmVudCBkZWZhdWx0IGFudGVubmEgKi8KIAl1X2ludDhfdAkJc2NfcnhvdGhlcmFu dDsJLyogcngncyBvbiBub24tZGVmYXVsdCBhbnRlbm5hKi8KIAl1X2ludDY0X3QJCXNjX2xhc3Ry eDsJLyogdHNmIGF0IGxhc3QgcngnZCBmcmFtZSAqLwpAQCAtNDQ2LDcgKzQ0Niw2IEBACiAJdV9p bnQJCQlzY190eGludHJwZXJpb2Q7LyogdHggaW50ZXJydXB0IGJhdGNoaW5nICovCiAJc3RydWN0 IGF0aF90eHEJCXNjX3R4cVtIQUxfTlVNX1RYX1FVRVVFU107CiAJc3RydWN0IGF0aF90eHEJCSpz Y19hYzJxWzVdOwkvKiBXTUUgQUMgLT4gaC93IHEgbWFwICovIAotCXN0cnVjdCB0YXNrCQlzY190 eHRhc2s7CS8qIHR4IGludCBwcm9jZXNzaW5nICovCiAJaW50CQkJc2Nfd2RfdGltZXI7CS8qIGNv dW50IGRvd24gZm9yIHdkIHRpbWVyICovCiAJc3RydWN0IGNhbGxvdXQJCXNjX3dkX2NoOwkvKiB0 eCB3YXRjaGRvZyB0aW1lciAqLwogCXN0cnVjdCBhdGhfdHhfcmFkaW90YXBfaGVhZGVyIHNjX3R4 X3RoOwpAQCAtNDYwLDYgKzQ1OSw4IEBACiAJc3RydWN0IGF0aF90eHEJCSpzY19jYWJxOwkvKiB0 eCBxIGZvciBjYWIgZnJhbWVzICovCiAJc3RydWN0IHRhc2sJCXNjX2JtaXNzdGFzazsJLyogYm1p c3MgaW50IHByb2Nlc3NpbmcgKi8KIAlzdHJ1Y3QgdGFzawkJc2NfYnN0dWNrdGFzazsJLyogc3R1 Y2sgYmVhY29uIHByb2Nlc3NpbmcgKi8KKwlzdHJ1Y3QgdGFzawkJc2NfaW50cnRhc2s7CS8qIGRl ZmVycmVkIGludGVycnVwdCBwcm9jZXNzaW5nICovCisJc3RydWN0IHRhc2sJCXNjX2ZhdGFsdGFz azsJLyogZGVmZXJyZWQgcmVzZXQgcHJvY2Vzc2luZyAqLwogCWVudW0gewogCQlPSywJCQkJLyog bm8gY2hhbmdlIG5lZWRlZCAqLwogCQlVUERBVEUsCQkJCS8qIHVwZGF0ZSBwZW5kaW5nICovCklu ZGV4OiBpZl9hdGguYwo9PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09PT09 PT09PT09PT09PT09PT09PT09PT09PT09Ci0tLSBpZl9hdGguYwkocmV2aXNpb24gMjI1NDY3KQor KysgaWZfYXRoLmMJKHdvcmtpbmcgY29weSkKQEAgLTEzMiw2ICsxMzIsNyBAQAogc3RhdGljIHZv aWQJYXRoX3dhdGNoZG9nKHZvaWQgKik7CiBzdGF0aWMgaW50CWF0aF9pb2N0bChzdHJ1Y3QgaWZu ZXQgKiwgdV9sb25nLCBjYWRkcl90KTsKIHN0YXRpYyB2b2lkCWF0aF9mYXRhbF9wcm9jKHZvaWQg KiwgaW50KTsKK3N0YXRpYyB2b2lkCWF0aF9oYW5kbGVfaW50cih2b2lkICosIGludCk7CiBzdGF0 aWMgdm9pZAlhdGhfYm1pc3NfdmFwKHN0cnVjdCBpZWVlODAyMTF2YXAgKik7CiBzdGF0aWMgdm9p ZAlhdGhfYm1pc3NfcHJvYyh2b2lkICosIGludCk7CiBzdGF0aWMgdm9pZAlhdGhfa2V5X3VwZGF0 ZV9iZWdpbihzdHJ1Y3QgaWVlZTgwMjExdmFwICopOwpAQCAtMTczLDggKzE3NCwxMCBAQAogc3Rh dGljIGludAlhdGhfd21lX3VwZGF0ZShzdHJ1Y3QgaWVlZTgwMjExY29tICopOwogc3RhdGljIHZv aWQJYXRoX3R4X2NsZWFudXBxKHN0cnVjdCBhdGhfc29mdGMgKiwgc3RydWN0IGF0aF90eHEgKik7 CiBzdGF0aWMgdm9pZAlhdGhfdHhfY2xlYW51cChzdHJ1Y3QgYXRoX3NvZnRjICopOworI2lmIDAK IHN0YXRpYyB2b2lkCWF0aF90eF9wcm9jX3EwKHZvaWQgKiwgaW50KTsKIHN0YXRpYyB2b2lkCWF0 aF90eF9wcm9jX3EwMTIzKHZvaWQgKiwgaW50KTsKKyNlbmRpZgogc3RhdGljIHZvaWQJYXRoX3R4 X3Byb2Modm9pZCAqLCBpbnQpOwogc3RhdGljIGludAlhdGhfY2hhbl9zZXQoc3RydWN0IGF0aF9z b2Z0YyAqLCBzdHJ1Y3QgaWVlZTgwMjExX2NoYW5uZWwgKik7CiBzdGF0aWMgdm9pZAlhdGhfZHJh aW50eHEoc3RydWN0IGF0aF9zb2Z0YyAqKTsKQEAgLTM5NSw5ICszOTgsMTAgQEAKIAl0YXNrcXVl dWVfc3RhcnRfdGhyZWFkcygmc2MtPnNjX3RxLCAxLCBQSV9ORVQsCiAJCSIlcyB0YXNrcSIsIGlm cC0+aWZfeG5hbWUpOwogCi0JVEFTS19JTklUKCZzYy0+c2Nfcnh0YXNrLCAwLCBhdGhfcnhfcHJv Yywgc2MpOwogCVRBU0tfSU5JVCgmc2MtPnNjX2JtaXNzdGFzaywgMCwgYXRoX2JtaXNzX3Byb2Ms IHNjKTsKIAlUQVNLX0lOSVQoJnNjLT5zY19ic3R1Y2t0YXNrLDAsIGF0aF9ic3R1Y2tfcHJvYywg c2MpOworCVRBU0tfSU5JVCgmc2MtPnNjX2ludHJ0YXNrLCAwLCBhdGhfaGFuZGxlX2ludHIsIHNj KTsKKwlUQVNLX0lOSVQoJnNjLT5zY19mYXRhbHRhc2ssIDAsIGF0aF9mYXRhbF9wcm9jLCBzYyk7 CiAKIAkvKgogCSAqIEFsbG9jYXRlIGhhcmR3YXJlIHRyYW5zbWl0IHF1ZXVlczogb25lIHF1ZXVl IGZvcgpAQCAtNDQ2LDIzICs0NTAsNiBAQAogCX0KIAogCS8qCi0JICogU3BlY2lhbCBjYXNlIGNl cnRhaW4gY29uZmlndXJhdGlvbnMuICBOb3RlIHRoZQotCSAqIENBQiBxdWV1ZSBpcyBoYW5kbGVk IGJ5IHRoZXNlIHNwZWNpYWxseSBzbyBkb24ndAotCSAqIGluY2x1ZGUgdGhlbSB3aGVuIGNoZWNr aW5nIHRoZSB0eHEgc2V0dXAgbWFzay4KLQkgKi8KLQlzd2l0Y2ggKHNjLT5zY190eHFzZXR1cCAm fiAoMTw8c2MtPnNjX2NhYnEtPmF4cV9xbnVtKSkgewotCWNhc2UgMHgwMToKLQkJVEFTS19JTklU KCZzYy0+c2NfdHh0YXNrLCAwLCBhdGhfdHhfcHJvY19xMCwgc2MpOwotCQlicmVhazsKLQljYXNl IDB4MGY6Ci0JCVRBU0tfSU5JVCgmc2MtPnNjX3R4dGFzaywgMCwgYXRoX3R4X3Byb2NfcTAxMjMs IHNjKTsKLQkJYnJlYWs7Ci0JZGVmYXVsdDoKLQkJVEFTS19JTklUKCZzYy0+c2NfdHh0YXNrLCAw LCBhdGhfdHhfcHJvYywgc2MpOwotCQlicmVhazsKLQl9Ci0KLQkvKgogCSAqIFNldHVwIHJhdGUg Y29udHJvbC4gIFNvbWUgcmF0ZSBjb250cm9sIG1vZHVsZXMKIAkgKiBjYWxsIGJhY2sgdG8gY2hh bmdlIHRoZSBhbm50ZW5hIHN0YXRlIHNvIGV4cG9zZQogCSAqIHRoZSBuZWNlc3NhcnkgZW50cnkg cG9pbnRzLgpAQCAtMTM0NSw2ICsxMzMyLDYzIEBACiB9CiAKIC8qCisgKiBEbyBkZWZlcnJlZCBp bnRlcnJ1cHQgcHJvY2Vzc2luZzsgdGhlbiByZS1lbmFibGUgaW50ZXJydXB0cworICogaWYgcmVx dWlyZWQuCisgKi8KK3N0YXRpYyB2b2lkCithdGhfaGFuZGxlX2ludHIodm9pZCAqYXJnLCBpbnQg bnBlbmRpbmcpCit7CisJc3RydWN0IGF0aF9zb2Z0YyAqc2MgPSAoc3RydWN0IGF0aF9zb2Z0YyAq KSBhcmc7CisJSEFMX0lOVCBzdGF0dXM7CisJc3RydWN0IGF0aF9oYWwgKmFoID0gc2MtPnNjX2Fo OworCXN0cnVjdCBpZm5ldCAqaWZwID0gc2MtPnNjX2lmcDsKKworCWlmIChzYy0+c2NfaW52YWxp ZCkgeworCQkvKgorCQkgKiBUaGUgaGFyZHdhcmUgaXMgbm90IHJlYWR5L3ByZXNlbnQsIGRvbid0 IHRvdWNoIGFueXRoaW5nLgorCQkgKiBOb3RlIHRoaXMgY2FuIGhhcHBlbiBlYXJseSBvbiBpZiB0 aGUgSVJRIGlzIHNoYXJlZC4KKwkJICovCisJCURQUklOVEYoc2MsIEFUSF9ERUJVR19BTlksICIl czogaW52YWxpZDsgaWdub3JlZFxuIiwgX19mdW5jX18pOworCQlyZXR1cm47CisJfQorCisJLyoK KwkgKiBGZXRjaCB0aGUgY3VycmVudCBpbnRlcnJ1cHQgc3RhdHVzIGZyb20gdGhlIGludGVycnVw dAorCSAqIGhhbmRsZXIuIEl0J3MgYXNzdW1lZCB0aGF0IGFueSBpbnRlcnJ1cHQgd2hpY2ggd291 bGQgbGVhZAorCSAqIHVzIGhlcmUgd29uJ3QgaGFwcGVuIHVudGlsIHRoZSBpbnRlcnJ1cHQgaXMg Y2xlYXJlZC4KKwkgKgorCSAqIFhYWCBUaHVzIEknbSBub3QgdXNpbmcgYSBsb2NrIGp1c3QgeWV0 LgorCSAqLworCXN0YXR1cyA9IHNjLT5zY19pbnRyc3RhdHVzOworCisJaWYgKHN0YXR1cyAmIEhB TF9JTlRfRkFUQUwpIHsKKwkJYXRoX2hhbF9pbnRyc2V0KGFoLCAwKTsJCS8qIGRpc2FibGUgaW50 cidzIHVudGlsIHJlc2V0ICovCisJCWF0aF9mYXRhbF9wcm9jKHNjLCAwKTsKKwl9IGVsc2Ugewor CQlpZiAoc3RhdHVzICYgKEhBTF9JTlRfUlhFT0wgfCBIQUxfSU5UX1JYKSkgeworCQkJYXRoX3J4 X3Byb2Moc2MsIDEpOworCQkJLyogWFhYIHRoaXMgbWF5IHJlc2V0IHRoZSBoYXJkd2FyZT8gU2hv dWxkIGhhbmRsZSB0aGF0ISAqLworCQl9CisJCWlmIChzdGF0dXMgJiBIQUxfSU5UX1RYVVJOKSB7 CisJCQkvKiBidW1wIHR4IHRyaWdnZXIgbGV2ZWwgKi8KKwkJCWF0aF9oYWxfdXBkYXRldHh0cmln bGV2ZWwoYWgsIEFIX1RSVUUpOworCQl9CisJCWlmIChzdGF0dXMgJiBIQUxfSU5UX1RYKSB7CisJ CQlhdGhfdHhfcHJvYyhzYywgMSk7CisJCX0KKwkJLyoKKwkJICogSWYgVFggb3IgUlggb2NjdXJl ZCwgY2FsbCBhdGhfc3RhcnQoKSBpZiB0aGUgaW50ZXJmYWNlCisJCSAqIGNhbiBncmFiIHNvbWUg cGFja2V0cy4KKwkJICovCisJCWlmICghSUZRX0lTX0VNUFRZKCZpZnAtPmlmX3NuZCkpCisJCQlh dGhfc3RhcnQoaWZwKTsKKwl9CisKKwkvKiByZS1lbmFibGUgaW50ZXJydXB0cyAqLworCWF0aF9o YWxfaW50cnNldChzYy0+c2NfYWgsIHNjLT5zY19pbWFzayk7Cit9CisKKy8qCiAgKiBJbnRlcnJ1 cHQgaGFuZGxlci4gIE1vc3Qgb2YgdGhlIGFjdHVhbCBwcm9jZXNzaW5nIGlzIGRlZmVycmVkLgog ICovCiB2b2lkCkBAIC0xMzU0LDYgKzEzOTgsNyBAQAogCXN0cnVjdCBpZm5ldCAqaWZwID0gc2Mt PnNjX2lmcDsKIAlzdHJ1Y3QgYXRoX2hhbCAqYWggPSBzYy0+c2NfYWg7CiAJSEFMX0lOVCBzdGF0 dXMgPSAwOworCWludCBzY2hlZCA9IDA7CiAKIAlpZiAoc2MtPnNjX2ludmFsaWQpIHsKIAkJLyoK QEAgLTEzODksMTAgKzE0MzQsMTIgQEAKIAlpZiAoc3RhdHVzID09IDB4MCkKIAkJcmV0dXJuOwog CisJLyogWFhYIGxvY2tpbmc/ICovCisJc2MtPnNjX2ludHJzdGF0dXMgPSBzdGF0dXM7CisKIAlp ZiAoc3RhdHVzICYgSEFMX0lOVF9GQVRBTCkgewogCQlzYy0+c2Nfc3RhdHMuYXN0X2hhcmR3YXJl Kys7Ci0JCWF0aF9oYWxfaW50cnNldChhaCwgMCk7CQkvKiBkaXNhYmxlIGludHIncyB1bnRpbCBy ZXNldCAqLwotCQlhdGhfZmF0YWxfcHJvYyhzYywgMCk7CisJCXNjaGVkID0gMTsKIAl9IGVsc2Ug ewogCQlpZiAoc3RhdHVzICYgSEFMX0lOVF9TV0JBKSB7CiAJCQkvKgpAQCAtMTQyMiwxMiArMTQ2 OSwxMiBAQAogCQkJCSAqIHRyYWZmaWMgc28gYW55IGZyYW1lcyBoZWxkIG9uIHRoZSBzdGFnaW5n CiAJCQkJICogcXVldWUgYXJlIGFnZWQgYW5kIHBvdGVudGlhbGx5IGZsdXNoZWQuCiAJCQkJICov CisJCQkJLyogWFhYIHRoZXJlJ3Mgbm8gbG9uZ2VyIGFuIHJ4dGFzaz8gSG93IHRvIGZvcmNlPyAq LwogCQkJCXRhc2txdWV1ZV9lbnF1ZXVlKHNjLT5zY190cSwgJnNjLT5zY19yeHRhc2spOwogI2Vu ZGlmCiAJCQl9CiAJCX0KIAkJaWYgKHN0YXR1cyAmIEhBTF9JTlRfUlhFT0wpIHsKLQkJCWludCBp bWFzayA9IHNjLT5zY19pbWFzazsKIAkJCS8qCiAJCQkgKiBOQjogdGhlIGhhcmR3YXJlIHNob3Vs ZCByZS1yZWFkIHRoZSBsaW5rIHdoZW4KIAkJCSAqICAgICBSWEUgYml0IGlzIHdyaXR0ZW4sIGJ1 dCBpdCBkb2Vzbid0IHdvcmsgYXQKQEAgLTE0NDMsMjkgKzE0OTAsMjMgQEAKIAkJCSAqIGJ5IGEg Y2FsbCB0byBhdGhfcmVzZXQoKSBzb21laG93LCB0aGUKIAkJCSAqIGludGVycnVwdCBtYXNrIHdp bGwgYmUgY29ycmVjdGx5IHJlcHJvZ3JhbW1lZC4KIAkJCSAqLwotCQkJaW1hc2sgJj0gfihIQUxf SU5UX1JYRU9MIHwgSEFMX0lOVF9SWE9STik7Ci0JCQlhdGhfaGFsX2ludHJzZXQoYWgsIGltYXNr KTsKLQkJCS8qCi0JCQkgKiBFbnF1ZXVlIGFuIFJYIHByb2MsIHRvIGhhbmRsZWQgd2hhdGV2ZXIK LQkJCSAqIGlzIGluIHRoZSBSWCBxdWV1ZS4KLQkJCSAqIFRoaXMgd2lsbCB0aGVuIGtpY2sgdGhl IFBDVS4KLQkJCSAqLwotCQkJdGFza3F1ZXVlX2VucXVldWUoc2MtPnNjX3RxLCAmc2MtPnNjX3J4 dGFzayk7CisJCQkvKiBYWFggdGhpcyBpcyBhbHJlYWR5IHJlc2V0IGluIHRoZSBzY2hlZCBjYWxs IGJlbG93ICovCiAJCQlzYy0+c2NfcnhsaW5rID0gTlVMTDsKIAkJCXNjLT5zY19raWNrcGN1ID0g MTsKKwkJCXNjaGVkID0gMTsKIAkJfQogCQlpZiAoc3RhdHVzICYgSEFMX0lOVF9UWFVSTikgewog CQkJc2MtPnNjX3N0YXRzLmFzdF90eHVybisrOwogCQkJLyogYnVtcCB0eCB0cmlnZ2VyIGxldmVs ICovCi0JCQlhdGhfaGFsX3VwZGF0ZXR4dHJpZ2xldmVsKGFoLCBBSF9UUlVFKTsKKwkJCXNjaGVk ID0gMTsKIAkJfQogCQlpZiAoc3RhdHVzICYgSEFMX0lOVF9SWCkgewogCQkJc2MtPnNjX3N0YXRz LmFzdF9yeF9pbnRyKys7Ci0JCQl0YXNrcXVldWVfZW5xdWV1ZShzYy0+c2NfdHEsICZzYy0+c2Nf cnh0YXNrKTsKKwkJCXNjaGVkID0gMTsKIAkJfQogCQlpZiAoc3RhdHVzICYgSEFMX0lOVF9UWCkg ewogCQkJc2MtPnNjX3N0YXRzLmFzdF90eF9pbnRyKys7Ci0JCQl0YXNrcXVldWVfZW5xdWV1ZShz Yy0+c2NfdHEsICZzYy0+c2NfdHh0YXNrKTsKKwkJCXNjaGVkID0gMTsKIAkJfQogCQlpZiAoc3Rh dHVzICYgSEFMX0lOVF9CTUlTUykgewogCQkJc2MtPnNjX3N0YXRzLmFzdF9ibWlzcysrOwpAQCAt MTQ5NCw2ICsxNTM1LDE4IEBACiAJCQlzYy0+c2Nfc3RhdHMuYXN0X3J4b3JuKys7CiAJCX0KIAl9 CisKKwkvKgorCSAqIElmIGFueSBvZiB0aGUgYWJvdmUgY2hlY2tzIHJlcXVpcmUgYW4gSVNSIHNj aGVkdWxlLAorCSAqIGVucXVldWUgdGhlIHRhc2sgYW5kIGRpc2FibGUgaW50ZXJydXB0cy4KKwkg KgorCSAqIFNpbmNlIGJlYWNvbiBoYW5kbGluZyBpcyBkb25lIGluIGludGVycnVwdCBjb250ZXh0 IGF0IHRoZQorCSAqIG1vbWVudCwgYWx3YXlzIGxlYXZlIHRoYXQgZW5hYmxlZC4KKwkgKi8KKwlp ZiAoc2NoZWQgPT0gMSkgeworCQlhdGhfaGFsX2ludHJzZXQoYWgsIChzYy0+c2NfaW1hc2sgJiBI QUxfSU5UX1NXQkEpKTsKKwkJdGFza3F1ZXVlX2VucXVldWUoc2MtPnNjX3RxLCAmc2MtPnNjX2lu dHJ0YXNrKTsKKwl9CiB9CiAKIHN0YXRpYyB2b2lkCkBAIC0xODI2LDYgKzE4NzksOSBAQAogCX0K IAlhdGhfaGFsX2ludHJzZXQoYWgsIHNjLT5zY19pbWFzayk7CiAKKwkvKgorCSAqIFhYWCBzaG91 bGQgdGhpcyBiZSBkb25lIGluLWxpbmU/CisJICovCiAJYXRoX3N0YXJ0KGlmcCk7CQkJLyogcmVz dGFydCB4bWl0ICovCiAJcmV0dXJuIDA7CiB9CkBAIC0zOTUwLDIzICs0MDA2LDIwIEBACiAJCSAq IFhYWCBraWNrIHRoZSBQQ1UgYWdhaW4gdG8gY29udGludWUgUlhpbmc/CiAJCSAqLwogCQlhdGhf c3RvcHJlY3Yoc2MpOwotCQlzYy0+c2NfaW1hc2sgfD0gKEhBTF9JTlRfUlhFT0wgfCBIQUxfSU5U X1JYT1JOKTsKIAkJaWYgKGF0aF9zdGFydHJlY3Yoc2MpICE9IDApIHsKIAkJCWlmX3ByaW50Zihp ZnAsCiAJCQkgICAgIiVzOiBjb3VsZG4ndCByZXN0YXJ0IFJYIGFmdGVyIFJYRU9MOyByZXNldHRp bmdcbiIsCiAJCQkgICAgX19mdW5jX18pOworCQkJLyogWFhYIHRoaXMgbXVzdCBiZSBzY2hlZHVs ZWQhICovCiAJCQlhdGhfcmVzZXQoaWZwKTsKIAkJCXJldHVybjsKIAkJfQotCQlhdGhfaGFsX2lu dHJzZXQoYWgsIHNjLT5zY19pbWFzayk7CiAJfQogCiAJaWYgKChpZnAtPmlmX2Rydl9mbGFncyAm IElGRl9EUlZfT0FDVElWRSkgPT0gMCkgewogI2lmZGVmIElFRUU4MDIxMV9TVVBQT1JUX1NVUEVS RwogCQlpZWVlODAyMTFfZmZfYWdlX2FsbChpYywgMTAwKTsKICNlbmRpZgotCQlpZiAoIUlGUV9J U19FTVBUWSgmaWZwLT5pZl9zbmQpKQotCQkJYXRoX3N0YXJ0KGlmcCk7CiAJfQogI3VuZGVmIFBB MkRFU0MKIH0KQEAgLTQ0NDQsNiArNDQ5Nyw3IEBACiAJcmV0dXJuICh0eHFzICYgKDE8PHFudW0p KTsKIH0KIAorI2lmIDAKIC8qCiAgKiBEZWZlcnJlZCBwcm9jZXNzaW5nIG9mIHRyYW5zbWl0IGlu dGVycnVwdDsgc3BlY2lhbC1jYXNlZAogICogZm9yIGEgc2luZ2xlIGhhcmR3YXJlIHRyYW5zbWl0 IHF1ZXVlIChlLmcuIDUyMTAgYW5kIDUyMTEpLgpAQCAtNDUwNCw2ICs0NTU4LDcgQEAKIAogCWF0 aF9zdGFydChpZnApOwogfQorI2VuZGlmCiAKIC8qCiAgKiBEZWZlcnJlZCBwcm9jZXNzaW5nIG9m IHRyYW5zbWl0IGludGVycnVwdC4K --20cf30563dc1128eb404ac9560ca--