Re: [PATCH] Futex Generalization Patch

Hubertus Franke (frankeh@watson.ibm.com)
Wed, 10 Apr 2002 10:24:42 -0400


--------------Boundary-00=_61WCC6Y813RGKY6NFQTQ
Content-Type: text/plain;
charset="iso-8859-1"
Content-Transfer-Encoding: 8bit

On Saturday 06 April 2002 04:48 am, Rusty Russell wrote:
> In message <20020404162751.B0A253FE06@smtp.linux.ibm.com> you write:

Enclosed is an "asynchronous" extension to futexes.
This mechanism is required to implement global locks in the presence of an
M:N threading package.
Here "N" denotes a set of kernel threads, that serve as virtual processors on
which the M user threads can be dispatched by the user level thread
manager/scheduler.

Under no circumstances can one block the kernel threads through the futex
interface. Instead, I want to indicate to the futex-subsystem, that I want a
notification for a particular futex, when its woken up.
Working with some M:N threading folks we came up with the following design
implemented in the attached patch to Rusty's previously posted futex
generalization patch. I can also provide a integrated patch over 2.5.7
vanilla.

The futex_q structure is extended to hold a <tgid>, the <uaddr> of the futex
and a signal with which to notify a caller.
We now provide a FUTEX_AWAIT call which attaches a futex_q object to the wait
queue, similar the FUTEX_WAIT. Differences are as follows.
(a) futex_q must be dynamically allocated in the AWAIT case, instead of on
the stack. We use the tgid to identify <async> vs. <sync> == 0.
(b) there will be no blocking in the kernel and hence we don't release the
page upon return from this AWAIT call.
(c) Upon wakeup, if the futex_q is an async wait (tgid != 0) we move it to a
global notification queue and signal the <tgid> with the specified signal.
We release the page (put_page) at this point.
If the <tgid> doesn't exist (e.g. died), we delete futex_q and signal the
next.
(d) A FUTEX_AWAKERS call is provided to the application to retrieve waiting
notifications, typically called within the signal handler.

We need a cleanup mechanism for the notification queue, when a process dies
prematurely before it had a chance to get their items out of the queue.

For this I introduced _exit_futex(task) to be called from do_exit().
It simply wakes the notifcation queue and deletes everything that is
associated with its pid. Right now that is done for each exiting task.
In general one might want to think about a flag indicating whether this
callback is necessary.

For easier reading I also attach the futex.c program.

Comments.

-- 
-- Hubertus Franke  (frankeh@watson.ibm.com)
--------------Boundary-00=_61WCC6Y813RGKY6NFQTQ
Content-Type: text/x-diff;
  charset="iso-8859-1";
  name="patch_afutex_gen"
Content-Transfer-Encoding: base64
Content-Disposition: attachment; filename="patch_afutex_gen"

