Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1946043AbWLVLS1 (ORCPT ); Fri, 22 Dec 2006 06:18:27 -0500 Received: (majordomo@vger.kernel.org) by vger.kernel.org id S1946047AbWLVLS1 (ORCPT ); Fri, 22 Dec 2006 06:18:27 -0500 Received: from nf-out-0910.google.com ([64.233.182.187]:10928 "EHLO nf-out-0910.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1946043AbWLVLS0 (ORCPT ); Fri, 22 Dec 2006 06:18:26 -0500 DomainKey-Signature: a=rsa-sha1; q=dns; c=nofws; s=beta; d=gmail.com; h=received:message-id:date:from:to:subject:cc:in-reply-to:mime-version:content-type:references; b=eYpbEvqEqbeP58ZeSQQQL5WHi7A1JZXqfIhpGEtCbmg3TvAkmh26NFQUBr2Sf1vwo8bfAMyNK8YGDP5c4yBHAM3MleJI34xTyJS6Ktp6OaSfBwJCrOb5W2YVDJ8ZFDdcBf/sPS2ooHbuxtbpkRLvGVmrRDAD8VRWdUks+O1a20g= Message-ID: Date: Fri, 22 Dec 2006 13:18:24 +0200 From: "saeed bishara" To: "Jens Axboe" Subject: Re: using splice/vmsplice to improve file receive performance Cc: linux-kernel@vger.kernel.org In-Reply-To: <20061222094858.GP17199@kernel.dk> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="----=_Part_37976_8697689.1166786304007" References: <20061222094858.GP17199@kernel.dk> Sender: linux-kernel-owner@vger.kernel.org X-Mailing-List: linux-kernel@vger.kernel.org Content-Length: 32829 Lines: 462 ------=_Part_37976_8697689.1166786304007 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit Content-Disposition: inline On 12/22/06, Jens Axboe wrote: > On Thu, Dec 21 2006, saeed bishara wrote: > > Hi, > > I'm trying to use the splice/vmsplice system calls to improve the > > samba server write throughput, but before touching the smbd, I started > > to improve the ttcp tool since it simple and has the same flow. I'm > > expecting to avoid the "copy_from_user" path when using those > > syscalls. > > so far, I couldn't make any improvement, actually the throughput get > > worst. the new receive flow looks like this (code also attached): > > 1. read tcp packet (64 pages) to page aligned buffer. > > 2. vmsplice the buffer to pipe with SPLICE_F_MOVE. > > 3. splice the pipe to the file, also with SPLICE_F_MOVE. > > > > the strace shows that the splice takes a lot of time. also when > > profiling the kernel, I found that the memcpy() called to often !! > > (didn't see this until now, axboe@suse.de doesn't work anymore) > > I'm assuming that you mean you vmsplice with SPLICE_F_GIFT, to hand > ownership of the pages to the kernel (in which case SPLICE_F_MOVE will > work, otherwise you get a copy)? If not, that'll surely cost you a data > copy I'll try the vmplice with SPLICE_F_GIFT and splice with MOVE. btw, I noticed that the splice system call takes the bulk of the time, does it mean anything? > > This sounds remarkably like a recent thread on lkml, you may want to > read up on that. Basically using splice for network receive is a bit of > a work-around now, since you do need the one copy and then vmsplice that > into a pipe. To realize the full potential of splice, we first need > socket receive support so you can skip that step (splice from socket to > pipe, splice pipe to file). Ashwini Kulkarni posted patches that implements that, see http://lkml.org/lkml/2006/9/20/272 . is that right? > > There was no test code attached, btw. sorry, here it is. can you please add sample application to your test tools (splice,fio ,,) that demonstrates my flow; socket to file using read & vmsplice? > > -- > Jens Axboe > > ------=_Part_37976_8697689.1166786304007 Content-Type: text/plain; name=ttcp.c; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_ew0i2149 Content-Disposition: attachment; filename="ttcp.c" LyoKICoJVCBUIEMgUCAuIEMKICoKICogVGVzdCBUQ1AgY29ubmVjdGlvbi4gIE1ha2VzIGEgY29u bmVjdGlvbiBvbiBwb3J0IDIwMDAKICogYW5kIHRyYW5zZmVycyB6ZXJvIGJ1ZmZlcnMgb3IgZGF0 YSBjb3BpZWQgZnJvbSBzdGRpbi4KICoKICogVXNhYmxlIG9uIDQuMiwgNC4zLCBhbmQgNC4xYSBz eXN0ZW1zIGJ5IGRlZmluaW5nIG9uZSBvZgogKiBCU0Q0MiBCU0Q0MyAoQlNENDFhKQogKgogKiBN b2RpZmllZCBmb3Igb3BlcmF0aW9uIHVuZGVyIDQuMkJTRCwgMTggRGVjIDg0CiAqICAgICAgVC5D LiBTbGF0dGVyeSwgVVNOQQogKiBNaW5vciBpbXByb3ZlbWVudHMsIE1pa2UgTXV1c3MgYW5kIFRl cnJ5IFNsYXR0ZXJ5LCAxNi1PY3QtODUuCiAqCiAqIE1pa2UgTXV1c3MgYW5kIFRlcnJ5IFNsYXR0 ZXJ5IGhhdmUgcmVsZWFzZWQgdGhpcyBjb2RlIHRvIHRoZSBQdWJsaWMgRG9tYWluLgogKi8KCgoj ZGVmaW5lIEJTRDQzCi8qICNkZWZpbmUgQlNENDIgKi8KLyogI2RlZmluZSBCU0Q0MWEgKi8KCiNp bmNsdWRlIDxzdGRpby5oPgojaW5jbHVkZSA8c3RkbGliLmg+CiNpbmNsdWRlIDxzdHJpbmdzLmg+ CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPHVuaXN0ZC5oPgojaW5jbHVkZSA8Y3R5cGUu aD4KI2luY2x1ZGUgPGVycm5vLmg+CiNpbmNsdWRlIDxzeXMvc29ja2V0Lmg+CiNpbmNsdWRlIDxu ZXRpbmV0L2luLmg+CiNpbmNsdWRlIDxhcnBhL2luZXQuaD4KI2luY2x1ZGUgPHN5cy90eXBlcy5o PgojaW5jbHVkZSA8c3lzL3NvY2tldC5oPgojaW5jbHVkZSA8bmV0aW5ldC9pbi5oPgojaW5jbHVk ZSA8bmV0ZGIuaD4KI2luY2x1ZGUgPHN5cy90aW1lLmg+CQkvKiBzdHJ1Y3QgdGltZXZhbCAqLwoK I2lmZGVmIFNZU1YKI2luY2x1ZGUgPHN5cy90aW1lcy5oPgojaW5jbHVkZSA8c3lzL3BhcmFtLmg+ CiNlbHNlCiNpbmNsdWRlIDxzeXMvcmVzb3VyY2UuaD4KI2VuZGlmCgojaW5jbHVkZSAic3BsaWNl LmgiCgojaWZuZGVmIE1BWF9TUExJQ0VfU0laRQojZGVmaW5lIE1BWF9TUExJQ0VfU0laRSAoNjQg KiAxMDI0KQojZW5kaWYKCiNkZWZpbmUgVk1fQlVGRkVSUwkyCiNkZWZpbmUgQUxJR04odmFsdWUs c2l6ZSkgKCgodmFsdWUpICsgKHNpemUpIC0gMSkgJiB+KChzaXplKSAtIDEpKQoKc3RydWN0IHNv Y2thZGRyX2luIHNpbm1lOwpzdHJ1Y3Qgc29ja2FkZHJfaW4gc2luaGltOwpzdHJ1Y3Qgc29ja2Fk ZHJfaW4gc2luZHVtOwpzdHJ1Y3Qgc29ja2FkZHJfaW4gZnJvbWluZXQ7CgppbnQgZG9tYWluLCBm cm9tbGVuOwppbnQgZmQ7CQkJCS8qIGZkIG9mIG5ldHdvcmsgc29ja2V0ICovCgppbnQgcGZkcy8q W1ZNX0JVRkZFUlNdKi9bMl07CQkJLyogZmRzIGZvciBwaXBlICovCmludCBidWZsZW4gPSAxMDI0 OwkJLyogbGVuZ3RoIG9mIGJ1ZmZlciAqLwpjaGFyICpidWY7CQkJLyogcHRyIHRvIGR5bmFtaWMg YnVmZmVyICovCmludCBuYnVmID0gMTAyNDsJCS8qIG51bWJlciBvZiBidWZmZXJzIHRvIHNlbmQg aW4gc2lua21vZGUgKi8KCnNpemVfdCBwaXBlX2J1Zl9zaXplOwpjaGFyICpwaXBlX2J1ZjsKCmlu dCB1ZHAgPSAwOwkJCS8qIDAgPSB0Y3AsICEwID0gdWRwICovCmludCBvcHRpb25zID0gMDsJCS8q IHNvY2tldCBvcHRpb25zICovCmludCBvbmUgPSAxOyAgICAgICAgICAgICAgICAgICAgLyogZm9y IDQuMyBCU0Qgc3R5bGUgc2V0c29ja29wdCgpICovCnNob3J0IHBvcnQgPSAyMDAwOwkJLyogVENQ IHBvcnQgbnVtYmVyICovCmNoYXIgKmhvc3Q7CQkJLyogcHRyIHRvIG5hbWUgb2YgaG9zdCAqLwpp bnQgdHJhbnM7CQkJLyogMD1yZWNlaXZlLCAhMD10cmFuc21pdCBtb2RlICovCmludCBzaW5rbW9k ZTsJCQkvKiAwPW5vcm1hbCBJL08sICEwPXNpbmsvc291cmNlIG1vZGUgKi8KaW50IHNwbGljZW1v ZGU7CQkJLyogMD1ub3JtYWwgSS9PLCAhMD1zcGxpY2UgbW9kZSAqLwoKc3RydWN0IGhvc3RlbnQg KmFkZHI7CmV4dGVybiBpbnQgZXJybm87CgpjaGFyIFVzYWdlW10gPSAiXApVc2FnZTogdHRjcCAt dCBbLW9wdGlvbnNdIGhvc3QgPGluXG5cCgktbCMjCWxlbmd0aCBvZiBidWZzIHdyaXR0ZW4gdG8g bmV0d29yayAoZGVmYXVsdCAxMDI0KVxuXAoJLXMJc291cmNlIGEgcGF0dGVybiB0byBuZXR3b3Jr XG5cCgktbiMjCW51bWJlciBvZiBidWZzIHdyaXR0ZW4gdG8gbmV0d29yayAoLXMgb25seSwgZGVm YXVsdCAxMDI0KVxuXAoJLXAjIwlwb3J0IG51bWJlciB0byBzZW5kIHRvIChkZWZhdWx0IDIwMDAp XG5cCgktdQl1c2UgVURQIGluc3RlYWQgb2YgVENQXG5cClVzYWdlOiB0dGNwIC1yIFstb3B0aW9u c10gPm91dFxuXAoJLWwjIwlsZW5ndGggb2YgbmV0d29yayByZWFkIGJ1ZiAoZGVmYXVsdCAxMDI0 KVxuXAoJLXMJc2luayAoZGlzY2FyZCkgYWxsIGRhdGEgZnJvbSBuZXR3b3JrXG5cCgktegl1c2Ug dGhlIHNwbGljZSBzeXNjYWxsXG5cCgktcCMjCXBvcnQgbnVtYmVyIHRvIGxpc3RlbiBhdCAoZGVm YXVsdCAyMDAwKVxuXAoJLUIJT25seSBvdXRwdXQgZnVsbCBibG9ja3MsIGFzIHNwZWNpZmllZCBp biAtbCMjIChmb3IgVEFSKVxuXAoJLXUJdXNlIFVEUCBpbnN0ZWFkIG9mIFRDUFxuXAoiOwkKCmNo YXIgc3RhdHNbMTI4XTsKZG91YmxlIHQ7CQkJLyogdHJhbnNtaXNzaW9uIHRpbWUgKi8KbG9uZyBu Ynl0ZXM7CQkJLyogYnl0ZXMgb24gbmV0ICovCmludCBiX2ZsYWcgPSAwOwkJCS8qIHVzZSBtcmVh ZCgpICovCgp2b2lkIHByZXBfdGltZXIoKTsKZG91YmxlIHJlYWRfdGltZXIoKTsKZG91YmxlIGNw dXQsIHJlYWx0OwkJLyogdXNlciwgcmVhbCB0aW1lIChzZWNvbmRzKSAqLwp2b2lkIGVycihjaGFy ICpzKTsKdm9pZCBtZXMoY2hhciAqcyk7CnZvaWQgcGF0dGVybihyZWdpc3RlciBjaGFyICpjcCwK CXJlZ2lzdGVyIGludCBjbnQpOwppbnQgTnJlYWQoIGludCBmZCwgY2hhciAqYnVmLCBpbnQgY291 bnQgKTsKaW50IE53cml0ZSggaW50IGZkLCBjaGFyICpidWYsIGludCBjb3VudCApOwppbnQgbXJl YWQoaW50IGZkLCBjaGFyICpidWZwLCB1bnNpZ25lZCBpbnQgbik7CnZvaWQgc2V0dXBfdm1zcGxp Y2UoKTsKdWludDY0X3Qgdm1zcGxpY2VfcmVjdihpbnQgc2QsIGludCBmZCk7Ci8vaW50IGRlbGF5 KGludCB1cyk7CgppbnQKbWFpbihhcmdjLGFyZ3YpCiAgICAgaW50IGFyZ2M7CiAgICAgY2hhciAq KmFyZ3Y7CnsKICB1bnNpZ25lZCBsb25nIGFkZHJfdG1wOwoKICBpZiAoYXJnYyA8IDIpIGdvdG8g dXNhZ2U7CgogIGFyZ3YrKzsgYXJnYy0tOwogIHdoaWxlKCBhcmdjPjAgJiYgYXJndlswXVswXSA9 PSAnLScgKSAgewogICAgc3dpdGNoIChhcmd2WzBdWzFdKSB7CgogICAgY2FzZSAnQic6CiAgICAg IGJfZmxhZyA9IDE7CiAgICAgIGJyZWFrOwogICAgY2FzZSAndCc6CiAgICAgIHRyYW5zID0gMTsK ICAgICAgYnJlYWs7CiAgICBjYXNlICdyJzoKICAgICAgdHJhbnMgPSAwOwogICAgICBicmVhazsK ICAgIGNhc2UgJ2QnOgogICAgICBvcHRpb25zIHw9IFNPX0RFQlVHOwogICAgICBicmVhazsKICAg IGNhc2UgJ24nOgogICAgICBuYnVmID0gYXRvaSgmYXJndlswXVsyXSk7CiAgICAgIGJyZWFrOwog ICAgY2FzZSAnbCc6CiAgICAgIGJ1ZmxlbiA9IGF0b2koJmFyZ3ZbMF1bMl0pOwogICAgICBicmVh azsKICAgIGNhc2UgJ3MnOgogICAgICBzaW5rbW9kZSA9IDE7CS8qIHNvdXJjZSBvciBzaW5rLCBy ZWFsbHkgKi8KICAgICAgYnJlYWs7CiAgICBjYXNlICd6JzoKICAgICAgc3BsaWNlbW9kZSA9IDE7 CS8qIHNwbGljZSBtb2RlICovCiAgICAgIGJyZWFrOwogICAgY2FzZSAncCc6CiAgICAgIHBvcnQg PSBhdG9pKCZhcmd2WzBdWzJdKTsKICAgICAgYnJlYWs7CiAgICBjYXNlICd1JzoKICAgICAgdWRw ID0gMTsKICAgICAgYnJlYWs7CiAgICBkZWZhdWx0OgogICAgICBnb3RvIHVzYWdlOwogICAgfQog ICAgYXJndisrOyBhcmdjLS07CiAgfQogIGlmKHRyYW5zKSAgewogICAgLyogeG1pdHIgKi8KICAg IGlmIChhcmdjICE9IDEpIGdvdG8gdXNhZ2U7CiAgICBiemVybygoY2hhciAqKSZzaW5oaW0sIHNp emVvZihzaW5oaW0pKTsKICAgIGhvc3QgPSBhcmd2WzBdOwogICAgaWYgKGF0b2koaG9zdCkgPiAw ICkgIHsKICAgICAgLyogTnVtZXJpYyAqLwogICAgICBzaW5oaW0uc2luX2ZhbWlseSA9IEFGX0lO RVQ7CiNpZmRlZiBjcmF5CiAgICAgIGFkZHJfdG1wID0gaW5ldF9hZGRyKGhvc3QpOwogICAgICBz aW5oaW0uc2luX2FkZHIgPSBhZGRyX3RtcDsKI2Vsc2UKICAgICAgc2luaGltLnNpbl9hZGRyLnNf YWRkciA9IGluZXRfYWRkcihob3N0KTsKI2VuZGlmCiAgICB9IGVsc2UgewogICAgICBpZiAoKGFk ZHI9Z2V0aG9zdGJ5bmFtZShob3N0KSkgPT0gTlVMTCkKICAgICAgICBlcnIoImJhZCBob3N0bmFt ZSIpOwogICAgICBzaW5oaW0uc2luX2ZhbWlseSA9IGFkZHItPmhfYWRkcnR5cGU7CiAgICAgIGJj b3B5KGFkZHItPmhfYWRkciwoY2hhciopJmFkZHJfdG1wLCBhZGRyLT5oX2xlbmd0aCk7CiNpZmRl ZiBjcmF5CiAgICAgIHNpbmhpbS5zaW5fYWRkciA9IGFkZHJfdG1wOwojZWxzZQogICAgICBzaW5o aW0uc2luX2FkZHIuc19hZGRyID0gYWRkcl90bXA7CiNlbmRpZgogICAgfQogICAgc2luaGltLnNp bl9wb3J0ID0gaHRvbnMocG9ydCk7CiAgICBzaW5tZS5zaW5fcG9ydCA9IDA7CQkvKiBmcmVlIGNo b2ljZSAqLwogIH0gZWxzZSB7CiAgICAvKiByY3ZyICovCiAgICBzaW5tZS5zaW5fcG9ydCA9ICBo dG9ucyhwb3J0KTsKICB9CgogIGlmKCAoYnVmID0gKGNoYXIgKiltYWxsb2MoYnVmbGVuKSkgPT0g KGNoYXIgKilOVUxMKQogICAgZXJyKCJtYWxsb2MiKTsKICBmcHJpbnRmKHN0ZGVyciwidHRjcCVz OiBuYnVmPSVkLCBidWZsZW49JWQsIHBvcnQ9JWRcbiIsCiAgICAgICAgICB0cmFucz8iLXQiOiIt ciIsCiAgICAgICAgICBuYnVmLCBidWZsZW4sIHBvcnQpOwoKICBpZiAoKGZkID0gc29ja2V0KEFG X0lORVQsIHVkcD9TT0NLX0RHUkFNOlNPQ0tfU1RSRUFNLCAwKSkgPCAwKQogICAgZXJyKCJzb2Nr ZXQiKTsKICBtZXMoInNvY2tldCIpOwoKICBpZiAoYmluZChmZCwgJnNpbm1lLCBzaXplb2Yoc2lu bWUpKSA8IDApCiAgICBlcnIoImJpbmQiKTsKCiAgaWYgKCF1ZHApICB7CiAgICBpZiAodHJhbnMp IHsKICAgICAgLyogV2UgYXJlIHRoZSBjbGllbnQgaWYgdHJhbnNtaXR0aW5nICovCiAgICAgIGlm KG9wdGlvbnMpICB7CiNpZmRlZiBCU0Q0MgogICAgICAgIGlmKCBzZXRzb2Nrb3B0KGZkLCBTT0xf U09DS0VULCBvcHRpb25zLCAwLCAwKSA8IDApCiNlbHNlIAogICAgICAgICAgaWYoIHNldHNvY2tv cHQoZmQsIFNPTF9TT0NLRVQsIG9wdGlvbnMsICZvbmUsIHNpemVvZihvbmUpKSA8IDApCiNlbmRp ZgogICAgICAgICAgICBlcnIoInNldHNvY2tvcHQiKTsKICAgICAgfQogICAgICBpZihjb25uZWN0 KGZkLCAmc2luaGltLCBzaXplb2Yoc2luaGltKSApIDwgMCkKICAgICAgICBlcnIoImNvbm5lY3Qi KTsKICAgICAgbWVzKCJjb25uZWN0Iik7CiAgICB9IGVsc2UgewogICAgICAvKiBvdGhlcndpc2Us IHdlIGFyZSB0aGUgc2VydmVyIGFuZCAKICAgICAgICogc2hvdWxkIGxpc3RlbiBmb3IgdGhlIGNv bm5lY3Rpb25zCiAgICAgICAqLwogICAgICBsaXN0ZW4oZmQsMCk7ICAgLyogYWxsb3cgYSBxdWV1 ZSBvZiAwICovCiAgICAgIGlmKG9wdGlvbnMpICB7CiNpZmRlZiBCU0Q0MgogICAgICAgIGlmKCBz ZXRzb2Nrb3B0KGZkLCBTT0xfU09DS0VULCBvcHRpb25zLCAwLCAwKSA8IDApCiNlbHNlCiAgICAg ICAgICBpZiggc2V0c29ja29wdChmZCwgU09MX1NPQ0tFVCwgb3B0aW9ucywgJm9uZSwgc2l6ZW9m KG9uZSkpIDwgMCkKI2VuZGlmCiAgICAgICAgICAgIGVycigic2V0c29ja29wdCIpOwogICAgICB9 CiAgICAgIGZyb21sZW4gPSBzaXplb2YoZnJvbWluZXQpOwogICAgICBkb21haW4gPSBBRl9JTkVU OwogICAgICBpZigoZmQ9YWNjZXB0KGZkLCAmZnJvbWluZXQsICZmcm9tbGVuKSApIDwgMCkKICAg ICAgICBlcnIoImFjY2VwdCIpOwogICAgICBtZXMoImFjY2VwdCIpOwogICAgfQogIH0KICAKICBp ZiAoc3BsaWNlbW9kZSl7CiAgICBwaXBlX2J1Zl9zaXplID0gYnVmbGVuOwogICAgc2V0dXBfdm1z cGxpY2UoKTsKICB9CiAgcHJlcF90aW1lcigpOyAgICAgICAgIAogIGVycm5vID0gMDsKCWlmIChz aW5rbW9kZSkgeyAgICAgIAogICAgICAgICAgcmVnaXN0ZXIgaW50IGNudDsKICAgICAgICAgIGlm ICh0cmFucykgIHsKICAgICAgICAgICAgcGF0dGVybiggYnVmLCBidWZsZW4gKTsKICAgICAgICAg ICAgaWYodWRwKSAgKHZvaWQpTndyaXRlKCBmZCwgYnVmLCA0ICk7IC8qIHJjdnIgc3RhcnQgKi8K ICAgICAgICAgICAgd2hpbGUgKG5idWYtLSAmJiBOd3JpdGUoZmQsYnVmLGJ1ZmxlbikgPT0gYnVm bGVuKQogICAgICAgICAgICAgIG5ieXRlcyArPSBidWZsZW47CiAgICAgICAgICAgIGlmKHVkcCkg ICh2b2lkKU53cml0ZSggZmQsIGJ1ZiwgNCApOyAvKiByY3ZyIGVuZCAqLwogICAgICAgICAgfSBl bHNlIHsKICAgICAgICAgICAgd2hpbGUgKChjbnQ9TnJlYWQoZmQsYnVmLGJ1ZmxlbikpID4gMCkg IHsKICAgICAgICAgICAgICBzdGF0aWMgaW50IGdvaW5nID0gMDsKICAgICAgICAgICAgICBpZigg Y250IDw9IDQgKSAgewogICAgICAgICAgICAgICAgaWYoIGdvaW5nICkKICAgICAgICAgICAgICAg ICAgYnJlYWs7CS8qICJFT0YiICovCiAgICAgICAgICAgICAgICBnb2luZyA9IDE7CiAgICAgICAg ICAgICAgICBwcmVwX3RpbWVyKCk7CiAgICAgICAgICAgICAgfSBlbHNlCiAgICAgICAgICAgICAg ICBuYnl0ZXMgKz0gY250OwogICAgICAgICAgICB9CiAgICAgICAgICB9Cgl9IGVsc2UgewogICAg ICAgICAgcmVnaXN0ZXIgaW50IGNudDsKICAgICAgICAgIGlmICh0cmFucykgIHsKICAgICAgICAg ICAgd2hpbGUoKGNudD1yZWFkKDAsYnVmLGJ1ZmxlbikpID4gMCAmJgogICAgICAgICAgICAgICAg ICBOd3JpdGUoZmQsYnVmLGNudCkgPT0gY250KQogICAgICAgICAgICAgIG5ieXRlcyArPSBjbnQ7 CiAgICAgICAgICB9ICBlbHNlICB7CiAgICAgICAgICAgIGlmKHNwbGljZW1vZGUpCiAgICAgICAg ICAgICAgewoJCXdoaWxlKChjbnQ9dm1zcGxpY2VfcmVjdihmZCwgMSkpID4gMCkKCQkgIG5ieXRl cyArPSBjbnQ7CiAgICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAg ewogICAgICAgICAgICAgICAgd2hpbGUoKGNudD1OcmVhZChmZCxidWYsYnVmbGVuKSkgPiAwICYm CiAgICAgICAgICAgICAgICAgICAgICB3cml0ZSgxLGJ1ZixjbnQpID09IGNudCkKICAgICAgICAg ICAgICAgICAgbmJ5dGVzICs9IGNudDsKICAgICAgICAgICAgICB9CiAgICAgICAgICB9Cgl9Cglp ZihlcnJubykgZXJyKCJJTyIpOwoJKHZvaWQpcmVhZF90aW1lcihzdGF0cyxzaXplb2Yoc3RhdHMp KTsKCWlmKHVkcCYmdHJhbnMpICB7CgkJKHZvaWQpTndyaXRlKCBmZCwgYnVmLCA0ICk7IC8qIHJj dnIgZW5kICovCgkJKHZvaWQpTndyaXRlKCBmZCwgYnVmLCA0ICk7IC8qIHJjdnIgZW5kICovCgkJ KHZvaWQpTndyaXRlKCBmZCwgYnVmLCA0ICk7IC8qIHJjdnIgZW5kICovCgkJKHZvaWQpTndyaXRl KCBmZCwgYnVmLCA0ICk7IC8qIHJjdnIgZW5kICovCgl9CglmcHJpbnRmKHN0ZGVyciwidHRjcCVz OiAlc1xuIiwgdHJhbnM/Ii10IjoiLXIiLCBzdGF0cyk7CglpZiggY3B1dCA8PSAwLjAgKSAgY3B1 dCA9IDAuMDAxOwoJaWYoIHJlYWx0IDw9IDAuMCApICByZWFsdCA9IDAuMDAxOwoJZnByaW50Zihz dGRlcnIsInR0Y3AlczogJWxkIGJ5dGVzIHByb2Nlc3NlZFxuIiwKCQl0cmFucz8iLXQiOiItciIs IG5ieXRlcyApOwoJZnByaW50ZihzdGRlcnIsInR0Y3AlczogJTlnIENQVSBzZWMgID0gJTlnIEtC L2NwdSBzZWMsICAlOWcgS2JpdHMvY3B1IHNlY1xuIiwKCQl0cmFucz8iLXQiOiItciIsCgkJY3B1 dCwKCQkoKGRvdWJsZSluYnl0ZXMpL2NwdXQvMTAyNCwKCQkoKGRvdWJsZSluYnl0ZXMpKjgvY3B1 dC8xMDI0ICk7CglmcHJpbnRmKHN0ZGVyciwidHRjcCVzOiAlOWcgcmVhbCBzZWMgPSAlOWcgS0Iv cmVhbCBzZWMsICU5ZyBLYml0cy9zZWNcbiIsCgkJdHJhbnM/Ii10IjoiLXIiLAoJCXJlYWx0LAoJ CSgoZG91YmxlKW5ieXRlcykvcmVhbHQvMTAyNCwKCQkoKGRvdWJsZSluYnl0ZXMpKjgvcmVhbHQv MTAyNCApOwoJZXhpdCgwKTsKCnVzYWdlOgoJZnByaW50ZihzdGRlcnIsVXNhZ2UpOwoJZXhpdCgx KTsKfQoKdm9pZAplcnIocykKY2hhciAqczsKewoJZnByaW50ZihzdGRlcnIsInR0Y3AlczogIiwg dHJhbnM/Ii10IjoiLXIiKTsKCXBlcnJvcihzKTsKCWZwcmludGYoc3RkZXJyLCJlcnJubz0lZFxu IixlcnJubyk7CglleGl0KDEpOwp9Cgp2b2lkCm1lcyhzKQpjaGFyICpzOwp7CglmcHJpbnRmKHN0 ZGVyciwidHRjcCVzOiAlc1xuIiwgdHJhbnM/Ii10IjoiLXIiLCBzKTsKfQoKdm9pZApwYXR0ZXJu KCBjcCwgY250ICkKcmVnaXN0ZXIgY2hhciAqY3A7CnJlZ2lzdGVyIGludCBjbnQ7CnsKCXJlZ2lz dGVyIGNoYXIgYzsKCWMgPSAwOwoJd2hpbGUoIGNudC0tID4gMCApICB7CgkJd2hpbGUoICFpc3By aW50KChjJjB4N0YpKSApICBjKys7CgkJKmNwKysgPSAoYysrJjB4N0YpOwoJfQp9CgovKioqKioq KiB0aW1pbmcgKioqKioqKioqLwoKI2lmZGVmIFNZU1YKZXh0ZXJuIGxvbmcgdGltZSgpOwpzdGF0 aWMgbG9uZyB0aW1lMDsKc3RhdGljIHN0cnVjdCB0bXMgdG1zMDsKI2Vsc2UKc3RhdGljIHN0cnVj dAl0aW1ldmFsIHRpbWUwOwkvKiBUaW1lIGF0IHdoaWNoIHRpbWVpbmcgc3RhcnRlZCAqLwpzdGF0 aWMgc3RydWN0CXJ1c2FnZSBydTA7CS8qIFJlc291cmNlIHV0aWxpemF0aW9uIGF0IHRoZSBzdGFy dCAqLwoKc3RhdGljIHZvaWQgcHJ1c2FnZSgpOwpzdGF0aWMgdm9pZCB0dmFkZCgpOwpzdGF0aWMg dm9pZCB0dnN1YigpOwpzdGF0aWMgdm9pZCBwc2VjcygpOwojZW5kaWYKCi8qCiAqCQkJUCBSIEUg UCBfIFQgSSBNIEUgUgogKi8Kdm9pZApwcmVwX3RpbWVyKCkKewojaWZkZWYgU1lTVgoJKHZvaWQp dGltZSgmdGltZTApOwoJKHZvaWQpdGltZXMoJnRtczApOwojZWxzZQoJZ2V0dGltZW9mZGF5KCZ0 aW1lMCwgKHN0cnVjdCB0aW1lem9uZSAqKTApOwoJZ2V0cnVzYWdlKFJVU0FHRV9TRUxGLCAmcnUw KTsKI2VuZGlmCn0KCi8qCiAqCQkJUiBFIEEgRCBfIFQgSSBNIEUgUgogKiAKICovCmRvdWJsZQpy ZWFkX3RpbWVyKHN0cixsZW4pCmNoYXIgKnN0cjsKewojaWZkZWYgU1lTVgoJbG9uZyBub3c7Cglz dHJ1Y3QgdG1zIHRtc25vdzsKCWNoYXIgbGluZVsxMzJdOwoKCSh2b2lkKXRpbWUoJm5vdyk7Cgly ZWFsdCA9IG5vdy10aW1lMDsKCSh2b2lkKXRpbWVzKCZ0bXNub3cpOwoJY3B1dCA9IHRtc25vdy50 bXNfdXRpbWUgLSB0bXMwLnRtc191dGltZTsKCWNwdXQgLz0gSFo7CglpZiggY3B1dCA8IDAuMDAw MDEgKSAgY3B1dCA9IDAuMDE7CglpZiggcmVhbHQgPCAwLjAwMDAxICkgIHJlYWx0ID0gY3B1dDsK CXNwcmludGYobGluZSwiJWcgQ1BVIHNlY3MgaW4gJWcgZWxhcHNlZCBzZWNzICglZyUlKSIsCgkJ Y3B1dCwgcmVhbHQsCgkJY3B1dC9yZWFsdCoxMDAgKTsKCSh2b2lkKXN0cm5jcHkoIHN0ciwgbGlu ZSwgbGVuICk7CglyZXR1cm4oIGNwdXQgKTsKI2Vsc2UKCS8qIEJTRCAqLwoJc3RydWN0IHRpbWV2 YWwgdGltZWRvbDsKCXN0cnVjdCBydXNhZ2UgcnUxOwoJc3RydWN0IHRpbWV2YWwgdGQ7CglzdHJ1 Y3QgdGltZXZhbCB0ZW5kLCB0c3RhcnQ7CgljaGFyIGxpbmVbMTMyXTsKCglnZXRydXNhZ2UoUlVT QUdFX1NFTEYsICZydTEpOwoJZ2V0dGltZW9mZGF5KCZ0aW1lZG9sLCAoc3RydWN0IHRpbWV6b25l ICopMCk7CglwcnVzYWdlKCZydTAsICZydTEsICZ0aW1lZG9sLCAmdGltZTAsIGxpbmUpOwoJKHZv aWQpc3RybmNweSggc3RyLCBsaW5lLCBsZW4gKTsKCgkvKiBHZXQgcmVhbCB0aW1lICovCgl0dnN1 YiggJnRkLCAmdGltZWRvbCwgJnRpbWUwICk7CglyZWFsdCA9IHRkLnR2X3NlYyArICgoZG91Ymxl KXRkLnR2X3VzZWMpIC8gMTAwMDAwMDsKCgkvKiBHZXQgQ1BVIHRpbWUgKHVzZXIrc3lzKSAqLwoJ dHZhZGQoICZ0ZW5kLCAmcnUxLnJ1X3V0aW1lLCAmcnUxLnJ1X3N0aW1lICk7Cgl0dmFkZCggJnRz dGFydCwgJnJ1MC5ydV91dGltZSwgJnJ1MC5ydV9zdGltZSApOwoJdHZzdWIoICZ0ZCwgJnRlbmQs ICZ0c3RhcnQgKTsKCWNwdXQgPSB0ZC50dl9zZWMgKyAoKGRvdWJsZSl0ZC50dl91c2VjKSAvIDEw MDAwMDA7CglpZiggY3B1dCA8IDAuMDAwMDEgKSAgY3B1dCA9IDAuMDAwMDE7CglyZXR1cm4oIGNw dXQgKTsKI2VuZGlmCn0KCiNpZm5kZWYgU1lTVgpzdGF0aWMgdm9pZApwcnVzYWdlKHIwLCByMSwg ZSwgYiwgb3V0cCkKCXJlZ2lzdGVyIHN0cnVjdCBydXNhZ2UgKnIwLCAqcjE7CglzdHJ1Y3QgdGlt ZXZhbCAqZSwgKmI7CgljaGFyICpvdXRwOwp7CglzdHJ1Y3QgdGltZXZhbCB0ZGlmZjsKCXJlZ2lz dGVyIHRpbWVfdCB0OwoJcmVnaXN0ZXIgY2hhciAqY3A7CglyZWdpc3RlciBpbnQgaTsKCWludCBt czsKCgl0ID0gKHIxLT5ydV91dGltZS50dl9zZWMtcjAtPnJ1X3V0aW1lLnR2X3NlYykqMTAwKwoJ ICAgIChyMS0+cnVfdXRpbWUudHZfdXNlYy1yMC0+cnVfdXRpbWUudHZfdXNlYykvMTAwMDArCgkg ICAgKHIxLT5ydV9zdGltZS50dl9zZWMtcjAtPnJ1X3N0aW1lLnR2X3NlYykqMTAwKwoJICAgIChy MS0+cnVfc3RpbWUudHZfdXNlYy1yMC0+cnVfc3RpbWUudHZfdXNlYykvMTAwMDA7CgltcyA9ICAo ZS0+dHZfc2VjLWItPnR2X3NlYykqMTAwICsgKGUtPnR2X3VzZWMtYi0+dHZfdXNlYykvMTAwMDA7 CgojZGVmaW5lIEVORCh4KQl7d2hpbGUoKngpIHgrKzt9CgljcCA9ICIlVXVzZXIgJVNzeXMgJUVy ZWFsICVQICVYaSslRGQgJU1tYXhyc3MgJUYrJVJwZiAlQ2NzdyI7Cglmb3IgKDsgKmNwOyBjcCsr KSAgewoJCWlmICgqY3AgIT0gJyUnKQoJCQkqb3V0cCsrID0gKmNwOwoJCWVsc2UgaWYgKGNwWzFd KSBzd2l0Y2goKisrY3ApIHsKCgkJY2FzZSAnVSc6CgkJCXR2c3ViKCZ0ZGlmZiwgJnIxLT5ydV91 dGltZSwgJnIwLT5ydV91dGltZSk7CgkJCXNwcmludGYob3V0cCwiJWQuJTAxbGQiLChpbnQpIHRk aWZmLnR2X3NlYywgdGRpZmYudHZfdXNlYy8xMDAwMDApOwoJCQlFTkQob3V0cCk7CgkJCWJyZWFr OwoKCQljYXNlICdTJzoKCQkJdHZzdWIoJnRkaWZmLCAmcjEtPnJ1X3N0aW1lLCAmcjAtPnJ1X3N0 aW1lKTsKCQkJc3ByaW50ZihvdXRwLCIlZC4lMDFsZCIsIChpbnQgKXRkaWZmLnR2X3NlYywgdGRp ZmYudHZfdXNlYy8xMDAwMDApOwoJCQlFTkQob3V0cCk7CgkJCWJyZWFrOwoKCQljYXNlICdFJzoK CQkJcHNlY3MobXMgLyAxMDAsIG91dHApOwoJCQlFTkQob3V0cCk7CgkJCWJyZWFrOwoKCQljYXNl ICdQJzoKCQkJc3ByaW50ZihvdXRwLCIlZCUlIiwgKGludCkgKHQqMTAwIC8gKChtcyA/IG1zIDog MSkpKSk7CgkJCUVORChvdXRwKTsKCQkJYnJlYWs7CgoJCWNhc2UgJ1cnOgoJCQlpID0gcjEtPnJ1 X25zd2FwIC0gcjAtPnJ1X25zd2FwOwoJCQlzcHJpbnRmKG91dHAsIiVkIiwgaSk7CgkJCUVORChv dXRwKTsKCQkJYnJlYWs7CgoJCWNhc2UgJ1gnOgoJCQlzcHJpbnRmKG91dHAsIiVsZCIsIHQgPT0g MCA/IDAgOiAocjEtPnJ1X2l4cnNzLXIwLT5ydV9peHJzcykvdCk7CgkJCUVORChvdXRwKTsKCQkJ YnJlYWs7CgoJCWNhc2UgJ0QnOgoJCQlzcHJpbnRmKG91dHAsIiVsZCIsIHQgPT0gMCA/IDAgOgoJ CQkgICAgKHIxLT5ydV9pZHJzcytyMS0+cnVfaXNyc3MtKHIwLT5ydV9pZHJzcytyMC0+cnVfaXNy c3MpKS90KTsKCQkJRU5EKG91dHApOwoJCQlicmVhazsKCgkJY2FzZSAnSyc6CgkJCXNwcmludGYo b3V0cCwiJWxkIiwgdCA9PSAwID8gMCA6CgkJCSAgICAoKHIxLT5ydV9peHJzcytyMS0+cnVfaXNy c3MrcjEtPnJ1X2lkcnNzKSAtCgkJCSAgICAocjAtPnJ1X2l4cnNzK3IwLT5ydV9pZHJzcytyMC0+ cnVfaXNyc3MpKS90KTsKCQkJRU5EKG91dHApOwoJCQlicmVhazsKCgkJY2FzZSAnTSc6CgkJCXNw cmludGYob3V0cCwiJWxkIiwgcjEtPnJ1X21heHJzcy8yKTsKCQkJRU5EKG91dHApOwoJCQlicmVh azsKCgkJY2FzZSAnRic6CgkJCXNwcmludGYob3V0cCwiJWxkIiwgcjEtPnJ1X21hamZsdC1yMC0+ cnVfbWFqZmx0KTsKCQkJRU5EKG91dHApOwoJCQlicmVhazsKCgkJY2FzZSAnUic6CgkJCXNwcmlu dGYob3V0cCwiJWxkIiwgcjEtPnJ1X21pbmZsdC1yMC0+cnVfbWluZmx0KTsKCQkJRU5EKG91dHAp OwoJCQlicmVhazsKCgkJY2FzZSAnSSc6CgkJCXNwcmludGYob3V0cCwiJWxkIiwgcjEtPnJ1X2lu YmxvY2stcjAtPnJ1X2luYmxvY2spOwoJCQlFTkQob3V0cCk7CgkJCWJyZWFrOwoKCQljYXNlICdP JzoKCQkJc3ByaW50ZihvdXRwLCIlbGQiLCByMS0+cnVfb3VibG9jay1yMC0+cnVfb3VibG9jayk7 CgkJCUVORChvdXRwKTsKCQkJYnJlYWs7CgkJY2FzZSAnQyc6CgkJCXNwcmludGYob3V0cCwiJWxk KyVsZCIsIHIxLT5ydV9udmNzdy1yMC0+cnVfbnZjc3csCgkJCQlyMS0+cnVfbml2Y3N3LXIwLT5y dV9uaXZjc3cgKTsKCQkJRU5EKG91dHApOwoJCQlicmVhazsKCQl9Cgl9Cgkqb3V0cCA9ICdcMCc7 Cn0KCnN0YXRpYyB2b2lkCnR2YWRkKHRzdW0sIHQwLCB0MSkKCXN0cnVjdCB0aW1ldmFsICp0c3Vt LCAqdDAsICp0MTsKewoKCXRzdW0tPnR2X3NlYyA9IHQwLT50dl9zZWMgKyB0MS0+dHZfc2VjOwoJ dHN1bS0+dHZfdXNlYyA9IHQwLT50dl91c2VjICsgdDEtPnR2X3VzZWM7CglpZiAodHN1bS0+dHZf dXNlYyA+IDEwMDAwMDApCgkJdHN1bS0+dHZfc2VjKyssIHRzdW0tPnR2X3VzZWMgLT0gMTAwMDAw MDsKfQoKc3RhdGljIHZvaWQKdHZzdWIodGRpZmYsIHQxLCB0MCkKCXN0cnVjdCB0aW1ldmFsICp0 ZGlmZiwgKnQxLCAqdDA7CnsKCgl0ZGlmZi0+dHZfc2VjID0gdDEtPnR2X3NlYyAtIHQwLT50dl9z ZWM7Cgl0ZGlmZi0+dHZfdXNlYyA9IHQxLT50dl91c2VjIC0gdDAtPnR2X3VzZWM7CglpZiAodGRp ZmYtPnR2X3VzZWMgPCAwKQoJCXRkaWZmLT50dl9zZWMtLSwgdGRpZmYtPnR2X3VzZWMgKz0gMTAw MDAwMDsKfQoKc3RhdGljIHZvaWQKcHNlY3MobCxjcCkKbG9uZyBsOwpyZWdpc3RlciBjaGFyICpj cDsKewoJcmVnaXN0ZXIgaW50IGk7CgoJaSA9IGwgLyAzNjAwOwoJaWYgKGkpIHsKCQlzcHJpbnRm KGNwLCIlZDoiLCBpKTsKCQlFTkQoY3ApOwoJCWkgPSBsICUgMzYwMDsKCQlzcHJpbnRmKGNwLCIl ZCVkIiwgKGkvNjApIC8gMTAsIChpLzYwKSAlIDEwKTsKCQlFTkQoY3ApOwoJfSBlbHNlIHsKCQlp ID0gbDsKCQlzcHJpbnRmKGNwLCIlZCIsIGkgLyA2MCk7CgkJRU5EKGNwKTsKCX0KCWkgJT0gNjA7 CgkqY3ArKyA9ICc6JzsKCXNwcmludGYoY3AsIiVkJWQiLCBpIC8gMTAsIGkgJSAxMCk7Cn0KI2Vu ZGlmCgovKgogKgkJCU4gUiBFIEEgRAogKi8KaW50IE5yZWFkKCBpbnQgZmQsIGNoYXIgKmJ1Ziwg aW50IGNvdW50ICkKewoJc3RydWN0IHNvY2thZGRyX2luIGZyb207CglpbnQgbGVuID0gc2l6ZW9m KGZyb20pOwoJcmVnaXN0ZXIgaW50IGNudDsKCWlmKCB1ZHAgKSAgewoJCWNudCA9IHJlY3Zmcm9t KCBmZCwgYnVmLCBjb3VudCwgMCwgJmZyb20sICZsZW4gKTsKCX0gZWxzZSB7CgkJaWYoIGJfZmxh ZyApCgkJCWNudCA9IG1yZWFkKCBmZCwgYnVmLCBjb3VudCApOwkvKiBmaWxsIGJ1ZiAqLwoJCWVs c2UKCQkJY250ID0gcmVhZCggZmQsIGJ1ZiwgY291bnQgKTsKCX0KCXJldHVybihjbnQpOwp9Cgov KgogKgkJCU4gVyBSIEkgVCBFCiAqLwppbnQgTndyaXRlKCBpbnQgZmQsIGNoYXIgKmJ1ZiwgaW50 IGNvdW50ICkKewoJcmVnaXN0ZXIgaW50IGNudDsKCWlmKCB1ZHAgKSAgewphZ2FpbjoKCQljbnQg PSBzZW5kdG8oIGZkLCBidWYsIGNvdW50LCAwLCAmc2luaGltLCBzaXplb2Yoc2luaGltKSApOwoJ CWlmKCBjbnQ8MCAmJiBlcnJubyA9PSBFTk9CVUZTICkgIHsKCQkJdXNsZWVwKDE4MDAwKTsKCQkJ ZXJybm8gPSAwOwoJCQlnb3RvIGFnYWluOwoJCX0KCX0gZWxzZSB7CgkJY250ID0gd3JpdGUoIGZk LCBidWYsIGNvdW50ICk7Cgl9CglyZXR1cm4oY250KTsKfQojaWYgMAppbnQKZGVsYXkodXMpCnsK CXN0cnVjdCB0aW1ldmFsIHR2OwoKCXR2LnR2X3NlYyA9IDA7Cgl0di50dl91c2VjID0gdXM7Cgko dm9pZClzZWxlY3QoIDEsIChjaGFyICopMCwgKGNoYXIgKikwLCAoY2hhciAqKTAsICZ0diApOwoJ cmV0dXJuKDEpOwp9CiNlbmRpZgovKgogKgkJCU0gUiBFIEEgRAogKgogKiBUaGlzIGZ1bmN0aW9u IHBlcmZvcm1zIHRoZSBmdW5jdGlvbiBvZiBhIHJlYWQoSUkpIGJ1dCB3aWxsCiAqIGNhbGwgcmVh ZChJSSkgbXVsdGlwbGUgdGltZXMgaW4gb3JkZXIgdG8gZ2V0IHRoZSByZXF1ZXN0ZWQKICogbnVt YmVyIG9mIGNoYXJhY3RlcnMuICBUaGlzIGNhbiBiZSBuZWNlc3NhcnkgYmVjYXVzZQogKiBuZXR3 b3JrIGNvbm5lY3Rpb25zIGRvbid0IGRlbGl2ZXIgZGF0YSB3aXRoIHRoZSBzYW1lCiAqIGdyb3Vw aW5nIGFzIGl0IGlzIHdyaXR0ZW4gd2l0aC4gIFdyaXR0ZW4gYnkgUm9iZXJ0IFMuIE1pbGVzLCBC UkwuCiAqLwppbnQKbXJlYWQoZmQsIGJ1ZnAsIG4pCmludCBmZDsKcmVnaXN0ZXIgY2hhcgkqYnVm cDsKdW5zaWduZWQJbjsKewoJcmVnaXN0ZXIgdW5zaWduZWQJY291bnQgPSAwOwoJcmVnaXN0ZXIg aW50CQlucmVhZDsKCglkbyB7CgkJbnJlYWQgPSByZWFkKGZkLCBidWZwLCBuLWNvdW50KTsKCQlp ZihucmVhZCA8IDApICB7CgkJCXBlcnJvcigidHRjcF9tcmVhZCIpOwoJCQlyZXR1cm4oLTEpOwoJ CX0KCQlpZihucmVhZCA9PSAwKQoJCQlyZXR1cm4oKGludCljb3VudCk7CgkJY291bnQgKz0gKHVu c2lnbmVkKW5yZWFkOwoJCWJ1ZnAgKz0gbnJlYWQ7CgkgfSB3aGlsZShjb3VudCA8IG4pOwoKCXJl dHVybigoaW50KWNvdW50KTsKfQovKiB2bXNwbGljZSBtb3ZlcyBwYWdlcyBiYWNraW5nIGEgdXNl ciBhZGRyZXNzIHJhbmdlIHRvIGEgcGlwZS4KSG93ZXZlciwKKiB5b3UgZG9uJ3Qgd2FudCB0aGUg YXBwbGljYXRpb24gY2hhbmdpbmcgZGF0YSBpbiB0aGF0IGFkZHJlc3MgcmFuZ2UKKiBhZnRlciB0 aGUgcGFnZXMgaGF2ZSBiZWVuIG1vdmVkIHRvIHRoZSBwaXBlLCBidXQgYmVmb3JlIHRoZXkgaGF2 ZQpiZWVuCiogY29uc3VtZWQgYXQgdGhlaXIgZGVzdGluYXRpb24uCioKKiBUaGUgc29sdXRpb24g aXMgdG8gZG91YmxlIGJ1ZmZlcjoKKiAgIGxvYWQgYnVmZmVyIEEsIHZtc3BsaWNlIHRvIHBpcGUK KiAgIGxvYWQgYnVmZmVyIEIsIHZtc3BsaWNlIHRvIHBpcGUKKiBXaGVuIHRoZSBCLT5zcGxpY2Ut PnBpcGUgY2FsbCBjb21wbGV0ZXMsIHRoZXJlIGNhbiBubyBsb25nZXIgYmUgYW55CiogcmVmZXJl bmNlcyBpbiB0aGUgcGlwZSB0byB0aGUgcGFnZXMgYmFja2luZyBidWZmZXIgQSwgc2luY2UgaXQg aXMgbm93CiogZmlsbGVkIHdpdGggcmVmZXJlbmNlcyB0byB0aGUgcGFnZXMgYmFja2luZyBidWZm ZXIgQi4gIFNvLCBpdCBpcyBzYWZlCiogdG8gbG9hZCBuZXcgZGF0YSBpbnRvIGJ1ZmZlciBBLgoq Lwp2b2lkIHNldHVwX3Ztc3BsaWNlKCkKewogIGludCBpOwogIHNpemVfdCBwZ19zeiA9IGdldHBh Z2VzaXplKCk7CiAgLyoKICBmb3IgKGk9MDsgaSA8IFZNX0JVRkZFUlM7IGkrKyl7CiAgICBpZiAo cGlwZShwZmRzW2ldKSA8IDApIHsKICAgICAgZXJyKCJvcGVuaW5nIHBpcGUiKTsKICAgIH0KICAg IH0qLwogIGlmIChwaXBlKHBmZHMpIDwgMCkgewogICAgZXJyKCJvcGVuaW5nIHBpcGUiKTsKICB9 CiAgCiAgaWYgKHBpcGVfYnVmX3NpemUgPiBNQVhfU1BMSUNFX1NJWkUpCiAgICBwaXBlX2J1Zl9z aXplID0gTUFYX1NQTElDRV9TSVpFOwogIHBpcGVfYnVmX3NpemUgPSBBTElHTihwaXBlX2J1Zl9z aXplLCBwZ19zeik7CgogIHBpcGVfYnVmID0gbWFsbG9jKFZNX0JVRkZFUlMqcGlwZV9idWZfc2l6 ZSArIHBnX3N6KTsKICBpZiAoIXBpcGVfYnVmKSB7CiAgICBlcnIoIkFsbG9jYXRpbmcgZGF0YSBi dWZmZXIiKTsKICB9CiAgcGlwZV9idWYgPSAoY2hhciAqKUFMSUdOKCh1bnNpZ25lZCBsb25nKXBp cGVfYnVmLAogICAgICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylwZ19zeik7 CiAgZnByaW50ZihzdGRlcnIsICJzZXR1cF92bXNwbGljZTogYnVmICVwICwgYnVmX3NpemUgJXhc biIsIAogICAgICAgICAgcGlwZV9idWYsIHBpcGVfYnVmX3NpemUpOwp9CiNpZiAxCnVpbnQ2NF90 IHZtc3BsaWNlX3JlY3YoaW50IHNkLCBpbnQgZmQpCnsKICBzdHJ1Y3QgaW92ZWMgaW92OwogIHVp bnQ2NF90IGJ5dGVzID0gMDsKICBzc2l6ZV90IG4sIG0sIGw7CiAgdW5zaWduZWQgaSA9IDE7Cgog IC8vICBmcHJpbnRmKHN0ZGVyciwgInZtc3BsaWNlX3JlY3Y6IHNkICVkIGZkICVkXG4iLCBzZCwg ZmQpOwogYWdhaW46CiAgaSA9IChpICsgMSkgJSBWTV9CVUZGRVJTOwogIGlvdi5pb3ZfYmFzZSA9 IHBpcGVfYnVmICsgaSAqIHBpcGVfYnVmX3NpemU7CiAgbCA9IDA7CgogYWdhaW4yOgogIG0gPSBy ZWFkKHNkLCBpb3YuaW92X2Jhc2UgKyBsLCBwaXBlX2J1Zl9zaXplIC0gbCk7CiAgLyogIGZwcmlu dGYoc3RkZXJyLCAidm1zcGxpY2VfcmVjdjogcmVhZCAweCV4IGJ5dGVzLCBidWYgc2l6ZSAweCV4 LCBsICVkLCBidWZmZXIgJXBcbiIsCiAgICAgIG0sIHBpcGVfYnVmX3NpemUsIGwsIGlvdi5pb3Zf YmFzZSArIGwpOyovCgogIGlmIChtIDwgMCkgewogICAgaWYgKGVycm5vID09IEVJTlRSKQogICAg ICBnb3RvIGFnYWluMjsKICAgIHBlcnJvcigiUmVhZCIpOwogICAgZXhpdChFWElUX0ZBSUxVUkUp OwogIH0KICBpZiAobSA9PSAwKSB7CiAgICBpZiAobCA9PSAwKSB7CiAgICAgIGZwcmludGYoc3Rk ZXJyLCAidm1zcGxpY2VfcmVjdjogbCByZWFjaGVkIHplcm8uIGJ5dGVzIGlzIDB4JXhcbiIsIChp bnQpIGJ5dGVzKTsKICAgICAgZmRhdGFzeW5jKGZkKTsKICAgICAgcmV0dXJuIGJ5dGVzOwogICAg fQogIH0KICBlbHNlIHsKICAgIGwgKz0gbTsKICAgIGlmIChsICE9IHBpcGVfYnVmX3NpemUpCiAg ICAgIGdvdG8gYWdhaW4yOwogICAgCiAgfQogIHdoaWxlIChsKSB7CiAgICB1bnNpZ25lZCBpbnQg c3BsaWNlX2ZsYWdzID0gMDsKCiAgICBpb3YuaW92X2xlbiA9IGw7CiAgICBpZiAoKGwgJiAweDNG RikgPT0gMCkKICAgICAgc3BsaWNlX2ZsYWdzID0gU1BMSUNFX0ZfTU9WRTsKICAgIAogICAgbiA9 IHZtc3BsaWNlKHBmZHNbMV0sICZpb3YsIDEsIHNwbGljZV9mbGFncyk7CiAgICAvKiAgICBmcHJp bnRmKHN0ZGVyciwgInZtc3BsaWNlX3JlY3Y6IHZtc3BsaWNlIDB4JXggYnl0ZXMgdG8gcGlwZVxu Iiwgbik7Ki8KCiAgICBpZiAobiA8IDApIHsKICAgICAgcGVycm9yKCJ2bXNwbGljZSB0byBwaXBl Iik7CiAgICAgIGZwcmludGYoc3RkZXJyLCAidm1zcGxpY2VfcmVjdjogaW92X2xlbiAlZCBpb3Yu aW92X2Jhc2UgJXhcbiIsICBpb3YuaW92X2xlbiwKICAgICAgICAgICAgICBpb3YuaW92X2Jhc2Up OwogICAgICBleGl0KEVYSVRfRkFJTFVSRSk7CiAgICB9CiAgICB3aGlsZSAobikgewogICAgICBt ID0gc3BsaWNlKHBmZHNbMF0sIE5VTEwsIGZkLCBOVUxMLCBuLCBzcGxpY2VfZmxhZ3MpOwogICAg ICAvLyAgICAgIGZwcmludGYoc3RkZXJyLCAidm1zcGxpY2VfcmVjdjogdm1zcGxpY2UgMHgleCBi eXRlcyB0byBmaWxlXG4iLCBtKTsKICAgICAgaWYgKG0gPCAwKSB7CiAgICAgICAgcGVycm9yKCJz cGxpY2UgdG8gZmlsZSIpOwogICAgICAgIGV4aXQoRVhJVF9GQUlMVVJFKTsKICAgICAgfQogICAg ICBpZiAobSAmIDB4M0ZGKQogICAgICB7CiAgICAgICAgZnByaW50ZihzdGRlcnIsICJzcGxpY2U6 IHJldHVybmVkICV4IFxuIiwgbSk7CiAgICAgIH0KICAgICAgbiAtPSBtOwogICAgICBsIC09IG07 CiAgICAgIGJ5dGVzICs9IG07CiAgICAgIGlvdi5pb3ZfYmFzZSArPSBtOwogICAgfQogIH0KICBn b3RvIGFnYWluOwp9CiNlbmRpZgo= ------=_Part_37976_8697689.1166786304007 Content-Type: text/plain; name=splice.h; charset=ANSI_X3.4-1968 Content-Transfer-Encoding: base64 X-Attachment-Id: f_ew0i2fjy Content-Disposition: attachment; filename="splice.h" I2lmbmRlZiBTUExJQ0VfSAojZGVmaW5lIFNQTElDRV9ICgojaW5jbHVkZSA8ZXJybm8uaD4KI2lu Y2x1ZGUgPHN5cy91aW8uaD4KI2luY2x1ZGUgPHN5cy9zdGF0Lmg+CiNpbmNsdWRlIDxsaW51eC91 bmlzdGQuaD4KCiNpZiBkZWZpbmVkKF9faTM4Nl9fKQojZGVmaW5lIF9fTlJfc3lzX3NwbGljZQkJ MzEzCiNkZWZpbmUgX19OUl9zeXNfdGVlCQkzMTUKI2RlZmluZSBfX05SX3N5c192bXNwbGljZQkz MTYKI2VsaWYgZGVmaW5lZChfX3g4Nl82NF9fKQojZGVmaW5lIF9fTlJfc3lzX3NwbGljZQkJMjc1 CiNkZWZpbmUgX19OUl9zeXNfdGVlCQkyNzYKI2RlZmluZSBfX05SX3N5c192bXNwbGljZQkyNzgK I2VsaWYgZGVmaW5lZChfX3Bvd2VycGNfXykgfHwgZGVmaW5lZChfX3Bvd2VycGM2NF9fKQojZGVm aW5lIF9fTlJfc3lzX3NwbGljZQkJMjgzCiNkZWZpbmUgX19OUl9zeXNfdGVlCQkyODQKI2RlZmlu ZSBfX05SX3N5c192bXNwbGljZQkyODUKI2VsaWYgZGVmaW5lZChfX2lhNjRfXykKI2RlZmluZSBf X05SX3N5c19zcGxpY2UJCTEyOTcKI2RlZmluZSBfX05SX3N5c190ZWUJCTEzMDEKI2RlZmluZSBf X05SX3N5c192bXNwbGljZQkxMzAyCiNlbGlmIGRlZmluZWQoX19hcm1fXykKI2RlZmluZSBfX05S X3N5c19zcGxpY2UJCTMyMgojZGVmaW5lIF9fTlJfc3lzX3RlZQkJMzIzCiNkZWZpbmUgX19OUl9z eXNfdm1zcGxpY2UJMzI0CiNlbHNlCiNlcnJvciB1bnN1cHBvcnRlZCBhcmNoCiNlbmRpZgoKI2Rl ZmluZSBTUExJQ0VfRl9NT1ZFCSgweDAxKQkvKiBtb3ZlIHBhZ2VzIGluc3RlYWQgb2YgY29weWlu ZyAqLwojZGVmaW5lIFNQTElDRV9GX05PTkJMT0NLICgweDAyKSAvKiBkb24ndCBibG9jayBvbiB0 aGUgcGlwZSBzcGxpY2luZyAoYnV0ICovCgkJCQkgLyogd2UgbWF5IHN0aWxsIGJsb2NrIG9uIHRo ZSBmZCB3ZSBzcGxpY2UgKi8KCQkJCSAvKiBmcm9tL3RvLCBvZiBjb3Vyc2UgKi8KI2RlZmluZSBT UExJQ0VfRl9NT1JFCSgweDA0KQkvKiBleHBlY3QgbW9yZSBkYXRhICovCiNkZWZpbmUgU1BMSUNF X0ZfR0lGVCAgICgweDA4KSAgLyogcGFnZXMgcGFzc2VkIGluIGFyZSBhIGdpZnQgKi8KCiNkZWZp bmUgU1lTX3NwbGljZSBfX05SX3N5c19zcGxpY2UKI2RlZmluZSBTWVNfdGVlIF9fTlJfc3lzX3Rl ZQojZGVmaW5lIFNZU192bXNwbGljZSBfX05SX3N5c192bXNwbGljZQoKc3RhdGljIGlubGluZQpp bnQgc3BsaWNlKGludCBmZF9pbiwgb2ZmNjRfdCAqb2ZmX2luLCBpbnQgZmRfb3V0LCBvZmY2NF90 ICpvZmZfb3V0LAogICAgICAgICAgIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncykKewog IHJldHVybiBzeXNjYWxsKFNZU19zcGxpY2UsIGZkX2luLCBvZmZfaW4sCiAgICAgICAgICAgICAg ICAgZmRfb3V0LCBvZmZfb3V0LCBsZW4sIGZsYWdzKTsKfQpzdGF0aWMgaW5saW5lIAppbnQgdGVl KGludCBmZGluLCBpbnQgZmRvdXQsIHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncykKewoJ cmV0dXJuIHN5c2NhbGwoU1lTX3RlZSwgZmRpbiwgZmRvdXQsIGxlbiwgZmxhZ3MpOwp9CgpzdGF0 aWMgaW5saW5lIAppbnQgdm1zcGxpY2UoaW50IGZkLCBjb25zdCBzdHJ1Y3QgaW92ZWMgKmlvdiwK CQkJICAgdW5zaWduZWQgbG9uZyBucl9zZWdzLCB1bnNpZ25lZCBpbnQgZmxhZ3MpCnsKCXJldHVy biBzeXNjYWxsKFNZU192bXNwbGljZSwgZmQsIGlvdiwgbnJfc2VncywgZmxhZ3MpOwp9CgoKI2lm IDAKCl9zeXNjYWxsNihpbnQsIHN5c19zcGxpY2UsIGludCwgZmRpbiwgbG9mZl90ICosIG9mZl9p biwgaW50LCBmZG91dCwgbG9mZl90ICosIG9mZl9vdXQsIHNpemVfdCwgbGVuLCB1bnNpZ25lZCBp bnQsIGZsYWdzKTsKI2VuZGlmCiNpZiAwCl9zeXNjYWxsNChpbnQsIHN5c192bXNwbGljZSwgaW50 LCBmZCwgY29uc3Qgc3RydWN0IGlvdmVjICosIGlvdiwgdW5zaWduZWQgbG9uZywgbnJfc2Vncywg dW5zaWduZWQgaW50LCBmbGFncyk7Cl9zeXNjYWxsNChpbnQsIHN5c190ZWUsIGludCwgZmRpbiwg aW50LCBmZG91dCwgc2l6ZV90LCBsZW4sIHVuc2lnbmVkIGludCwgZmxhZ3MpOwojZW5kaWYKI2lm IDAKc3RhdGljIGlubGluZSBpbnQgc3BsaWNlKGludCBmZGluLCBsb2ZmX3QgKm9mZl9pbiwgaW50 IGZkb3V0LCBsb2ZmX3QgKm9mZl9vdXQsCgkJCSBzaXplX3QgbGVuLCB1bnNpZ25lZCBsb25nIGZs YWdzKQp7CglyZXR1cm4gc3lzX3NwbGljZShmZGluLCBvZmZfaW4sIGZkb3V0LCBvZmZfb3V0LCBs ZW4sIGZsYWdzKTsKfQoKc3RhdGljIGlubGluZSBpbnQgdGVlKGludCBmZGluLCBpbnQgZmRvdXQs IHNpemVfdCBsZW4sIHVuc2lnbmVkIGludCBmbGFncykKewoJcmV0dXJuIHN5c190ZWUoZmRpbiwg ZmRvdXQsIGxlbiwgZmxhZ3MpOwp9CgpzdGF0aWMgaW5saW5lIGludCB2bXNwbGljZShpbnQgZmQs IGNvbnN0IHN0cnVjdCBpb3ZlYyAqaW92LAoJCQkgICB1bnNpZ25lZCBsb25nIG5yX3NlZ3MsIHVu c2lnbmVkIGludCBmbGFncykKewoJcmV0dXJuIHN5c192bXNwbGljZShmZCwgaW92LCBucl9zZWdz LCBmbGFncyk7Cn0KI2VuZGlmCiNkZWZpbmUgU1BMSUNFX1NJWkUJKDY0KjEwMjQpCgojZGVmaW5l IEJVR19PTihjKSBhc3NlcnQoIShjKSkKCiNkZWZpbmUgbWluKHgseSkgKHsgXAogICAgICAgIHR5 cGVvZih4KSBfeCA9ICh4KTsgICAgIFwKICAgICAgICB0eXBlb2YoeSkgX3kgPSAoeSk7ICAgICBc CiAgICAgICAgKHZvaWQpICgmX3ggPT0gJl95KTsgICAgICAgICAgICBcCiAgICAgICAgX3ggPCBf eSA/IF94IDogX3k7IH0pCgojZGVmaW5lIG1heCh4LHkpICh7IFwKICAgICAgICB0eXBlb2YoeCkg X3ggPSAoeCk7ICAgICBcCiAgICAgICAgdHlwZW9mKHkpIF95ID0gKHkpOyAgICAgXAogICAgICAg ICh2b2lkKSAoJl94ID09ICZfeSk7ICAgICAgICAgICAgXAogICAgICAgIF94ID4gX3kgPyBfeCA6 IF95OyB9KQoKc3RhdGljIGlubGluZSBpbnQgZXJyb3IoY29uc3QgY2hhciAqbikKewoJcGVycm9y KG4pOwoJcmV0dXJuIC0xOwp9CgpzdGF0aWMgaW50IF9fY2hlY2tfcGlwZShpbnQgcGZkKQp7Cglz dHJ1Y3Qgc3RhdCBzYjsKCglpZiAoZnN0YXQocGZkLCAmc2IpIDwgMCkKCQlyZXR1cm4gZXJyb3Io InN0YXQiKTsKCWlmICghU19JU0ZJRk8oc2Iuc3RfbW9kZSkpCgkJcmV0dXJuIDE7CgoJcmV0dXJu IDA7Cn0KCnN0YXRpYyBpbmxpbmUgaW50IGNoZWNrX2lucHV0X3BpcGUodm9pZCkKewoJaWYgKCFf X2NoZWNrX3BpcGUoU1RESU5fRklMRU5PKSkKCQlyZXR1cm4gMDsKCglmcHJpbnRmKHN0ZGVyciwg InN0ZGluIG11c3QgYmUgYSBwaXBlXG4iKTsKCXJldHVybiAxOwp9CgpzdGF0aWMgaW5saW5lIGlu dCBjaGVja19vdXRwdXRfcGlwZSh2b2lkKQp7CglpZiAoIV9fY2hlY2tfcGlwZShTVERPVVRfRklM RU5PKSkKCQlyZXR1cm4gMDsKCglmcHJpbnRmKHN0ZGVyciwgInN0ZG91dCBtdXN0IGJlIGEgcGlw ZVxuIik7CglyZXR1cm4gMTsKfQoKI2VuZGlmCg== ------=_Part_37976_8697689.1166786304007 Content-Type: application/octet-stream; name=Makefile Content-Transfer-Encoding: base64 X-Attachment-Id: f_ew0i2n8d Content-Disposition: attachment; filename="Makefile" Q0MJPSBnY2MKQ0ZMQUdTCT0gLVdhbGwgLU8yIC1nIC1EX0dOVV9TT1VSQ0UgLURfTEFSR0VGSUxF X1NPVVJDRSAtRF9GSUxFX09GRlNFVF9CSVRTPTY0ClBST0dTCT0ga3RlZSBrdGVlLW5ldCBzcGxp Y2UtY3Agc3BsaWNlLWluIHNwbGljZS1vdXQgc3BsaWNlLW5ldCBzcGxpY2UtdGVzdDRjIHNwbGlj ZS10ZXN0NHMgdm1zcGxpY2Ugc3BsaWNlLWJlbmNoIHZtc3BsaWNlMgpNQU5TCT0gc3BsaWNlLjIg dGVlLjIgdm1zcGxpY2UuMgoKYWxsOiBkZXBlbmQgJChQUk9HUykKCiUubzogJS5jCgkkKENDKSAt byAkKi5vIC1jICQoQ0ZMQUdTKSAkPAoKZGVwZW5kOgoJQCQoQ0MpIC1NTSAkKENGTEFHUykgKi5j IDE+IC5kZXBlbmQKCmNsZWFuOgoJLXJtIC1mICoubyAkKFBST0dTKSAuZGVwZW5kCgpJTlNUQUxM ID0gaW5zdGFsbApwcmVmaXggPSAvdXNyL2xvY2FsCmJpbmRpciA9ICQocHJlZml4KS9iaW4KbWFu ZGlyID0gJChwcmVmaXgpL21hbgoKaW5zdGFsbDogJChQUk9HUykKCSQoSU5TVEFMTCkgLW03NTUg LWQgJChERVNURElSKSQoYmluZGlyKQoJJChJTlNUQUxMKSAkKFBST0dTKSAkKERFU1RESVIpJChi aW5kaXIpCgkkKElOU1RBTEwpIC1tNzU1IC1kICQoREVTVERJUikkKG1hbmRpcikvbWFuMgoJJChJ TlNUQUxMKSAkKE1BTlMpICQoREVTVERJUikkKG1hbmRpcikvbWFuMgoKaWZuZXEgKCQod2lsZGNh cmQgLmRlcGVuZCksKQppbmNsdWRlIC5kZXBlbmQKZW5kaWYK ------=_Part_37976_8697689.1166786304007-- - To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html Please read the FAQ at http://www.tux.org/lkml/