[PFC]: hash instrumentation

Chuck Lever (cel@monkey.org)
Wed, 7 Apr 1999 15:49:36 -0400 (EDT)


This message is in MIME format. The first part should be readable text,
while the remaining parts are likely unreadable without MIME-aware tools.
Send mail to mime@docserver.cac.washington.edu for more info.

--0-294808368-923514576=:17860
Content-Type: TEXT/PLAIN; charset=US-ASCII

[PFC] = patch for comments - not a bug fix or for general use

i've attached a diff to this message that contains the hash
instrumentation i'm using to analyze and improve hash functions. i'd like
to instrument a couple of other hashes (dentry, inode, fib), and create a
new directory in /proc called /proc/cache, with files for each of the
important caches. these may not contain the histogram information, since
it's just for testing, but they might contain important statistics about
hash performance, for example.

here's some sample output (from /var/log/messages) to show what
information you might be able to gather from the hash instrumentation:

for the page cache:

Apr 7 15:08:50 pillbox kernel: Total pages in hash: 4079 total buckets:
2048
Apr 7 15:08:50 pillbox kernel: hash table histogram:
Apr 7 15:08:50 pillbox kernel: size: 0 buckets: 379 pages: 0
Apr 7 15:08:50 pillbox kernel: size: 1 buckets: 462 pages: 462
Apr 7 15:08:50 pillbox kernel: size: 2 buckets: 507 pages: 1014
Apr 7 15:08:50 pillbox kernel: size: 3 buckets: 385 pages: 1155
Apr 7 15:08:50 pillbox kernel: size: 4 buckets: 178 pages: 712
Apr 7 15:08:50 pillbox kernel: size: 5 buckets: 94 pages: 470
Apr 7 15:08:50 pillbox kernel: size: 6 buckets: 36 pages: 216
Apr 7 15:08:50 pillbox kernel: size: 7 buckets: 6 pages: 42
Apr 7 15:08:50 pillbox kernel: size: 8 buckets: 1 pages: 8
Apr 7 15:08:50 pillbox kernel: size: 9 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: size: 10 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: size: 11 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: size: 12 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: size: 13 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: size: 14 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: size: 15 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: size:>15 buckets: 0 pages: 0
Apr 7 15:08:50 pillbox kernel: Max bucket size: 8
Apr 7 15:08:50 pillbox kernel: Total lookups: 58933 pages found: 52044
(hit rate: 88%)
Apr 7 15:08:50 pillbox kernel: find_page loops: 53950 loops/lookup:
915/1000

notice that the bucket sizes are nicely distributed, and that most of the
buckets are used. loops/lookup is really the number that matters here,
since it provides a good indication of how much average effort is required
to find a given page. loops/lookup is the average number of times
__find_page (or find_buffer, below) had to loop during a lookup operation.

the histogram table is organized so that each row represents buckets of a
given size. for instance, the row for empty buckets is "size:0" and the
number of buckets that were empty is 379. the number of buckets that
contained only 2 pages is 507, and there were 1014 pages stored in buckets
that only contained 2 pages. this allows us to clearly see the bucket
size distribution, and to easily tell when there are lots of large or
empty buckets (both bad situations).

here's the buffer cache:

Apr 7 15:08:50 pillbox kernel: total buffers in hash table: 2149
Apr 7 15:08:50 pillbox kernel: total buckets: 32768 largest: 59
Apr 7 15:08:50 pillbox kernel: times find_buffer looped: 53900
loops/lookup: 874/1000
Apr 7 15:08:50 pillbox kernel: hash table histogram:
Apr 7 15:08:50 pillbox kernel: size: 0 buckets: 31941 buffers: 0
Apr 7 15:08:50 pillbox kernel: size: 1 buckets: 648 buffers: 648
Apr 7 15:08:50 pillbox kernel: size: 2 buckets: 50 buffers: 100
Apr 7 15:08:50 pillbox kernel: size: 3 buckets: 26 buffers: 78
Apr 7 15:08:50 pillbox kernel: size: 4 buckets: 8 buffers: 32
Apr 7 15:08:50 pillbox kernel: size: 5 buckets: 16 buffers: 80
Apr 7 15:08:50 pillbox kernel: size: 6 buckets: 17 buffers: 102
Apr 7 15:08:50 pillbox kernel: size: 7 buckets: 18 buffers: 126
Apr 7 15:08:50 pillbox kernel: size: 8 buckets: 12 buffers: 96
Apr 7 15:08:50 pillbox kernel: size: 9 buckets: 3 buffers: 27
Apr 7 15:08:50 pillbox kernel: size: 10 buckets: 5 buffers: 50
Apr 7 15:08:50 pillbox kernel: size: 11 buckets: 4 buffers: 44
Apr 7 15:08:50 pillbox kernel: size: 12 buckets: 1 buffers: 12
Apr 7 15:08:50 pillbox kernel: size: 13 buckets: 0 buffers: 0
Apr 7 15:08:50 pillbox kernel: size: 14 buckets: 2 buffers: 28
Apr 7 15:08:50 pillbox kernel: size: 15 buckets: 0 buffers: 0
Apr 7 15:08:50 pillbox kernel: size:>15 buckets: 17 buffers: 726

the buffer hash function doesn't work well: bucket sizes are not nicely
distributed, there is a huge number of empty buckets, and there are more
than a few buckets that contain lots of buffers. this is just after the
system was booted, but after some file system intensive activity, we have
this:

page hash:

