From owner-freebsd-net@freebsd.org Tue Jan 12 14:53:28 2016 Return-Path: Delivered-To: freebsd-net@mailman.ysv.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:1900:2254:206a::19:1]) by mailman.ysv.freebsd.org (Postfix) with ESMTP id 6B3F7A6D3DF for ; Tue, 12 Jan 2016 14:53:28 +0000 (UTC) (envelope-from boris.astardzhiev@gmail.com) Received: from mail-wm0-x233.google.com (mail-wm0-x233.google.com [IPv6:2a00:1450:400c:c09::233]) (using TLSv1.2 with cipher ECDHE-RSA-AES128-GCM-SHA256 (128/128 bits)) (Client CN "smtp.gmail.com", Issuer "Google Internet Authority G2" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id E2DA41FE9 for ; Tue, 12 Jan 2016 14:53:27 +0000 (UTC) (envelope-from boris.astardzhiev@gmail.com) Received: by mail-wm0-x233.google.com with SMTP id b14so324245047wmb.1 for ; Tue, 12 Jan 2016 06:53:27 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20120113; h=mime-version:in-reply-to:references:date:message-id:subject:from:to :cc:content-type; bh=P8cEtAJgIV3KOIzzK1O3gBohNpjJsOvMP3w9EWeuRP0=; b=YDTXSNZZhF9avIBSz6emTQmnDY1QB7jC8SRSEzkeo/Xd09P7hOwF281YV/Bslg3a1v cy7WsfpWnFOwh6TYTGInwHhM822yx0qZqCfWESOOjpOLJ65oVvcwdboPkHCvAhVmyF6+ JtufvOT/mMj+eJa6CL+/KHHMAkNxMXOERJkvAn6tsIlmjVj/bUsqlNoegdnQRMaZx0IG VwWsfKAY99R9GuahyOH9+S6Ouw042Cs2GzALw/dm72qplTKwc8SSbbR+MpW1r7ezvjoQ On2ELeYrFJAUfPAEVyQTsQwZNqAlcdM2HDZEFtMWDPMOjvLHqWKPJGK5GzL/0eYAtOLd zh+w== MIME-Version: 1.0 X-Received: by 10.28.186.85 with SMTP id k82mr21636352wmf.77.1452610406318; Tue, 12 Jan 2016 06:53:26 -0800 (PST) Received: by 10.28.136.148 with HTTP; Tue, 12 Jan 2016 06:53:25 -0800 (PST) In-Reply-To: References: <20160104101747.58347.qmail@f5-external.bushwire.net> <20160104194044.GD3625@kib.kiev.ua> <20160104210741.32812.qmail@f5-external.bushwire.net> <20160107161213.GZ3625@kib.kiev.ua> <20160107192840.GF3625@kib.kiev.ua> <20160108172323.W1815@besplex.bde.org> <20160108075815.3243.qmail@f5-external.bushwire.net> <20160108204606.G2420@besplex.bde.org> Date: Tue, 12 Jan 2016 16:53:25 +0200 Message-ID: Subject: Re: Does FreeBSD have sendmmsg or recvmmsg system calls? From: Boris Astardzhiev To: Adrian Chadd Cc: Bruce Evans , Mark Delany , FreeBSD Net Content-Type: multipart/mixed; boundary=001a114a0eae44223e05292437ae X-Content-Filtered-By: Mailman/MimeDel 2.1.20 X-BeenThere: freebsd-net@freebsd.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: Networking and TCP/IP with FreeBSD List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Tue, 12 Jan 2016 14:53:28 -0000 --001a114a0eae44223e05292437ae Content-Type: text/plain; charset=UTF-8 Hello again, In my spare time I did the following simple libc-only implementation of the syscalls. I did some tests in a VM adapting these experiments: https://blog.cloudflare.com/how-to-receive-a-million-packets/ Any comments about the diff are greatly appreciated. Best regards, Boris Astardzhiev On Fri, Jan 8, 2016 at 7:02 PM, Adrian Chadd wrote: > On 8 January 2016 at 03:02, Bruce Evans wrote: > > On Fri, 8 Jan 2016, Adrian Chadd wrote: > > > >> On 7 January 2016 at 23:58, Mark Delany wrote: > >>> > >>> On 08Jan16, Bruce Evans allegedly wrote: > >>>> > >>>> If the NIC can't reach line rate > >>> > >>> > >>>> Network stack overheads are also enormous. > >>> > >>> > >>> Bruce makes some excellent points. > >>> > >>> I challenge anyone to get line rate UDP out of FBSD (or Linux) for a > >>> 1G NIC yet alone a 10G NIC listening to a single port. It was exactly > >>> my frustration with UDP performance that led me down the path of > >>> *mmsg() and netmap. > >>> > >>> Frankly this is an opportunity for FBSD as UDP performance appears to > >>> be a neglected area. > >> > >> > >> I'm there, on 16 threads. > >> > >> I'd rather we do it on two or three, as a lot of time is wasted in > >> producer/consumer locking. but yeah, 500k tx/rx should be doable per > >> CPU with only locking changes. > > .. and I did mean "kernel producer/consumer locking changes." > > > > > Line rate for 1 Gbps is about 1500 kpps (small packets). > > > > With I218V2 (em), I see enormous lock contention above 3 or 4 (user) > > threads, and 8 are slightly slower than 1. 1 doesn't saturate the NIC, > > and 2 is optimal. > > > > The RSS support in -HEAD lets you get away with parallelising UDP > streams very nicely. > > The framework is pretty simple (!): > > * drivers ask the RSS code for the RSS config and RSS hash to use, and > configure the hardware appropriately; > * the netisr input paths check the existence of the RSS hash and will > calculte it in software if reqiured; > * v4/v6 reassembly is done (at the IP level, /not/ at the protocol > level) and if it needs a new RSS hash / netisr reinjection, that'll > happen; > * the PCB lookup code for listen sockets now allows one listen socket > per RSS bucket - as the RSS / PCBGROUPS code already extended the PCB > to have one PCB table per RSS bucket (as well as a global one); > > So: > > * userland code queries RSS for the CPU and RSS bucket setup; > * you then create one listen socket per RSS bucket, bind it to the > local thread (if you want) and tell it "you're in RSS bucket X"; > * .. and then in the UDP case for local-bound sockets, the > transmit/receive path does not require modifying the global PCB state, > so the locking is kept per-RSS bucket, and scales linearly with the > number of CPUs you have (until you hit the NIC queue limits.) > > https://github.com/erikarn/freebsd-rss/ > > and: > > > http://adrianchadd.blogspot.com/2014/06/hacking-on-receive-side-scaling-rss-on.html > > http://adrianchadd.blogspot.com/2014/07/application-awareness-of-receive-side.html > > http://adrianchadd.blogspot.com/2014/08/receive-side-scaling-figuring-out-how.html > > http://adrianchadd.blogspot.com/2014/09/receive-side-scaling-testing-udp.html > > http://adrianchadd.blogspot.com/2014/10/more-rss-udp-tests-this-time-on-dell.html > > > > -adrian > _______________________________________________ > freebsd-net@freebsd.org mailing list > https://lists.freebsd.org/mailman/listinfo/freebsd-net > To unsubscribe, send any mail to "freebsd-net-unsubscribe@freebsd.org" > --001a114a0eae44223e05292437ae Content-Type: text/plain; charset=US-ASCII; name="sendrecvmmsg-libconly.diff" Content-Disposition: attachment; filename="sendrecvmmsg-libconly.diff" Content-Transfer-Encoding: base64 X-Attachment-Id: f_ijbimzj50 ZGlmZiAtLWdpdCBhL2xpYi9saWJjL2luY2x1ZGUvbGliY19wcml2YXRlLmggYi9saWIvbGliYy9p bmNsdWRlL2xpYmNfcHJpdmF0ZS5oCmluZGV4IDVjYWY5YTMuLjlhMGQ2Y2YgMTAwNjQ0Ci0tLSBh L2xpYi9saWJjL2luY2x1ZGUvbGliY19wcml2YXRlLmgKKysrIGIvbGliL2xpYmMvaW5jbHVkZS9s aWJjX3ByaXZhdGUuaApAQCAtMjI0LDYgKzIyNCw4IEBAIGVudW0gewogCUlOVEVSUE9TX2tldmVu dCwKIAlJTlRFUlBPU193YWl0NiwKIAlJTlRFUlBPU19wcG9sbCwKKwlJTlRFUlBPU19zZW5kbW1z ZywKKwlJTlRFUlBPU19yZWN2bW1zZywKIAlJTlRFUlBPU19NQVgKIH07CiAKZGlmZiAtLWdpdCBh L2xpYi9saWJjL2luY2x1ZGUvbmFtZXNwYWNlLmggYi9saWIvbGliYy9pbmNsdWRlL25hbWVzcGFj ZS5oCmluZGV4IDczOWQ3YjEuLmM5NTgyOWUgMTAwNjQ0Ci0tLSBhL2xpYi9saWJjL2luY2x1ZGUv bmFtZXNwYWNlLmgKKysrIGIvbGliL2xpYmMvaW5jbHVkZS9uYW1lc3BhY2UuaApAQCAtMjA4LDYg KzIwOCw3IEBACiAjZGVmaW5lCQlyZWFkdgkJCQlfcmVhZHYKICNkZWZpbmUJCXJlY3Zmcm9tCQkJ X3JlY3Zmcm9tCiAjZGVmaW5lCQlyZWN2bXNnCQkJCV9yZWN2bXNnCisjZGVmaW5lCQlyZWN2bW1z ZwkJCV9yZWN2bW1zZwogI2RlZmluZQkJc2VsZWN0CQkJCV9zZWxlY3QKICNkZWZpbmUJCXNlbV9j bG9zZQkJCV9zZW1fY2xvc2UKICNkZWZpbmUJCXNlbV9kZXN0cm95CQkJX3NlbV9kZXN0cm95CkBA IC0yMjAsNiArMjIxLDcgQEAKICNkZWZpbmUJCXNlbV91bmxpbmsJCQlfc2VtX3VubGluawogI2Rl ZmluZQkJc2VtX3dhaXQJCQlfc2VtX3dhaXQKICNkZWZpbmUJCXNlbmRtc2cJCQkJX3NlbmRtc2cK KyNkZWZpbmUJCXNlbmRtbXNnCQkJX3NlbmRtbXNnCiAjZGVmaW5lCQlzZW5kdG8JCQkJX3NlbmR0 bwogI2RlZmluZQkJc2V0c29ja29wdAkJCV9zZXRzb2Nrb3B0CiAvKiNkZWZpbmUJCXNpZ2FjdGlv bgkJCV9zaWdhY3Rpb24qLwpkaWZmIC0tZ2l0IGEvbGliL2xpYmMvaW5jbHVkZS91bi1uYW1lc3Bh Y2UuaCBiL2xpYi9saWJjL2luY2x1ZGUvdW4tbmFtZXNwYWNlLmgKaW5kZXggZjMxZmE3YS4uMDIz MzM0OCAxMDA2NDQKLS0tIGEvbGliL2xpYmMvaW5jbHVkZS91bi1uYW1lc3BhY2UuaAorKysgYi9s aWIvbGliYy9pbmNsdWRlL3VuLW5hbWVzcGFjZS5oCkBAIC0xODksNiArMTg5LDcgQEAKICN1bmRl ZgkJcmVhZHYKICN1bmRlZgkJcmVjdmZyb20KICN1bmRlZgkJcmVjdm1zZworI3VuZGVmCQlyZWN2 bW1zZwogI3VuZGVmCQlzZWxlY3QKICN1bmRlZgkJc2VtX2Nsb3NlCiAjdW5kZWYJCXNlbV9kZXN0 cm95CkBAIC0yMDEsNiArMjAyLDcgQEAKICN1bmRlZgkJc2VtX3VubGluawogI3VuZGVmCQlzZW1f d2FpdAogI3VuZGVmCQlzZW5kbXNnCisjdW5kZWYJCXNlbmRtbXNnCiAjdW5kZWYJCXNlbmR0bwog I3VuZGVmCQlzZXRzb2Nrb3B0CiAjdW5kZWYJCXNpZ2FjdGlvbgpkaWZmIC0tZ2l0IGEvbGliL2xp YmMvc3lzL01ha2VmaWxlLmluYyBiL2xpYi9saWJjL3N5cy9NYWtlZmlsZS5pbmMKaW5kZXggZTRm ZTFiMi4uZWNiMzY2YSAxMDA2NDQKLS0tIGEvbGliL2xpYmMvc3lzL01ha2VmaWxlLmluYworKysg Yi9saWIvbGliYy9zeXMvTWFrZWZpbGUuaW5jCkBAIC0yOCw2ICsyOCwxMCBAQCBTUkNTKz0gZnV0 aW1lbnMuYyB1dGltZW5zYXQuYwogTk9BU00rPSBmdXRpbWVucy5vIHV0aW1lbnNhdC5vCiBQU0VV RE8rPSBfZnV0aW1lbnMubyBfdXRpbWVuc2F0Lm8KIAorU1JDUys9IHJlY3ZtbXNnLmMgc2VuZG1t c2cuYworTk9BU00rPSByZWN2bW1zZy5vIHNlbmRtbXNnLm8KK1BTRVVETys9IF9yZWN2bW1zZy5v IF9zZW5kbW1zZy5vCisKIElOVEVSUE9TRUQgPSBcCiAJYWNjZXB0IFwKIAlhY2NlcHQ0IFwKZGlm ZiAtLWdpdCBhL2xpYi9saWJjL3N5cy9TeW1ib2wubWFwIGIvbGliL2xpYmMvc3lzL1N5bWJvbC5t YXAKaW5kZXggN2IzMjU3Yy4uNzI0ZTFiNCAxMDA2NDQKLS0tIGEvbGliL2xpYmMvc3lzL1N5bWJv bC5tYXAKKysrIGIvbGliL2xpYmMvc3lzL1N5bWJvbC5tYXAKQEAgLTM5OSw2ICszOTksOCBAQCBG QlNEXzEuNCB7CiAJdXRpbWVuc2F0OwogCW51bWFfc2V0YWZmaW5pdHk7CiAJbnVtYV9nZXRhZmZp bml0eTsKKwlzZW5kbW1zZzsKKwlyZWN2bW1zZzsKIH07CiAKIEZCU0Rwcml2YXRlXzEuMCB7CkBA IC0xMDUxLDQgKzEwNTMsNiBAQCBGQlNEcHJpdmF0ZV8xLjAgewogCWdzc2Rfc3lzY2FsbDsKIAlf X2xpYmNfaW50ZXJwb3Npbmdfc2xvdDsKIAlfX2xpYmNfc2lnd2FpdDsKKwlfc2VuZG1tc2c7CisJ X3JlY3ZtbXNnOwogfTsKZGlmZiAtLWdpdCBhL2xpYi9saWJjL3N5cy9yZWN2bW1zZy5jIGIvbGli L2xpYmMvc3lzL3JlY3ZtbXNnLmMKbmV3IGZpbGUgbW9kZSAxMDA2NDQKaW5kZXggMDAwMDAwMC4u MDNhYjM3OQotLS0gL2Rldi9udWxsCisrKyBiL2xpYi9saWJjL3N5cy9yZWN2bW1zZy5jCkBAIC0w LDAgKzEsNzMgQEAKKy8qCisgKiBDb3B5cmlnaHQgKGMpIDIwMTYgQm9yaXMgQXN0YXJkemhpZXYs IFNtYXJ0Y29tLUJ1bGdhcmlhIEFECisgKiBBbGwgcmlnaHRzIHJlc2VydmVkLgorICoKKyAqIFJl ZGlzdHJpYnV0aW9uIGFuZCB1c2UgaW4gc291cmNlIGFuZCBiaW5hcnkgZm9ybXMsIHdpdGggb3Ig d2l0aG91dAorICogbW9kaWZpY2F0aW9uLCBhcmUgcGVybWl0dGVkIHByb3ZpZGVkIHRoYXQgdGhl IGZvbGxvd2luZyBjb25kaXRpb25zCisgKiBhcmUgbWV0OgorICogMS4gUmVkaXN0cmlidXRpb25z IG9mIHNvdXJjZSBjb2RlIG11c3QgcmV0YWluIHRoZSBhYm92ZSBjb3B5cmlnaHQKKyAqICAgIG5v dGljZShzKSwgdGhpcyBsaXN0IG9mIGNvbmRpdGlvbnMgYW5kIHRoZSBmb2xsb3dpbmcgZGlzY2xh aW1lciBhcworICogICAgdGhlIGZpcnN0IGxpbmVzIG9mIHRoaXMgZmlsZSB1bm1vZGlmaWVkIG90 aGVyIHRoYW4gdGhlIHBvc3NpYmxlCisgKiAgICBhZGRpdGlvbiBvZiBvbmUgb3IgbW9yZSBjb3B5 cmlnaHQgbm90aWNlcy4KKyAqIDIuIFJlZGlzdHJpYnV0aW9ucyBpbiBiaW5hcnkgZm9ybSBtdXN0 IHJlcHJvZHVjZSB0aGUgYWJvdmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UocyksIHRoaXMgbGlz dCBvZiBjb25kaXRpb25zIGFuZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgaW4KKyAqICAgIHRo ZSBkb2N1bWVudGF0aW9uIGFuZC9vciBvdGhlciBtYXRlcmlhbHMgcHJvdmlkZWQgd2l0aCB0aGUK KyAqICAgIGRpc3RyaWJ1dGlvbi4KKyAqCisgKiBUSElTIFNPRlRXQVJFIElTIFBST1ZJREVEIEJZ IFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIGBgQVMgSVMnJyBBTkQgQU5ZCisgKiBFWFBSRVNTIE9S IElNUExJRUQgV0FSUkFOVElFUywgSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFRIRQor ICogSU1QTElFRCBXQVJSQU5USUVTIE9GIE1FUkNIQU5UQUJJTElUWSBBTkQgRklUTkVTUyBGT1Ig QSBQQVJUSUNVTEFSCisgKiBQVVJQT1NFIEFSRSBESVNDTEFJTUVELiAgSU4gTk8gRVZFTlQgU0hB TEwgVEhFIENPUFlSSUdIVCBIT0xERVIoUykgQkUKKyAqIExJQUJMRSBGT1IgQU5ZIERJUkVDVCwg SU5ESVJFQ1QsIElOQ0lERU5UQUwsIFNQRUNJQUwsIEVYRU1QTEFSWSwgT1IKKyAqIENPTlNFUVVF TlRJQUwgREFNQUdFUyAoSU5DTFVESU5HLCBCVVQgTk9UIExJTUlURUQgVE8sIFBST0NVUkVNRU5U IE9GCisgKiBTVUJTVElUVVRFIEdPT0RTIE9SIFNFUlZJQ0VTOyBMT1NTIE9GIFVTRSwgREFUQSwg T1IgUFJPRklUUzsgT1IKKyAqIEJVU0lORVNTIElOVEVSUlVQVElPTikgSE9XRVZFUiBDQVVTRUQg QU5EIE9OIEFOWSBUSEVPUlkgT0YgTElBQklMSVRZLAorICogV0hFVEhFUiBJTiBDT05UUkFDVCwg U1RSSUNUIExJQUJJTElUWSwgT1IgVE9SVCAoSU5DTFVESU5HIE5FR0xJR0VOQ0UKKyAqIE9SIE9U SEVSV0lTRSkgQVJJU0lORyBJTiBBTlkgV0FZIE9VVCBPRiBUSEUgVVNFIE9GIFRISVMgU09GVFdB UkUsCisgKiBFVkVOIElGIEFEVklTRUQgT0YgVEhFIFBPU1NJQklMSVRZIE9GIFNVQ0ggREFNQUdF LgorICovCisKKyNpbmNsdWRlIDxzeXMvY2RlZnMuaD4KK19fRkJTRElEKCIkRnJlZUJTRCQiKTsK KworI2luY2x1ZGUgPGVycm5vLmg+CisjaW5jbHVkZSA8c3lzL3R5cGVzLmg+CisjaW5jbHVkZSA8 c3lzL3N5c2NhbGwuaD4KKyNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CisjaW5jbHVkZSAibGliY19w cml2YXRlLmgiCisKKyNkZWZpbmUgVkxFTl9NQVggMTAyNAorCitpbnQKK3JlY3ZtbXNnKGludCBz LCBzdHJ1Y3QgbW1zZ2hkciAqbXNndmVjLCB1bnNpZ25lZCBpbnQgdmxlbiwgaW50IGZsYWdzKQor eworCWludCBpLCByZXQsIHJjdmQ7CisKKwlpZiAodmxlbiA+IFZMRU5fTUFYKQorCQl2bGVuID0g VkxFTl9NQVg7CisKKwlyY3ZkID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgdmxlbjsgaSsrKSB7CisJ CWVycm5vID0gMDsKKwkJcmV0ID0gKCgoaW50ICgqKShpbnQsIGNvbnN0IHN0cnVjdCBtc2doZHIg KiwgaW50KSkKKwkJICAgIF9fbGliY19pbnRlcnBvc2luZ1tJTlRFUlBPU19yZWN2bXNnXSkocywK KwkJICAgICAgICAmbXNndmVjW2ldLm1zZ19oZHIsIGZsYWdzKSk7CisJCWlmIChyZXQgPCAwIHx8 IGVycm5vICE9IDApIHsKKwkJCWlmIChyY3ZkKSB7CisJCQkJLyogV2UndmUgcmVjZWl2ZWQgbWVz c2FnZXMuIExldCBjYWxsZXIga25vdy4gKi8KKwkJCQllcnJubyA9IDA7CisJCQkJcmV0dXJuIChy Y3ZkKTsKKwkJCX0KKwkJCXJldHVybiAoLTEpOworCQl9CisKKwkJLyogU2F2ZSByZWNlaXZlZCBi eXRlcyAqLworCQltc2d2ZWNbaV0ubXNnX2xlbiA9IHJldDsKKworCQlyY3ZkKys7CisJfQorCisJ cmV0dXJuIChyY3ZkKTsKK30KKworI3VuZGVmIFZMRU5fTUFYCmRpZmYgLS1naXQgYS9saWIvbGli Yy9zeXMvc2VuZG1tc2cuYyBiL2xpYi9saWJjL3N5cy9zZW5kbW1zZy5jCm5ldyBmaWxlIG1vZGUg MTAwNjQ0CmluZGV4IDAwMDAwMDAuLjMzODdmZGMKLS0tIC9kZXYvbnVsbAorKysgYi9saWIvbGli Yy9zeXMvc2VuZG1tc2cuYwpAQCAtMCwwICsxLDczIEBACisvKgorICogQ29weXJpZ2h0IChjKSAy MDE2IEJvcmlzIEFzdGFyZHpoaWV2LCBTbWFydGNvbS1CdWxnYXJpYSBBRAorICogQWxsIHJpZ2h0 cyByZXNlcnZlZC4KKyAqCisgKiBSZWRpc3RyaWJ1dGlvbiBhbmQgdXNlIGluIHNvdXJjZSBhbmQg YmluYXJ5IGZvcm1zLCB3aXRoIG9yIHdpdGhvdXQKKyAqIG1vZGlmaWNhdGlvbiwgYXJlIHBlcm1p dHRlZCBwcm92aWRlZCB0aGF0IHRoZSBmb2xsb3dpbmcgY29uZGl0aW9ucworICogYXJlIG1ldDoK KyAqIDEuIFJlZGlzdHJpYnV0aW9ucyBvZiBzb3VyY2UgY29kZSBtdXN0IHJldGFpbiB0aGUgYWJv dmUgY29weXJpZ2h0CisgKiAgICBub3RpY2UocyksIHRoaXMgbGlzdCBvZiBjb25kaXRpb25zIGFu ZCB0aGUgZm9sbG93aW5nIGRpc2NsYWltZXIgYXMKKyAqICAgIHRoZSBmaXJzdCBsaW5lcyBvZiB0 aGlzIGZpbGUgdW5tb2RpZmllZCBvdGhlciB0aGFuIHRoZSBwb3NzaWJsZQorICogICAgYWRkaXRp b24gb2Ygb25lIG9yIG1vcmUgY29weXJpZ2h0IG5vdGljZXMuCisgKiAyLiBSZWRpc3RyaWJ1dGlv bnMgaW4gYmluYXJ5IGZvcm0gbXVzdCByZXByb2R1Y2UgdGhlIGFib3ZlIGNvcHlyaWdodAorICog ICAgbm90aWNlKHMpLCB0aGlzIGxpc3Qgb2YgY29uZGl0aW9ucyBhbmQgdGhlIGZvbGxvd2luZyBk aXNjbGFpbWVyIGluCisgKiAgICB0aGUgZG9jdW1lbnRhdGlvbiBhbmQvb3Igb3RoZXIgbWF0ZXJp YWxzIHByb3ZpZGVkIHdpdGggdGhlCisgKiAgICBkaXN0cmlidXRpb24uCisgKgorICogVEhJUyBT T0ZUV0FSRSBJUyBQUk9WSURFRCBCWSBUSEUgQ09QWVJJR0hUIEhPTERFUihTKSBgYEFTIElTJycg QU5EIEFOWQorICogRVhQUkVTUyBPUiBJTVBMSUVEIFdBUlJBTlRJRVMsIElOQ0xVRElORywgQlVU IE5PVCBMSU1JVEVEIFRPLCBUSEUKKyAqIElNUExJRUQgV0FSUkFOVElFUyBPRiBNRVJDSEFOVEFC SUxJVFkgQU5EIEZJVE5FU1MgRk9SIEEgUEFSVElDVUxBUgorICogUFVSUE9TRSBBUkUgRElTQ0xB SU1FRC4gIElOIE5PIEVWRU5UIFNIQUxMIFRIRSBDT1BZUklHSFQgSE9MREVSKFMpIEJFCisgKiBM SUFCTEUgRk9SIEFOWSBESVJFQ1QsIElORElSRUNULCBJTkNJREVOVEFMLCBTUEVDSUFMLCBFWEVN UExBUlksIE9SCisgKiBDT05TRVFVRU5USUFMIERBTUFHRVMgKElOQ0xVRElORywgQlVUIE5PVCBM SU1JVEVEIFRPLCBQUk9DVVJFTUVOVCBPRgorICogU1VCU1RJVFVURSBHT09EUyBPUiBTRVJWSUNF UzsgTE9TUyBPRiBVU0UsIERBVEEsIE9SIFBST0ZJVFM7IE9SCisgKiBCVVNJTkVTUyBJTlRFUlJV UFRJT04pIEhPV0VWRVIgQ0FVU0VEIEFORCBPTiBBTlkgVEhFT1JZIE9GIExJQUJJTElUWSwKKyAq IFdIRVRIRVIgSU4gQ09OVFJBQ1QsIFNUUklDVCBMSUFCSUxJVFksIE9SIFRPUlQgKElOQ0xVRElO RyBORUdMSUdFTkNFCisgKiBPUiBPVEhFUldJU0UpIEFSSVNJTkcgSU4gQU5ZIFdBWSBPVVQgT0Yg VEhFIFVTRSBPRiBUSElTIFNPRlRXQVJFLAorICogRVZFTiBJRiBBRFZJU0VEIE9GIFRIRSBQT1NT SUJJTElUWSBPRiBTVUNIIERBTUFHRS4KKyAqLworCisjaW5jbHVkZSA8c3lzL2NkZWZzLmg+Citf X0ZCU0RJRCgiJEZyZWVCU0QkIik7CisKKyNpbmNsdWRlIDxlcnJuby5oPgorI2luY2x1ZGUgPHN5 cy90eXBlcy5oPgorI2luY2x1ZGUgPHN5cy9zeXNjYWxsLmg+CisjaW5jbHVkZSA8c3lzL3NvY2tl dC5oPgorI2luY2x1ZGUgImxpYmNfcHJpdmF0ZS5oIgorCisjZGVmaW5lIFZMRU5fTUFYIDEwMjQK KworaW50CitzZW5kbW1zZyhpbnQgcywgc3RydWN0IG1tc2doZHIgKm1zZ3ZlYywgdW5zaWduZWQg aW50IHZsZW4sIGludCBmbGFncykKK3sKKwlpbnQgaSwgcmV0LCBzZW50OworCisJaWYgKHZsZW4g PiBWTEVOX01BWCkKKwkJdmxlbiA9IFZMRU5fTUFYOworCisJc2VudCA9IDA7CisJZm9yIChpID0g MDsgaSA8IHZsZW47IGkrKykgeworCQllcnJubyA9IDA7CisJCXJldCA9ICgoKGludCAoKikoaW50 LCBjb25zdCBzdHJ1Y3QgbXNnaGRyICosIGludCkpCisJCSAgICBfX2xpYmNfaW50ZXJwb3Npbmdb SU5URVJQT1Nfc2VuZG1zZ10pKHMsCisJCSAgICAgICAgJm1zZ3ZlY1tpXS5tc2dfaGRyLCBmbGFn cykpOworCQlpZiAocmV0IDwgMCB8fCBlcnJubyAhPSAwKSB7CisJCQlpZiAoc2VudCkgeworCQkJ CS8qIFdlIGhhdmUgc2VudCBtZXNzYWdlcy4gTGV0IGNhbGxlciBrbm93LiAqLworCQkJCWVycm5v ID0gMDsKKwkJCQlyZXR1cm4gKHNlbnQpOworCQkJfQorCQkJcmV0dXJuICgtMSk7CisJCX0KKwor CQkvKiBTYXZlIHNlbnQgYnl0ZXMgKi8KKwkJbXNndmVjW2ldLm1zZ19sZW4gPSByZXQ7CisKKwkJ c2VudCsrOworCX0KKworCXJldHVybiAoc2VudCk7Cit9CisKKyN1bmRlZiBWTEVOX01BWApkaWZm IC0tZ2l0IGEvbGliL2xpYnRoci90aHJlYWQvdGhyX3N5c2NhbGxzLmMgYi9saWIvbGlidGhyL3Ro cmVhZC90aHJfc3lzY2FsbHMuYwppbmRleCA3YzA1Njk3Li43YjU0NThkIDEwMDY0NAotLS0gYS9s aWIvbGlidGhyL3RocmVhZC90aHJfc3lzY2FsbHMuYworKysgYi9saWIvbGlidGhyL3RocmVhZC90 aHJfc3lzY2FsbHMuYwpAQCAtNjA2LDYgKzYwNiw4NCBAQCBfX3Rocl93cml0ZXYoaW50IGZkLCBj b25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwgaW50IGlvdmNudCkKIAlyZXR1cm4gKHJldCk7CiB9CiAK KyNkZWZpbmUgVkxFTl9NQVggMTAyNAorCitzdGF0aWMgaW50CitfX3Rocl9zZW5kbW1zZyhpbnQg cywgc3RydWN0IG1tc2doZHIgKm1zZ3ZlYywgdW5zaWduZWQgaW50IHZsZW4sIGludCBmbGFncykK K3sKKwlzdHJ1Y3QgcHRocmVhZCAqY3VydGhyZWFkOworCWludCBpLCByZXQsIHNlbnQ7CisKKwlj dXJ0aHJlYWQgPSBfZ2V0X2N1cnRocmVhZCgpOworCV90aHJfY2FuY2VsX2VudGVyKGN1cnRocmVh ZCk7CisKKwlpZiAodmxlbiA+IFZMRU5fTUFYKQorCQl2bGVuID0gVkxFTl9NQVg7CisKKwlzZW50 ID0gMDsKKwlmb3IgKGkgPSAwOyBpIDwgKGludCl2bGVuOyBpKyspIHsKKwkJZXJybm8gPSAwOwor CQlyZXQgPSBfX3N5c19zZW5kbXNnKHMsICZtc2d2ZWNbaV0ubXNnX2hkciwgZmxhZ3MpOworCQlp ZiAocmV0IDwgMCB8fCBlcnJubyAhPSAwKSB7CisJCQlpZiAoc2VudCkgeworCQkJCS8qIFdlIGhh dmUgc2VudCBtZXNzYWdlcy4gTGV0IGNhbGxlciBrbm93LiAqLworCQkJCWVycm5vID0gMDsKKwkJ CQlfdGhyX2NhbmNlbF9sZWF2ZShjdXJ0aHJlYWQsIHJldCA8PSAwKTsKKwkJCQlyZXR1cm4gKHNl bnQpOworCQkJfQorCQkJcmV0dXJuICgtMSk7CisJCX0KKworCQkvKiBTYXZlIHNlbnQgYnl0ZXMg Ki8KKwkJbXNndmVjW2ldLm1zZ19sZW4gPSByZXQ7CisKKwkJc2VudCsrOworCX0KKworCV90aHJf Y2FuY2VsX2xlYXZlKGN1cnRocmVhZCwgcmV0IDw9IDApOworCisJcmV0dXJuIChzZW50KTsKK30K Kworc3RhdGljIGludAorX190aHJfcmVjdm1tc2coaW50IHMsIHN0cnVjdCBtbXNnaGRyICptc2d2 ZWMsIHVuc2lnbmVkIGludCB2bGVuLCBpbnQgZmxhZ3MpCit7CisJc3RydWN0IHB0aHJlYWQgKmN1 cnRocmVhZDsKKwlpbnQgaSwgcmV0LCByY3ZkOworCisJY3VydGhyZWFkID0gX2dldF9jdXJ0aHJl YWQoKTsKKwlfdGhyX2NhbmNlbF9lbnRlcihjdXJ0aHJlYWQpOworCisJaWYgKHZsZW4gPiBWTEVO X01BWCkKKwkJdmxlbiA9IFZMRU5fTUFYOworCisJcmN2ZCA9IDA7CisJZm9yIChpID0gMDsgaSA8 IChpbnQpdmxlbjsgaSsrKSB7CisJCWVycm5vID0gMDsKKwkJcmV0ID0gX19zeXNfcmVjdm1zZyhz LCAmbXNndmVjW2ldLm1zZ19oZHIsIGZsYWdzKTsKKwkJaWYgKHJldCA8IDAgfHwgZXJybm8gIT0g MCkgeworCQkJaWYgKHJjdmQpIHsKKwkJCQkvKiBXZSd2ZSByZWNlaXZlZCBtZXNzYWdlcy4gTGV0 IGNhbGxlciBrbm93LiAqLworCQkJCWVycm5vID0gMDsKKwkJCQlfdGhyX2NhbmNlbF9sZWF2ZShj dXJ0aHJlYWQsIHJldCA9PSAtMSk7CisJCQkJcmV0dXJuIChyY3ZkKTsKKwkJCX0KKwkJCXJldHVy biAoLTEpOworCQl9CisKKwkJLyogU2F2ZSByZWNlaXZlZCBieXRlcyAqLworCQltc2d2ZWNbaV0u bXNnX2xlbiA9IHJldDsKKworCQlyY3ZkKys7CisJfQorCisJX3Rocl9jYW5jZWxfbGVhdmUoY3Vy dGhyZWFkLCByZXQgPT0gLTEpOworCisJcmV0dXJuIChyY3ZkKTsKK30KKworI3VuZGVmIFZMRU5f TUFYCisKIHZvaWQKIF9fdGhyX2ludGVycG9zZV9saWJjKHZvaWQpCiB7CkBAIC02NTIsNiArNzMw LDggQEAgX190aHJfaW50ZXJwb3NlX2xpYmModm9pZCkKIAlTTE9UKGtldmVudCk7CiAJU0xPVCh3 YWl0Nik7CiAJU0xPVChwcG9sbCk7CisJU0xPVChzZW5kbW1zZyk7CisJU0xPVChyZWN2bW1zZyk7 CiAjdW5kZWYgU0xPVAogCSooX19saWJjX2ludGVycG9zaW5nX3Nsb3QoCiAJICAgIElOVEVSUE9T X19wdGhyZWFkX211dGV4X2luaXRfY2FsbG9jX2NiKSkgPQpkaWZmIC0tZ2l0IGEvc3lzL3N5cy9z b2NrZXQuaCBiL3N5cy9zeXMvc29ja2V0LmgKaW5kZXggMThlMmRlMS4uNTA0MzEzZSAxMDA2NDQK LS0tIGEvc3lzL3N5cy9zb2NrZXQuaAorKysgYi9zeXMvc3lzL3NvY2tldC5oCkBAIC01OTUsNiAr NTk1LDE4IEBAIHN0cnVjdCBzZl9oZHRyIHsKICNlbmRpZiAvKiBfS0VSTkVMICovCiAjZW5kaWYg LyogX19CU0RfVklTSUJMRSAqLwogCisjaWZuZGVmIF9LRVJORUwKKyNpZmRlZiBfX0JTRF9WSVNJ QkxFCisvKgorICogU2VuZC9yZWN2bW1zZyBzcGVjaWZpYyBzdHJ1Y3R1cmUocykKKyAqLworc3Ry dWN0IG1tc2doZHIgeworCXN0cnVjdCBtc2doZHIJbXNnX2hkcjsJCS8qIG1lc3NhZ2UgaGVhZGVy ICovCisJdW5zaWduZWQgaW50CW1zZ19sZW47CQkvKiBtZXNzYWdlIGxlbmd0aCAgKi8KK307Cisj ZW5kaWYgLyogX19CU0RfVklTSUJMRSAqLworI2VuZGlmIC8qICFfS0VSTkVMICovCisKICNpZm5k ZWYJX0tFUk5FTAogCiAjaW5jbHVkZSA8c3lzL2NkZWZzLmg+CkBAIC02MTUsMTEgKzYyNywxNyBA QCBpbnQJbGlzdGVuKGludCwgaW50KTsKIHNzaXplX3QJcmVjdihpbnQsIHZvaWQgKiwgc2l6ZV90 LCBpbnQpOwogc3NpemVfdAlyZWN2ZnJvbShpbnQsIHZvaWQgKiwgc2l6ZV90LCBpbnQsIHN0cnVj dCBzb2NrYWRkciAqIF9fcmVzdHJpY3QsIHNvY2tsZW5fdCAqIF9fcmVzdHJpY3QpOwogc3NpemVf dAlyZWN2bXNnKGludCwgc3RydWN0IG1zZ2hkciAqLCBpbnQpOworI2lmIF9fQlNEX1ZJU0lCTEUK K2ludAlyZWN2bW1zZyhpbnQsIHN0cnVjdCBtbXNnaGRyICosIHVuc2lnbmVkIGludCwgaW50KTsK KyNlbmRpZgogc3NpemVfdAlzZW5kKGludCwgY29uc3Qgdm9pZCAqLCBzaXplX3QsIGludCk7CiBz c2l6ZV90CXNlbmR0byhpbnQsIGNvbnN0IHZvaWQgKiwKIAkgICAgc2l6ZV90LCBpbnQsIGNvbnN0 IHN0cnVjdCBzb2NrYWRkciAqLCBzb2NrbGVuX3QpOwogc3NpemVfdAlzZW5kbXNnKGludCwgY29u c3Qgc3RydWN0IG1zZ2hkciAqLCBpbnQpOwogI2lmIF9fQlNEX1ZJU0lCTEUKK2ludAlzZW5kbW1z ZyhpbnQsIHN0cnVjdCBtbXNnaGRyICosIHVuc2lnbmVkIGludCwgaW50KTsKKyNlbmRpZgorI2lm IF9fQlNEX1ZJU0lCTEUKIGludAlzZW5kZmlsZShpbnQsIGludCwgb2ZmX3QsIHNpemVfdCwgc3Ry dWN0IHNmX2hkdHIgKiwgb2ZmX3QgKiwgaW50KTsKIGludAlzZXRmaWIoaW50KTsKICNlbmRpZgo= --001a114a0eae44223e05292437ae--