From owner-freebsd-net@FreeBSD.ORG Wed Mar 13 03:48:13 2013 Return-Path: Delivered-To: freebsd-net@freebsd.org Received: from mx1.freebsd.org (mx1.FreeBSD.org [8.8.178.115]) by hub.freebsd.org (Postfix) with ESMTP id E4D224AF; Wed, 13 Mar 2013 03:48:13 +0000 (UTC) (envelope-from rmacklem@uoguelph.ca) Received: from esa-jnhn.mail.uoguelph.ca (esa-jnhn.mail.uoguelph.ca [131.104.91.44]) by mx1.freebsd.org (Postfix) with ESMTP id F04E7E34; Wed, 13 Mar 2013 03:48:12 +0000 (UTC) X-IronPort-Anti-Spam-Filtered: true X-IronPort-Anti-Spam-Result: AqEEABn2P1GDaFvO/2dsb2JhbAA7CIgZvGCBYnSCKQEBAQMBAQEBFwkEJyALGxgRGQIEJQEJJgYIBwQBGgIEh20GDK80gkCPaReNTAsBBH0ZGweCLYETA480hGSCPoEfj1eDJiAyfQgXHg X-IronPort-AV: E=Sophos;i="4.84,833,1355115600"; d="scan'208";a="20887967" Received: from erie.cs.uoguelph.ca (HELO zcs3.mail.uoguelph.ca) ([131.104.91.206]) by esa-jnhn.mail.uoguelph.ca with ESMTP; 12 Mar 2013 23:48:00 -0400 Received: from zcs3.mail.uoguelph.ca (localhost.localdomain [127.0.0.1]) by zcs3.mail.uoguelph.ca (Postfix) with ESMTP id A11D2B3F15; Tue, 12 Mar 2013 23:48:00 -0400 (EDT) Date: Tue, 12 Mar 2013 23:48:00 -0400 (EDT) From: Rick Macklem To: Garrett Wollman Message-ID: <75232221.3844453.1363146480616.JavaMail.root@erie.cs.uoguelph.ca> In-Reply-To: <20798.44871.601547.24628@hergotha.csail.mit.edu> Subject: Re: Limits on jumbo mbuf cluster allocation MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_3844452_1526038691.1363146480611" X-Originating-IP: [172.17.91.201] X-Mailer: Zimbra 6.0.10_GA_2692 (ZimbraWebClient - FF3.0 (Win)/6.0.10_GA_2692) Cc: freebsd-net@freebsd.org, andre@freebsd.org, Ivan Voras X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Wed, 13 Mar 2013 03:48:14 -0000 ------=_Part_3844452_1526038691.1363146480611 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 7bit Garrett Wollman wrote: > < said: > > > To be honest, I'd consider seeing a lot of non-empty receive queues > > for TCP connections to the NFS server to be an indication that it is > > near/at its load limit. (Sure, if you do netstat a lot, you will > > occasionally > > see a non-empty queue here or there, but I would not expect to see a > > lot > > of them non-empty a lot of the time.) If that is the case, then the > > question becomes "what is the bottleneck?". Below I suggest getting > > rid > > of the DRC in case it is the bottleneck for your server. > > The problem is not the DRC in "normal" operation, but the DRC when it > gets into the livelocked state. I think we've talked about a number > of solutions to the livelock problem, but I haven't managed to > implement or test these ideas yet. I have a duplicate server up now, > so I hope to do some testing this week. > > In normal operation, the server is mostly idle, and the nfsd threads > that aren't themselves idle are sleeping deep in ZFS waiting for > something to happen on disk. When the arrival rate exceeds the rate > at which requests are cleared from the DRC, *all* of the nfsd threads > will spin, either waiting for the DRC mutex or walking the DRC finding > that there is nothing that can be released yet. *That* is the > livelock condition -- the spinning that takes over all nfsd threads is > what causes the receive buffers to build up, and the large queues then > maintain the livelocked condition -- and that is why it clears > *immediately* when the DRC size is increased. (It's possible to > reproduce this condition on a loaded server by simply reducing the > tcphighwater to less than the current size.) Unfortunately, I'm at > the NFSRC_FLOODSIZE limit right now (64k), so there is no room for > further increases until I recompile the kernel. It's probably a bug > that the sysctl definition in drc3.patch doesn't check the new value > against this limit. > > Note that I'm currently running 64 nfsd threads on a 12-core > (24-thread) system. In the livelocked condition, as you would expect, > the system goes to 100% CPU utilization and the load average peaks out > at 64, while goodput goes to nearly nil. > Ok, I think I finally understand what you are referring to by your livelock. Basically, you are at the tcphighwater mark and the nfsd threads don't succeed in freeing up many cache entries so each nfsd thread tries to trim the cache for each RPC and that slows the server right down. I suspect it is the cached entries from dismounted clients that are filling up the cache (you did mention clients using amd at some point in the discussion, which implies frequent mounts/dismounts). I'm guessing that the tcp cache timeout needs to be made a lot smaller for your case. > > For either A or B, I'd suggest that you disable the DRC for TCP > > connections > > (email if you need a patch for that), which will have a couple of > > effects: > > I would like to see your patch, since it's more likely to be correct > than one I might dream up. > > The alternative solution is twofold: first, nfsrv_trimcache() needs to > do something to ensure forward progress, even when that means dropping > something that hasn't timed out yet, and second, the server code needs > to ensure that nfsrv_trimcache() is only executing on one thread at a > time. An easy way to do the first part would be to maintain an LRU > queue for TCP in addition to the UDP LRU, and just blow away the first > N (>NCPU) entries on the queue if, after checking all the TCP replies, > the DRC is still larger than the limit. The second part is just an > atomic_cmpset_int(). > I've attached a patch that has assorted changes. I didn't use an LRU list, since that results in a single mutex to contend on, but I added a second pass to the nfsrc_trimcache() function that frees old entries. (Approximate LRU, using a histogram of timeout values to select a timeout value that frees enough of the oldest ones.) Basically, this patch: - allows setting of the tcp timeout via vfs.nfsd.tcpcachetimeo (I'd suggest you go down to a few minutes instead of 12hrs) - allows TCP caching to be disabled by setting vfs.nfsd.cachetcp=0 - does the above 2 things you describe to try and avoid the livelock, although not quite using an lru list - increases the hash table size to 500 (still a compile time setting) (feel free to make it even bigger) - sets nfsrc_floodlevel to at least nfsrc_tcphighwater, so you can grow vfs.nfsd.tcphighwater as big as you dare The patch includes a lot of drc2.patch and drc3.patch, so don't try and apply it to a patched kernel. Hopefully it will apply cleanly to vanilla sources. Tha patch has been minimally tested. If you'd rather not apply the patch, you can change NFSRVCACHE_TCPTIMEOUT and set the variable nfsrc_tcpidempotent == 0 to get a couple of the changes. (You'll have to recompile the kernel for these changes to take effect.) Good luck with it, rick > -GAWollman > _______________________________________________ > freebsd-net@freebsd.org mailing list > http://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" ------=_Part_3844452_1526038691.1363146480611 Content-Type: text/x-patch; name=drc4.patch Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename=drc4.patch LS0tIGZzL25mc3NlcnZlci9uZnNfbmZzZGNhY2hlLmMub3JpZwkyMDEzLTAxLTA3IDA5OjA0OjEz LjAwMDAwMDAwMCAtMDUwMAorKysgZnMvbmZzc2VydmVyL25mc19uZnNkY2FjaGUuYwkyMDEzLTAz LTEyIDIyOjQyOjA1LjAwMDAwMDAwMCAtMDQwMApAQCAtMTYwLDEyICsxNjAsMzEgQEAgX19GQlNE SUQoIiRGcmVlQlNEOiBwcm9qZWN0cy9uZnN2NC1wYWNrcgogI2luY2x1ZGUgPGZzL25mcy9uZnNw b3J0Lmg+CiAKIGV4dGVybiBzdHJ1Y3QgbmZzc3RhdHMgbmV3bmZzc3RhdHM7Ci1ORlNDQUNIRU1V VEVYOworZXh0ZXJuIHN0cnVjdCBtdHggbmZzcmNfdGNwbXR4W05GU1JWQ0FDSEVfSEFTSFNJWkVd OworZXh0ZXJuIHN0cnVjdCBtdHggbmZzcmNfdWRwbXR4OwogaW50IG5mc3JjX2Zsb29kbGV2ZWwg PSBORlNSVkNBQ0hFX0ZMT09ETEVWRUwsIG5mc3JjX3RjcHNhdmVkcmVwbGllcyA9IDA7CiAjZW5k aWYJLyogIUFQUExFS0VYVCAqLwogCi1zdGF0aWMgaW50IG5mc3JjX3RjcG5vbmlkZW1wb3RlbnQg PSAxOwotc3RhdGljIGludCBuZnNyY191ZHBoaWdod2F0ZXIgPSBORlNSVkNBQ0hFX1VEUEhJR0hX QVRFUiwgbmZzcmNfdWRwY2FjaGVzaXplID0gMDsKK1NZU0NUTF9ERUNMKF92ZnNfbmZzZCk7CisK K3N0YXRpYyB1X2ludAluZnNyY190Y3BoaWdod2F0ZXIgPSAwOworU1lTQ1RMX1VJTlQoX3Zmc19u ZnNkLCBPSURfQVVUTywgdGNwaGlnaHdhdGVyLCBDVExGTEFHX1JXLAorICAgICZuZnNyY190Y3Bo aWdod2F0ZXIsIDAsCisgICAgIkhpZ2ggd2F0ZXIgbWFyayBmb3IgVENQIGNhY2hlIGVudHJpZXMi KTsKK3N0YXRpYyB1X2ludAluZnNyY191ZHBoaWdod2F0ZXIgPSBORlNSVkNBQ0hFX1VEUEhJR0hX QVRFUjsKK1NZU0NUTF9VSU5UKF92ZnNfbmZzZCwgT0lEX0FVVE8sIHVkcGhpZ2h3YXRlciwgQ1RM RkxBR19SVywKKyAgICAmbmZzcmNfdWRwaGlnaHdhdGVyLCAwLAorICAgICJIaWdoIHdhdGVyIG1h cmsgZm9yIFVEUCBjYWNoZSBlbnRyaWVzIik7CitzdGF0aWMgdV9pbnQJbmZzcmNfdGNwdGltZW91 dCA9IE5GU1JWQ0FDSEVfVENQVElNRU9VVDsKK1NZU0NUTF9VSU5UKF92ZnNfbmZzZCwgT0lEX0FV VE8sIHRjcGNhY2hldGltZW8sIENUTEZMQUdfUlcsCisgICAgJm5mc3JjX3RjcHRpbWVvdXQsIDAs CisgICAgIlRpbWVvdXQgZm9yIFRDUCBlbnRyaWVzIGluIHRoZSBEUkMiKTsKK3N0YXRpYyB1X2lu dCBuZnNyY190Y3Bub25pZGVtcG90ZW50ID0gMTsKK1NZU0NUTF9VSU5UKF92ZnNfbmZzZCwgT0lE X0FVVE8sIGNhY2hldGNwLCBDVExGTEFHX1JXLAorICAgICZuZnNyY190Y3Bub25pZGVtcG90ZW50 LCAwLAorICAgICJFbmFibGUgdGhlIERSQyBmb3IgTkZTIG92ZXIgVENQIik7CisKK3N0YXRpYyBp bnQgbmZzcmNfdWRwY2FjaGVzaXplID0gMDsKIHN0YXRpYyBUQUlMUV9IRUFEKCwgbmZzcnZjYWNo ZSkgbmZzcnZ1ZHBscnU7CiBzdGF0aWMgc3RydWN0IG5mc3J2aGFzaGhlYWQgbmZzcnZoYXNodGJs W05GU1JWQ0FDSEVfSEFTSFNJWkVdLAogICAgIG5mc3J2dWRwaGFzaHRibFtORlNSVkNBQ0hFX0hB U0hTSVpFXTsKQEAgLTE5NywxMCArMjE2LDExIEBAIHN0YXRpYyBpbnQgbmV3bmZzdjJfcHJvY2lk W05GU19WM05QUk9DU10KIAlORlNWMlBST0NfTk9PUCwKIH07CiAKKyNkZWZpbmUJbmZzcmNfaGFz aCh4aWQpCSgoKHhpZCkgKyAoKHhpZCkgPj4gMjQpKSAlIE5GU1JWQ0FDSEVfSEFTSFNJWkUpCiAj ZGVmaW5lCU5GU1JDVURQSEFTSCh4aWQpIFwKLQkoJm5mc3J2dWRwaGFzaHRibFsoKHhpZCkgKyAo KHhpZCkgPj4gMjQpKSAlIE5GU1JWQ0FDSEVfSEFTSFNJWkVdKQorCSgmbmZzcnZ1ZHBoYXNodGJs W25mc3JjX2hhc2goeGlkKV0pCiAjZGVmaW5lCU5GU1JDSEFTSCh4aWQpIFwKLQkoJm5mc3J2aGFz aHRibFsoKHhpZCkgKyAoKHhpZCkgPj4gMjQpKSAlIE5GU1JWQ0FDSEVfSEFTSFNJWkVdKQorCSgm bmZzcnZoYXNodGJsW25mc3JjX2hhc2goeGlkKV0pCiAjZGVmaW5lCVRSVUUJMQogI2RlZmluZQlG QUxTRQkwCiAjZGVmaW5lCU5GU1JWQ0FDSEVfQ0hFQ0tMRU4JMTAwCkBAIC0yNTEsNiArMjcxLDE4 IEBAIHN0YXRpYyBpbnQgbmZzcmNfZ2V0bGVuYW5kY2tzdW0obWJ1Zl90IG0KIHN0YXRpYyB2b2lk IG5mc3JjX21hcmtzYW1ldGNwY29ubih1X2ludDY0X3QpOwogCiAvKgorICogUmV0dXJuIHRoZSBj b3JyZWN0IG11dGV4IGZvciB0aGlzIGNhY2hlIGVudHJ5LgorICovCitzdGF0aWMgX19pbmxpbmUg c3RydWN0IG10eCAqCituZnNyY19jYWNoZW11dGV4KHN0cnVjdCBuZnNydmNhY2hlICpycCkKK3sK KworCWlmICgocnAtPnJjX2ZsYWcgJiBSQ19VRFApICE9IDApCisJCXJldHVybiAoJm5mc3JjX3Vk cG10eCk7CisJcmV0dXJuICgmbmZzcmNfdGNwbXR4W25mc3JjX2hhc2gocnAtPnJjX3hpZCldKTsK K30KKworLyoKICAqIEluaXRpYWxpemUgdGhlIHNlcnZlciByZXF1ZXN0IGNhY2hlIGxpc3QKICAq LwogQVBQTEVTVEFUSUMgdm9pZApAQCAtMzI1LDEwICszNTcsMTIgQEAgbmZzcmNfZ2V0dWRwKHN0 cnVjdCBuZnNydl9kZXNjcmlwdCAqbmQsIAogCXN0cnVjdCBzb2NrYWRkcl9pbjYgKnNhZGRyNjsK IAlzdHJ1Y3QgbmZzcnZoYXNoaGVhZCAqaHA7CiAJaW50IHJldCA9IDA7CisJc3RydWN0IG10eCAq bXV0ZXg7CiAKKwltdXRleCA9IG5mc3JjX2NhY2hlbXV0ZXgobmV3cnApOwogCWhwID0gTkZTUkNV RFBIQVNIKG5ld3JwLT5yY194aWQpOwogbG9vcDoKLQlORlNMT0NLQ0FDSEUoKTsKKwltdHhfbG9j ayhtdXRleCk7CiAJTElTVF9GT1JFQUNIKHJwLCBocCwgcmNfaGFzaCkgewogCSAgICBpZiAobmV3 cnAtPnJjX3hpZCA9PSBycC0+cmNfeGlkICYmCiAJCW5ld3JwLT5yY19wcm9jID09IHJwLT5yY19w cm9jICYmCkBAIC0zMzYsOCArMzcwLDggQEAgbG9vcDoKIAkJbmZzYWRkcl9tYXRjaChORVRGQU1J TFkocnApLCAmcnAtPnJjX2hhZGRyLCBuZC0+bmRfbmFtKSkgewogCQkJaWYgKChycC0+cmNfZmxh ZyAmIFJDX0xPQ0tFRCkgIT0gMCkgewogCQkJCXJwLT5yY19mbGFnIHw9IFJDX1dBTlRFRDsKLQkJ CQkodm9pZCltdHhfc2xlZXAocnAsIE5GU0NBQ0hFTVVURVhQVFIsCi0JCQkJICAgIChQWkVSTyAt IDEpIHwgUERST1AsICJuZnNyYyIsIDEwICogaHopOworCQkJCSh2b2lkKW10eF9zbGVlcChycCwg bXV0ZXgsIChQWkVSTyAtIDEpIHwgUERST1AsCisJCQkJICAgICJuZnNyYyIsIDEwICogaHopOwog CQkJCWdvdG8gbG9vcDsKIAkJCX0KIAkJCWlmIChycC0+cmNfZmxhZyA9PSAwKQpAQCAtMzQ3LDE0 ICszODEsMTQgQEAgbG9vcDoKIAkJCVRBSUxRX0lOU0VSVF9UQUlMKCZuZnNydnVkcGxydSwgcnAs IHJjX2xydSk7CiAJCQlpZiAocnAtPnJjX2ZsYWcgJiBSQ19JTlBST0cpIHsKIAkJCQluZXduZnNz dGF0cy5zcnZjYWNoZV9pbnByb2doaXRzKys7Ci0JCQkJTkZTVU5MT0NLQ0FDSEUoKTsKKwkJCQlt dHhfdW5sb2NrKG11dGV4KTsKIAkJCQlyZXQgPSBSQ19EUk9QSVQ7CiAJCQl9IGVsc2UgaWYgKHJw LT5yY19mbGFnICYgUkNfUkVQU1RBVFVTKSB7CiAJCQkJLyoKIAkJCQkgKiBWMiBvbmx5LgogCQkJ CSAqLwogCQkJCW5ld25mc3N0YXRzLnNydmNhY2hlX25vbmlkZW1kb25laGl0cysrOwotCQkJCU5G U1VOTE9DS0NBQ0hFKCk7CisJCQkJbXR4X3VubG9jayhtdXRleCk7CiAJCQkJbmZzcnZkX3JlcGhl YWQobmQpOwogCQkJCSoobmQtPm5kX2VycnApID0gcnAtPnJjX3N0YXR1czsKIAkJCQlyZXQgPSBS Q19SRVBMWTsKQEAgLTM2Miw3ICszOTYsNyBAQCBsb29wOgogCQkJCQlORlNSVkNBQ0hFX1VEUFRJ TUVPVVQ7CiAJCQl9IGVsc2UgaWYgKHJwLT5yY19mbGFnICYgUkNfUkVQTUJVRikgewogCQkJCW5l d25mc3N0YXRzLnNydmNhY2hlX25vbmlkZW1kb25laGl0cysrOwotCQkJCU5GU1VOTE9DS0NBQ0hF KCk7CisJCQkJbXR4X3VubG9jayhtdXRleCk7CiAJCQkJbmQtPm5kX21yZXEgPSBtX2NvcHltKHJw LT5yY19yZXBseSwgMCwKIAkJCQkJTV9DT1BZQUxMLCBNX1dBSVRPSyk7CiAJCQkJcmV0ID0gUkNf UkVQTFk7CkBAIC0zOTIsNyArNDI2LDcgQEAgbG9vcDoKIAl9CiAJTElTVF9JTlNFUlRfSEVBRCho cCwgbmV3cnAsIHJjX2hhc2gpOwogCVRBSUxRX0lOU0VSVF9UQUlMKCZuZnNydnVkcGxydSwgbmV3 cnAsIHJjX2xydSk7Ci0JTkZTVU5MT0NLQ0FDSEUoKTsKKwltdHhfdW5sb2NrKG11dGV4KTsKIAlu ZC0+bmRfcnAgPSBuZXdycDsKIAlyZXQgPSBSQ19ET0lUOwogCkBAIC00MTAsMTIgKzQ0NCwxNiBA QCBuZnNydmRfdXBkYXRlY2FjaGUoc3RydWN0IG5mc3J2X2Rlc2NyaXB0CiAJc3RydWN0IG5mc3J2 Y2FjaGUgKnJwOwogCXN0cnVjdCBuZnNydmNhY2hlICpyZXRycCA9IE5VTEw7CiAJbWJ1Zl90IG07 CisJc3RydWN0IG10eCAqbXV0ZXg7CiAKKwlpZiAobmZzcmNfdGNwaGlnaHdhdGVyID4gbmZzcmNf Zmxvb2RsZXZlbCkKKwkJbmZzcmNfZmxvb2RsZXZlbCA9IG5mc3JjX3RjcGhpZ2h3YXRlcjsKIAly cCA9IG5kLT5uZF9ycDsKIAlpZiAoIXJwKQogCQlwYW5pYygibmZzcnZkX3VwZGF0ZWNhY2hlIG51 bGwgcnAiKTsKIAluZC0+bmRfcnAgPSBOVUxMOwotCU5GU0xPQ0tDQUNIRSgpOworCW11dGV4ID0g bmZzcmNfY2FjaGVtdXRleChycCk7CisJbXR4X2xvY2sobXV0ZXgpOwogCW5mc3JjX2xvY2socnAp OwogCWlmICghKHJwLT5yY19mbGFnICYgUkNfSU5QUk9HKSkKIAkJcGFuaWMoIm5mc3J2ZF91cGRh dGVjYWNoZSBub3QgaW5wcm9nIik7CkBAIC00MzAsNyArNDY4LDcgQEAgbmZzcnZkX3VwZGF0ZWNh Y2hlKHN0cnVjdCBuZnNydl9kZXNjcmlwdAogCSAqLwogCWlmIChuZC0+bmRfcmVwc3RhdCA9PSBO RlNFUlJfUkVQTFlGUk9NQ0FDSEUpIHsKIAkJbmV3bmZzc3RhdHMuc3J2Y2FjaGVfbm9uaWRlbWRv bmVoaXRzKys7Ci0JCU5GU1VOTE9DS0NBQ0hFKCk7CisJCW10eF91bmxvY2sobXV0ZXgpOwogCQlu ZC0+bmRfcmVwc3RhdCA9IDA7CiAJCWlmIChuZC0+bmRfbXJlcSkKIAkJCW1idWZfZnJlZW0obmQt Pm5kX21yZXEpOwpAQCAtNDM4LDcgKzQ3Niw3IEBAIG5mc3J2ZF91cGRhdGVjYWNoZShzdHJ1Y3Qg bmZzcnZfZGVzY3JpcHQKIAkJCXBhbmljKCJyZXBseSBmcm9tIGNhY2hlIik7CiAJCW5kLT5uZF9t cmVxID0gbV9jb3B5bShycC0+cmNfcmVwbHksIDAsCiAJCSAgICBNX0NPUFlBTEwsIE1fV0FJVE9L KTsKLQkJcnAtPnJjX3RpbWVzdGFtcCA9IE5GU0RfTU9OT1NFQyArIE5GU1JWQ0FDSEVfVENQVElN RU9VVDsKKwkJcnAtPnJjX3RpbWVzdGFtcCA9IE5GU0RfTU9OT1NFQyArIG5mc3JjX3RjcHRpbWVv dXQ7CiAJCW5mc3JjX3VubG9jayhycCk7CiAJCWdvdG8gb3V0OwogCX0KQEAgLTQ2MywyMSArNTAx LDIxIEBAIG5mc3J2ZF91cGRhdGVjYWNoZShzdHJ1Y3QgbmZzcnZfZGVzY3JpcHQKIAkJICAgIG5m c3YyX3JlcHN0YXRbbmV3bmZzdjJfcHJvY2lkW25kLT5uZF9wcm9jbnVtXV0pIHsKIAkJCXJwLT5y Y19zdGF0dXMgPSBuZC0+bmRfcmVwc3RhdDsKIAkJCXJwLT5yY19mbGFnIHw9IFJDX1JFUFNUQVRV UzsKLQkJCU5GU1VOTE9DS0NBQ0hFKCk7CisJCQltdHhfdW5sb2NrKG11dGV4KTsKIAkJfSBlbHNl IHsKIAkJCWlmICghKHJwLT5yY19mbGFnICYgUkNfVURQKSkgewotCQkJICAgIG5mc3JjX3RjcHNh dmVkcmVwbGllcysrOworCQkJICAgIGF0b21pY19hZGRfaW50KCZuZnNyY190Y3BzYXZlZHJlcGxp ZXMsIDEpOwogCQkJICAgIGlmIChuZnNyY190Y3BzYXZlZHJlcGxpZXMgPgogCQkJCW5ld25mc3N0 YXRzLnNydmNhY2hlX3RjcHBlYWspCiAJCQkJbmV3bmZzc3RhdHMuc3J2Y2FjaGVfdGNwcGVhayA9 CiAJCQkJICAgIG5mc3JjX3RjcHNhdmVkcmVwbGllczsKIAkJCX0KLQkJCU5GU1VOTE9DS0NBQ0hF KCk7Ci0JCQltID0gbV9jb3B5bShuZC0+bmRfbXJlcSwgMCwgTV9DT1BZQUxMLCBNX1dBSVRPSyk7 Ci0JCQlORlNMT0NLQ0FDSEUoKTsKKwkJCW10eF91bmxvY2sobXV0ZXgpOworCQkJbSA9IG1fY29w eW0obmQtPm5kX21yZXEsIDAsIE1fQ09QWUFMTCwgTV9XQUlUKTsKKwkJCW10eF9sb2NrKG11dGV4 KTsKIAkJCXJwLT5yY19yZXBseSA9IG07CiAJCQlycC0+cmNfZmxhZyB8PSBSQ19SRVBNQlVGOwot CQkJTkZTVU5MT0NLQ0FDSEUoKTsKKwkJCW10eF91bmxvY2sobXV0ZXgpOwogCQl9CiAJCWlmIChy cC0+cmNfZmxhZyAmIFJDX1VEUCkgewogCQkJcnAtPnJjX3RpbWVzdGFtcCA9IE5GU0RfTU9OT1NF QyArCkBAIC00ODUsNyArNTIzLDcgQEAgbmZzcnZkX3VwZGF0ZWNhY2hlKHN0cnVjdCBuZnNydl9k ZXNjcmlwdAogCQkJbmZzcmNfdW5sb2NrKHJwKTsKIAkJfSBlbHNlIHsKIAkJCXJwLT5yY190aW1l c3RhbXAgPSBORlNEX01PTk9TRUMgKwotCQkJICAgIE5GU1JWQ0FDSEVfVENQVElNRU9VVDsKKwkJ CSAgICBuZnNyY190Y3B0aW1lb3V0OwogCQkJaWYgKHJwLT5yY19yZWZjbnQgPiAwKQogCQkJCW5m c3JjX3VubG9jayhycCk7CiAJCQllbHNlCkBAIC00OTMsNyArNTMxLDcgQEAgbmZzcnZkX3VwZGF0 ZWNhY2hlKHN0cnVjdCBuZnNydl9kZXNjcmlwdAogCQl9CiAJfSBlbHNlIHsKIAkJbmZzcmNfZnJl ZWNhY2hlKHJwKTsKLQkJTkZTVU5MT0NLQ0FDSEUoKTsKKwkJbXR4X3VubG9jayhtdXRleCk7CiAJ fQogCiBvdXQ6CkBAIC01MDksMTQgKzU0NywxNiBAQCBvdXQ6CiBBUFBMRVNUQVRJQyB2b2lkCiBu ZnNydmRfZGVsY2FjaGUoc3RydWN0IG5mc3J2Y2FjaGUgKnJwKQogeworCXN0cnVjdCBtdHggKm11 dGV4OwogCisJbXV0ZXggPSBuZnNyY19jYWNoZW11dGV4KHJwKTsKIAlpZiAoIShycC0+cmNfZmxh ZyAmIFJDX0lOUFJPRykpCiAJCXBhbmljKCJuZnNydmRfZGVsY2FjaGUgbm90IGluIHByb2ciKTsK LQlORlNMT0NLQ0FDSEUoKTsKKwltdHhfbG9jayhtdXRleCk7CiAJcnAtPnJjX2ZsYWcgJj0gflJD X0lOUFJPRzsKIAlpZiAocnAtPnJjX3JlZmNudCA9PSAwICYmICEocnAtPnJjX2ZsYWcgJiBSQ19M T0NLRUQpKQogCQluZnNyY19mcmVlY2FjaGUocnApOwotCU5GU1VOTE9DS0NBQ0hFKCk7CisJbXR4 X3VubG9jayhtdXRleCk7CiB9CiAKIC8qCkBAIC01MjgsNyArNTY4LDkgQEAgQVBQTEVTVEFUSUMg dm9pZAogbmZzcnZkX3NlbnRjYWNoZShzdHJ1Y3QgbmZzcnZjYWNoZSAqcnAsIHN0cnVjdCBzb2Nr ZXQgKnNvLCBpbnQgZXJyKQogewogCXRjcF9zZXEgdG1wX3NlcTsKKwlzdHJ1Y3QgbXR4ICptdXRl eDsKIAorCW11dGV4ID0gbmZzcmNfY2FjaGVtdXRleChycCk7CiAJaWYgKCEocnAtPnJjX2ZsYWcg JiBSQ19MT0NLRUQpKQogCQlwYW5pYygibmZzcnZkX3NlbnRjYWNoZSBub3QgbG9ja2VkIik7CiAJ aWYgKCFlcnIpIHsKQEAgLTUzNywxMCArNTc5LDEwIEBAIG5mc3J2ZF9zZW50Y2FjaGUoc3RydWN0 IG5mc3J2Y2FjaGUgKnJwLCAKIAkJICAgICBzby0+c29fcHJvdG8tPnByX3Byb3RvY29sICE9IElQ UFJPVE9fVENQKQogCQkJcGFuaWMoIm5mcyBzZW50IGNhY2hlIik7CiAJCWlmIChuZnNydl9nZXRz b2Nrc2VxbnVtKHNvLCAmdG1wX3NlcSkpIHsKLQkJCU5GU0xPQ0tDQUNIRSgpOworCQkJbXR4X2xv Y2sobXV0ZXgpOwogCQkJcnAtPnJjX3RjcHNlcSA9IHRtcF9zZXE7CiAJCQlycC0+cmNfZmxhZyB8 PSBSQ19UQ1BTRVE7Ci0JCQlORlNVTkxPQ0tDQUNIRSgpOworCQkJbXR4X3VubG9jayhtdXRleCk7 CiAJCX0KIAl9CiAJbmZzcmNfdW5sb2NrKHJwKTsKQEAgLTU1OSwxMSArNjAxLDEzIEBAIG5mc3Jj X2dldHRjcChzdHJ1Y3QgbmZzcnZfZGVzY3JpcHQgKm5kLCAKIAlzdHJ1Y3QgbmZzcnZjYWNoZSAq aGl0cnA7CiAJc3RydWN0IG5mc3J2aGFzaGhlYWQgKmhwLCBuZnNyY190ZW1wbGlzdDsKIAlpbnQg aGl0LCByZXQgPSAwOworCXN0cnVjdCBtdHggKm11dGV4OwogCisJbXV0ZXggPSBuZnNyY19jYWNo ZW11dGV4KG5ld3JwKTsKIAlocCA9IE5GU1JDSEFTSChuZXdycC0+cmNfeGlkKTsKIAluZXdycC0+ cmNfcmVxbGVuID0gbmZzcmNfZ2V0bGVuYW5kY2tzdW0obmQtPm5kX21yZXAsICZuZXdycC0+cmNf Y2tzdW0pOwogdHJ5YWdhaW46Ci0JTkZTTE9DS0NBQ0hFKCk7CisJbXR4X2xvY2sobXV0ZXgpOwog CWhpdCA9IDE7CiAJTElTVF9JTklUKCZuZnNyY190ZW1wbGlzdCk7CiAJLyoKQEAgLTYyMSw4ICs2 NjUsOCBAQCB0cnlhZ2FpbjoKIAkJcnAgPSBoaXRycDsKIAkJaWYgKChycC0+cmNfZmxhZyAmIFJD X0xPQ0tFRCkgIT0gMCkgewogCQkJcnAtPnJjX2ZsYWcgfD0gUkNfV0FOVEVEOwotCQkJKHZvaWQp bXR4X3NsZWVwKHJwLCBORlNDQUNIRU1VVEVYUFRSLAotCQkJICAgIChQWkVSTyAtIDEpIHwgUERS T1AsICJuZnNyYyIsIDEwICogaHopOworCQkJKHZvaWQpbXR4X3NsZWVwKHJwLCBtdXRleCwgKFBa RVJPIC0gMSkgfCBQRFJPUCwKKwkJCSAgICAibmZzcmMiLCAxMCAqIGh6KTsKIAkJCWdvdG8gdHJ5 YWdhaW47CiAJCX0KIAkJaWYgKHJwLT5yY19mbGFnID09IDApCkBAIC02MzAsNyArNjc0LDcgQEAg dHJ5YWdhaW46CiAJCXJwLT5yY19mbGFnIHw9IFJDX0xPQ0tFRDsKIAkJaWYgKHJwLT5yY19mbGFn ICYgUkNfSU5QUk9HKSB7CiAJCQluZXduZnNzdGF0cy5zcnZjYWNoZV9pbnByb2doaXRzKys7Ci0J CQlORlNVTkxPQ0tDQUNIRSgpOworCQkJbXR4X3VubG9jayhtdXRleCk7CiAJCQlpZiAobmV3cnAt PnJjX3NvY2tyZWYgPT0gcnAtPnJjX3NvY2tyZWYpCiAJCQkJbmZzcmNfbWFya3NhbWV0Y3Bjb25u KHJwLT5yY19zb2NrcmVmKTsKIAkJCXJldCA9IFJDX0RST1BJVDsKQEAgLTYzOSwyNCArNjgzLDI0 IEBAIHRyeWFnYWluOgogCQkJICogVjIgb25seS4KIAkJCSAqLwogCQkJbmV3bmZzc3RhdHMuc3J2 Y2FjaGVfbm9uaWRlbWRvbmVoaXRzKys7Ci0JCQlORlNVTkxPQ0tDQUNIRSgpOworCQkJbXR4X3Vu bG9jayhtdXRleCk7CiAJCQlpZiAobmV3cnAtPnJjX3NvY2tyZWYgPT0gcnAtPnJjX3NvY2tyZWYp CiAJCQkJbmZzcmNfbWFya3NhbWV0Y3Bjb25uKHJwLT5yY19zb2NrcmVmKTsKIAkJCXJldCA9IFJD X1JFUExZOwogCQkJbmZzcnZkX3JlcGhlYWQobmQpOwogCQkJKihuZC0+bmRfZXJycCkgPSBycC0+ cmNfc3RhdHVzOwogCQkJcnAtPnJjX3RpbWVzdGFtcCA9IE5GU0RfTU9OT1NFQyArCi0JCQkJTkZT UlZDQUNIRV9UQ1BUSU1FT1VUOworCQkJCW5mc3JjX3RjcHRpbWVvdXQ7CiAJCX0gZWxzZSBpZiAo cnAtPnJjX2ZsYWcgJiBSQ19SRVBNQlVGKSB7CiAJCQluZXduZnNzdGF0cy5zcnZjYWNoZV9ub25p ZGVtZG9uZWhpdHMrKzsKLQkJCU5GU1VOTE9DS0NBQ0hFKCk7CisJCQltdHhfdW5sb2NrKG11dGV4 KTsKIAkJCWlmIChuZXdycC0+cmNfc29ja3JlZiA9PSBycC0+cmNfc29ja3JlZikKIAkJCQluZnNy Y19tYXJrc2FtZXRjcGNvbm4ocnAtPnJjX3NvY2tyZWYpOwogCQkJcmV0ID0gUkNfUkVQTFk7CiAJ CQluZC0+bmRfbXJlcSA9IG1fY29weW0ocnAtPnJjX3JlcGx5LCAwLAogCQkJCU1fQ09QWUFMTCwg TV9XQUlUT0spOwogCQkJcnAtPnJjX3RpbWVzdGFtcCA9IE5GU0RfTU9OT1NFQyArCi0JCQkJTkZT UlZDQUNIRV9UQ1BUSU1FT1VUOworCQkJCW5mc3JjX3RjcHRpbWVvdXQ7CiAJCX0gZWxzZSB7CiAJ CQlwYW5pYygibmZzIHRjcCBjYWNoZTEiKTsKIAkJfQpAQCAtNjc0LDcgKzcxOCw3IEBAIHRyeWFn YWluOgogCW5ld3JwLT5yY19jYWNoZXRpbWUgPSBORlNEX01PTk9TRUM7CiAJbmV3cnAtPnJjX2Zs YWcgfD0gUkNfSU5QUk9HOwogCUxJU1RfSU5TRVJUX0hFQUQoaHAsIG5ld3JwLCByY19oYXNoKTsK LQlORlNVTkxPQ0tDQUNIRSgpOworCW10eF91bmxvY2sobXV0ZXgpOwogCW5kLT5uZF9ycCA9IG5l d3JwOwogCXJldCA9IFJDX0RPSVQ7CiAKQEAgLTY4NSwxNiArNzI5LDE3IEBAIG91dDoKIAogLyoK ICAqIExvY2sgYSBjYWNoZSBlbnRyeS4KLSAqIEFsc28gcHV0cyBhIG11dGV4IGxvY2sgb24gdGhl IGNhY2hlIGxpc3QuCiAgKi8KIHN0YXRpYyB2b2lkCiBuZnNyY19sb2NrKHN0cnVjdCBuZnNydmNh Y2hlICpycCkKIHsKLQlORlNDQUNIRUxPQ0tSRVFVSVJFRCgpOworCXN0cnVjdCBtdHggKm11dGV4 OworCisJbXV0ZXggPSBuZnNyY19jYWNoZW11dGV4KHJwKTsKKwltdHhfYXNzZXJ0KG11dGV4LCBN QV9PV05FRCk7CiAJd2hpbGUgKChycC0+cmNfZmxhZyAmIFJDX0xPQ0tFRCkgIT0gMCkgewogCQly cC0+cmNfZmxhZyB8PSBSQ19XQU5URUQ7Ci0JCSh2b2lkKW10eF9zbGVlcChycCwgTkZTQ0FDSEVN VVRFWFBUUiwgUFpFUk8gLSAxLAotCQkgICAgIm5mc3JjIiwgMCk7CisJCSh2b2lkKW10eF9zbGVl cChycCwgbXV0ZXgsIFBaRVJPIC0gMSwgIm5mc3JjIiwgMCk7CiAJfQogCXJwLT5yY19mbGFnIHw9 IFJDX0xPQ0tFRDsKIH0KQEAgLTcwNSwxMSArNzUwLDEzIEBAIG5mc3JjX2xvY2soc3RydWN0IG5m c3J2Y2FjaGUgKnJwKQogc3RhdGljIHZvaWQKIG5mc3JjX3VubG9jayhzdHJ1Y3QgbmZzcnZjYWNo ZSAqcnApCiB7CisJc3RydWN0IG10eCAqbXV0ZXg7CiAKLQlORlNMT0NLQ0FDSEUoKTsKKwltdXRl eCA9IG5mc3JjX2NhY2hlbXV0ZXgocnApOworCW10eF9sb2NrKG11dGV4KTsKIAlycC0+cmNfZmxh ZyAmPSB+UkNfTE9DS0VEOwogCW5mc3JjX3dhbnRlZChycCk7Ci0JTkZTVU5MT0NLQ0FDSEUoKTsK KwltdHhfdW5sb2NrKG11dGV4KTsKIH0KIAogLyoKQEAgLTczMiw3ICs3NzksNiBAQCBzdGF0aWMg dm9pZAogbmZzcmNfZnJlZWNhY2hlKHN0cnVjdCBuZnNydmNhY2hlICpycCkKIHsKIAotCU5GU0NB Q0hFTE9DS1JFUVVJUkVEKCk7CiAJTElTVF9SRU1PVkUocnAsIHJjX2hhc2gpOwogCWlmIChycC0+ cmNfZmxhZyAmIFJDX1VEUCkgewogCQlUQUlMUV9SRU1PVkUoJm5mc3J2dWRwbHJ1LCBycCwgcmNf bHJ1KTsKQEAgLTc0Miw3ICs3ODgsNyBAQCBuZnNyY19mcmVlY2FjaGUoc3RydWN0IG5mc3J2Y2Fj aGUgKnJwKQogCWlmIChycC0+cmNfZmxhZyAmIFJDX1JFUE1CVUYpIHsKIAkJbWJ1Zl9mcmVlbShy cC0+cmNfcmVwbHkpOwogCQlpZiAoIShycC0+cmNfZmxhZyAmIFJDX1VEUCkpCi0JCQluZnNyY190 Y3BzYXZlZHJlcGxpZXMtLTsKKwkJCWF0b21pY19hZGRfaW50KCZuZnNyY190Y3BzYXZlZHJlcGxp ZXMsIC0xKTsKIAl9CiAJRlJFRSgoY2FkZHJfdClycCwgTV9ORlNSVkNBQ0hFKTsKIAluZXduZnNz dGF0cy5zcnZjYWNoZV9zaXplLS07CkBAIC03NTcsMjAgKzgwMywyMiBAQCBuZnNydmRfY2xlYW5j YWNoZSh2b2lkKQogCXN0cnVjdCBuZnNydmNhY2hlICpycCwgKm5leHRycDsKIAlpbnQgaTsKIAot CU5GU0xPQ0tDQUNIRSgpOwogCWZvciAoaSA9IDA7IGkgPCBORlNSVkNBQ0hFX0hBU0hTSVpFOyBp KyspIHsKKwkJbXR4X2xvY2soJm5mc3JjX3RjcG10eFtpXSk7CiAJCUxJU1RfRk9SRUFDSF9TQUZF KHJwLCAmbmZzcnZoYXNodGJsW2ldLCByY19oYXNoLCBuZXh0cnApIHsKIAkJCW5mc3JjX2ZyZWVj YWNoZShycCk7CiAJCX0KKwkJbXR4X3VubG9jaygmbmZzcmNfdGNwbXR4W2ldKTsKIAl9CisJbXR4 X2xvY2soJm5mc3JjX3VkcG10eCk7CiAJZm9yIChpID0gMDsgaSA8IE5GU1JWQ0FDSEVfSEFTSFNJ WkU7IGkrKykgewogCQlMSVNUX0ZPUkVBQ0hfU0FGRShycCwgJm5mc3J2dWRwaGFzaHRibFtpXSwg cmNfaGFzaCwgbmV4dHJwKSB7CiAJCQluZnNyY19mcmVlY2FjaGUocnApOwogCQl9CiAJfQogCW5l d25mc3N0YXRzLnNydmNhY2hlX3NpemUgPSAwOworCW10eF91bmxvY2soJm5mc3JjX3VkcG10eCk7 CiAJbmZzcmNfdGNwc2F2ZWRyZXBsaWVzID0gMDsKLQlORlNVTkxPQ0tDQUNIRSgpOwogfQogCiAv KgpAQCAtNzgwLDI4ICs4MjgsOTcgQEAgc3RhdGljIHZvaWQKIG5mc3JjX3RyaW1jYWNoZSh1X2lu dDY0X3Qgc29ja3JlZiwgc3RydWN0IHNvY2tldCAqc28pCiB7CiAJc3RydWN0IG5mc3J2Y2FjaGUg KnJwLCAqbmV4dHJwOwotCWludCBpOworCWludCBpLCBqLCBrLCB0aW1lX2hpc3RvWzEwXTsKKwl0 aW1lX3QgdGhpc3N0YW1wOworCXN0YXRpYyB0aW1lX3QgdWRwX2xhc3R0cmltID0gMCwgdGNwX2xh c3R0cmltID0gMDsKKwlzdGF0aWMgaW50IG9uZXRocmVhZCA9IDA7CiAKLQlORlNMT0NLQ0FDSEUo KTsKLQlUQUlMUV9GT1JFQUNIX1NBRkUocnAsICZuZnNydnVkcGxydSwgcmNfbHJ1LCBuZXh0cnAp IHsKLQkJaWYgKCEocnAtPnJjX2ZsYWcgJiAoUkNfSU5QUk9HfFJDX0xPQ0tFRHxSQ19XQU5URUQp KQotCQkgICAgICYmIHJwLT5yY19yZWZjbnQgPT0gMAotCQkgICAgICYmICgocnAtPnJjX2ZsYWcg JiBSQ19SRUZDTlQpIHx8Ci0JCQkgTkZTRF9NT05PU0VDID4gcnAtPnJjX3RpbWVzdGFtcCB8fAot CQkJIG5mc3JjX3VkcGNhY2hlc2l6ZSA+IG5mc3JjX3VkcGhpZ2h3YXRlcikpCi0JCQluZnNyY19m cmVlY2FjaGUocnApOwotCX0KLQlmb3IgKGkgPSAwOyBpIDwgTkZTUlZDQUNIRV9IQVNIU0laRTsg aSsrKSB7Ci0JCUxJU1RfRk9SRUFDSF9TQUZFKHJwLCAmbmZzcnZoYXNodGJsW2ldLCByY19oYXNo LCBuZXh0cnApIHsKKwlpZiAoYXRvbWljX2NtcHNldF9hY3FfaW50KCZvbmV0aHJlYWQsIDAsIDEp ID09IDApCisJCXJldHVybjsKKwlpZiAoTkZTRF9NT05PU0VDICE9IHVkcF9sYXN0dHJpbSB8fAor CSAgICBuZnNyY191ZHBjYWNoZXNpemUgPj0gKG5mc3JjX3VkcGhpZ2h3YXRlciArCisJICAgIG5m c3JjX3VkcGhpZ2h3YXRlciAvIDIpKSB7CisJCW10eF9sb2NrKCZuZnNyY191ZHBtdHgpOworCQl1 ZHBfbGFzdHRyaW0gPSBORlNEX01PTk9TRUM7CisJCVRBSUxRX0ZPUkVBQ0hfU0FGRShycCwgJm5m c3J2dWRwbHJ1LCByY19scnUsIG5leHRycCkgewogCQkJaWYgKCEocnAtPnJjX2ZsYWcgJiAoUkNf SU5QUk9HfFJDX0xPQ0tFRHxSQ19XQU5URUQpKQogCQkJICAgICAmJiBycC0+cmNfcmVmY250ID09 IDAKIAkJCSAgICAgJiYgKChycC0+cmNfZmxhZyAmIFJDX1JFRkNOVCkgfHwKLQkJCQkgTkZTRF9N T05PU0VDID4gcnAtPnJjX3RpbWVzdGFtcCB8fAotCQkJCSBuZnNyY19hY3RpdmVzb2NrZXQocnAs IHNvY2tyZWYsIHNvKSkpCisJCQkJIHVkcF9sYXN0dHJpbSA+IHJwLT5yY190aW1lc3RhbXAgfHwK KwkJCQkgbmZzcmNfdWRwY2FjaGVzaXplID4gbmZzcmNfdWRwaGlnaHdhdGVyKSkKIAkJCQluZnNy Y19mcmVlY2FjaGUocnApOwogCQl9CisJCW10eF91bmxvY2soJm5mc3JjX3VkcG10eCk7CisJfQor CWlmIChORlNEX01PTk9TRUMgIT0gdGNwX2xhc3R0cmltIHx8CisJICAgIG5mc3JjX3RjcHNhdmVk cmVwbGllcyA+PSBuZnNyY190Y3BoaWdod2F0ZXIpIHsKKwkJZm9yIChpID0gMDsgaSA8IDEwOyBp KyspCisJCQl0aW1lX2hpc3RvW2ldID0gMDsKKwkJZm9yIChpID0gMDsgaSA8IE5GU1JWQ0FDSEVf SEFTSFNJWkU7IGkrKykgeworCQkJbXR4X2xvY2soJm5mc3JjX3RjcG10eFtpXSk7CisJCQlpZiAo aSA9PSAwKQorCQkJCXRjcF9sYXN0dHJpbSA9IE5GU0RfTU9OT1NFQzsKKwkJCUxJU1RfRk9SRUFD SF9TQUZFKHJwLCAmbmZzcnZoYXNodGJsW2ldLCByY19oYXNoLAorCQkJICAgIG5leHRycCkgewor CQkJCWlmICghKHJwLT5yY19mbGFnICYKKwkJCQkgICAgIChSQ19JTlBST0d8UkNfTE9DS0VEfFJD X1dBTlRFRCkpCisJCQkJICAgICAmJiBycC0+cmNfcmVmY250ID09IDApIHsKKwkJCQkJLyoKKwkJ CQkJICogVGhlIHRpbWVzdGFtcHMgcmFuZ2UgZnJvbSByb3VnaGx5IHRoZQorCQkJCQkgKiBwcmVz ZW50ICh0Y3BfbGFzdHRyaW0pIHRvIHRoZSBwcmVzZW50CisJCQkJCSAqICsgbmZzcmNfdGNwdGlt ZW91dC4gR2VuZXJhdGUgYSBzaW1wbGUKKwkJCQkJICogaGlzdG9ncmFtIG9mIHdoZXJlIHRoZSB0 aW1lb3V0cyBmYWxsLgorCQkJCQkgKi8KKwkJCQkJaiA9IHJwLT5yY190aW1lc3RhbXAgLSB0Y3Bf bGFzdHRyaW07CisJCQkJCWlmIChqID49IG5mc3JjX3RjcHRpbWVvdXQpCisJCQkJCQlqID0gbmZz cmNfdGNwdGltZW91dCAtIDE7CisJCQkJCWlmIChqIDwgMCkKKwkJCQkJCWogPSAwOworCQkJCQlq ID0gKGogKiAxMCAvIG5mc3JjX3RjcHRpbWVvdXQpICUgMTA7CisJCQkJCXRpbWVfaGlzdG9bal0r KzsKKwkJCQkJaWYgKChycC0+cmNfZmxhZyAmIFJDX1JFRkNOVCkgfHwKKwkJCQkJICAgIHRjcF9s YXN0dHJpbSA+IHJwLT5yY190aW1lc3RhbXAgfHwKKwkJCQkJICAgIG5mc3JjX2FjdGl2ZXNvY2tl dChycCwgc29ja3JlZiwgc28pKQorCQkJCQkJbmZzcmNfZnJlZWNhY2hlKHJwKTsKKwkJCQl9CisJ CQl9CisJCQltdHhfdW5sb2NrKCZuZnNyY190Y3BtdHhbaV0pOworCQl9CisJCWogPSBuZnNyY190 Y3BoaWdod2F0ZXIgLyA1OwkvKiAyMCUgb2YgaXQgKi8KKwkJaWYgKGogPiAwICYmIChuZnNyY190 Y3BzYXZlZHJlcGxpZXMgKyBqKSA+IG5mc3JjX3RjcGhpZ2h3YXRlcikgeworCQkJLyoKKwkJCSAq IFRyaW0gc29tZSBtb3JlIHdpdGggYSBzbWFsbGVyIHRpbWVvdXQgb2YgYXMgbGl0dGxlCisJCQkg KiBhcyAyMCUgb2YgbmZzcmNfdGNwdGltZW91dCB0byB0cnkgYW5kIGdldCBiZWxvdworCQkJICog ODAlIG9mIHRoZSBuZnNyY190Y3BoaWdod2F0ZXIuCisJCQkgKi8KKwkJCWsgPSAwOworCQkJZm9y IChpID0gMDsgaSA8IDg7IGkrKykgeworCQkJCWsgKz0gdGltZV9oaXN0b1tpXTsKKwkJCQlpZiAo ayA+IGopCisJCQkJCWJyZWFrOworCQkJfQorCQkJayA9IG5mc3JjX3RjcHRpbWVvdXQgKiAoaSAr IDEpIC8gMTA7CisJCQlpZiAoayA8IDEpCisJCQkJayA9IDE7CisJCQl0aGlzc3RhbXAgPSB0Y3Bf bGFzdHRyaW0gKyBrOworCQkJZm9yIChpID0gMDsgaSA8IE5GU1JWQ0FDSEVfSEFTSFNJWkU7IGkr KykgeworCQkJCW10eF9sb2NrKCZuZnNyY190Y3BtdHhbaV0pOworCQkJCUxJU1RfRk9SRUFDSF9T QUZFKHJwLCAmbmZzcnZoYXNodGJsW2ldLCByY19oYXNoLAorCQkJCSAgICBuZXh0cnApIHsKKwkJ CQkJaWYgKCEocnAtPnJjX2ZsYWcgJgorCQkJCQkgICAgIChSQ19JTlBST0d8UkNfTE9DS0VEfFJD X1dBTlRFRCkpCisJCQkJCSAgICAgJiYgcnAtPnJjX3JlZmNudCA9PSAwCisJCQkJCSAgICAgJiYg KChycC0+cmNfZmxhZyAmIFJDX1JFRkNOVCkgfHwKKwkJCQkJCSB0aGlzc3RhbXAgPiBycC0+cmNf dGltZXN0YW1wIHx8CisJCQkJCQkgbmZzcmNfYWN0aXZlc29ja2V0KHJwLCBzb2NrcmVmLAorCQkJ CQkJICAgIHNvKSkpCisJCQkJCQluZnNyY19mcmVlY2FjaGUocnApOworCQkJCX0KKwkJCQltdHhf dW5sb2NrKCZuZnNyY190Y3BtdHhbaV0pOworCQkJfQorCQl9CiAJfQotCU5GU1VOTE9DS0NBQ0hF KCk7CisJYXRvbWljX3N0b3JlX3JlbF9pbnQoJm9uZXRocmVhZCwgMCk7CiB9CiAKIC8qCkBAIC04 MTAsMTIgKzkyNywxNCBAQCBuZnNyY190cmltY2FjaGUodV9pbnQ2NF90IHNvY2tyZWYsIHN0cnVj CiBBUFBMRVNUQVRJQyB2b2lkCiBuZnNydmRfcmVmY2FjaGUoc3RydWN0IG5mc3J2Y2FjaGUgKnJw KQogeworCXN0cnVjdCBtdHggKm11dGV4OwogCi0JTkZTTE9DS0NBQ0hFKCk7CisJbXV0ZXggPSBu ZnNyY19jYWNoZW11dGV4KHJwKTsKKwltdHhfbG9jayhtdXRleCk7CiAJaWYgKHJwLT5yY19yZWZj bnQgPCAwKQogCQlwYW5pYygibmZzIGNhY2hlIHJlZmNudCIpOwogCXJwLT5yY19yZWZjbnQrKzsK LQlORlNVTkxPQ0tDQUNIRSgpOworCW10eF91bmxvY2sobXV0ZXgpOwogfQogCiAvKgpAQCAtODI0 LDE0ICs5NDMsMTYgQEAgbmZzcnZkX3JlZmNhY2hlKHN0cnVjdCBuZnNydmNhY2hlICpycCkKIEFQ UExFU1RBVElDIHZvaWQKIG5mc3J2ZF9kZXJlZmNhY2hlKHN0cnVjdCBuZnNydmNhY2hlICpycCkK IHsKKwlzdHJ1Y3QgbXR4ICptdXRleDsKIAotCU5GU0xPQ0tDQUNIRSgpOworCW11dGV4ID0gbmZz cmNfY2FjaGVtdXRleChycCk7CisJbXR4X2xvY2sobXV0ZXgpOwogCWlmIChycC0+cmNfcmVmY250 IDw9IDApCiAJCXBhbmljKCJuZnMgY2FjaGUgZGVyZWZjbnQiKTsKIAlycC0+cmNfcmVmY250LS07 CiAJaWYgKHJwLT5yY19yZWZjbnQgPT0gMCAmJiAhKHJwLT5yY19mbGFnICYgKFJDX0xPQ0tFRCB8 IFJDX0lOUFJPRykpKQogCQluZnNyY19mcmVlY2FjaGUocnApOwotCU5GU1VOTE9DS0NBQ0hFKCk7 CisJbXR4X3VubG9jayhtdXRleCk7CiB9CiAKIC8qCi0tLSBmcy9uZnNzZXJ2ZXIvbmZzX25mc2Rw b3J0LmMub3JpZwkyMDEzLTAzLTAyIDE4OjE5OjM0LjAwMDAwMDAwMCAtMDUwMAorKysgZnMvbmZz c2VydmVyL25mc19uZnNkcG9ydC5jCTIwMTMtMDMtMTIgMTc6NTE6MzEuMDAwMDAwMDAwIC0wNDAw CkBAIC02MSw3ICs2MSw4IEBAIGV4dGVybiBzdHJ1Y3QgbmZzdjRsb2NrIG5mc2Rfc3VzcGVuZF9s b2MKIGV4dGVybiBzdHJ1Y3QgbmZzc2Vzc2lvbmhhc2ggbmZzc2Vzc2lvbmhhc2hbTkZTU0VTU0lP TkhBU0hTSVpFXTsKIHN0cnVjdCB2ZnNvcHRsaXN0IG5mc3Y0cm9vdF9vcHQsIG5mc3Y0cm9vdF9u ZXdvcHQ7CiBORlNETE9DS01VVEVYOwotc3RydWN0IG10eCBuZnNfY2FjaGVfbXV0ZXg7CitzdHJ1 Y3QgbXR4IG5mc3JjX3RjcG10eFtORlNSVkNBQ0hFX0hBU0hTSVpFXTsKK3N0cnVjdCBtdHggbmZz cmNfdWRwbXR4Owogc3RydWN0IG10eCBuZnNfdjRyb290X211dGV4Owogc3RydWN0IG5mc3J2Zmgg bmZzX3Jvb3RmaCwgbmZzX3B1YmZoOwogaW50IG5mc19wdWJmaHNldCA9IDAsIG5mc19yb290Zmhz ZXQgPSAwOwpAQCAtMzMwNSw3ICszMzA2LDEwIEBAIG5mc2RfbW9kZXZlbnQobW9kdWxlX3QgbW9k LCBpbnQgdHlwZSwgdm8KIAkJaWYgKGxvYWRlZCkKIAkJCWdvdG8gb3V0OwogCQluZXduZnNfcG9y dGluaXQoKTsKLQkJbXR4X2luaXQoJm5mc19jYWNoZV9tdXRleCwgIm5mc19jYWNoZV9tdXRleCIs IE5VTEwsIE1UWF9ERUYpOworCQlmb3IgKGkgPSAwOyBpIDwgTkZTUlZDQUNIRV9IQVNIU0laRTsg aSsrKQorCQkJbXR4X2luaXQoJm5mc3JjX3RjcG10eFtpXSwgIm5mc190Y3BjYWNoZV9tdXRleCIs IE5VTEwsCisJCQkgICAgTVRYX0RFRik7CisJCW10eF9pbml0KCZuZnNyY191ZHBtdHgsICJuZnNf dWRwY2FjaGVfbXV0ZXgiLCBOVUxMLCBNVFhfREVGKTsKIAkJbXR4X2luaXQoJm5mc192NHJvb3Rf bXV0ZXgsICJuZnNfdjRyb290X211dGV4IiwgTlVMTCwgTVRYX0RFRik7CiAJCW10eF9pbml0KCZu ZnN2NHJvb3RfbW50Lm1udF9tdHgsICJzdHJ1Y3QgbW91bnQgbXR4IiwgTlVMTCwKIAkJICAgIE1U WF9ERUYpOwpAQCAtMzM1Miw3ICszMzU2LDkgQEAgbmZzZF9tb2RldmVudChtb2R1bGVfdCBtb2Qs IGludCB0eXBlLCB2bwogCQkJc3ZjcG9vbF9kZXN0cm95KG5mc3J2ZF9wb29sKTsKIAogCQkvKiBh bmQgZ2V0IHJpZCBvZiB0aGUgbG9ja3MgKi8KLQkJbXR4X2Rlc3Ryb3koJm5mc19jYWNoZV9tdXRl eCk7CisJCWZvciAoaSA9IDA7IGkgPCBORlNSVkNBQ0hFX0hBU0hTSVpFOyBpKyspCisJCQltdHhf ZGVzdHJveSgmbmZzcmNfdGNwbXR4W2ldKTsKKwkJbXR4X2Rlc3Ryb3koJm5mc3JjX3VkcG10eCk7 CiAJCW10eF9kZXN0cm95KCZuZnNfdjRyb290X211dGV4KTsKIAkJbXR4X2Rlc3Ryb3koJm5mc3Y0 cm9vdF9tbnQubW50X210eCk7CiAJCWZvciAoaSA9IDA7IGkgPCBORlNTRVNTSU9OSEFTSFNJWkU7 IGkrKykKLS0tIGZzL25mcy9uZnNwb3J0Lmgub3JpZwkyMDEzLTAzLTAyIDE4OjM1OjEzLjAwMDAw MDAwMCAtMDUwMAorKysgZnMvbmZzL25mc3BvcnQuaAkyMDEzLTAzLTEyIDE3OjUxOjMxLjAwMDAw MDAwMCAtMDQwMApAQCAtNjA5LDExICs2MDksNiBAQCB2b2lkIG5mc3J2ZF9yY3Yoc3RydWN0IHNv Y2tldCAqLCB2b2lkICosCiAjZGVmaW5lCU5GU1JFUVNQSU5MT0NLCQlleHRlcm4gc3RydWN0IG10 eCBuZnNfcmVxX211dGV4CiAjZGVmaW5lCU5GU0xPQ0tSRVEoKQkJbXR4X2xvY2soJm5mc19yZXFf bXV0ZXgpCiAjZGVmaW5lCU5GU1VOTE9DS1JFUSgpCQltdHhfdW5sb2NrKCZuZnNfcmVxX211dGV4 KQotI2RlZmluZQlORlNDQUNIRU1VVEVYCQlleHRlcm4gc3RydWN0IG10eCBuZnNfY2FjaGVfbXV0 ZXgKLSNkZWZpbmUJTkZTQ0FDSEVNVVRFWFBUUgkoJm5mc19jYWNoZV9tdXRleCkKLSNkZWZpbmUJ TkZTTE9DS0NBQ0hFKCkJCW10eF9sb2NrKCZuZnNfY2FjaGVfbXV0ZXgpCi0jZGVmaW5lCU5GU1VO TE9DS0NBQ0hFKCkJbXR4X3VubG9jaygmbmZzX2NhY2hlX211dGV4KQotI2RlZmluZQlORlNDQUNI RUxPQ0tSRVFVSVJFRCgpCW10eF9hc3NlcnQoJm5mc19jYWNoZV9tdXRleCwgTUFfT1dORUQpCiAj ZGVmaW5lCU5GU1NPQ0tNVVRFWAkJZXh0ZXJuIHN0cnVjdCBtdHggbmZzX3Nsb2NrX211dGV4CiAj ZGVmaW5lCU5GU1NPQ0tNVVRFWFBUUgkJKCZuZnNfc2xvY2tfbXV0ZXgpCiAjZGVmaW5lCU5GU0xP Q0tTT0NLKCkJCW10eF9sb2NrKCZuZnNfc2xvY2tfbXV0ZXgpCi0tLSBmcy9uZnMvbmZzcnZjYWNo ZS5oLm9yaWcJMjAxMy0wMS0wNyAwOTowNDoxNS4wMDAwMDAwMDAgLTA1MDAKKysrIGZzL25mcy9u ZnNydmNhY2hlLmgJMjAxMy0wMy0xMiAxODowMjo0Mi4wMDAwMDAwMDAgLTA0MDAKQEAgLTQxLDcg KzQxLDcgQEAKICNkZWZpbmUJTkZTUlZDQUNIRV9NQVhfU0laRQkyMDQ4CiAjZGVmaW5lCU5GU1JW Q0FDSEVfTUlOX1NJWkUJICA2NAogCi0jZGVmaW5lCU5GU1JWQ0FDSEVfSEFTSFNJWkUJMjAKKyNk ZWZpbmUJTkZTUlZDQUNIRV9IQVNIU0laRQk1MDAKIAogc3RydWN0IG5mc3J2Y2FjaGUgewogCUxJ U1RfRU5UUlkobmZzcnZjYWNoZSkgcmNfaGFzaDsJCS8qIEhhc2ggY2hhaW4gKi8K ------=_Part_3844452_1526038691.1363146480611--