Apr 7 15:36:20 pillbox kernel: Total pages in hash: 21854 total buckets:
2048
Apr 7 15:36:20 pillbox kernel: hash table histogram:
Apr 7 15:36:20 pillbox kernel: size: 0 buckets: 0 pages: 0
Apr 7 15:36:20 pillbox kernel: size: 1 buckets: 0 pages: 0
Apr 7 15:36:20 pillbox kernel: size: 2 buckets: 3 pages: 6
Apr 7 15:36:20 pillbox kernel: size: 3 buckets: 4 pages: 12
Apr 7 15:36:20 pillbox kernel: size: 4 buckets: 20 pages: 80
Apr 7 15:36:20 pillbox kernel: size: 5 buckets: 60 pages: 300
Apr 7 15:36:20 pillbox kernel: size: 6 buckets: 76 pages: 456
Apr 7 15:36:20 pillbox kernel: size: 7 buckets: 131 pages: 917
Apr 7 15:36:20 pillbox kernel: size: 8 buckets: 198 pages: 1584
Apr 7 15:36:20 pillbox kernel: size: 9 buckets: 247 pages: 2223
Apr 7 15:36:20 pillbox kernel: size: 10 buckets: 261 pages: 2610
Apr 7 15:36:20 pillbox kernel: size: 11 buckets: 284 pages: 3124
Apr 7 15:36:20 pillbox kernel: size: 12 buckets: 224 pages: 2688
Apr 7 15:36:20 pillbox kernel: size: 13 buckets: 185 pages: 2405
Apr 7 15:36:20 pillbox kernel: size: 14 buckets: 148 pages: 2072
Apr 7 15:36:20 pillbox kernel: size: 15 buckets: 82 pages: 1230
Apr 7 15:36:20 pillbox kernel: size:>15 buckets: 125 pages: 1427
Apr 7 15:36:20 pillbox kernel: Max bucket size: 22
Apr 7 15:36:20 pillbox kernel: Total lookups: 5129003 pages found:
4590496 (hit rate: 89%)
Apr 7 15:36:20 pillbox kernel: find_page loops: 28371900 loops/lookup:
507/1000

the loops/lookup is pretty low (less than one is good) and the hash
distribution is still nicely shaped. it's clear that the hash table is
too small, though. for buffers:

Apr 7 15:36:20 pillbox kernel: total buffers in hash table: 1767
Apr 7 15:36:20 pillbox kernel: total buckets: 32768 largest: 25
Apr 7 15:36:20 pillbox kernel: times find_buffer looped: 2314427
loops/lookup: 1078/1000
Apr 7 15:36:20 pillbox kernel: hash table histogram:
Apr 7 15:36:20 pillbox kernel: size: 0 buckets: 31866 buffers: 0
Apr 7 15:36:20 pillbox kernel: size: 1 buckets: 687 buffers: 687
Apr 7 15:36:20 pillbox kernel: size: 2 buckets: 109 buffers: 218
Apr 7 15:36:20 pillbox kernel: size: 3 buckets: 19 buffers: 57
Apr 7 15:36:20 pillbox kernel: size: 4 buckets: 11 buffers: 44
Apr 7 15:36:20 pillbox kernel: size: 5 buckets: 15 buffers: 75
Apr 7 15:36:20 pillbox kernel: size: 6 buckets: 9 buffers: 54
Apr 7 15:36:20 pillbox kernel: size: 7 buckets: 9 buffers: 63
Apr 7 15:36:20 pillbox kernel: size: 8 buckets: 4 buffers: 32
Apr 7 15:36:20 pillbox kernel: size: 9 buckets: 7 buffers: 63
Apr 7 15:36:20 pillbox kernel: size: 10 buckets: 4 buffers: 40
Apr 7 15:36:20 pillbox kernel: size: 11 buckets: 5 buffers: 55
Apr 7 15:36:20 pillbox kernel: size: 12 buckets: 4 buffers: 48
Apr 7 15:36:20 pillbox kernel: size: 13 buckets: 6 buffers: 78
Apr 7 15:36:20 pillbox kernel: size: 14 buckets: 1 buffers: 14
Apr 7 15:36:20 pillbox kernel: size: 15 buckets: 1 buffers: 15
Apr 7 15:36:20 pillbox kernel: size:>15 buckets: 11 buffers: 224

for buffers the story is quite different. there's still a huge number of
empty buckets, and the size distribution is practically flat.
loops/lookup is greater than one.

- Chuck Lever

--
corporate:	<chuckl@netscape.com>
personal:	<chucklever@netscape.net> or <cel@monkey.org>

The Linux Scalability project: http://www.citi.umich.edu/projects/citi-netscape/

--0-294808368-923514576=:17860 Content-Type: TEXT/PLAIN; charset=US-ASCII; name="hash-inst.diff" Content-Transfer-Encoding: BASE64 Content-ID: <Pine.BSF.4.03.9904071549361.17860@funky.monkey.org> Content-Description: Content-Disposition: attachment; filename="hash-inst.diff"