ZGlmZiAtdXJiTiBsaW51eC0yLjUuNy1mdXRleC9pbmNsdWRlL2xpbnV4L2Z1dGV4LmggbGludXgt Mi41LjctYWZ1dGV4L2luY2x1ZGUvbGludXgvZnV0ZXguaAotLS0gbGludXgtMi41LjctZnV0ZXgv aW5jbHVkZS9saW51eC9mdXRleC5oCVR1ZSBBcHIgIDkgMTY6MTk6NTkgMjAwMgorKysgbGludXgt Mi41LjctYWZ1dGV4L2luY2x1ZGUvbGludXgvZnV0ZXguaAlUdWUgQXByICA5IDEyOjI4OjM2IDIw MDIKQEAgLTQsNSArNCw3IEBACiAvKiBTZWNvbmQgYXJndW1lbnQgdG8gZnV0ZXggc3lzY2FsbCAq LwogI2RlZmluZSBGVVRFWF9XQUlUICgwKQogI2RlZmluZSBGVVRFWF9XQUtFICgxKQorI2RlZmlu ZSBGVVRFWF9BV0FJVCAgICgyKQorI2RlZmluZSBGVVRFWF9BV0FLRVJTICgzKQogCiAjZW5kaWYK ZGlmZiAtdXJiTiBsaW51eC0yLjUuNy1mdXRleC9rZXJuZWwvZXhpdC5jIGxpbnV4LTIuNS43LWFm dXRleC9rZXJuZWwvZXhpdC5jCi0tLSBsaW51eC0yLjUuNy1mdXRleC9rZXJuZWwvZXhpdC5jCU1v biBNYXIgMTggMTU6Mzc6MTAgMjAwMgorKysgbGludXgtMi41LjctYWZ1dGV4L2tlcm5lbC9leGl0 LmMJVHVlIEFwciAgOSAxNDowNzo0NSAyMDAyCkBAIC00OTYsNiArNDk2LDEwIEBACiAjaWZkZWYg Q09ORklHX0JTRF9QUk9DRVNTX0FDQ1QKIAlhY2N0X3Byb2Nlc3MoY29kZSk7CiAjZW5kaWYKKwl7 CisJZXh0ZXJuIHZvaWQgX19leGl0X2Z1dGV4KHN0cnVjdCB0YXNrX3N0cnVjdCopOworIAlfX2V4 aXRfZnV0ZXgodHNrKTsJCisJfQogCV9fZXhpdF9tbSh0c2spOwogCiAJbG9ja19rZXJuZWwoKTsK ZGlmZiAtdXJiTiBsaW51eC0yLjUuNy1mdXRleC9rZXJuZWwvZnV0ZXguYyBsaW51eC0yLjUuNy1h ZnV0ZXgva2VybmVsL2Z1dGV4LmMKLS0tIGxpbnV4LTIuNS43LWZ1dGV4L2tlcm5lbC9mdXRleC5j CVR1ZSBBcHIgIDkgMTY6MTk6NTkgMjAwMgorKysgbGludXgtMi41LjctYWZ1dGV4L2tlcm5lbC9m dXRleC5jCVdlZCBBcHIgMTAgMDk6NTQ6MTAgMjAwMgpAQCAtMzMsNiArMzMsNyBAQAogI2luY2x1 ZGUgPGxpbnV4L2Z1dGV4Lmg+CiAjaW5jbHVkZSA8bGludXgvaGlnaG1lbS5oPgogI2luY2x1ZGUg PGxpbnV4L3RpbWUuaD4KKyNpbmNsdWRlIDxsaW51eC9zbGFiLmg+ICAgICAgICAvKiBmb3Iga21h bGxvYygpICovICAgICAKICNpbmNsdWRlIDxhc20vdWFjY2Vzcy5oPgogCiAvKiBUaGVzZSBtdXRl eGVzIGFyZSBhIHZlcnkgc2ltcGxlIGNvdW50ZXI6IHRoZSB3aW5uZXIgaXMgdGhlIG9uZSB3aG8K QEAgLTQ5LDE1ICs1MCwxOSBAQAogICAgdGhlIHJlbGV2ZW50IG9uZXMgKGhhc2hlZCBxdWV1ZXMg bWF5IGJlIHNoYXJlZCkgKi8KIHN0cnVjdCBmdXRleF9xIHsKIAlzdHJ1Y3QgbGlzdF9oZWFkIGxp c3Q7Ci0Jc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOwogCS8qIFBhZ2Ugc3RydWN0IGFuZCBvZmZz ZXQgd2l0aGluIGl0LiAqLwogCXN0cnVjdCBwYWdlICpwYWdlOwogCXVuc2lnbmVkIGludCBvZmZz ZXQ7CisJc3RydWN0IHRhc2tfc3RydWN0ICp0YXNrOworCXBpZF90IHRnaWQ7ICAvKiAiMCIgaWYg c3luY2hyb25vdXMgZnV0ZXggKi8KKwl2b2lkICp1YWRkcjsgLyogYXN5bmMgd2FpdCBvbiAgICAg ICAgICAgICovCisJaW50ICAgc2lnOyAgIC8qIHNpZ25hbCB0byB3YWtldXAgICAgICAgICAqLwog fTsKIAogLyogVGhlIGtleSBmb3IgdGhlIGhhc2ggaXMgdGhlIGFkZHJlc3MgKyBpbmRleCArIG9m ZnNldCB3aXRoaW4gcGFnZSAqLwogc3RhdGljIHN0cnVjdCBsaXN0X2hlYWQgZnV0ZXhfcXVldWVz WzE8PEZVVEVYX0hBU0hCSVRTXTsKIHN0YXRpYyBzcGlubG9ja190IGZ1dGV4X2xvY2sgPSBTUElO X0xPQ0tfVU5MT0NLRUQ7CitzdGF0aWMgTElTVF9IRUFEKG5vdGlmeV9xdWV1ZSk7CiAKIHN0YXRp YyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAqaGFzaF9mdXRleChzdHJ1Y3QgcGFnZSAqcGFnZSwK IAkJCQkJICAgdW5zaWduZWQgbG9uZyBvZmZzZXQpCkBAIC02OSw1MCArNzQsNjIgQEAKIAlyZXR1 cm4gJmZ1dGV4X3F1ZXVlc1toYXNoX2xvbmcoaCwgRlVURVhfSEFTSEJJVFMpXTsKIH0KIAotc3Rh dGljIGludCBmdXRleF93YWtlKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisKKy8qIEFkZCBhdCBl bmQgdG8gYXZvaWQgc3RhcnZhdGlvbiAqLworc3RhdGljIGlubGluZSB2b2lkIHF1ZXVlX21lKHN0 cnVjdCBsaXN0X2hlYWQgKmhlYWQsCisJCQkgICAgc3RydWN0IGZ1dGV4X3EgKnEsCiAJCSAgICAg IHN0cnVjdCBwYWdlICpwYWdlLAotCQkgICAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAotCQkgICAg ICBpbnQgbnVtKQorCQkJICAgIHVuc2lnbmVkIGludCBvZmZzZXQpCiB7Ci0Jc3RydWN0IGxpc3Rf aGVhZCAqaSwgKm5leHQ7Ci0JaW50IG51bV93b2tlbiA9IDA7CisJcS0+dGdpZCAgID0gMDsKKwlx LT50YXNrICAgPSBjdXJyZW50OworCXEtPnBhZ2UgICA9IHBhZ2U7CisJcS0+b2Zmc2V0ID0gb2Zm c2V0OwogCiAJc3Bpbl9sb2NrKCZmdXRleF9sb2NrKTsKLQlsaXN0X2Zvcl9lYWNoX3NhZmUoaSwg bmV4dCwgaGVhZCkgewotCQlzdHJ1Y3QgZnV0ZXhfcSAqdGhpcyA9IGxpc3RfZW50cnkoaSwgc3Ry dWN0IGZ1dGV4X3EsIGxpc3QpOworCWxpc3RfYWRkX3RhaWwoJnEtPmxpc3QsIGhlYWQpOworCXNw aW5fdW5sb2NrKCZmdXRleF9sb2NrKTsKK30KIAotCQlpZiAodGhpcy0+cGFnZSA9PSBwYWdlICYm IHRoaXMtPm9mZnNldCA9PSBvZmZzZXQpIHsKLQkJCWxpc3RfZGVsX2luaXQoaSk7Ci0JCQl3YWtl X3VwX3Byb2Nlc3ModGhpcy0+dGFzayk7Ci0JCQludW1fd29rZW4rKzsKLQkJCWlmIChudW1fd29r ZW4gPj0gbnVtKSBicmVhazsKLQkJfQorLyogUmV0dXJuIDEgaWYgd2Ugd2VyZSBzdGlsbCBxdWV1 ZWQgKGllLiAwIG1lYW5zIHdlIHdlcmUgd29rZW4pICovCitzdGF0aWMgaW5saW5lIGludCB1bnF1 ZXVlX21lKHN0cnVjdCBmdXRleF9xICpxKQoreworCWludCByZXQgPSAwOworCXNwaW5fbG9jaygm ZnV0ZXhfbG9jayk7CisJaWYgKCFsaXN0X2VtcHR5KCZxLT5saXN0KSkgeworCQlsaXN0X2RlbCgm cS0+bGlzdCk7CisJCXJldCA9IDE7CiAJfQogCXNwaW5fdW5sb2NrKCZmdXRleF9sb2NrKTsKLQly ZXR1cm4gbnVtX3dva2VuOworCXJldHVybiByZXQ7CiB9CiAKIC8qIEFkZCBhdCBlbmQgdG8gYXZv aWQgc3RhcnZhdGlvbiAqLwotc3RhdGljIGlubGluZSB2b2lkIHF1ZXVlX21lKHN0cnVjdCBsaXN0 X2hlYWQgKmhlYWQsCitzdGF0aWMgaW5saW5lIHZvaWQgcXVldWVfbWVfYXN5bmMoc3RydWN0IGxp c3RfaGVhZCAqaGVhZCwKIAkJCSAgICBzdHJ1Y3QgZnV0ZXhfcSAqcSwKIAkJCSAgICBzdHJ1Y3Qg cGFnZSAqcGFnZSwKLQkJCSAgICB1bnNpZ25lZCBpbnQgb2Zmc2V0KQorCQkJCSAgdW5zaWduZWQg aW50IG9mZnNldCwKKwkJCQkgIHZvaWQgKnVhZGRyLAorCQkJCSAgaW50ICAgc2lnKQogeworCXEt PnRnaWQgICA9IGN1cnJlbnQtPnRnaWQ7CiAJcS0+dGFzayA9IGN1cnJlbnQ7CiAJcS0+cGFnZSA9 IHBhZ2U7CiAJcS0+b2Zmc2V0ID0gb2Zmc2V0OworCXEtPnVhZGRyICA9IHVhZGRyOworCXEtPnNp ZyAgICA9IHNpZzsKIAogCXNwaW5fbG9jaygmZnV0ZXhfbG9jayk7CiAJbGlzdF9hZGRfdGFpbCgm cS0+bGlzdCwgaGVhZCk7CiAJc3Bpbl91bmxvY2soJmZ1dGV4X2xvY2spOwogfQogCi0vKiBSZXR1 cm4gMSBpZiB3ZSB3ZXJlIHN0aWxsIHF1ZXVlZCAoaWUuIDAgbWVhbnMgd2Ugd2VyZSB3b2tlbikg Ki8KLXN0YXRpYyBpbmxpbmUgaW50IHVucXVldWVfbWUoc3RydWN0IGZ1dGV4X3EgKnEpCisvKiBS ZXR1cm4gMSBpZiB3ZSB3ZXJlIHN0aWxsIHF1ZXVlZCBpbiB3YWl0IHF1ZXVlIGFuZCBub3QgaW4g bm90aWZ5IHF1ZXVlICovCitzdGF0aWMgaW5saW5lIGludCB1bnF1ZXVlX21lX2FzeW5jKHN0cnVj dCBmdXRleF9xICpxKQogewogCWludCByZXQgPSAwOwogCXNwaW5fbG9jaygmZnV0ZXhfbG9jayk7 Ci0JaWYgKCFsaXN0X2VtcHR5KCZxLT5saXN0KSkgeworCWlmICgocS0+cGFnZSAhPSBOVUxMKSAm JiAoIWxpc3RfZW1wdHkoJnEtPmxpc3QpKSkgewogCQlsaXN0X2RlbCgmcS0+bGlzdCk7CiAJCXJl dCA9IDE7CiAJfQpAQCAtMTIwLDYgKzEzNyw0NyBAQAogCXJldHVybiByZXQ7CiB9CiAKK3N0YXRp YyBpbnQgZnV0ZXhfd2FrZShzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQkgICAgICBzdHJ1Y3Qg cGFnZSAqcGFnZSwKKwkJICAgICAgdW5zaWduZWQgaW50IG9mZnNldCwKKwkJICAgICAgaW50IG51 bSkKK3sKKworCWV4dGVybiBpbnQgc3lzX2tpbGwoaW50LGludCk7CisKKwlzdHJ1Y3QgbGlzdF9o ZWFkICppLCAqbmV4dDsKKwlpbnQgbnVtX3dva2VuID0gMDsKKworCXNwaW5fbG9jaygmZnV0ZXhf bG9jayk7CisJbGlzdF9mb3JfZWFjaF9zYWZlKGksIG5leHQsIGhlYWQpIHsKKwkJc3RydWN0IGZ1 dGV4X3EgKnRoaXMgPSBsaXN0X2VudHJ5KGksIHN0cnVjdCBmdXRleF9xLCBsaXN0KTsKKworCQlp ZiAodGhpcy0+cGFnZSA9PSBwYWdlICYmIHRoaXMtPm9mZnNldCA9PSBvZmZzZXQpIHsKKwkJCWxp c3RfZGVsX2luaXQoaSk7CisJCQlpZiAodGhpcy0+dGdpZCA9PSAwKSB7CisJCQkJLyogc3luY2hy b25vdXMgKi8KKwkJCQl3YWtlX3VwX3Byb2Nlc3ModGhpcy0+dGFzayk7CisJCQl9IGVsc2Ugewor CQkJCS8qIG1vdmUgdG8gbm90aWZpY2F0aW9uIHF1ZXVlLCByZWxlYXNlIHBhZ2UgKi8KKwkJCQls aXN0X2FkZF90YWlsKCZ0aGlzLT5saXN0LCAmbm90aWZ5X3F1ZXVlKTsKKwkJCQlwdXRfcGFnZSh0 aGlzLT5wYWdlKTsKKwkJCQl0aGlzLT5wYWdlID0gTlVMTDsKKworCQkJCWlmIChzeXNfa2lsbCh0 aGlzLT50Z2lkLHRoaXMtPnNpZykpIHsKKwkJCQkJLyogdGFyZ2V0IGlzIGRlYWQgKi8KKwkJCQkJ bGlzdF9kZWwoJnRoaXMtPmxpc3QpOworCQkJCQlrZnJlZSh0aGlzKTsKKwkJCQkJY29udGludWU7 CisJCQkJfQorCQkJfQorCQkJbnVtX3dva2VuKys7CisJCQlpZiAobnVtX3dva2VuID49IG51bSkg YnJlYWs7CisJCX0KKwl9CisJc3Bpbl91bmxvY2soJmZ1dGV4X2xvY2spOworCXJldHVybiBudW1f d29rZW47Cit9CisKIC8qIEdldCBrZXJuZWwgYWRkcmVzcyBvZiB0aGUgdXNlciBwYWdlIGFuZCBw aW4gaXQuICovCiBzdGF0aWMgc3RydWN0IHBhZ2UgKnBpbl9wYWdlKHVuc2lnbmVkIGxvbmcgcGFn ZV9zdGFydCkKIHsKQEAgLTE1OCw4ICsyMTYsMTAgQEAKIAlpZiAoKmNvdW50ICE9IHZhbCkgewog CQlyZXQgPSAtRVdPVUxEQkxPQ0s7CiAJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7 CisJCWt1bm1hcChwYWdlKTsKIAkJZ290byBvdXQ7CiAJfQorCWt1bm1hcChwYWdlKTsKIAl0aW1l ID0gc2NoZWR1bGVfdGltZW91dCh0aW1lKTsKIAlpZiAodGltZSA9PSAwKSB7CiAJCXJldCA9IC1F VElNRURPVVQ7CkBAIC0xNzAsMjEgKzIzMCwxMDAgQEAKIAkJZ290byBvdXQ7CiAJfQogIG91dDoK LQlrdW5tYXAocGFnZSk7CiAJLyogV2VyZSB3ZSB3b2tlbiB1cCBhbnl3YXk/ICovCiAJaWYgKCF1 bnF1ZXVlX21lKCZxKSkKIAkJcmV0dXJuIDA7CiAJcmV0dXJuIHJldDsKIH0KIAorc3RhdGljIGlu dCBmdXRleF9hd2FpdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAorCQkgICAgICAgc3RydWN0IHBh Z2UgKnBhZ2UsCisJCSAgICAgICBpbnQgb2Zmc2V0LAorCQkgICAgICAgaW50IHZhbCwKKwkJICAg ICAgIHZvaWQgKnVhZGRyLAorCQkgICAgICAgaW50IHNpZykKK3sKKwlpbnQgKmNvdW50OworCXN0 cnVjdCBmdXRleF9xICpxID0ga21hbGxvYyhzaXplb2Yoc3RydWN0IGZ1dGV4X3EpLEdGUF9LRVJO RUwpOworCWludCByZXQgPSAwOworCisJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19JTlRFUlJVUFRJ QkxFKTsKKwlxdWV1ZV9tZV9hc3luYyhoZWFkLCBxLCBwYWdlLCBvZmZzZXQsIHVhZGRyLCBzaWcp OworCisJY291bnQgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OworCWlmICgqY291bnQgIT0gdmFsKSB7 CisJCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfUlVOTklORyk7CisJCWlmICh1bnF1ZXVlX21lX2Fz eW5jKHEpKSB7CisJCQlrZnJlZShxKTsKKwkJCXJldCA9IC1FQUdBSU47CisJCX0KKwl9CisJa3Vu bWFwKHBhZ2UpOworCXJldHVybihyZXQpOworfQorCitzdGF0aWMgaW50IGZ1dGV4X2F3YWl0ZXJz KHZvaWQgKip1YWRkciwgaW50IG51bSkKK3sKKwlzdHJ1Y3QgbGlzdF9oZWFkICppLCAqbmV4dDsK KwlpbnQgbnVtX3dva2VuID0gMDsKKwlpbnQgcmM7CisKKwlzcGluX2xvY2soJmZ1dGV4X2xvY2sp OworCWxpc3RfZm9yX2VhY2hfc2FmZShpLCBuZXh0LCAmbm90aWZ5X3F1ZXVlKSB7CisJCXN0cnVj dCBmdXRleF9xICp0aGlzID0gbGlzdF9lbnRyeShpLCBzdHJ1Y3QgZnV0ZXhfcSwgbGlzdCk7CisK KwkJaWYgKHRoaXMtPnRnaWQgPT0gY3VycmVudC0+dGdpZCkgeworCQkJaWYgKG51bV93b2tlbiA+ PSBudW0pIAorCQkJCWdvdG8gb3V0OworCisJCQlpZiAoKHJjID0gcHV0X3VzZXIodGhpcy0+dWFk ZHIsJnVhZGRyW251bV93b2tlbl0pKSkgeworCQkJCS8qIGFsbCBub3RpZmljYXRpb25zIHNlbGVj dGVkIHNvZmFyIHdpbGwgYmUgbG9zdCAqLworCQkJCS8qIHdlIGNvdWxkIHJlY3JlYXRlIHRoZW0g ZnJvbSAqKnVhZGRyICAgICAgICAgICAqLworCQkJCW51bV93b2tlbiA9IHJjOworCQkJCWJyZWFr OworCQkJfQorCQkJbGlzdF9kZWwoaSk7CisJCQlrZnJlZSh0aGlzKTsKKwkJCW51bV93b2tlbisr OworCQl9CisJfQorIG91dDoKKwlzcGluX3VubG9jaygmZnV0ZXhfbG9jayk7CisJcmV0dXJuIG51 bV93b2tlbjsKK30KKworLyogY2xlYW51cCBjYWxsZWQgZnJvbSBkb19leGl0ICovCit2b2lkIF9f ZXhpdF9mdXRleChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCit7CisJc3RydWN0IGxpc3RfaGVh ZCAqaSwgKm5leHQ7CisKKwlzcGluX2xvY2soJmZ1dGV4X2xvY2spOworCWxpc3RfZm9yX2VhY2hf c2FmZShpLCBuZXh0LCAmbm90aWZ5X3F1ZXVlKSB7CisJCXN0cnVjdCBmdXRleF9xICp0aGlzID0g bGlzdF9lbnRyeShpLCBzdHJ1Y3QgZnV0ZXhfcSwgbGlzdCk7CisKKwkJaWYgKHRoaXMtPnRnaWQg PT0gdGFzay0+cGlkKSB7CisJCQlsaXN0X2RlbChpKTsKKwkJCWtmcmVlKHRoaXMpOworCQl9CisJ fQorCXNwaW5fdW5sb2NrKCZmdXRleF9sb2NrKTsKK30KKwogYXNtbGlua2FnZSBpbnQgc3lzX2Z1 dGV4KHZvaWQgKnVhZGRyLCBpbnQgb3AsIGludCB2YWwsIHN0cnVjdCB0aW1lc3BlYyAqdXRpbWUp CiB7CiAJaW50IHJldDsKIAl1bnNpZ25lZCBsb25nIHBvc19pbl9wYWdlOwogCXN0cnVjdCBsaXN0 X2hlYWQgKmhlYWQ7CiAJc3RydWN0IHBhZ2UgKnBhZ2U7Ci0JdW5zaWduZWQgbG9uZyB0aW1lID0g TUFYX1NDSEVEVUxFX1RJTUVPVVQ7CisJdW5zaWduZWQgbG9uZyB0aW1lOwogCisJLyogZmlyc3Qg aGFuZGxlIHRoZSBzcGVjaWFsIGNhc2UgY29tbWFuZHMgKi8KKwlpZiAob3AgPT0gRlVURVhfQVdB S0VSUykgeworCQlyZXR1cm4gZnV0ZXhfYXdhaXRlcnMoKHZvaWQqKil1YWRkciwgdmFsKTsKKwl9 CisKKworCXRpbWUgPSBNQVhfU0NIRURVTEVfVElNRU9VVDsKIAlpZiAodXRpbWUpIHsKIAkJc3Ry dWN0IHRpbWVzcGVjIHQ7CiAJCWlmIChjb3B5X2Zyb21fdXNlcigmdCwgdXRpbWUsIHNpemVvZih0 KSkgIT0gMCkKQEAgLTIxMiwxMSArMzUxLDE3IEBACiAJY2FzZSBGVVRFWF9XQUtFOgogCQlyZXQg PSBmdXRleF93YWtlKGhlYWQsIHBhZ2UsIHBvc19pbl9wYWdlLCB2YWwpOwogCQlicmVhazsKKwlj YXNlIEZVVEVYX0FXQUlUOgorCQlyZXQgPSBmdXRleF9hd2FpdChoZWFkLCBwYWdlLCBwb3NfaW5f cGFnZSwgdmFsLCB1YWRkciwgKGludCl1dGltZSk7CisJCWlmICghcmV0KSAKKwkJCWdvdG8gb3V0 IDsgIC8qIGRvbid0IHJlbGVhc2UgdGhlIHBhZ2UgKi8KKwkJYnJlYWs7CiAJZGVmYXVsdDoKIAkJ cmV0ID0gLUVJTlZBTDsKIAl9CiAJcHV0X3BhZ2UocGFnZSk7CiAKK291dDoKIAlyZXR1cm4gcmV0 OwogfQogCg==

