From owner-freebsd-current@FreeBSD.ORG Sun Aug 15 19:49:40 2010 Return-Path: Delivered-To: current@freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2001:4f8:fff6::34]) by hub.freebsd.org (Postfix) with ESMTP id ACE3610656A3; Sun, 15 Aug 2010 19:49:40 +0000 (UTC) (envelope-from dimitry@andric.com) Received: from tensor.andric.com (cl-327.ede-01.nl.sixxs.net [IPv6:2001:7b8:2ff:146::2]) by mx1.freebsd.org (Postfix) with ESMTP id D197B8FC0A; Sun, 15 Aug 2010 19:49:39 +0000 (UTC) Received: from [IPv6:2001:7b8:3a7:0:6403:24ec:96ef:bc90] (unknown [IPv6:2001:7b8:3a7:0:6403:24ec:96ef:bc90]) (using TLSv1 with cipher DHE-RSA-CAMELLIA256-SHA (256/256 bits)) (No client certificate requested) by tensor.andric.com (Postfix) with ESMTPSA id A72EE5C43; Sun, 15 Aug 2010 21:49:38 +0200 (CEST) Message-ID: <4C6844D8.5070602@andric.com> Date: Sun, 15 Aug 2010 21:49:44 +0200 From: Dimitry Andric User-Agent: Mozilla/5.0 (Windows; U; Windows NT 5.2; en-US; rv:1.9.2.9pre) Gecko/20100814 Lanikai/3.1.3pre MIME-Version: 1.0 To: =?UTF-8?B?RGFnLUVybGluZyBTbcO4cmdyYXY=?= References: <4C6505A4.9060203@FreeBSD.org> <20100813085235.GA16268@freebsd.org> <4C66C010.3040308@FreeBSD.org> <4C673F02.8000805@FreeBSD.org> <20100815013438.GA8958@troutmask.apl.washington.edu> <4C67492C.5020206@FreeBSD.org> <8639ufd78w.fsf@ds4.des.no> In-Reply-To: <8639ufd78w.fsf@ds4.des.no> Content-Type: multipart/mixed; boundary="------------010000040108020607000907" Cc: Doug Barton , Justin Hibbits , core@freebsd.org, delphij@freebsd.org, Gabor Kovesdan , Steve Kargl , current@freebsd.org Subject: Re: Official request: Please make GNU grep the default X-BeenThere: freebsd-current@freebsd.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: Discussions about the use of FreeBSD-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Sun, 15 Aug 2010 19:49:40 -0000 This is a multi-part message in MIME format. --------------010000040108020607000907 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable On 2010-08-15 21:07, Dag-Erling Sm=C3=B8rgrav wrote: > I built a profiling version of BSD grep and ran it with a regexp that > matches only the very last line in (my copy of) INDEX-9. The results > are pretty clear: [I also did precisely that, and I just read your mail when I was composing the following... :) ] I had a look at Doug Barton's time trial script for GNU and BSD grep, and decided to profile both greps a bit. This gave some interesting results. I started with GNU grep, doing approximately the same search as in Doug's trial, e.g. grep -m1 "|/usr/ports/x11-wm/xfce4-wm|", but I made the testfile 373491 lines instead of the original 21971, with the only matching line as the last one. The GNU grep top called functions are (please ignore the .mcount entry, which is a gprof side effect): % cumulative self self total =20 time seconds seconds calls ms/call ms/call name =20 99.1 0.59 0.59 11497 0.05 0.05 read [5] 0.6 0.59 0.00 11497 0.00 0.00 kwsexec [8] 0.1 0.59 0.00 0 100.00% .mcount (130) 0.1 0.59 0.00 1 0.62 594.77 grepfile [3] 0.1 0.60 0.00 11496 0.00 0.00 memmove [9] 0.0 0.60 0.00 4 0.03 0.03 memchr [10] 0.0 0.60 0.00 12541 0.00 0.00 memset [16] 0.0 0.60 0.00 11497 0.00 0.00 EGexecute [7] 0.0 0.60 0.00 11497 0.00 0.05 fillbuf [4] 0.0 0.60 0.00 11497 0.00 0.00 grepbuf [6] The same exercise with BSD grep indeed runs *much* slower, and its top called functions are: % cumulative self self total =20 time seconds seconds calls ms/call ms/call name =20 67.3 8.60 8.60 0 100.00% .mcount (105) 22.2 11.44 2.84 22778 0.12 0.12 __sys_read [9] 3.6 11.91 0.46 373553797 0.00 0.00 grep_feof [11] 3.5 12.35 0.45 373180306 0.00 0.00 fgetc [6] 2.1 12.63 0.27 373180306 0.00 0.00 grep_fgetc [5] 1.2 12.78 0.15 373491 0.00 0.01 grep_fgetln [4] 0.0 12.78 0.01 464 0.01 0.01 memset [12] 0.0 12.79 0.00 1 2.83 4184.69 procfile [3] 0.0 12.79 0.00 5 0.42 0.69 free [14] 0.0 12.79 0.00 22778 0.00 0.00 __sread [607] The testfile has 373180306 bytes, so you can see there is a tremendous overhead in calling grep_fgetc, grep_feof and fgetc, which is done separately for EACH byte in the file! So my first quick fix attempt was to replace the home-grown grep_fgetln with fgetln(3), which is in libc. This does not support gzip and bzip2 files, but just to prove the point, it is enough. It gave the following profiling result: % cumulative self self total =20 time seconds seconds calls ms/call ms/call name =20 80.0 0.68 0.68 5695 0.12 0.12 read [5] 15.5 0.81 0.13 379178 0.00 0.00 memchr [8] 3.2 0.83 0.03 0 100.00% .mcount (102) 0.6 0.84 0.00 451 0.01 0.01 memset [9] 0.4 0.84 0.00 5 0.59 0.85 free [10] 0.1 0.84 0.00 1 1.23 814.47 procfile [3] 0.1 0.84 0.00 373491 0.00 0.00 fgetln [4] 0.0 0.84 0.00 373491 0.00 0.00 grep_fgetln [29] 0.0 0.84 0.00 11379 0.00 0.00 memcpy [30] 0.0 0.84 0.00 50 0.00 0.00 arena_run_alloc [36= ] You can see there is much less overhead, and it is the regular read() function that gets the most calls, though not yet as much as with GNU grep. However, this already gave MUCH better runtimes with Doug's trial script: GNU grep Elapsed time: 57 seconds BSD grep (original) Elapsed time: 820 seconds (~14.4x slower than GNU grep) BSD grep (quickfixed) Elapsed time: 115 seconds (~2.0x slower than GNU grep) It proves that getting rid of the fgetc's is certainly worthwhile, and I have attached a more complete patch that: - Replaces the horrendously inefficient grep_fgetln() with mostly the same implementation as the libc fgetln() function. - Uses plain file descriptors instead of struct FILE, since the buffering is done manually anyway, and it makes it easier to support gzip and bzip2. - Let the bzip2 reader just read the file as plain data, when the initial magic number doesn't match, mimicking the behaviour of GNU grep. There is probably more room for optimization, but let's see if this survives a bunch of tests first. :) --------------010000040108020607000907 Content-Type: text/plain; name="bsdgrep-speed-1.diff" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="bsdgrep-speed-1.diff" ZGlmZiAtLWdpdCBhL3Vzci5iaW4vZ3JlcC9mYXN0Z3JlcC5jIGIvdXNyLmJpbi9ncmVwL2Zh c3RncmVwLmMKaW5kZXggNTIzOWEwZS4uMjQwNWVkOCAxMDA2NDQKLS0tIGEvdXNyLmJpbi9n cmVwL2Zhc3RncmVwLmMKKysrIGIvdXNyLmJpbi9ncmVwL2Zhc3RncmVwLmMKQEAgLTE5OCw3 ICsxOTgsNyBAQCBmYXN0Y29tcChmYXN0Z3JlcF90ICpmZywgY29uc3QgY2hhciAqcGF0KQog fQogCiBpbnQKLWdyZXBfc2VhcmNoKGZhc3RncmVwX3QgKmZnLCB1bnNpZ25lZCBjaGFyICpk YXRhLCBzaXplX3QgbGVuLCByZWdtYXRjaF90ICpwbWF0Y2gpCitncmVwX3NlYXJjaChmYXN0 Z3JlcF90ICpmZywgY29uc3QgdW5zaWduZWQgY2hhciAqZGF0YSwgc2l6ZV90IGxlbiwgcmVn bWF0Y2hfdCAqcG1hdGNoKQogewogCXVuc2lnbmVkIGludCBqOwogCWludCByZXQgPSBSRUdf Tk9NQVRDSDsKZGlmZiAtLWdpdCBhL3Vzci5iaW4vZ3JlcC9maWxlLmMgYi91c3IuYmluL2dy ZXAvZmlsZS5jCmluZGV4IGM0ZGU3ZGIuLmE3ZTNiZjAgMTAwNjQ0Ci0tLSBhL3Vzci5iaW4v Z3JlcC9maWxlLmMKKysrIGIvdXNyLmJpbi9ncmVwL2ZpbGUuYwpAQCAtMzcsNyArMzcsNyBA QCBfX0ZCU0RJRCgiJEZyZWVCU0QkIik7CiAjaW5jbHVkZSA8YnpsaWIuaD4KICNpbmNsdWRl IDxlcnIuaD4KICNpbmNsdWRlIDxlcnJuby5oPgotI2luY2x1ZGUgPHN0ZGlvLmg+CisjaW5j bHVkZSA8ZmNudGwuaD4KICNpbmNsdWRlIDxzdGRsaWIuaD4KICNpbmNsdWRlIDxzdHJpbmcu aD4KICNpbmNsdWRlIDx1bmlzdGQuaD4KQEAgLTQ3LDEzMyArNDcsMTU5IEBAIF9fRkJTRElE KCIkRnJlZUJTRCQiKTsKIAogI2luY2x1ZGUgImdyZXAuaCIKIAotc3RhdGljIGNoYXIJIGZu YW1lW01BWFBBVEhMRU5dOwkvKiBmaWxlIG5hbWUgKi8KKyNkZWZpbmUJTUFYQlVGU0laCSgz MiAqIDEwMjQpCisjZGVmaW5lCUxOQlVGQlVNUAk4MAogCi0jZGVmaW5lCQkgTUFYQlVGU0la CSgxNiAqIDEwMjQpCi0jZGVmaW5lCQkgUFJFUkVBRF9NCTAuMgorc3RhdGljIGd6RmlsZSBn emJ1ZmRlc2M7CitzdGF0aWMgQlpGSUxFKiBiemJ1ZmRlc2M7CiAKLS8qIFNvbWUgZ2xvYmFs IHZhcmlhYmxlcyBmb3IgdGhlIGJ1ZmZlcmluZyBhbmQgcmVhZGluZy4gKi8KLXN0YXRpYyBj aGFyCSpsbmJ1ZjsKLXN0YXRpYyBzaXplX3QJIGxuYnVmbGVuOwotc3RhdGljIHVuc2lnbmVk IGNoYXIgKmJpbmJ1ZjsKLXN0YXRpYyBpbnQJIGJpbmJ1ZnNpejsKLXVuc2lnbmVkIGNoYXIJ KmJpbmJ1ZnB0cjsKLXN0YXRpYyBpbnQJIGJ6ZXJyOworc3RhdGljIHVuc2lnbmVkIGNoYXIg YnVmZmVyW01BWEJVRlNJWl07CitzdGF0aWMgdW5zaWduZWQgY2hhciAqYnVmcG9zOworc3Rh dGljIHNpemVfdCBidWZyZW07CiAKLSNkZWZpbmUgaXN3YmluYXJ5KGNoKQkoIWlzd3NwYWNl KChjaCkpICYmIGlzd2NudHJsKChjaCkpICYmIFwKLQkJCSAgICAoY2ggIT0gTCdcYicpICYm IChjaCAhPSBMJ1wwJykpCitzdGF0aWMgdW5zaWduZWQgY2hhciAqbG5idWY7CitzdGF0aWMg c2l6ZV90IGxuYnVmbGVuOwogCi0vKgotICogUmV0dXJucyBhIHNpbmdsZSBjaGFyYWN0ZXIg YWNjb3JkaW5nIHRvIHRoZSBmaWxlIHR5cGUuCi0gKiBSZXR1cm5zIC0xIG9uIGZhaWx1cmUu Ci0gKi8KLWludAotZ3JlcF9mZ2V0YyhzdHJ1Y3QgZmlsZSAqZikKK3N0YXRpYyBpbnQKK2dy ZXBfcmVmaWxsKHN0cnVjdCBmaWxlICpmKQogewotCXVuc2lnbmVkIGNoYXIgYzsKLQotCXN3 aXRjaCAoZmlsZWJlaGF2ZSkgewotCWNhc2UgRklMRV9TVERJTzoKLQkJcmV0dXJuIChmZ2V0 YyhmLT5mKSk7Ci0JY2FzZSBGSUxFX0daSVA6Ci0JCXJldHVybiAoZ3pnZXRjKGYtPmd6Zikp OwotCWNhc2UgRklMRV9CWklQOgotCQlCWjJfYnpSZWFkKCZiemVyciwgZi0+YnpmLCAmYywg MSk7Ci0JCWlmIChiemVyciA9PSBCWl9TVFJFQU1fRU5EKQotCQkJcmV0dXJuICgtMSk7Ci0J CWVsc2UgaWYgKGJ6ZXJyICE9IEJaX1NFUVVFTkNFX0VSUk9SICYmIGJ6ZXJyICE9IEJaX09L KQotCQkJZXJyeCgyLCAiJXMiLCBnZXRzdHIoMikpOwotCQlyZXR1cm4gKGMpOworCXNzaXpl X3QgbnI7CisJaW50IGJ6ZXJyOworCisJYnVmcG9zID0gYnVmZmVyOworCWJ1ZnJlbSA9IDA7 CisKKwlpZiAoZmlsZWJlaGF2ZSA9PSBGSUxFX0daSVApIHsKKwkJbnIgPSBnenJlYWQoZ3pi dWZkZXNjLCBidWZmZXIsIE1BWEJVRlNJWik7CisJfSBlbHNlIGlmIChmaWxlYmVoYXZlID09 IEZJTEVfQlpJUCAmJiBiemJ1ZmRlc2MgIT0gTlVMTCkgeworCQluciA9IEJaMl9ielJlYWQo JmJ6ZXJyLCBiemJ1ZmRlc2MsIGJ1ZmZlciwgTUFYQlVGU0laKTsKKwkJc3dpdGNoIChiemVy cikgeworCQljYXNlIEJaX09LOgorCQljYXNlIEJaX1NUUkVBTV9FTkQ6CisJCQkvKiBObyBw cm9ibGVtLCBuciB3aWxsIGJlIG9rYXkgKi8KKwkJCWJyZWFrOworCQljYXNlIEJaX0RBVEFf RVJST1JfTUFHSUM6CisJCQkvKgorCQkJICogQXMgb3Bwb3NlZCB0byBnenJlYWQoKSwgd2hp Y2ggc2ltcGx5IHJldHVybnMgdGhlCisJCQkgKiBwbGFpbiBmaWxlIGRhdGEsIGlmIGl0IGlz IG5vdCBpbiB0aGUgY29ycmVjdAorCQkJICogY29tcHJlc3NlZCBmb3JtYXQsIEJaMl9ielJl YWQoKSBpbnN0ZWFkIGFib3J0cy4KKwkJCSAqCisJCQkgKiBTbywganVzdCByZXN0YXJ0IGF0 IHRoZSBiZWdpbm5pbmcgb2YgdGhlIGZpbGUgYWdhaW4sCisJCQkgKiBhbmQgdXNlIHBsYWlu IHJlYWRzIGZyb20gbm93IG9uLgorCQkJICovCisJCQlCWjJfYnpSZWFkQ2xvc2UoJmJ6ZXJy LCBiemJ1ZmRlc2MpOworCQkJYnpidWZkZXNjID0gTlVMTDsKKwkJCWlmIChsc2VlayhmLT5m ZCwgMCwgU0VFS19TRVQpID09IC0xKQorCQkJCXJldHVybiAoRU9GKTsKKwkJCW5yID0gcmVh ZChmLT5mZCwgYnVmZmVyLCBNQVhCVUZTSVopOworCQkJYnJlYWs7CisJCWRlZmF1bHQ6CisJ CQkvKiBNYWtlIHN1cmUgd2UgZXhpdCB3aXRoIGFuIGVycm9yICovCisJCQluciA9IC0xOwor CQl9CisJfSBlbHNlIHsKKwkJbnIgPSByZWFkKGYtPmZkLCBidWZmZXIsIE1BWEJVRlNJWik7 CiAJfQotCXJldHVybiAoLTEpOworCisJaWYgKG5yIDw9IDApCisJCXJldHVybiAoRU9GKTsK KworCWJ1ZnJlbSA9IG5yOworCXJldHVybiAoMCk7CiB9CiAKLS8qCi0gKiBSZXR1cm5zIHRy dWUgaWYgdGhlIGZpbGUgcG9zaXRpb24gaXMgYSBFT0YsIHJldHVybnMgZmFsc2UKLSAqIG90 aGVyd2lzZS4KLSAqLwotaW50Ci1ncmVwX2Zlb2Yoc3RydWN0IGZpbGUgKmYpCitzdGF0aWMg aW50CitncmVwX2xuYnVmZ3JvdyhzaXplX3QgbmV3bGVuKQogewotCi0Jc3dpdGNoIChmaWxl YmVoYXZlKSB7Ci0JY2FzZSBGSUxFX1NURElPOgotCQlyZXR1cm4gKGZlb2YoZi0+ZikpOwot CWNhc2UgRklMRV9HWklQOgotCQlyZXR1cm4gKGd6ZW9mKGYtPmd6ZikpOwotCWNhc2UgRklM RV9CWklQOgotCQlyZXR1cm4gKGJ6ZXJyID09IEJaX1NUUkVBTV9FTkQpOwotCX0KLQlyZXR1 cm4gKDEpOworCXVuc2lnbmVkIGNoYXIgKnA7CisKKwlpZiAobG5idWZsZW4gPj0gbmV3bGVu KQorCQlyZXR1cm4gKDApOworCWlmICgocCA9IHJlYWxsb2MobG5idWYsIG5ld2xlbikpID09 IE5VTEwpCisJCXJldHVybiAoRU9GKTsKKwlsbmJ1ZiA9IHA7CisJbG5idWZsZW4gPSBuZXds ZW47CisJcmV0dXJuICgwKTsKIH0KIAotLyoKLSAqIEF0IHRoZSBmaXJzdCBjYWxsLCBmaWxs cyBpbiBhbiBpbnRlcm5hbCBidWZmZXIgYW5kIGNoZWNrcyBpZiB0aGUgZ2l2ZW4KLSAqIGZp bGUgaXMgYSBiaW5hcnkgZmlsZSBhbmQgc2V0cyB0aGUgYmluYXJ5IGZsYWcgYWNjb3JkaW5n bHkuICBUaGVuIHJldHVybnMKLSAqIGEgc2luZ2xlIGxpbmUgYW5kIHNldHMgbGVuIHRvIHRo ZSBsZW5ndGggb2YgdGhlIHJldHVybmVkIGxpbmUuCi0gKiBBdCBhbnkgb3RoZXIgY2FsbCBy ZXR1cm5zIGEgc2luZ2xlIGxpbmUgZWl0aGVyIGZyb20gdGhlIGludGVybmFsIGJ1ZmZlcgot ICogb3IgZnJvbSB0aGUgZmlsZSBpZiB0aGUgYnVmZmVyIGlzIGV4aGF1c3RlZCBhbmQgc2V0 cyBsZW4gdG8gdGhlIGxlbmd0aAotICogb2YgdGhlIGxpbmUuCi0gKi8KIGNoYXIgKgotZ3Jl cF9mZ2V0bG4oc3RydWN0IGZpbGUgKmYsIHNpemVfdCAqbGVuKQorZ3JlcF9mZ2V0bG4oc3Ry dWN0IGZpbGUgKmYsIHNpemVfdCAqbGVucCkKIHsKLQlzdHJ1Y3Qgc3RhdCBzdDsKLQlzaXpl X3QgYnVmc2l6LCBpID0gMDsKLQlpbnQgY2ggPSAwOwotCi0JLyogRmlsbCBpbiB0aGUgYnVm ZmVyIGlmIGl0IGlzIGVtcHR5LiAqLwotCWlmIChiaW5idWZwdHIgPT0gTlVMTCkgewotCi0J CS8qIE9ubHkgcHJlLXJlYWQgdG8gdGhlIGJ1ZmZlciBpZiB3ZSBuZWVkIHRoZSBiaW5hcnkg Y2hlY2suICovCi0JCWlmIChiaW5iZWhhdmUgIT0gQklORklMRV9URVhUKSB7Ci0JCQlpZiAo Zi0+c3RkaW4pCi0JCQkJc3Quc3Rfc2l6ZSA9IE1BWEJVRlNJWjsKLQkJCWVsc2UgaWYgKHN0 YXQoZm5hbWUsICZzdCkgIT0gMCkKLQkJCQllcnIoMiwgTlVMTCk7Ci0KLQkJCWJ1ZnNpeiA9 IChNQVhCVUZTSVogPiAoc3Quc3Rfc2l6ZSAqIFBSRVJFQURfTSkpID8KLQkJCSAgICAoc3Qu c3Rfc2l6ZSAvIDIpIDogTUFYQlVGU0laOwotCi0JCQliaW5idWYgPSBncmVwX21hbGxvYyhz aXplb2YoY2hhcikgKiBidWZzaXopOwotCi0JCQl3aGlsZSAoaSA8IGJ1ZnNpeikgewotCQkJ CWNoID0gZ3JlcF9mZ2V0YyhmKTsKLQkJCQlpZiAoY2ggPT0gRU9GKQotCQkJCQlicmVhazsK LQkJCQliaW5idWZbaSsrXSA9IGNoOwotCQkJfQotCi0JCQlmLT5iaW5hcnkgPSBtZW1jaHIo YmluYnVmLCAoZmlsZWJlaGF2ZSAhPSBGSUxFX0daSVApID8KLQkJCSAgICAnXDAnIDogJ1wy MDAnLCBpIC0gMSkgIT0gTlVMTDsKLQkJfQotCQliaW5idWZzaXogPSBpOwotCQliaW5idWZw dHIgPSBiaW5idWY7CisJdW5zaWduZWQgY2hhciAqcDsKKwljaGFyICpyZXQ7CisJc2l6ZV90 IGxlbjsKKwlzaXplX3QgZGlmZjsKKwlzaXplX3Qgb2ZmOworCisJLyogRmlsbCB0aGUgYnVm ZmVyLCBpZiBuZWNlc3NhcnkgKi8KKwlpZiAoYnVmcmVtID09IDAgJiYgZ3JlcF9yZWZpbGwo ZikpIHsKK2Vycm9yOgorCQkqbGVucCA9IDA7CisJCXJldHVybiAoTlVMTCk7CiAJfQogCi0J LyogUmVhZCBhIGxpbmUgd2hldGhlciBmcm9tIHRoZSBidWZmZXIgb3IgZnJvbSB0aGUgZmls ZSBpdHNlbGYuICovCi0JZm9yIChpID0gMDsgIShncmVwX2Zlb2YoZikgJiYKLQkgICAgKGJp bmJ1ZnB0ciA9PSAmYmluYnVmW2JpbmJ1ZnNpel0pKTsgaSsrKSB7Ci0JCWlmIChiaW5idWZw dHIgPT0gJmJpbmJ1ZltiaW5idWZzaXpdKSB7Ci0JCQljaCA9IGdyZXBfZmdldGMoZik7Ci0J CX0gZWxzZSB7Ci0JCQljaCA9IGJpbmJ1ZnB0clswXTsKLQkJCWJpbmJ1ZnB0cisrOwotCQl9 Ci0JCWlmIChpID49IGxuYnVmbGVuKSB7Ci0JCQlsbmJ1ZmxlbiAqPSAyOwotCQkJbG5idWYg PSBncmVwX3JlYWxsb2MobG5idWYsICsrbG5idWZsZW4pOwotCQl9Ci0JCWlmICgoY2ggPT0g J1xuJykgfHwgKGNoID09IEVPRikpIHsKLQkJCWxuYnVmW2ldID0gJ1wwJzsKLQkJCWJyZWFr OwotCQl9IGVsc2UKLQkJCWxuYnVmW2ldID0gY2g7CisJLyogTG9vayBmb3IgYSBuZXdsaW5l IGluIHRoZSByZW1haW5pbmcgcGFydCBvZiB0aGUgYnVmZmVyICovCisJaWYgKChwID0gbWVt Y2hyKGJ1ZnBvcywgJ1xuJywgYnVmcmVtKSkgIT0gTlVMTCkgeworCQkrK3A7IC8qIGFkdmFu Y2Ugb3ZlciBuZXdsaW5lICovCisJCXJldCA9IGJ1ZnBvczsKKwkJbGVuID0gcCAtIGJ1ZnBv czsKKwkJYnVmcmVtIC09IGxlbjsKKwkJYnVmcG9zID0gcDsKKwkJKmxlbnAgPSBsZW47CisJ CXJldHVybiAocmV0KTsKIAl9Ci0JaWYgKGdyZXBfZmVvZihmKSAmJiAoaSA9PSAwKSAmJiAo Y2ggIT0gJ1xuJykpCisKKwkvKiBXZSBoYXZlIHRvIGNvcHkgdGhlIGN1cnJlbnQgYnVmZmVy ZWQgZGF0YSB0byB0aGUgbGluZSBidWZmZXIgKi8KKwlmb3IgKGxlbiA9IGJ1ZnJlbSwgb2Zm ID0gMDsgOyBsZW4gKz0gYnVmcmVtKSB7CisJCS8qIE1ha2Ugc3VyZSB0aGVyZSBpcyByb29t IGZvciBtb3JlIGRhdGEgKi8KKwkJaWYgKGdyZXBfbG5idWZncm93KGxlbiArIExOQlVGQlVN UCkpCisJCQlnb3RvIGVycm9yOworCQltZW1jcHkobG5idWYgKyBvZmYsIGJ1ZnBvcywgbGVu IC0gb2ZmKTsKKwkJb2ZmID0gbGVuOworCQlpZiAoZ3JlcF9yZWZpbGwoZikpCisJCQlicmVh azsgLyogRU9GIG9yIGVycm9yOiByZXR1cm4gcGFydGlhbCBsaW5lICovCisJCWlmICgocCA9 IG1lbWNocihidWZwb3MsICdcbicsIGJ1ZnJlbSkpID09IE5VTEwpCisJCQljb250aW51ZTsK KwkJLyogZ290IGl0OiBmaW5pc2ggdXAgdGhlIGxpbmUgKGxpa2UgY29kZSBhYm92ZSkgKi8K KwkJKytwOworCQlkaWZmID0gcCAtIGJ1ZnBvczsKKwkJbGVuID0rIGRpZmY7CisJCWlmIChn cmVwX2xuYnVmZ3JvdyhsZW4pKQorCQkgICAgZ290byBlcnJvcjsKKwkJbWVtY3B5KGxuYnVm ICsgb2ZmLCBidWZwb3MsIGRpZmYpOworCQlidWZyZW0gLT0gZGlmZjsKKwkJYnVmcG9zID0g cDsKKwkJYnJlYWs7CisJfQorCSpsZW5wID0gbGVuOworCXJldHVybiBsbmJ1ZjsKK30KKwor c3RhdGljIHN0cnVjdCBmaWxlICoKK2dyZXBfZmlsZV9pbml0KHN0cnVjdCBmaWxlICpmKQor eworCWlmIChmaWxlYmVoYXZlID09IEZJTEVfR1pJUCAmJgorCSAgICAoZ3pidWZkZXNjID0g Z3pkb3BlbihmLT5mZCwgInIiKSkgPT0gTlVMTCkgeworZXJyb3I6CisJCWlmICghZi0+c3Rk aW4pCisJCQljbG9zZShmLT5mZCk7CisJCWZyZWUoZik7CiAJCXJldHVybiAoTlVMTCk7Ci0J KmxlbiA9IGk7Ci0JcmV0dXJuIChsbmJ1Zik7CisJfQorCisJaWYgKGZpbGViZWhhdmUgPT0g RklMRV9CWklQICYmCisJICAgIChiemJ1ZmRlc2MgPSBCWjJfYnpkb3BlbihmLT5mZCwgInIi KSkgPT0gTlVMTCkKKwkJZ290byBlcnJvcjsKKworCS8qIEZpbGwgcmVhZCBidWZmZXIsIGFs c28gY2F0Y2hlcyBlcnJvcnMgZWFybHkgKi8KKwlpZiAoZ3JlcF9yZWZpbGwoZikpCisJCWdv dG8gZXJyb3I7CisKKwkvKiBDaGVjayBmb3IgYmluYXJ5IHN0dWZmLCBpZiBuZWNlc3Nhcnkg Ki8KKwlpZiAoYmluYmVoYXZlICE9IEJJTkZJTEVfVEVYVCAmJiBtZW1jaHIoYnVmcG9zLCAn XDAnLCBidWZyZW0pICE9IE5VTEwpCisJCWYtPmJpbmFyeSA9IHRydWU7CisKKwlyZXR1cm4g KGYpOwogfQogCiAvKgpAQCAtMTg0LDcyICsyMTAsNDUgQEAgZ3JlcF9zdGRpbl9vcGVuKHZv aWQpCiB7CiAJc3RydWN0IGZpbGUgKmY7CiAKLQlzbnByaW50ZihmbmFtZSwgc2l6ZW9mIGZu YW1lLCAiJXMiLCBnZXRzdHIoMSkpOwotCiAJZiA9IGdyZXBfbWFsbG9jKHNpemVvZiAqZik7 CisJbWVtc2V0KGYsIDAsIHNpemVvZiAqZik7CisJZi0+ZmQgPSBmaWxlbm8oc3RkaW4pOwor CWYtPnN0ZGluID0gdHJ1ZTsKIAotCWlmICgoZi0+ZiA9IGZkb3BlbihTVERJTl9GSUxFTk8s ICJyIikpICE9IE5VTEwpIHsKLQkJZi0+c3RkaW4gPSB0cnVlOwotCQlyZXR1cm4gKGYpOwot CX0KLQotCWZyZWUoZik7Ci0JcmV0dXJuIChOVUxMKTsKKwlyZXR1cm4gZ3JlcF9maWxlX2lu aXQoZik7CiB9CiAKIC8qCi0gKiBPcGVucyBhIG5vcm1hbCwgYSBnemlwcGVkIG9yIGEgYnpp cDIgY29tcHJlc3NlZCBmaWxlIGZvciBwcm9jZXNzaW5nLgorICogT3BlbnMgYSBmaWxlIGZv ciBwcm9jZXNzaW5nLgogICovCiBzdHJ1Y3QgZmlsZSAqCiBncmVwX29wZW4oY29uc3QgY2hh ciAqcGF0aCkKIHsKIAlzdHJ1Y3QgZmlsZSAqZjsKIAotCXNucHJpbnRmKGZuYW1lLCBzaXpl b2YgZm5hbWUsICIlcyIsIHBhdGgpOwotCiAJZiA9IGdyZXBfbWFsbG9jKHNpemVvZiAqZik7 Ci0KLQlmLT5zdGRpbiA9IGZhbHNlOwotCXN3aXRjaCAoZmlsZWJlaGF2ZSkgewotCWNhc2Ug RklMRV9TVERJTzoKLQkJaWYgKChmLT5mID0gZm9wZW4ocGF0aCwgInIiKSkgIT0gTlVMTCkK LQkJCXJldHVybiAoZik7Ci0JCWJyZWFrOwotCWNhc2UgRklMRV9HWklQOgotCQlpZiAoKGYt Pmd6ZiA9IGd6b3BlbihmbmFtZSwgInIiKSkgIT0gTlVMTCkKLQkJCXJldHVybiAoZik7Ci0J CWJyZWFrOwotCWNhc2UgRklMRV9CWklQOgotCQlpZiAoKGYtPmJ6ZiA9IEJaMl9iem9wZW4o Zm5hbWUsICJyIikpICE9IE5VTEwpCi0JCQlyZXR1cm4gKGYpOwotCQlicmVhazsKKwltZW1z ZXQoZiwgMCwgc2l6ZW9mICpmKTsKKwlpZiAoKGYtPmZkID0gb3BlbihwYXRoLCBPX1JET05M WSkpID09IC0xKSB7CisJCWZyZWUoZik7CisJCXJldHVybiAoTlVMTCk7CiAJfQogCi0JZnJl ZShmKTsKLQlyZXR1cm4gKE5VTEwpOworCXJldHVybiBncmVwX2ZpbGVfaW5pdChmKTsKIH0K IAogLyoKLSAqIENsb3NlcyBhIG5vcm1hbCwgYSBnemlwcGVkIG9yIGEgYnppcDIgY29tcHJl c3NlZCBmaWxlLgorICogQ2xvc2VzIGEgZmlsZS4KICAqLwogdm9pZAogZ3JlcF9jbG9zZShz dHJ1Y3QgZmlsZSAqZikKIHsKKwljbG9zZShmLT5mZCk7CiAKLQlzd2l0Y2ggKGZpbGViZWhh dmUpIHsKLQljYXNlIEZJTEVfU1RESU86Ci0JCWZjbG9zZShmLT5mKTsKLQkJYnJlYWs7Ci0J Y2FzZSBGSUxFX0daSVA6Ci0JCWd6Y2xvc2UoZi0+Z3pmKTsKLQkJYnJlYWs7Ci0JY2FzZSBG SUxFX0JaSVA6Ci0JCUJaMl9iemNsb3NlKGYtPmJ6Zik7Ci0JCWJyZWFrOwotCX0KLQotCS8q IFJlc2V0IHJlYWQgYnVmZmVyIGZvciB0aGUgZmlsZSB3ZSBhcmUgY2xvc2luZyAqLwotCWJp bmJ1ZnB0ciA9IE5VTEw7Ci0JZnJlZShiaW5idWYpOworCS8qIFJlc2V0IHJlYWQgYnVmZmVy IGFuZCBsaW5lIGJ1ZmZlciAqLworCWJ1ZnBvcyA9IGJ1ZmZlcjsKKwlidWZyZW0gPSAwOwog CisJZnJlZShsbmJ1Zik7CisJbG5idWYgPSBOVUxMOworCWxuYnVmbGVuID0gMDsKIH0KZGlm ZiAtLWdpdCBhL3Vzci5iaW4vZ3JlcC9ncmVwLmggYi91c3IuYmluL2dyZXAvZ3JlcC5oCmlu ZGV4IGJiNWU1ZjkuLjM5ODgyNDAgMTAwNjQ0Ci0tLSBhL3Vzci5iaW4vZ3JlcC9ncmVwLmgK KysrIGIvdXNyLmJpbi9ncmVwL2dyZXAuaApAQCAtNzcsMTAgKzc3LDcgQEAgZXh0ZXJuIGNv bnN0IGNoYXIJCSplcnJzdHJbXTsKICNkZWZpbmUgTUFYX0xJTkVfTUFUQ0hFUwkzMgogCiBz dHJ1Y3QgZmlsZSB7Ci0Jc3RydWN0IG1tZmlsZQkqbW1mOwotCUJaRklMRQkJKmJ6ZjsKLQlG SUxFCQkqZjsKLQlnekZpbGUJCSpnemY7CisJaW50CQkgZmQ7CiAJYm9vbAkJIGJpbmFyeTsK IAlib29sCQkgc3RkaW47CiB9OwpAQCAtMTUzLDExICsxNTAsOSBAQCB2b2lkCSBjbGVhcnF1 ZXVlKHZvaWQpOwogdm9pZAkJIGdyZXBfY2xvc2Uoc3RydWN0IGZpbGUgKmYpOwogc3RydWN0 IGZpbGUJKmdyZXBfc3RkaW5fb3Blbih2b2lkKTsKIHN0cnVjdCBmaWxlCSpncmVwX29wZW4o Y29uc3QgY2hhciAqcGF0aCk7Ci1pbnQJCSBncmVwX2Zlb2Yoc3RydWN0IGZpbGUgKmYpOwot aW50CQkgZ3JlcF9mZ2V0YyhzdHJ1Y3QgZmlsZSAqZik7CiBjaGFyCQkqZ3JlcF9mZ2V0bG4o c3RydWN0IGZpbGUgKmYsIHNpemVfdCAqbGVuKTsKIAogLyogZmFzdGdyZXAuYyAqLwogaW50 CQkgZmFzdGNvbXAoZmFzdGdyZXBfdCAqLCBjb25zdCBjaGFyICopOwogdm9pZAkJIGZncmVw Y29tcChmYXN0Z3JlcF90ICosIGNvbnN0IGNoYXIgKik7Ci1pbnQJCSBncmVwX3NlYXJjaChm YXN0Z3JlcF90ICosIHVuc2lnbmVkIGNoYXIgKiwgc2l6ZV90LCByZWdtYXRjaF90ICopOwor aW50CQkgZ3JlcF9zZWFyY2goZmFzdGdyZXBfdCAqLCBjb25zdCB1bnNpZ25lZCBjaGFyICos IHNpemVfdCwgcmVnbWF0Y2hfdCAqKTsK --------------010000040108020607000907--