ZGlmZiAtcnVOIGxpbnV4LTIuMi41LXJlZmVyZW5jZS9hcmNoL2kzODYvbW0v aW5pdC5jIGxpbnV4L2FyY2gvaTM4Ni9tbS9pbml0LmMNCi0tLSBsaW51eC0y LjIuNS1yZWZlcmVuY2UvYXJjaC9pMzg2L21tL2luaXQuYwlUaHUgSmFuIDIx IDE0OjI4OjQwIDE5OTkNCisrKyBsaW51eC9hcmNoL2kzODYvbW0vaW5pdC5j CVdlZCBBcHIgIDcgMTI6NDk6NDMgMTk5OQ0KQEAgLTE3LDYgKzE3LDcgQEAN CiAjaW5jbHVkZSA8bGludXgvc3dhcC5oPg0KICNpbmNsdWRlIDxsaW51eC9z bXAuaD4NCiAjaW5jbHVkZSA8bGludXgvaW5pdC5oPg0KKyNpbmNsdWRlIDxs aW51eC9wYWdlbWFwLmg+DQogI2lmZGVmIENPTkZJR19CTEtfREVWX0lOSVRS RA0KICNpbmNsdWRlIDxsaW51eC9ibGsuaD4NCiAjZW5kaWYNCkBAIC0xNjks NiArMTcwLDcgQEANCiAJcHJpbnRrKCIlZCBwYWdlcyBzaGFyZWRcbiIsc2hh cmVkKTsNCiAJcHJpbnRrKCIlZCBwYWdlcyBzd2FwIGNhY2hlZFxuIixjYWNo ZWQpOw0KIAlwcmludGsoIiVsZCBwYWdlcyBpbiBwYWdlIHRhYmxlIGNhY2hl XG4iLHBndGFibGVfY2FjaGVfc2l6ZSk7DQorCXNob3dfcGFnZV9oYXNoKCk7 DQogCXNob3dfYnVmZmVycygpOw0KICNpZmRlZiBDT05GSUdfTkVUDQogCXNo b3dfbmV0X2J1ZmZlcnMoKTsNCmRpZmYgLXJ1TiBsaW51eC0yLjIuNS1yZWZl cmVuY2UvZnMvYnVmZmVyLmMgbGludXgvZnMvYnVmZmVyLmMNCi0tLSBsaW51 eC0yLjIuNS1yZWZlcmVuY2UvZnMvYnVmZmVyLmMJTW9uIE1hciAyOSAyMToz NjoxOSAxOTk5DQorKysgbGludXgvZnMvYnVmZmVyLmMJV2VkIEFwciAgNyAx NToxMToxOCAxOTk5DQpAQCAtMTE1LDYgKzExNSwyOSBAQA0KIGludCBiZGZs dXNoX21pbltOX1BBUkFNXSA9IHsgIDAsICAxMCwgICAgNSwgICAyNSwgIDAs ICAgMSpIWiwgICAxKkhaLCAxLCAxfTsNCiBpbnQgYmRmbHVzaF9tYXhbTl9Q QVJBTV0gPSB7MTAwLDUwMDAsIDIwMDAsIDIwMDAsMTAwLCA2MDAqSFosIDYw MCpIWiwgMjA0NywgNX07DQogDQorLyogYWxpZ24gdGhlIG5leHQgc3RydWN0 ICovDQorX19hc21fXyAoIiAgICAgICAuYWxpZ24gMTZcbiIpOw0KKw0KK3N0 cnVjdCB0b3RhbHMgew0KKwl1bnNpZ25lZCBsb25nIGxvb2t1cHM7DQorCXVu c2lnbmVkIGxvbmcgaGl0czsNCisJdW5zaWduZWQgbG9uZyBmYl9sb29wczsN CisJdW5zaWduZWQgbG9uZyBuZGlydHlfd3JpdHRlbjsNCisJdW5zaWduZWQg bG9uZyBiZGZsdXNoOw0KKwl1bnNpZ25lZCBsb25nIGJkZmx1c2hfd2FpdDsN CisJdW5zaWduZWQgbG9uZyB3YWl0X29uX2J1ZmZlcjsNCisJdW5zaWduZWQg bG9uZyByZWZpbGxzOw0KKwl1bnNpZ25lZCBsb25nIGdyb3dfYnVmZmVyczsN CisJdW5zaWduZWQgbG9uZyBmcmVlX2J1ZmZlcnM7DQorCXVuc2lnbmVkIGxv bmcgZm9yZ290dGVuOw0KKwl1bnNpZ25lZCBsb25nIGZyZWVkX3BhZ2VzOw0K Kwl1bnNpZ25lZCBsb25nIGJyZWFkczsgDQorCXVuc2lnbmVkIGxvbmcgYnJl YWRhczsNCisJdW5zaWduZWQgbG9uZyByZWFkcGFnZTsNCisJdW5zaWduZWQg bG9uZyBicndfcGFnZTsNCisJdW5zaWduZWQgbG9uZyBicndfcmVhZDsNCit9 IGJ1ZmZlcl9jb3VudGVycyA9IHswLCB9Ow0KKw0KIHZvaWQgd2FrZXVwX2Jk Zmx1c2goaW50KTsNCiANCiAvKg0KQEAgLTEzMSw2ICsxNTQsNyBAQA0KIAlz dHJ1Y3QgdGFza19zdHJ1Y3QgKnRzayA9IGN1cnJlbnQ7DQogCXN0cnVjdCB3 YWl0X3F1ZXVlIHdhaXQ7DQogDQorCWJ1ZmZlcl9jb3VudGVycy53YWl0X29u X2J1ZmZlcisrOw0KIAliaC0+Yl9jb3VudCsrOw0KIAl3YWl0LnRhc2sgPSB0 c2s7DQogCWFkZF93YWl0X3F1ZXVlKCZiaC0+Yl93YWl0LCAmd2FpdCk7DQpA QCAtMjIwLDYgKzI0NCw3IEBADQogCQkJYmgtPmJfY291bnQrKzsNCiAJCQlu ZXh0LT5iX2NvdW50Kys7DQogCQkJYmgtPmJfZmx1c2h0aW1lID0gMDsNCisJ CQlidWZmZXJfY291bnRlcnMubmRpcnR5X3dyaXR0ZW4rKzsNCiAJCQlsbF9y d19ibG9jayhXUklURSwgMSwgJmJoKTsNCiAJCQliaC0+Yl9jb3VudC0tOw0K IAkJCW5leHQtPmJfY291bnQtLTsNCkBAIC01NzgsMTcgKzYwMywyMCBAQA0K IHsJCQ0KIAlzdHJ1Y3QgYnVmZmVyX2hlYWQgKiBuZXh0Ow0KIA0KKwlidWZm ZXJfY291bnRlcnMubG9va3VwcysrOw0KIAluZXh0ID0gaGFzaChkZXYsYmxv Y2spOw0KIAlmb3IgKDs7KSB7DQogCQlzdHJ1Y3QgYnVmZmVyX2hlYWQgKnRt cCA9IG5leHQ7DQogCQlpZiAoIW5leHQpDQotCQkJYnJlYWs7DQorCQkJcmV0 dXJuIG5leHQ7DQorCQlidWZmZXJfY291bnRlcnMuZmJfbG9vcHMrKzsNCiAJ CW5leHQgPSB0bXAtPmJfbmV4dDsNCiAJCWlmICh0bXAtPmJfYmxvY2tuciAh PSBibG9jayB8fCB0bXAtPmJfc2l6ZSAhPSBzaXplIHx8IHRtcC0+Yl9kZXYg IT0gZGV2KQ0KIAkJCWNvbnRpbnVlOw0KIAkJbmV4dCA9IHRtcDsNCiAJCWJy ZWFrOw0KIAl9DQorCWJ1ZmZlcl9jb3VudGVycy5oaXRzKys7DQogCXJldHVy biBuZXh0Ow0KIH0NCiANCkBAIC04NTMsNiArODgxLDcgQEANCiAJCV9fYnJl bHNlKGJ1Zik7DQogCQlyZXR1cm47DQogCX0NCisJYnVmZmVyX2NvdW50ZXJz LmZvcmdvdHRlbisrOw0KIAlidWYtPmJfY291bnQgPSAwOw0KIAlyZW1vdmVf ZnJvbV9xdWV1ZXMoYnVmKTsNCiAJcHV0X2xhc3RfZnJlZShidWYpOw0KQEAg LTg2Niw2ICs4OTUsNyBAQA0KIHsNCiAJc3RydWN0IGJ1ZmZlcl9oZWFkICog Ymg7DQogDQorCWJ1ZmZlcl9jb3VudGVycy5icmVhZHMrKzsNCiAJYmggPSBn ZXRibGsoZGV2LCBibG9jaywgc2l6ZSk7DQogCXRvdWNoX2J1ZmZlcihiaCk7 DQogCWlmIChidWZmZXJfdXB0b2RhdGUoYmgpKQ0KQEAgLTkwMSw2ICs5MzEs NyBAQA0KIAlpZiAoYmxvY2sgPCAwKQ0KIAkJcmV0dXJuIE5VTEw7DQogDQor CWJ1ZmZlcl9jb3VudGVycy5icmVhZGFzKys7DQogCWJoID0gZ2V0YmxrKGRl diwgYmxvY2ssIGJ1ZnNpemUpOw0KIAlpbmRleCA9IEJVRlNJWkVfSU5ERVgo YmgtPmJfc2l6ZSk7DQogDQpAQCAtMTI0Myw2ICsxMjc0LDEwIEBADQogCXN0 cnVjdCBidWZmZXJfaGVhZCAqYmgsICpwcmV2LCAqbmV4dCwgKmFycltNQVhf QlVGX1BFUl9QQUdFXTsNCiAJaW50IGJsb2NrLCBucjsNCiANCisJYnVmZmVy X2NvdW50ZXJzLmJyd19wYWdlKys7DQorCWlmIChydyA9PSBSRUFEKQ0KKwkJ YnVmZmVyX2NvdW50ZXJzLmJyd19yZWFkKys7DQorDQogCWlmICghUGFnZUxv Y2tlZChwYWdlKSkNCiAJCXBhbmljKCJicndfcGFnZTogcGFnZSBub3QgbG9j a2VkIGZvciBJL08iKTsNCiAJY2xlYXJfYml0KFBHX3VwdG9kYXRlLCAmcGFn ZS0+ZmxhZ3MpOw0KQEAgLTEzNTksNiArMTM5NCw3IEBADQogCWludCAqcCwg bnJbUEFHRV9TSVpFLzUxMl07DQogCWludCBpOw0KIA0KKwlidWZmZXJfY291 bnRlcnMucmVhZHBhZ2UrKzsNCiAJYXRvbWljX2luYygmcGFnZS0+Y291bnQp Ow0KIAlzZXRfYml0KFBHX2xvY2tlZCwgJnBhZ2UtPmZsYWdzKTsNCiAJc2V0 X2JpdChQR19mcmVlX2FmdGVyLCAmcGFnZS0+ZmxhZ3MpOw0KQEAgLTEzOTYs NiArMTQzMiw3IEBADQogDQogCWlmICghKHBhZ2UgPSBfX2dldF9mcmVlX3Bh Z2UoR0ZQX0JVRkZFUikpKQ0KIAkJcmV0dXJuIDA7DQorCWJ1ZmZlcl9jb3Vu dGVycy5ncm93X2J1ZmZlcnMrKzsNCiAJYmggPSBjcmVhdGVfYnVmZmVycyhw YWdlLCBzaXplLCAwKTsNCiAJaWYgKCFiaCkgew0KIAkJZnJlZV9wYWdlKHBh Z2UpOw0KQEAgLTE0NTksNiArMTQ5Niw3IEBADQogCQlyZXR1cm4gMDsNCiAJ fSB3aGlsZSAodG1wICE9IGJoKTsNCiANCisJYnVmZmVyX2NvdW50ZXJzLmZy ZWVfYnVmZmVycysrOw0KIAl0bXAgPSBiaDsNCiAJZG8gew0KIAkJc3RydWN0 IGJ1ZmZlcl9oZWFkICogcCA9IHRtcDsNCkBAIC0xNDcyLDYgKzE1MTAsNyBA QA0KIAl3YWtlX3VwKCZidWZmZXJfd2FpdCk7DQogDQogCS8qIEFuZCBmcmVl IHRoZSBwYWdlICovDQorCWJ1ZmZlcl9jb3VudGVycy5mcmVlZF9wYWdlcysr Ow0KIAlidWZmZXJtZW0gLT0gUEFHRV9TSVpFOw0KIAlwYWdlX21hcC0+YnVm ZmVycyA9IE5VTEw7DQogCV9fZnJlZV9wYWdlKHBhZ2VfbWFwKTsNCkBAIC0x NDgwLDEyICsxNTE5LDE2IEBADQogDQogLyogPT09PT09PT09PT09PT09PT09 IERlYnVnZ2luZyA9PT09PT09PT09PT09PT09PT09ICovDQogDQorI2RlZmlu ZSBISVNUT0dSQU1fTUFYIDE2DQorDQogdm9pZCBzaG93X2J1ZmZlcnModm9p ZCkNCiB7DQogCXN0cnVjdCBidWZmZXJfaGVhZCAqIGJoOw0KIAlpbnQgZm91 bmQgPSAwLCBsb2NrZWQgPSAwLCBkaXJ0eSA9IDAsIHVzZWQgPSAwLCBsYXN0 dXNlZCA9IDA7DQogCWludCBwcm90ZWN0ZWQgPSAwOw0KLQlpbnQgbmxpc3Q7 DQorCWludCBubGlzdCwgbnNpemU7DQorCWludCBtYXgsIG1heHN1bTsNCisJ dW5zaWduZWQgaGlzdFtISVNUT0dSQU1fTUFYKzFdOw0KIAlzdGF0aWMgY2hh ciAqYnVmX3R5cGVzW05SX0xJU1RdID0geyJDTEVBTiIsIkxPQ0tFRCIsIkRJ UlRZIn07DQogDQogCXByaW50aygiQnVmZmVyIG1lbW9yeTogICAlNmRrQlxu IixidWZmZXJtZW0+PjEwKTsNCkBAIC0xNDkzLDYgKzE1MzYsNjggQEANCiAJ cHJpbnRrKCJCdWZmZXIgYmxvY2tzOiAgICU2ZFxuIixucl9idWZmZXJzKTsN CiAJcHJpbnRrKCJCdWZmZXIgaGFzaGVkOiAgICU2ZFxuIixucl9oYXNoZWRf YnVmZmVycyk7DQogDQorCXByaW50aygiY2FjaGUgaGl0IHJhdGU6ICVkJSUg KCVsZCBoaXRzIGluICVsZCBsb29rdXBzKVxuIiwNCisJCSh1bnNpZ25lZCkg KChidWZmZXJfY291bnRlcnMuaGl0cyAqIDEwMCkvYnVmZmVyX2NvdW50ZXJz Lmxvb2t1cHMpLA0KKwkJYnVmZmVyX2NvdW50ZXJzLmhpdHMsIGJ1ZmZlcl9j b3VudGVycy5sb29rdXBzKTsNCisJcHJpbnRrKCJ0b3RhbCBidWZmZXJzIGZs dXNoZWQ6ICVsZCAgZm9yZ290dGVuOiAlbGRcbiIsDQorCQlidWZmZXJfY291 bnRlcnMubmRpcnR5X3dyaXR0ZW4sIGJ1ZmZlcl9jb3VudGVycy5mb3Jnb3R0 ZW4pOw0KKwlwcmludGsoImJkZmx1c2ggcnVuczogJWxkICB0aW1lcyB3ZSB3 YWl0ZWQgZm9yIGl0OiAlbGRcbiIsDQorCQlidWZmZXJfY291bnRlcnMuYmRm bHVzaCwgYnVmZmVyX2NvdW50ZXJzLmJkZmx1c2hfd2FpdCk7DQorCXByaW50 aygidG90YWwgd2FpdHMgZm9yIGEgYnVmZmVyOiAlbGRcbiIsDQorCQlidWZm ZXJfY291bnRlcnMud2FpdF9vbl9idWZmZXIpOw0KKwlwcmludGsoInJlcXVl c3RzIHRvIGdyb3cvc2hyaW5rIGJ1ZmZlciBjYWNoZTogJWxkLyVsZFxuIiwN CisJCWJ1ZmZlcl9jb3VudGVycy5ncm93X2J1ZmZlcnMsIGJ1ZmZlcl9jb3Vu dGVycy5mcmVlX2J1ZmZlcnMpOw0KKwlwcmludGsoInBhZ2VzIGZyZWVkIGR1 cmluZyBzaHJpbmsgcmVxdWVzdHM6ICVsZFxuIiwNCisJCWJ1ZmZlcl9jb3Vu dGVycy5mcmVlZF9wYWdlcyk7DQorCXByaW50aygiZnJlZSBsaXN0IHJlZmls bHM6ICVsZFxuIiwgYnVmZmVyX2NvdW50ZXJzLnJlZmlsbHMpOw0KKw0KKwlw cmludGsoImJyZWFkKCkgY2FsbHM6ICVsZCAgYnJlYWRhKCkgY2FsbHM6ICVs ZFxuIiwNCisJYnVmZmVyX2NvdW50ZXJzLmJyZWFkcywgYnVmZmVyX2NvdW50 ZXJzLmJyZWFkYXMpOw0KKwlwcmludGsoImdlbmVyaWNfcmVhZHBhZ2UgY2Fs bHM6ICVsZFxuIiwNCisJCWJ1ZmZlcl9jb3VudGVycy5yZWFkcGFnZSk7DQor CXByaW50aygiYnJ3X3BhZ2UoKSBjYWxsczogJWxkICByZWFkL3dyaXRlOiAl bGQvJWxkXG4iLA0KKwkJYnVmZmVyX2NvdW50ZXJzLmJyd19wYWdlLCBidWZm ZXJfY291bnRlcnMuYnJ3X3JlYWQsDQorCQkoYnVmZmVyX2NvdW50ZXJzLmJy d19wYWdlIC0gYnVmZmVyX2NvdW50ZXJzLmJyd19yZWFkKSk7DQorDQorCWZv ciAobmxpc3Q9MDsgbmxpc3QgPD0gSElTVE9HUkFNX01BWDsgbmxpc3QrKykN CisJICBoaXN0W25saXN0XSA9IDA7DQorCWZvdW5kID0gMDsNCisJbWF4ID0g MDsNCisJbWF4c3VtID0gMDsNCisJZm9yKG5saXN0ID0gMDsgbmxpc3QgPD0g YmhfaGFzaF9tYXNrOyBubGlzdCsrKSB7DQorCSAgYmggPSBoYXNoX3RhYmxl W25saXN0XTsNCisJICBpZiAoIWJoKSB7DQorCQloaXN0WzBdKys7DQorCQlj b250aW51ZTsNCisJICB9DQorDQorCSAgdXNlZCA9IDA7DQorCSAgZG8gew0K KwkJZm91bmQrKzsNCisJCXVzZWQrKzsNCisJCWJoID0gYmgtPmJfbmV4dDsN CisJICB9IHdoaWxlIChiaCk7DQorCSAgaWYgKG1heCA8IHVzZWQpIG1heCA9 IHVzZWQ7DQorCSAgaWYgKHVzZWQgPCBISVNUT0dSQU1fTUFYKQ0KKwkJaGlz dFt1c2VkXSsrOw0KKwkgIGVsc2Ugew0KKwkJbWF4c3VtICs9IHVzZWQ7DQor CQloaXN0W0hJU1RPR1JBTV9NQVhdKys7DQorCSAgfQ0KKwl9DQorCXByaW50 aygidG90YWwgYnVmZmVycyBpbiBoYXNoIHRhYmxlOiAlZFxuIiwgZm91bmQp Ow0KKwlwcmludGsoIiB0b3RhbCBidWNrZXRzOiAlbGQgIGxhcmdlc3Q6ICVk XG4iLA0KKwliaF9oYXNoX21hc2srMSwgbWF4KTsNCisJcHJpbnRrKCIgdGlt ZXMgZmluZF9idWZmZXIgbG9vcGVkOiAlbGQgIGxvb3BzL2xvb2t1cDogJWxk LzEwMDBcbiIsDQorCQlidWZmZXJfY291bnRlcnMuZmJfbG9vcHMsDQorCQko YnVmZmVyX2NvdW50ZXJzLmZiX2xvb3BzICogMTAwMCkgLyBidWZmZXJfY291 bnRlcnMubG9va3Vwcyk7DQorCXByaW50aygiIGhhc2ggdGFibGUgaGlzdG9n cmFtOlxuIik7DQorCWZvciAobmxpc3QgPSAwOyBubGlzdCA8IEhJU1RPR1JB TV9NQVg7IG5saXN0KyspDQorCSAgcHJpbnRrKCIgIHNpemU6ICUtMmQgIGJ1 Y2tldHM6ICUtNmQgIGJ1ZmZlcnM6ICUtNmRcbiIsDQorCQkJbmxpc3QsIGhp c3Rbbmxpc3RdLCBubGlzdCpoaXN0W25saXN0XSk7DQorCXByaW50aygiICBz aXplOj4lLTJkICBidWNrZXRzOiAlLTZkICBidWZmZXJzOiAlLTZkXG4iLA0K KwkJCUhJU1RPR1JBTV9NQVgtMSwgaGlzdFtISVNUT0dSQU1fTUFYXSwgbWF4 c3VtKTsNCisNCiAJZm9yKG5saXN0ID0gMDsgbmxpc3QgPCBOUl9MSVNUOyBu bGlzdCsrKSB7DQogCSAgZm91bmQgPSBsb2NrZWQgPSBkaXJ0eSA9IHVzZWQg PSBsYXN0dXNlZCA9IHByb3RlY3RlZCA9IDA7DQogCSAgYmggPSBscnVfbGlz dFtubGlzdF07DQpAQCAtMTUxNCw3ICsxNjE5LDE5IEBADQogCQkgIiVkIGxv Y2tlZCwgJWQgcHJvdGVjdGVkLCAlZCBkaXJ0eVxuIiwNCiAJCSBidWZfdHlw ZXNbbmxpc3RdLCBmb3VuZCwgdXNlZCwgbGFzdHVzZWQsDQogCQkgbG9ja2Vk LCBwcm90ZWN0ZWQsIGRpcnR5KTsNCi0JfTsNCisJfQ0KKw0KKwlmb3IobnNp emUgPSAwOyBuc2l6ZSA8IE5SX1NJWkVTOyBuc2l6ZSsrKSB7DQorCSAgZm91 bmQgPSAwOw0KKwkgIGJoID0gZnJlZV9saXN0W25zaXplXTsNCisJICBpZigh YmgpIGNvbnRpbnVlOw0KKw0KKwkgIGRvIHsNCisJCWZvdW5kKys7DQorCQli aCA9IGJoLT5iX25leHRfZnJlZTsNCisJICB9IHdoaWxlIChiaCAhPSBmcmVl X2xpc3RbbnNpemVdKTsNCisJICBwcmludGsoIiAgICBGUkVFOiAlZCAlZC1i eXRlIGJ1ZmZlcnNcbiIsIGZvdW5kLCAobnNpemUrMSk8PDkpOw0KKwl9DQog fQ0KIA0KIA0KQEAgLTE1NzYsNiArMTY5Myw3IEBADQogew0KIAlpZiAoY3Vy cmVudCA9PSBiZGZsdXNoX3RzaykNCiAJCXJldHVybjsNCisJaWYgKHdhaXQp IGJ1ZmZlcl9jb3VudGVycy5iZGZsdXNoX3dhaXQrKzsNCiAJd2FrZV91cCgm YmRmbHVzaF93YWl0KTsNCiAJaWYgKHdhaXQpIHsNCiAJCXJ1bl90YXNrX3F1 ZXVlKCZ0cV9kaXNrKTsNCkBAIC0xNjQ5LDYgKzE3NjcsNyBAQA0KICNpZmRl ZiBERUJVRw0KIAkJCQkgaWYobmxpc3QgIT0gQlVGX0RJUlRZKSBuY291bnQr KzsNCiAjZW5kaWYNCisJCQkJIGJ1ZmZlcl9jb3VudGVycy5uZGlydHlfd3Jp dHRlbisrOw0KIAkJCQkgbGxfcndfYmxvY2soV1JJVEUsIDEsICZiaCk7DQog CQkJCSBiaC0+Yl9jb3VudC0tOw0KIAkJCQkgbmV4dC0+Yl9jb3VudC0tOw0K QEAgLTE3NTMsNiArMTg3Miw3IEBADQogI2lmZGVmIERFQlVHDQogCQlwcmlu dGsoImJkZmx1c2goKSBhY3RpdmF0ZWQuLi4iKTsNCiAjZW5kaWYNCisJCWJ1 ZmZlcl9jb3VudGVycy5iZGZsdXNoKys7DQogDQogCQlDSEVDS19FTUVSR0VO Q1lfU1lOQw0KIA0KQEAgLTE3OTgsNiArMTkxOCw3IEBADQogCQkJCQkgIG5l eHQtPmJfY291bnQrKzsNCiAJCQkJCSAgYmgtPmJfY291bnQrKzsNCiAJCQkJ CSAgbmRpcnR5Kys7DQorCQkJCQkgIGJ1ZmZlcl9jb3VudGVycy5uZGlydHlf d3JpdHRlbisrOw0KIAkJCQkJICBiaC0+Yl9mbHVzaHRpbWUgPSAwOw0KIAkJ CQkJICBpZiAobWFqb3IgPT0gTE9PUF9NQUpPUikgew0KIAkJCQkJCSAgbGxf cndfYmxvY2sod3J0YV9jbWQsMSwgJmJoKTsNCmRpZmYgLXJ1TiBsaW51eC0y LjIuNS1yZWZlcmVuY2UvaW5jbHVkZS9saW51eC9wYWdlbWFwLmggbGludXgv aW5jbHVkZS9saW51eC9wYWdlbWFwLmgNCi0tLSBsaW51eC0yLjIuNS1yZWZl cmVuY2UvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgJTW9uIE1hciAyOSAyMTo0 NTowNyAxOTk5DQorKysgbGludXgvaW5jbHVkZS9saW51eC9wYWdlbWFwLmgJ V2VkIEFwciAgNyAxMzoxMjowNCAxOTk5DQpAQCAtMjQsNiArMjQsMTEgQEAN CiANCiBleHRlcm4gdW5zaWduZWQgbG9uZyBwYWdlX2NhY2hlX3NpemU7IC8q ICMgb2YgcGFnZXMgY3VycmVudGx5IGluIHRoZSBoYXNoIHRhYmxlICovDQog ZXh0ZXJuIHN0cnVjdCBwYWdlICogcGFnZV9oYXNoX3RhYmxlW1BBR0VfSEFT SF9TSVpFXTsNCitleHRlcm4gdW5zaWduZWQgbG9uZyBwYWdlX2NhY2hlX2xv b2t1cHM7DQorZXh0ZXJuIHVuc2lnbmVkIGxvbmcgcGFnZV9jYWNoZV9sb29w czsNCitleHRlcm4gdW5zaWduZWQgbG9uZyBwYWdlX2NhY2hlX2hpdHM7DQor DQorZXh0ZXJuIHZvaWQgc2hvd19wYWdlX2hhc2godm9pZCk7DQogDQogLyoN CiAgKiBXZSB1c2UgYSBwb3dlci1vZi10d28gaGFzaCB0YWJsZSB0byBhdm9p ZCBhIG1vZHVsdXMsDQpAQCAtNDYsOSArNTEsMTEgQEANCiANCiBzdGF0aWMg aW5saW5lIHN0cnVjdCBwYWdlICogX19maW5kX3BhZ2Uoc3RydWN0IGlub2Rl ICogaW5vZGUsIHVuc2lnbmVkIGxvbmcgb2Zmc2V0LCBzdHJ1Y3QgcGFnZSAq cGFnZSkNCiB7DQorCXBhZ2VfY2FjaGVfbG9va3VwcysrOw0KIAlnb3RvIGlu c2lkZTsNCiAJZm9yICg7Oykgew0KIAkJcGFnZSA9IHBhZ2UtPm5leHRfaGFz aDsNCisJCXBhZ2VfY2FjaGVfbG9vcHMrKzsNCiBpbnNpZGU6DQogCQlpZiAo IXBhZ2UpDQogCQkJZ290byBub3RfZm91bmQ7DQpAQCAtNTgsNiArNjUsNyBA QA0KIAkJCWJyZWFrOw0KIAl9DQogCS8qIEZvdW5kIHRoZSBwYWdlLiAqLw0K KwlwYWdlX2NhY2hlX2hpdHMrKzsNCiAJYXRvbWljX2luYygmcGFnZS0+Y291 bnQpOw0KIAlzZXRfYml0KFBHX3JlZmVyZW5jZWQsICZwYWdlLT5mbGFncyk7 DQogbm90X2ZvdW5kOg0KZGlmZiAtcnVOIGxpbnV4LTIuMi41LXJlZmVyZW5j ZS9tbS9maWxlbWFwLmMgbGludXgvbW0vZmlsZW1hcC5jDQotLS0gbGludXgt Mi4yLjUtcmVmZXJlbmNlL21tL2ZpbGVtYXAuYwlNb24gTWFyIDI5IDIxOjM2 OjA4IDE5OTkNCisrKyBsaW51eC9tbS9maWxlbWFwLmMJV2VkIEFwciAgNyAx NTowNDoyMSAxOTk5DQpAQCAtMzMsNiArMzMsNTcgQEANCiANCiB1bnNpZ25l ZCBsb25nIHBhZ2VfY2FjaGVfc2l6ZSA9IDA7DQogc3RydWN0IHBhZ2UgKiBw YWdlX2hhc2hfdGFibGVbUEFHRV9IQVNIX1NJWkVdOw0KK3Vuc2lnbmVkIGxv bmcgcGFnZV9jYWNoZV9sb29rdXBzID0gMDsNCit1bnNpZ25lZCBsb25nIHBh Z2VfY2FjaGVfbG9vcHMgPSAwOw0KK3Vuc2lnbmVkIGxvbmcgcGFnZV9jYWNo ZV9oaXRzID0gMDsNCisNCisjZGVmaW5lIEhJU1RfU0laRSAxNg0KKw0KK3Zv aWQgc2hvd19wYWdlX2hhc2godm9pZCkNCit7DQorCXVuc2lnbmVkIGJ1Y2tl dCwgaW5kZXg7DQorCXVuc2lnbmVkIGxvbmcgY291bnQsIG1heCwgdG90YWws IG92ZXJzaXplZDsNCisJdW5zaWduZWQgbG9uZyBoaXN0W0hJU1RfU0laRSsx XTsNCisJc3RydWN0IHBhZ2UgKiBwOw0KKw0KKwltYXggPSAwOw0KKwl0b3Rh bCA9IDA7DQorCW92ZXJzaXplZCA9IDA7DQorCWZvciAoaW5kZXg9MDsgaW5k ZXg8PUhJU1RfU0laRTsgaW5kZXgrKykgaGlzdFtpbmRleF0gPSAwOw0KKwlm b3IgKGJ1Y2tldD0wOyBidWNrZXQ8UEFHRV9IQVNIX1NJWkU7IGJ1Y2tldCsr KSB7DQorCQljb3VudCA9IDA7DQorCQlwID0gcGFnZV9oYXNoX3RhYmxlW2J1 Y2tldF07DQorCQl3aGlsZSAocCkgew0KKwkJCWNvdW50Kys7DQorCQkJdG90 YWwrKzsNCisJCQlwID0gcC0+bmV4dF9oYXNoOw0KKwkJfQ0KKwkJaWYgKGNv dW50ID4gbWF4KQ0KKwkJCW1heCA9IGNvdW50Ow0KKwkJaWYgKGNvdW50ID4g SElTVF9TSVpFKSB7DQorCQkJb3ZlcnNpemVkICs9IGNvdW50Ow0KKwkJCWNv dW50ID0gSElTVF9TSVpFOw0KKwkJfQ0KKwkJaGlzdFtjb3VudF0rKzsNCisJ fQ0KKw0KKwlwcmludGsoIlRvdGFsIHBhZ2VzIGluIGhhc2g6ICVsdSAgdG90 YWwgYnVja2V0czogJWRcbiIsDQorCQl0b3RhbCwgYnVja2V0KTsNCisJcHJp bnRrKCIgaGFzaCB0YWJsZSBoaXN0b2dyYW06XG4iKTsNCisJZm9yIChpbmRl eD0wOyBpbmRleDxISVNUX1NJWkU7IGluZGV4KyspIHsNCisJCXByaW50aygi ICBzaXplOiAlLTJkICBidWNrZXRzOiAlLTZsdSAgcGFnZXM6ICUtNmx1XG4i LA0KKwkJCWluZGV4LCBoaXN0W2luZGV4XSwgaW5kZXggKiBoaXN0W2luZGV4 XSk7DQorCX0NCisJcHJpbnRrKCIgIHNpemU6PiUtMmQgIGJ1Y2tldHM6ICUt Nmx1ICBwYWdlczogJS02bHVcbiIsDQorCQlpbmRleC0xLCBoaXN0W2luZGV4 XSwgb3ZlcnNpemVkKTsNCisJcHJpbnRrKCJNYXggYnVja2V0IHNpemU6ICVs dVxuIiwgbWF4KTsNCisJcHJpbnRrKCJUb3RhbCBsb29rdXBzOiAlbHUgIHBh Z2VzIGZvdW5kOiAlbHUgIChoaXQgcmF0ZTogJWQlJSlcbiIsDQorCQlwYWdl X2NhY2hlX2xvb2t1cHMsIHBhZ2VfY2FjaGVfaGl0cywNCisJCSh1bnNpZ25l ZCkgKChwYWdlX2NhY2hlX2hpdHMgKiAxMDBVTCkgLyBwYWdlX2NhY2hlX2xv b2t1cHMpKTsNCisJcHJpbnRrKCIgZmluZF9wYWdlIGxvb3BzOiAlbHUgIGxv b3BzL2xvb2t1cDogJWx1LzEwMDBcbiIsDQorCQlwYWdlX2NhY2hlX2xvb3Bz LA0KKwkJKChwYWdlX2NhY2hlX2xvb3BzICogMTAwMFVMKSAvIHBhZ2VfY2Fj aGVfbG9va3VwcykpOw0KK30NCiANCiAvKg0KICAqIFNpbXBsZSByb3V0aW5l cyBmb3IgYm90aCBub24tc2hhcmVkIGFuZCBzaGFyZWQgbWFwcGluZ3MuDQo= --0-294808368-923514576=:17860--

- To unsubscribe from this list: send the line "unsubscribe linux-kernel" in the body of a message to majordomo@vger.rutgers.edu Please read the FAQ at http://www.tux.org/lkml/