--------------Boundary-00=_61WCC6Y813RGKY6NFQTQ Content-Type: text/x-c; charset="iso-8859-1"; name="futex.c" Content-Transfer-Encoding: base64 Content-Disposition: attachment; filename="futex.c"

LyoKICogIEZhc3QgVXNlcnNwYWNlIE11dGV4ZXMgKHdoaWNoIEkgY2FsbCAiRnV0ZXhlcyEiKS4K ICogIChDKSBSdXN0eSBSdXNzZWxsLCBJQk0gMjAwMgogKgogKiAgVGhhbmtzIHRvIEJlbiBMYUhh aXNlIGZvciB5ZWxsaW5nICJoYXNoZWQgd2FpdHF1ZXVlcyIgbG91ZGx5CiAqICBlbm91Z2ggYXQg bWUsIExpbnVzIGZvciB0aGUgb3JpZ2luYWwgKGZsYXdlZCkgaWRlYSwgTWF0dGhldwogKiAgS2ly a3dvb2QgZm9yIHByb29mLW9mLWNvbmNlcHQgaW1wbGVtZW50YXRpb24uCiAqCiAqICAiVGhlIGZ1 dGV4ZXMgYXJlIGFsc28gY3Vyc2VkLiIKICogICJCdXQgdGhleSBjb21lIGluIGEgY2hvaWNlIG9m IHRocmVlIGZsYXZvdXJzISIKICoKICogIFRoaXMgcHJvZ3JhbSBpcyBmcmVlIHNvZnR3YXJlOyB5 b3UgY2FuIHJlZGlzdHJpYnV0ZSBpdCBhbmQvb3IgbW9kaWZ5CiAqICBpdCB1bmRlciB0aGUgdGVy bXMgb2YgdGhlIEdOVSBHZW5lcmFsIFB1YmxpYyBMaWNlbnNlIGFzIHB1Ymxpc2hlZCBieQogKiAg dGhlIEZyZWUgU29mdHdhcmUgRm91bmRhdGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGlj ZW5zZSwgb3IKICogIChhdCB5b3VyIG9wdGlvbikgYW55IGxhdGVyIHZlcnNpb24uCiAqCiAqICBU aGlzIHByb2dyYW0gaXMgZGlzdHJpYnV0ZWQgaW4gdGhlIGhvcGUgdGhhdCBpdCB3aWxsIGJlIHVz ZWZ1bCwKICogIGJ1dCBXSVRIT1VUIEFOWSBXQVJSQU5UWTsgd2l0aG91dCBldmVuIHRoZSBpbXBs aWVkIHdhcnJhbnR5IG9mCiAqICBNRVJDSEFOVEFCSUxJVFkgb3IgRklUTkVTUyBGT1IgQSBQQVJU SUNVTEFSIFBVUlBPU0UuICBTZWUgdGhlCiAqICBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5zZSBm b3IgbW9yZSBkZXRhaWxzLgogKgogKiAgWW91IHNob3VsZCBoYXZlIHJlY2VpdmVkIGEgY29weSBv ZiB0aGUgR05VIEdlbmVyYWwgUHVibGljIExpY2Vuc2UKICogIGFsb25nIHdpdGggdGhpcyBwcm9n cmFtOyBpZiBub3QsIHdyaXRlIHRvIHRoZSBGcmVlIFNvZnR3YXJlCiAqICBGb3VuZGF0aW9uLCBJ bmMuLCA1OSBUZW1wbGUgUGxhY2UsIFN1aXRlIDMzMCwgQm9zdG9uLCBNQSAgMDIxMTEtMTMwNyAg VVNBCiAqLwojaW5jbHVkZSA8bGludXgva2VybmVsLmg+CiNpbmNsdWRlIDxsaW51eC9zcGlubG9j ay5oPgojaW5jbHVkZSA8bGludXgvc2NoZWQuaD4KI2luY2x1ZGUgPGxpbnV4L21tLmg+CiNpbmNs dWRlIDxsaW51eC9oYXNoLmg+CiNpbmNsdWRlIDxsaW51eC9pbml0Lmg+CiNpbmNsdWRlIDxsaW51 eC9mcy5oPgojaW5jbHVkZSA8bGludXgvZnV0ZXguaD4KI2luY2x1ZGUgPGxpbnV4L2hpZ2htZW0u aD4KI2luY2x1ZGUgPGxpbnV4L3RpbWUuaD4KI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4gICAgICAg IC8qIGZvciBrbWFsbG9jKCkgKi8gICAgIAojaW5jbHVkZSA8YXNtL3VhY2Nlc3MuaD4KCi8qIFRo ZXNlIG11dGV4ZXMgYXJlIGEgdmVyeSBzaW1wbGUgY291bnRlcjogdGhlIHdpbm5lciBpcyB0aGUg b25lIHdobwogICBkZWNyZW1lbnRzIGZyb20gMSB0byAwLiAgVGhlIGNvdW50ZXIgc3RhcnRzIGF0 IDEgd2hlbiB0aGUgbG9jayBpcwogICBmcmVlLiAgQSB2YWx1ZSBvdGhlciB0aGFuIDAgb3IgMSBt ZWFucyBzb21lb25lIG1heSBiZSBzbGVlcGluZy4KICAgVGhpcyBpcyBzaW1wbGUgZW5vdWdoIHRv IHdvcmsgb24gYWxsIGFyY2hpdGVjdHVyZXMsIGJ1dCBoYXMgdGhlCiAgIHByb2JsZW0gdGhhdCBp ZiB3ZSBuZXZlciAidXAiIHRoZSBzZW1hcGhvcmUgaXQgY291bGQgZXZlbnR1YWxseQogICB3cmFw IGFyb3VuZC4gKi8KCi8qIEZJWE1FOiBUaGlzIG1heSBiZSB3YXkgdG9vIHNtYWxsLiAtLVJSICov CiNkZWZpbmUgRlVURVhfSEFTSEJJVFMgNgoKLyogV2UgdXNlIHRoaXMgaW5zdGVhZCBvZiBhIG5v cm1hbCB3YWl0X3F1ZXVlX3QsIHNvIHdlIGNhbiB3YWtlIG9ubHkKICAgdGhlIHJlbGV2ZW50IG9u ZXMgKGhhc2hlZCBxdWV1ZXMgbWF5IGJlIHNoYXJlZCkgKi8Kc3RydWN0IGZ1dGV4X3EgewoJc3Ry dWN0IGxpc3RfaGVhZCBsaXN0OwoJLyogUGFnZSBzdHJ1Y3QgYW5kIG9mZnNldCB3aXRoaW4gaXQu ICovCglzdHJ1Y3QgcGFnZSAqcGFnZTsKCXVuc2lnbmVkIGludCBvZmZzZXQ7CglzdHJ1Y3QgdGFz a19zdHJ1Y3QgKnRhc2s7CglwaWRfdCB0Z2lkOyAgLyogIjAiIGlmIHN5bmNocm9ub3VzIGZ1dGV4 ICovCgl2b2lkICp1YWRkcjsgLyogYXN5bmMgd2FpdCBvbiAgICAgICAgICAgICovCglpbnQgICBz aWc7ICAgLyogc2lnbmFsIHRvIHdha2V1cCAgICAgICAgICovCn07CgovKiBUaGUga2V5IGZvciB0 aGUgaGFzaCBpcyB0aGUgYWRkcmVzcyArIGluZGV4ICsgb2Zmc2V0IHdpdGhpbiBwYWdlICovCnN0 YXRpYyBzdHJ1Y3QgbGlzdF9oZWFkIGZ1dGV4X3F1ZXVlc1sxPDxGVVRFWF9IQVNIQklUU107CnN0 YXRpYyBzcGlubG9ja190IGZ1dGV4X2xvY2sgPSBTUElOX0xPQ0tfVU5MT0NLRUQ7CnN0YXRpYyBM SVNUX0hFQUQobm90aWZ5X3F1ZXVlKTsKCnN0YXRpYyBpbmxpbmUgc3RydWN0IGxpc3RfaGVhZCAq aGFzaF9mdXRleChzdHJ1Y3QgcGFnZSAqcGFnZSwKCQkJCQkgICB1bnNpZ25lZCBsb25nIG9mZnNl dCkKewoJdW5zaWduZWQgbG9uZyBoOwoKCS8qIHN0cnVjdCBwYWdlIGlzIHNoYXJlZCwgc28gd2Ug Y2FuIGhhc2ggb24gaXRzIGFkZHJlc3MgKi8KCWggPSAodW5zaWduZWQgbG9uZylwYWdlICsgb2Zm c2V0OwoJcmV0dXJuICZmdXRleF9xdWV1ZXNbaGFzaF9sb25nKGgsIEZVVEVYX0hBU0hCSVRTKV07 Cn0KCgovKiBBZGQgYXQgZW5kIHRvIGF2b2lkIHN0YXJ2YXRpb24gKi8Kc3RhdGljIGlubGluZSB2 b2lkIHF1ZXVlX21lKHN0cnVjdCBsaXN0X2hlYWQgKmhlYWQsCgkJCSAgICBzdHJ1Y3QgZnV0ZXhf cSAqcSwKCQkJICAgIHN0cnVjdCBwYWdlICpwYWdlLAoJCQkgICAgdW5zaWduZWQgaW50IG9mZnNl dCkKewoJcS0+dGdpZCAgID0gMDsKCXEtPnRhc2sgICA9IGN1cnJlbnQ7CglxLT5wYWdlICAgPSBw YWdlOwoJcS0+b2Zmc2V0ID0gb2Zmc2V0OwoKCXNwaW5fbG9jaygmZnV0ZXhfbG9jayk7CglsaXN0 X2FkZF90YWlsKCZxLT5saXN0LCBoZWFkKTsKCXNwaW5fdW5sb2NrKCZmdXRleF9sb2NrKTsKfQoK LyogUmV0dXJuIDEgaWYgd2Ugd2VyZSBzdGlsbCBxdWV1ZWQgKGllLiAwIG1lYW5zIHdlIHdlcmUg d29rZW4pICovCnN0YXRpYyBpbmxpbmUgaW50IHVucXVldWVfbWUoc3RydWN0IGZ1dGV4X3EgKnEp CnsKCWludCByZXQgPSAwOwoJc3Bpbl9sb2NrKCZmdXRleF9sb2NrKTsKCWlmICghbGlzdF9lbXB0 eSgmcS0+bGlzdCkpIHsKCQlsaXN0X2RlbCgmcS0+bGlzdCk7CgkJcmV0ID0gMTsKCX0KCXNwaW5f dW5sb2NrKCZmdXRleF9sb2NrKTsKCXJldHVybiByZXQ7Cn0KCi8qIEFkZCBhdCBlbmQgdG8gYXZv aWQgc3RhcnZhdGlvbiAqLwpzdGF0aWMgaW5saW5lIHZvaWQgcXVldWVfbWVfYXN5bmMoc3RydWN0 IGxpc3RfaGVhZCAqaGVhZCwKCQkJCSAgc3RydWN0IGZ1dGV4X3EgKnEsCgkJCQkgIHN0cnVjdCBw YWdlICpwYWdlLAoJCQkJICB1bnNpZ25lZCBpbnQgb2Zmc2V0LAoJCQkJICB2b2lkICp1YWRkciwK CQkJCSAgaW50ICAgc2lnKQp7CglxLT50Z2lkICAgPSBjdXJyZW50LT50Z2lkOwoJcS0+dGFzayAg ID0gY3VycmVudDsKCXEtPnBhZ2UgICA9IHBhZ2U7CglxLT5vZmZzZXQgPSBvZmZzZXQ7CglxLT51 YWRkciAgPSB1YWRkcjsKCXEtPnNpZyAgICA9IHNpZzsKCglzcGluX2xvY2soJmZ1dGV4X2xvY2sp OwoJbGlzdF9hZGRfdGFpbCgmcS0+bGlzdCwgaGVhZCk7CglzcGluX3VubG9jaygmZnV0ZXhfbG9j ayk7Cn0KCi8qIFJldHVybiAxIGlmIHdlIHdlcmUgc3RpbGwgcXVldWVkIGluIHdhaXQgcXVldWUg YW5kIG5vdCBpbiBub3RpZnkgcXVldWUgKi8Kc3RhdGljIGlubGluZSBpbnQgdW5xdWV1ZV9tZV9h c3luYyhzdHJ1Y3QgZnV0ZXhfcSAqcSkKewoJaW50IHJldCA9IDA7CglzcGluX2xvY2soJmZ1dGV4 X2xvY2spOwoJaWYgKChxLT5wYWdlICE9IE5VTEwpICYmICghbGlzdF9lbXB0eSgmcS0+bGlzdCkp KSB7CgkJbGlzdF9kZWwoJnEtPmxpc3QpOwoJCXJldCA9IDE7Cgl9CglzcGluX3VubG9jaygmZnV0 ZXhfbG9jayk7CglyZXR1cm4gcmV0Owp9CgpzdGF0aWMgaW50IGZ1dGV4X3dha2Uoc3RydWN0IGxp c3RfaGVhZCAqaGVhZCwKCQkgICAgICBzdHJ1Y3QgcGFnZSAqcGFnZSwKCQkgICAgICB1bnNpZ25l ZCBpbnQgb2Zmc2V0LAoJCSAgICAgIGludCBudW0pCnsKCglleHRlcm4gaW50IHN5c19raWxsKGlu dCxpbnQpOwoKCXN0cnVjdCBsaXN0X2hlYWQgKmksICpuZXh0OwoJaW50IG51bV93b2tlbiA9IDA7 CgoJc3Bpbl9sb2NrKCZmdXRleF9sb2NrKTsKCWxpc3RfZm9yX2VhY2hfc2FmZShpLCBuZXh0LCBo ZWFkKSB7CgkJc3RydWN0IGZ1dGV4X3EgKnRoaXMgPSBsaXN0X2VudHJ5KGksIHN0cnVjdCBmdXRl eF9xLCBsaXN0KTsKCgkJaWYgKHRoaXMtPnBhZ2UgPT0gcGFnZSAmJiB0aGlzLT5vZmZzZXQgPT0g b2Zmc2V0KSB7CgkJCWxpc3RfZGVsX2luaXQoaSk7CgkJCWlmICh0aGlzLT50Z2lkID09IDApIHsK CQkJCS8qIHN5bmNocm9ub3VzICovCgkJCQl3YWtlX3VwX3Byb2Nlc3ModGhpcy0+dGFzayk7CgkJ CX0gZWxzZSB7CgkJCQkvKiBtb3ZlIHRvIG5vdGlmaWNhdGlvbiBxdWV1ZSwgcmVsZWFzZSBwYWdl ICovCgkJCQlsaXN0X2FkZF90YWlsKCZ0aGlzLT5saXN0LCAmbm90aWZ5X3F1ZXVlKTsKCQkJCXB1 dF9wYWdlKHRoaXMtPnBhZ2UpOwoJCQkJdGhpcy0+cGFnZSA9IE5VTEw7CgoJCQkJaWYgKHN5c19r aWxsKHRoaXMtPnRnaWQsdGhpcy0+c2lnKSkgewoJCQkJCS8qIHRhcmdldCBpcyBkZWFkICovCgkJ CQkJbGlzdF9kZWwoJnRoaXMtPmxpc3QpOwoJCQkJCWtmcmVlKHRoaXMpOwoJCQkJCWNvbnRpbnVl OwoJCQkJfQoJCQl9CgkJCW51bV93b2tlbisrOwoJCQlpZiAobnVtX3dva2VuID49IG51bSkgYnJl YWs7CgkJfQoJfQoJc3Bpbl91bmxvY2soJmZ1dGV4X2xvY2spOwoJcmV0dXJuIG51bV93b2tlbjsK fQoKLyogR2V0IGtlcm5lbCBhZGRyZXNzIG9mIHRoZSB1c2VyIHBhZ2UgYW5kIHBpbiBpdC4gKi8K c3RhdGljIHN0cnVjdCBwYWdlICpwaW5fcGFnZSh1bnNpZ25lZCBsb25nIHBhZ2Vfc3RhcnQpCnsK CXN0cnVjdCBtbV9zdHJ1Y3QgKm1tID0gY3VycmVudC0+bW07CglzdHJ1Y3QgcGFnZSAqcGFnZTsK CWludCBlcnI7CgoJZG93bl9yZWFkKCZtbS0+bW1hcF9zZW0pOwoJZXJyID0gZ2V0X3VzZXJfcGFn ZXMoY3VycmVudCwgY3VycmVudC0+bW0sIHBhZ2Vfc3RhcnQsCgkJCSAgICAgMSAvKiBvbmUgcGFn ZSAqLywKCQkJICAgICAxIC8qIHdyaXRhYmxlICovLAoJCQkgICAgIDAgLyogZG9uJ3QgZm9yY2Ug Ki8sCgkJCSAgICAgJnBhZ2UsCgkJCSAgICAgTlVMTCAvKiBkb24ndCByZXR1cm4gdm1hcyAqLyk7 Cgl1cF9yZWFkKCZtbS0+bW1hcF9zZW0pOwoKCWlmIChlcnIgPCAwKQoJCXJldHVybiBFUlJfUFRS KGVycik7CglyZXR1cm4gcGFnZTsKfQoKc3RhdGljIGludCBmdXRleF93YWl0KHN0cnVjdCBsaXN0 X2hlYWQgKmhlYWQsCgkJICAgICAgc3RydWN0IHBhZ2UgKnBhZ2UsCgkJICAgICAgaW50IG9mZnNl dCwKCQkgICAgICBpbnQgdmFsLAoJCSAgICAgIHVuc2lnbmVkIGxvbmcgdGltZSkKewoJaW50ICpj b3VudDsKCXN0cnVjdCBmdXRleF9xIHE7CglpbnQgcmV0ID0gMDsKCglzZXRfY3VycmVudF9zdGF0 ZShUQVNLX0lOVEVSUlVQVElCTEUpOwoJcXVldWVfbWUoaGVhZCwgJnEsIHBhZ2UsIG9mZnNldCk7 CgoJY291bnQgPSBrbWFwKHBhZ2UpICsgb2Zmc2V0OwoJaWYgKCpjb3VudCAhPSB2YWwpIHsKCQly ZXQgPSAtRVdPVUxEQkxPQ0s7CgkJc2V0X2N1cnJlbnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCQlr dW5tYXAocGFnZSk7CgkJZ290byBvdXQ7Cgl9CglrdW5tYXAocGFnZSk7Cgl0aW1lID0gc2NoZWR1 bGVfdGltZW91dCh0aW1lKTsKCWlmICh0aW1lID09IDApIHsKCQlyZXQgPSAtRVRJTUVET1VUOwoJ CWdvdG8gb3V0OwoJfQoJaWYgKHNpZ25hbF9wZW5kaW5nKGN1cnJlbnQpKSB7CgkJcmV0ID0gLUVJ TlRSOwoJCWdvdG8gb3V0OwoJfQogb3V0OgoJLyogV2VyZSB3ZSB3b2tlbiB1cCBhbnl3YXk/ICov CglpZiAoIXVucXVldWVfbWUoJnEpKQoJCXJldHVybiAwOwoJcmV0dXJuIHJldDsKfQoKc3RhdGlj IGludCBmdXRleF9hd2FpdChzdHJ1Y3QgbGlzdF9oZWFkICpoZWFkLAoJCSAgICAgICBzdHJ1Y3Qg cGFnZSAqcGFnZSwKCQkgICAgICAgaW50IG9mZnNldCwKCQkgICAgICAgaW50IHZhbCwKCQkgICAg ICAgdm9pZCAqdWFkZHIsCgkJICAgICAgIGludCBzaWcpCnsKCWludCAqY291bnQ7CglzdHJ1Y3Qg ZnV0ZXhfcSAqcSA9IGttYWxsb2Moc2l6ZW9mKHN0cnVjdCBmdXRleF9xKSxHRlBfS0VSTkVMKTsK CWludCByZXQgPSAwOwoKCXNldF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7Cglx dWV1ZV9tZV9hc3luYyhoZWFkLCBxLCBwYWdlLCBvZmZzZXQsIHVhZGRyLCBzaWcpOwoKCWNvdW50 ID0ga21hcChwYWdlKSArIG9mZnNldDsKCWlmICgqY291bnQgIT0gdmFsKSB7CgkJc2V0X2N1cnJl bnRfc3RhdGUoVEFTS19SVU5OSU5HKTsKCQlpZiAodW5xdWV1ZV9tZV9hc3luYyhxKSkgewoJCQlr ZnJlZShxKTsKCQkJcmV0ID0gLUVBR0FJTjsKCQl9Cgl9CglrdW5tYXAocGFnZSk7CglyZXR1cm4o cmV0KTsKfQoKc3RhdGljIGludCBmdXRleF9hd2FpdGVycyh2b2lkICoqdWFkZHIsIGludCBudW0p CnsKCXN0cnVjdCBsaXN0X2hlYWQgKmksICpuZXh0OwoJaW50IG51bV93b2tlbiA9IDA7CglpbnQg cmM7CgoJc3Bpbl9sb2NrKCZmdXRleF9sb2NrKTsKCWxpc3RfZm9yX2VhY2hfc2FmZShpLCBuZXh0 LCAmbm90aWZ5X3F1ZXVlKSB7CgkJc3RydWN0IGZ1dGV4X3EgKnRoaXMgPSBsaXN0X2VudHJ5KGks IHN0cnVjdCBmdXRleF9xLCBsaXN0KTsKCgkJaWYgKHRoaXMtPnRnaWQgPT0gY3VycmVudC0+dGdp ZCkgewoJCQlpZiAobnVtX3dva2VuID49IG51bSkgCgkJCQlnb3RvIG91dDsKCgkJCWlmICgocmMg PSBwdXRfdXNlcih0aGlzLT51YWRkciwmdWFkZHJbbnVtX3dva2VuXSkpKSB7CgkJCQkvKiBhbGwg bm90aWZpY2F0aW9ucyBzZWxlY3RlZCBzb2ZhciB3aWxsIGJlIGxvc3QgKi8KCQkJCS8qIHdlIGNv dWxkIHJlY3JlYXRlIHRoZW0gZnJvbSAqKnVhZGRyICAgICAgICAgICAqLwoJCQkJbnVtX3dva2Vu ID0gcmM7CgkJCQlicmVhazsKCQkJfQoJCQlsaXN0X2RlbChpKTsKCQkJa2ZyZWUodGhpcyk7CgkJ CW51bV93b2tlbisrOwoJCX0KCX0KIG91dDoKCXNwaW5fdW5sb2NrKCZmdXRleF9sb2NrKTsKCXJl dHVybiBudW1fd29rZW47Cn0KCi8qIGNsZWFudXAgY2FsbGVkIGZyb20gZG9fZXhpdCAqLwp2b2lk IF9fZXhpdF9mdXRleChzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRhc2spCnsKCXN0cnVjdCBsaXN0X2hl YWQgKmksICpuZXh0OwoKCXNwaW5fbG9jaygmZnV0ZXhfbG9jayk7CglsaXN0X2Zvcl9lYWNoX3Nh ZmUoaSwgbmV4dCwgJm5vdGlmeV9xdWV1ZSkgewoJCXN0cnVjdCBmdXRleF9xICp0aGlzID0gbGlz dF9lbnRyeShpLCBzdHJ1Y3QgZnV0ZXhfcSwgbGlzdCk7CgoJCWlmICh0aGlzLT50Z2lkID09IHRh c2stPnRnaWQpIHsKCQkJbGlzdF9kZWwoaSk7CgkJCWtmcmVlKHRoaXMpOwoJCX0KCX0KCXNwaW5f dW5sb2NrKCZmdXRleF9sb2NrKTsKfQoKYXNtbGlua2FnZSBpbnQgc3lzX2Z1dGV4KHZvaWQgKnVh ZGRyLCBpbnQgb3AsIGludCB2YWwsIHN0cnVjdCB0aW1lc3BlYyAqdXRpbWUpCnsKCWludCByZXQ7 Cgl1bnNpZ25lZCBsb25nIHBvc19pbl9wYWdlOwoJc3RydWN0IGxpc3RfaGVhZCAqaGVhZDsKCXN0 cnVjdCBwYWdlICpwYWdlOwoJdW5zaWduZWQgbG9uZyB0aW1lOwoKCS8qIGZpcnN0IGhhbmRsZSB0 aGUgc3BlY2lhbCBjYXNlIGNvbW1hbmRzICovCglpZiAob3AgPT0gRlVURVhfQVdBS0VSUykgewoJ CXJldHVybiBmdXRleF9hd2FpdGVycygodm9pZCoqKXVhZGRyLCB2YWwpOwoJfQoKCgl0aW1lID0g TUFYX1NDSEVEVUxFX1RJTUVPVVQ7CglpZiAodXRpbWUpIHsKCQlzdHJ1Y3QgdGltZXNwZWMgdDsK CQlpZiAoY29weV9mcm9tX3VzZXIoJnQsIHV0aW1lLCBzaXplb2YodCkpICE9IDApCgkJCXJldHVy biAtRUZBVUxUOwoJCXRpbWUgPSB0aW1lc3BlY190b19qaWZmaWVzKCZ0KSArIDE7Cgl9CgoJcG9z X2luX3BhZ2UgPSAoKHVuc2lnbmVkIGxvbmcpdWFkZHIpICUgUEFHRV9TSVpFOwoKCS8qIE11c3Qg YmUgIm5hdHVyYWxseSIgYWxpZ25lZCwgYW5kIG5vdCBvbiBwYWdlIGJvdW5kYXJ5LiAqLwoJaWYg KChwb3NfaW5fcGFnZSAlIF9fYWxpZ25vZl9fKGludCkpICE9IDAKCSAgICB8fCBwb3NfaW5fcGFn ZSArIHNpemVvZihpbnQpID4gUEFHRV9TSVpFKQoJCXJldHVybiAtRUlOVkFMOwoKCS8qIFNpbXBs ZXIgaWYgaXQgZG9lc24ndCB2YW5pc2ggdW5kZXJuZWF0aCB1cy4gKi8KCXBhZ2UgPSBwaW5fcGFn ZSgodW5zaWduZWQgbG9uZyl1YWRkciAtIHBvc19pbl9wYWdlKTsKCWlmIChJU19FUlIocGFnZSkp CgkJcmV0dXJuIFBUUl9FUlIocGFnZSk7CgoJaGVhZCA9IGhhc2hfZnV0ZXgocGFnZSwgcG9zX2lu X3BhZ2UpOwoJc3dpdGNoIChvcCkgewoJY2FzZSBGVVRFWF9XQUlUOgoJCXJldCA9IGZ1dGV4X3dh aXQoaGVhZCwgcGFnZSwgcG9zX2luX3BhZ2UsIHZhbCwgdGltZSk7CgkJYnJlYWs7CgljYXNlIEZV VEVYX1dBS0U6CgkJcmV0ID0gZnV0ZXhfd2FrZShoZWFkLCBwYWdlLCBwb3NfaW5fcGFnZSwgdmFs KTsKCQlicmVhazsKCWNhc2UgRlVURVhfQVdBSVQ6CgkJcmV0ID0gZnV0ZXhfYXdhaXQoaGVhZCwg cGFnZSwgcG9zX2luX3BhZ2UsIHZhbCwgdWFkZHIsIChpbnQpdXRpbWUpOwoJCWlmICghcmV0KSAK CQkJZ290byBvdXQgOyAgLyogZG9uJ3QgcmVsZWFzZSB0aGUgcGFnZSAqLwoJCWJyZWFrOwoJZGVm YXVsdDoKCQlyZXQgPSAtRUlOVkFMOwoJfQoJcHV0X3BhZ2UocGFnZSk7CgpvdXQ6CglyZXR1cm4g cmV0Owp9CgpzdGF0aWMgaW50IF9faW5pdCBpbml0KHZvaWQpCnsKCXVuc2lnbmVkIGludCBpOwoK CWZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGZ1dGV4X3F1ZXVlcyk7IGkrKykKCQlJTklUX0xJ U1RfSEVBRCgmZnV0ZXhfcXVldWVzW2ldKTsKCXJldHVybiAwOwp9Cl9faW5pdGNhbGwoaW5pdCk7 Cg==

--------------Boundary-00=_61WCC6Y813RGKY6NFQTQ-- - 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/