[announce] [patch] limiting IRQ load, irq-rewrite-2.4.11-B5

Ingo Molnar (mingo@elte.hu)
Tue, 2 Oct 2001 00:16:06 +0200 (CEST)


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.

--8323328-1385438795-1001973739=:3759
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII
Content-ID: <Pine.LNX.4.33.0110020003071.3759@localhost.localdomain>

to sum things up, we have three main problem areas that are connected to
hardirq and softirq processing:

- a little utility written by Simon Kirby proved that no matter how much
softirq throttling, it's easy to lock up a pretty powerful Linux
box via a high rate of network interrupts, from relatively low-powered
clients as well. 2.4.6, 2.4.7, 2.4.10 all lock up. Alexey said it as
well that it's still easy to lock up low-powered Linux routers via more
or less normal traffic.

- prior 2.4.7 we used to 'leak' softirq handling => we ended up missing
softirqs in a number of circumstances. Stock 2.4.10 still has a number
of places that do this too.

- a number of people have reported gigabit performance problems (some
people reported a 10-20% drop in performance under load) since
ksoftirqd was added - which was added to fix some of the 2.4.6-
softirq-handling latency problems.

we also have another problem that often pops up when the BIOS goes bad or
a device driver does some mistake:

- Linux often 'locks up' if it gets into a 'interrupt storm' - when
interrupt sources that send a very high rate of interrupts. This can be
seen as boot-time hangs and module-insert-time hangs as well.

the attached patch, while a bit radical, is i believe a robust solution to
all four problems. It gives gigabit performance back, avoids the lockups
and attempts to reach as short softirq-processing latency as possible.

the new mechanizm:

- the irq handling code has been extended to support 'soft mitigation',
ie. to mitigate the rate of hardware interrupts, without support from
the actual hardware. There is a reasonable default, but the value can
also be decreased/increased on a per-irq basis via /proc/irq/NR/max_rate.

the method is the following. We count the number of interrupts serviced,
and if within a jiffy there are more than max_rate interrupts, the code
disables the IRQ source and marks it as IRQ_MITIGATED. On the next timer
interrupt the irq_rate_check() function is called, which makes sure that
'blocked' irqs are restarted & handled properly. The interrupt is disabled
in the interrupt controller, which has the nice side-effect of fixing and
blocking interrupt storms. (The support code for 'soft mitigation' is
designed to be very lightweight, it's a decrement and a test in the IRQ
handling hot path.)

(note that in case of shared interrupts, another 'innocent' device might
stay disabled for some short amount of time as well - but this is not an
issue because this mitigation does not make that device inoperable, it
just delays its interrupt by up to 10 msecs. Plus, modern systems have
properly distributed interrupts.)

- softirq code got simplified significantly. The concept is to 'handle all
pending softirqs' - just as the hardware IRQ code 'handles all hardware
interrupts that were passed to it'. Since most of the time there is a
direct relationship between softirq work and hardirq work, the
mitigation of hardirqs mitigates softirq load as well.

- ksoftirqd is gone, there is never any softirq pending while
softirq-unaware code is executing.

- the tasklet code needed some cleanup along the way, and it also won some
restart-on-enable and restart-on-unlock properties that it lacked
before. (but which is desired.)

due to these changes, the linecount in softirq.c got smaller by 25%.
[i dropped the unwakeup change - but that one could be useful in the VM,
to eg. unwakeup bdflush or kswapd.]

- drivers can optionally use the set_irq_rate(irq, new_rate) call to
change the current IRQ rate. Drivers are the ones who know best what
kind of loads to expect from the hardware, so they might want to
influence this value. Also, drivers that implement IRQ mitigation
themselves in hardware, can effectively disable the soft-mitigation code
by using a very high rate value.

what is the concept behind all this? Simplicity, and concept. We were
clearly heading in the wrong direction: putting more complexity into the
core softirq code to handle some really extreme and unusual cases. Also,
softirqs were slowly morphing into something process-ish - but in Linux we
already have a concept of processes, so we'd have two dualling concepts.
(We still have tasklets, which are not really processes - they are
single-threaded paths of execution.)

with this patch, softirqs can again be what they should be: lightweight
'interrupt code' that processes hard-IRQ events but still does this with
interrupts enabled, to allow for low hard-IRQ latencies. Anything that is
conceptually heavyweight IMO does not belong into softirqs, it should be
moved into process contexts. That will take care of CPU-time usage
accounting and CPU-time-limiting and priority issues as well.

(the patch also imports the latency and softirq-restart fixes from my
previous softirq patches.)

i've tested the patch on both UP, SMP, XT-PIC and APIC systems, it
correctly limits network interrupt rates (and other device interrupt
rates) to the given limit. I've done stress-testing as well. The patch is
against 2.4.11-pre1, but it applies just fine to the -ac tree as well.

with a high irq-rate limit set, ping flooding has this effect on the
test-system:

[root@mars /root]# vmstat 1
procs memory swap io
r b w swpd free buff cache si so bi bo in
0 0 0 0 877024 1140 11364 0 0 12 0 30960
0 0 0 0 877024 1140 11364 0 0 0 0 30950
0 0 0 0 877024 1140 11364 0 0 0 0 30520

ie. 30k interrupts/sec. With the max_rate set to 1000 interrupts/sec:

[root@mars /root]# echo 1000 > /proc/irq/21/max_rate
[root@mars /root]# vmstat 1
procs memory swap io
r b w swpd free buff cache si so bi bo in
0 0 0 0 877004 1144 11372 0 0 0 0 1112
0 0 0 0 877004 1144 11372 0 0 0 0 1111
0 0 0 0 877004 1144 11372 0 0 0 0 1111

so it works just fine here. Interactive tasks are still snappy over the
same interface.

Comments, reports, suggestions and testing feedback is more than welcome,

Ingo

--8323328-1385438795-1001973739=:3759
Content-Type: TEXT/PLAIN; CHARSET=US-ASCII; NAME="irq-rewrite-2.4.11-B5"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.4.33.0110020002190.3759@localhost.localdomain>
Content-Description:
Content-Disposition: ATTACHMENT; FILENAME="irq-rewrite-2.4.11-B5"

LS0tIGxpbnV4L2tlcm5lbC9rc3ltcy5jLm9yaWcJTW9uIE9jdCAgMSAyMTo1
MjozMiAyMDAxDQorKysgbGludXgva2VybmVsL2tzeW1zLmMJTW9uIE9jdCAg
MSAyMTo1Mjo0MyAyMDAxDQpAQCAtNTM4LDggKzUzOCw2IEBADQogRVhQT1JU
X1NZTUJPTCh0YXNrbGV0X2tpbGwpOw0KIEVYUE9SVF9TWU1CT0woX19ydW5f
dGFza19xdWV1ZSk7DQogRVhQT1JUX1NZTUJPTChkb19zb2Z0aXJxKTsNCi1F
WFBPUlRfU1lNQk9MKHJhaXNlX3NvZnRpcnEpOw0KLUVYUE9SVF9TWU1CT0wo
Y3B1X3JhaXNlX3NvZnRpcnEpOw0KIEVYUE9SVF9TWU1CT0woX190YXNrbGV0
X3NjaGVkdWxlKTsNCiBFWFBPUlRfU1lNQk9MKF9fdGFza2xldF9oaV9zY2hl
ZHVsZSk7DQogDQotLS0gbGludXgva2VybmVsL3NvZnRpcnEuYy5vcmlnCU1v
biBPY3QgIDEgMjE6NTI6MzIgMjAwMQ0KKysrIGxpbnV4L2tlcm5lbC9zb2Z0
aXJxLmMJTW9uIE9jdCAgMSAyMTo1Mzo1MiAyMDAxDQpAQCAtNDQsMjYgKzQ0
LDExIEBADQogDQogc3RhdGljIHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiBzb2Z0
aXJxX3ZlY1szMl0gX19jYWNoZWxpbmVfYWxpZ25lZDsNCiANCi0vKg0KLSAq
IHdlIGNhbm5vdCBsb29wIGluZGVmaW5pdGVseSBoZXJlIHRvIGF2b2lkIHVz
ZXJzcGFjZSBzdGFydmF0aW9uLA0KLSAqIGJ1dCB3ZSBhbHNvIGRvbid0IHdh
bnQgdG8gaW50cm9kdWNlIGEgd29yc3QgY2FzZSAxL0haIGxhdGVuY3kNCi0g
KiB0byB0aGUgcGVuZGluZyBldmVudHMsIHNvIGxldHMgdGhlIHNjaGVkdWxl
ciB0byBiYWxhbmNlDQotICogdGhlIHNvZnRpcnEgbG9hZCBmb3IgdXMuDQot
ICovDQotc3RhdGljIGlubGluZSB2b2lkIHdha2V1cF9zb2Z0aXJxZCh1bnNp
Z25lZCBjcHUpDQotew0KLQlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiB0c2sgPSBr
c29mdGlycWRfdGFzayhjcHUpOw0KLQ0KLQlpZiAodHNrICYmIHRzay0+c3Rh
dGUgIT0gVEFTS19SVU5OSU5HKQ0KLQkJd2FrZV91cF9wcm9jZXNzKHRzayk7
DQotfQ0KLQ0KIGFzbWxpbmthZ2Ugdm9pZCBkb19zb2Z0aXJxKCkNCiB7DQog
CWludCBjcHUgPSBzbXBfcHJvY2Vzc29yX2lkKCk7DQogCV9fdTMyIHBlbmRp
bmc7DQogCWxvbmcgZmxhZ3M7DQotCV9fdTMyIG1hc2s7DQogDQogCWlmIChp
bl9pbnRlcnJ1cHQoKSkNCiAJCXJldHVybjsNCkBAIC03NSw3ICs2MCw2IEBA
DQogCWlmIChwZW5kaW5nKSB7DQogCQlzdHJ1Y3Qgc29mdGlycV9hY3Rpb24g
Kmg7DQogDQotCQltYXNrID0gfnBlbmRpbmc7DQogCQlsb2NhbF9iaF9kaXNh
YmxlKCk7DQogcmVzdGFydDoNCiAJCS8qIFJlc2V0IHRoZSBwZW5kaW5nIGJp
dG1hc2sgYmVmb3JlIGVuYWJsaW5nIGlycXMgKi8NCkBAIC05NSwxNTIgKzc5
LDEzMCBAQA0KIAkJbG9jYWxfaXJxX2Rpc2FibGUoKTsNCiANCiAJCXBlbmRp
bmcgPSBzb2Z0aXJxX3BlbmRpbmcoY3B1KTsNCi0JCWlmIChwZW5kaW5nICYg
bWFzaykgew0KLQkJCW1hc2sgJj0gfnBlbmRpbmc7DQorCQlpZiAocGVuZGlu
ZykNCiAJCQlnb3RvIHJlc3RhcnQ7DQotCQl9DQogCQlfX2xvY2FsX2JoX2Vu
YWJsZSgpOw0KLQ0KLQkJaWYgKHBlbmRpbmcpDQotCQkJd2FrZXVwX3NvZnRp
cnFkKGNwdSk7DQogCX0NCiANCiAJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3Mp
Ow0KIH0NCiANCi0vKg0KLSAqIFRoaXMgZnVuY3Rpb24gbXVzdCBydW4gd2l0
aCBpcnEgZGlzYWJsZWQhDQotICovDQotaW5saW5lIHZvaWQgY3B1X3JhaXNl
X3NvZnRpcnEodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5yKQ0K
LXsNCi0JX19jcHVfcmFpc2Vfc29mdGlycShjcHUsIG5yKTsNCi0NCi0JLyoN
Ci0JICogSWYgd2UncmUgaW4gYW4gaW50ZXJydXB0IG9yIGJoLCB3ZSdyZSBk
b25lDQotCSAqICh0aGlzIGFsc28gY2F0Y2hlcyBiaC1kaXNhYmxlZCBjb2Rl
KS4gV2Ugd2lsbA0KLQkgKiBhY3R1YWxseSBydW4gdGhlIHNvZnRpcnEgb25j
ZSB3ZSByZXR1cm4gZnJvbQ0KLQkgKiB0aGUgaXJxIG9yIGJoLg0KLQkgKg0K
LQkgKiBPdGhlcndpc2Ugd2Ugd2FrZSB1cCBrc29mdGlycWQgdG8gbWFrZSBz
dXJlIHdlDQotCSAqIHNjaGVkdWxlIHRoZSBzb2Z0aXJxIHNvb24uDQotCSAq
Lw0KLQlpZiAoIShsb2NhbF9pcnFfY291bnQoY3B1KSB8IGxvY2FsX2JoX2Nv
dW50KGNwdSkpKQ0KLQkJd2FrZXVwX3NvZnRpcnFkKGNwdSk7DQotfQ0KLQ0K
LXZvaWQgcmFpc2Vfc29mdGlycSh1bnNpZ25lZCBpbnQgbnIpDQotew0KLQls
b25nIGZsYWdzOw0KLQ0KLQlsb2NhbF9pcnFfc2F2ZShmbGFncyk7DQotCWNw
dV9yYWlzZV9zb2Z0aXJxKHNtcF9wcm9jZXNzb3JfaWQoKSwgbnIpOw0KLQls
b2NhbF9pcnFfcmVzdG9yZShmbGFncyk7DQotfQ0KLQ0KIHZvaWQgb3Blbl9z
b2Z0aXJxKGludCBuciwgdm9pZCAoKmFjdGlvbikoc3RydWN0IHNvZnRpcnFf
YWN0aW9uKiksIHZvaWQgKmRhdGEpDQogew0KIAlzb2Z0aXJxX3ZlY1tucl0u
ZGF0YSA9IGRhdGE7DQogCXNvZnRpcnFfdmVjW25yXS5hY3Rpb24gPSBhY3Rp
b247DQogfQ0KIA0KLQ0KIC8qIFRhc2tsZXRzICovDQogDQogc3RydWN0IHRh
c2tsZXRfaGVhZCB0YXNrbGV0X3ZlY1tOUl9DUFVTXSBfX2NhY2hlbGluZV9h
bGlnbmVkOw0KIHN0cnVjdCB0YXNrbGV0X2hlYWQgdGFza2xldF9oaV92ZWNb
TlJfQ1BVU10gX19jYWNoZWxpbmVfYWxpZ25lZDsNCiANCi12b2lkIF9fdGFz
a2xldF9zY2hlZHVsZShzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKnQpDQorc3Rh
dGljIGlubGluZSB2b2lkIF9fdGFza2xldF9lbmFibGUoc3RydWN0IHRhc2ts
ZXRfc3RydWN0ICp0LA0KKwkJCQkJc3RydWN0IHRhc2tsZXRfaGVhZCAqdmVj
LCBpbnQgc29mdGlycSkNCiB7DQogCWludCBjcHUgPSBzbXBfcHJvY2Vzc29y
X2lkKCk7DQotCXVuc2lnbmVkIGxvbmcgZmxhZ3M7DQogDQotCWxvY2FsX2ly
cV9zYXZlKGZsYWdzKTsNCi0JdC0+bmV4dCA9IHRhc2tsZXRfdmVjW2NwdV0u
bGlzdDsNCi0JdGFza2xldF92ZWNbY3B1XS5saXN0ID0gdDsNCi0JY3B1X3Jh
aXNlX3NvZnRpcnEoY3B1LCBUQVNLTEVUX1NPRlRJUlEpOw0KLQlsb2NhbF9p
cnFfcmVzdG9yZShmbGFncyk7DQorCXNtcF9tYl9fYmVmb3JlX2F0b21pY19k
ZWMoKTsNCisJaWYgKCFhdG9taWNfZGVjX2FuZF90ZXN0KCZ0LT5jb3VudCkp
DQorCQlyZXR1cm47DQorDQorCWxvY2FsX2lycV9kaXNhYmxlKCk7DQorCS8q
DQorCSAqIEJlaW5nIGFibGUgdG8gY2xlYXIgdGhlIFNDSEVEIGJpdCBmcm9t
IDEgdG8gMCBtZWFucw0KKwkgKiB3ZSBnb3QgdGhlIHJpZ2h0IHRvIGhhbmRs
ZSB0aGlzIHRhc2tsZXQuDQorCSAqIFNldHRpbmcgaXQgZnJvbSAwIHRvIDEg
bWVhbnMgd2UgY2FuIHF1ZXVlIGl0Lg0KKwkgKi8NCisJaWYgKHRlc3RfYW5k
X2NsZWFyX2JpdChUQVNLTEVUX1NUQVRFX1NDSEVELCAmdC0+c3RhdGUpICYm
ICF0LT5uZXh0KSB7DQorCQlpZiAoIXRlc3RfYW5kX3NldF9iaXQoVEFTS0xF
VF9TVEFURV9TQ0hFRCwgJnQtPnN0YXRlKSkgew0KKw0KKwkJCXQtPm5leHQg
PSAodmVjICsgY3B1KS0+bGlzdDsNCisJCQkodmVjICsgY3B1KS0+bGlzdCA9
IHQ7DQorCQkJX19jcHVfcmFpc2Vfc29mdGlycShjcHUsIHNvZnRpcnEpOw0K
KwkJfQ0KKwl9DQorCWxvY2FsX2lycV9lbmFibGUoKTsNCisJcmVydW5fc29m
dGlycXMoY3B1KTsNCiB9DQogDQotdm9pZCBfX3Rhc2tsZXRfaGlfc2NoZWR1
bGUoc3RydWN0IHRhc2tsZXRfc3RydWN0ICp0KQ0KK3ZvaWQgdGFza2xldF9l
bmFibGUoc3RydWN0IHRhc2tsZXRfc3RydWN0ICp0KQ0KK3sNCisJX190YXNr
bGV0X2VuYWJsZSh0LCB0YXNrbGV0X3ZlYywgVEFTS0xFVF9TT0ZUSVJRKTsN
Cit9DQorDQordm9pZCB0YXNrbGV0X2hpX2VuYWJsZShzdHJ1Y3QgdGFza2xl
dF9zdHJ1Y3QgKnQpDQorew0KKwlfX3Rhc2tsZXRfZW5hYmxlKHQsIHRhc2ts
ZXRfaGlfdmVjLCBISV9TT0ZUSVJRKTsNCit9DQorDQorc3RhdGljIGlubGlu
ZSB2b2lkIF9fdGFza2xldF9zY2hlZChzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qg
KnQsDQorCQkJCQlzdHJ1Y3QgdGFza2xldF9oZWFkICp2ZWMsIGludCBzb2Z0
aXJxKQ0KIHsNCiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsNCiAJ
dW5zaWduZWQgbG9uZyBmbGFnczsNCiANCiAJbG9jYWxfaXJxX3NhdmUoZmxh
Z3MpOw0KLQl0LT5uZXh0ID0gdGFza2xldF9oaV92ZWNbY3B1XS5saXN0Ow0K
LQl0YXNrbGV0X2hpX3ZlY1tjcHVdLmxpc3QgPSB0Ow0KLQljcHVfcmFpc2Vf
c29mdGlycShjcHUsIEhJX1NPRlRJUlEpOw0KKwl0LT5uZXh0ID0gKHZlYyAr
IGNwdSktPmxpc3Q7DQorCSh2ZWMgKyBjcHUpLT5saXN0ID0gdDsNCisJX19j
cHVfcmFpc2Vfc29mdGlycShjcHUsIHNvZnRpcnEpOw0KIAlsb2NhbF9pcnFf
cmVzdG9yZShmbGFncyk7DQorCXJlcnVuX3NvZnRpcnFzKGNwdSk7DQogfQ0K
IA0KLXN0YXRpYyB2b2lkIHRhc2tsZXRfYWN0aW9uKHN0cnVjdCBzb2Z0aXJx
X2FjdGlvbiAqYSkNCit2b2lkIF9fdGFza2xldF9zY2hlZHVsZShzdHJ1Y3Qg
dGFza2xldF9zdHJ1Y3QgKnQpDQogew0KLQlpbnQgY3B1ID0gc21wX3Byb2Nl
c3Nvcl9pZCgpOw0KLQlzdHJ1Y3QgdGFza2xldF9zdHJ1Y3QgKmxpc3Q7DQot
DQotCWxvY2FsX2lycV9kaXNhYmxlKCk7DQotCWxpc3QgPSB0YXNrbGV0X3Zl
Y1tjcHVdLmxpc3Q7DQotCXRhc2tsZXRfdmVjW2NwdV0ubGlzdCA9IE5VTEw7
DQotCWxvY2FsX2lycV9lbmFibGUoKTsNCi0NCi0Jd2hpbGUgKGxpc3QpIHsN
Ci0JCXN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCA9IGxpc3Q7DQotDQotCQls
aXN0ID0gbGlzdC0+bmV4dDsNCi0NCi0JCWlmICh0YXNrbGV0X3RyeWxvY2so
dCkpIHsNCi0JCQlpZiAoIWF0b21pY19yZWFkKCZ0LT5jb3VudCkpIHsNCi0J
CQkJaWYgKCF0ZXN0X2FuZF9jbGVhcl9iaXQoVEFTS0xFVF9TVEFURV9TQ0hF
RCwgJnQtPnN0YXRlKSkNCi0JCQkJCUJVRygpOw0KLQkJCQl0LT5mdW5jKHQt
PmRhdGEpOw0KLQkJCQl0YXNrbGV0X3VubG9jayh0KTsNCi0JCQkJY29udGlu
dWU7DQotCQkJfQ0KLQkJCXRhc2tsZXRfdW5sb2NrKHQpOw0KLQkJfQ0KKwlf
X3Rhc2tsZXRfc2NoZWQodCwgdGFza2xldF92ZWMsIFRBU0tMRVRfU09GVElS
USk7DQorfQ0KIA0KLQkJbG9jYWxfaXJxX2Rpc2FibGUoKTsNCi0JCXQtPm5l
eHQgPSB0YXNrbGV0X3ZlY1tjcHVdLmxpc3Q7DQotCQl0YXNrbGV0X3ZlY1tj
cHVdLmxpc3QgPSB0Ow0KLQkJX19jcHVfcmFpc2Vfc29mdGlycShjcHUsIFRB
U0tMRVRfU09GVElSUSk7DQotCQlsb2NhbF9pcnFfZW5hYmxlKCk7DQotCX0N
Cit2b2lkIF9fdGFza2xldF9oaV9zY2hlZHVsZShzdHJ1Y3QgdGFza2xldF9z
dHJ1Y3QgKnQpDQorew0KKwlfX3Rhc2tsZXRfc2NoZWQodCwgdGFza2xldF9o
aV92ZWMsIEhJX1NPRlRJUlEpOw0KIH0NCiANCi1zdGF0aWMgdm9pZCB0YXNr
bGV0X2hpX2FjdGlvbihzdHJ1Y3Qgc29mdGlycV9hY3Rpb24gKmEpDQorc3Rh
dGljIGlubGluZSB2b2lkIF9fdGFza2xldF9hY3Rpb24oc3RydWN0IHNvZnRp
cnFfYWN0aW9uICphLA0KKwkJCQkJc3RydWN0IHRhc2tsZXRfaGVhZCAqdmVj
KQ0KIHsNCiAJaW50IGNwdSA9IHNtcF9wcm9jZXNzb3JfaWQoKTsNCiAJc3Ry
dWN0IHRhc2tsZXRfc3RydWN0ICpsaXN0Ow0KIA0KIAlsb2NhbF9pcnFfZGlz
YWJsZSgpOw0KLQlsaXN0ID0gdGFza2xldF9oaV92ZWNbY3B1XS5saXN0Ow0K
LQl0YXNrbGV0X2hpX3ZlY1tjcHVdLmxpc3QgPSBOVUxMOw0KKwlsaXN0ID0g
KHZlYyArIGNwdSktPmxpc3Q7DQorCSh2ZWMgKyBjcHUpLT5saXN0ID0gTlVM
TDsNCiAJbG9jYWxfaXJxX2VuYWJsZSgpOw0KIA0KIAl3aGlsZSAobGlzdCkg
ew0KIAkJc3RydWN0IHRhc2tsZXRfc3RydWN0ICp0ID0gbGlzdDsNCiANCiAJ
CWxpc3QgPSBsaXN0LT5uZXh0Ow0KKwkJdC0+bmV4dCA9IE5VTEw7DQogDQot
CQlpZiAodGFza2xldF90cnlsb2NrKHQpKSB7DQotCQkJaWYgKCFhdG9taWNf
cmVhZCgmdC0+Y291bnQpKSB7DQotCQkJCWlmICghdGVzdF9hbmRfY2xlYXJf
Yml0KFRBU0tMRVRfU1RBVEVfU0NIRUQsICZ0LT5zdGF0ZSkpDQotCQkJCQlC
VUcoKTsNCi0JCQkJdC0+ZnVuYyh0LT5kYXRhKTsNCi0JCQkJdGFza2xldF91
bmxvY2sodCk7DQotCQkJCWNvbnRpbnVlOw0KLQkJCX0NCityZXBlYXQ6DQor
CQlpZiAoIXRhc2tsZXRfdHJ5bG9jayh0KSkNCisJCQljb250aW51ZTsNCisJ
CWlmIChhdG9taWNfcmVhZCgmdC0+Y291bnQpKSB7DQogCQkJdGFza2xldF91
bmxvY2sodCk7DQorCQkJY29udGludWU7DQogCQl9DQotDQotCQlsb2NhbF9p
cnFfZGlzYWJsZSgpOw0KLQkJdC0+bmV4dCA9IHRhc2tsZXRfaGlfdmVjW2Nw
dV0ubGlzdDsNCi0JCXRhc2tsZXRfaGlfdmVjW2NwdV0ubGlzdCA9IHQ7DQot
CQlfX2NwdV9yYWlzZV9zb2Z0aXJxKGNwdSwgSElfU09GVElSUSk7DQotCQls
b2NhbF9pcnFfZW5hYmxlKCk7DQorCQlpZiAodGVzdF9hbmRfY2xlYXJfYml0
KFRBU0tMRVRfU1RBVEVfU0NIRUQsICZ0LT5zdGF0ZSkpIHsNCisJCQl0LT5m
dW5jKHQtPmRhdGEpOw0KKwkJCXRhc2tsZXRfdW5sb2NrKHQpOw0KKwkJCWlm
ICh0ZXN0X2JpdChUQVNLTEVUX1NUQVRFX1NDSEVELCAmdC0+c3RhdGUpKQ0K
KwkJCQlnb3RvIHJlcGVhdDsNCisJCQljb250aW51ZTsNCisJCX0NCisJCXRh
c2tsZXRfdW5sb2NrKHQpOw0KIAl9DQogfQ0KIA0KK3N0YXRpYyB2b2lkIHRh
c2tsZXRfYWN0aW9uKHN0cnVjdCBzb2Z0aXJxX2FjdGlvbiAqYSkNCit7DQor
CV9fdGFza2xldF9hY3Rpb24oYSwgdGFza2xldF92ZWMpOw0KK30NCisNCitz
dGF0aWMgdm9pZCB0YXNrbGV0X2hpX2FjdGlvbihzdHJ1Y3Qgc29mdGlycV9h
Y3Rpb24gKmEpDQorew0KKwlfX3Rhc2tsZXRfYWN0aW9uKGEsIHRhc2tsZXRf
aGlfdmVjKTsNCit9DQogDQogdm9pZCB0YXNrbGV0X2luaXQoc3RydWN0IHRh
c2tsZXRfc3RydWN0ICp0LA0KIAkJICB2b2lkICgqZnVuYykodW5zaWduZWQg
bG9uZyksIHVuc2lnbmVkIGxvbmcgZGF0YSkNCkBAIC0yNjgsOCArMjMwLDYg
QEANCiAJY2xlYXJfYml0KFRBU0tMRVRfU1RBVEVfU0NIRUQsICZ0LT5zdGF0
ZSk7DQogfQ0KIA0KLQ0KLQ0KIC8qIE9sZCBzdHlsZSBCSHMgKi8NCiANCiBz
dGF0aWMgdm9pZCAoKmJoX2Jhc2VbMzJdKSh2b2lkKTsNCkBAIC0zMjUsNyAr
Mjg1LDcgQEANCiB7DQogCWludCBpOw0KIA0KLQlmb3IgKGk9MDsgaTwzMjsg
aSsrKQ0KKwlmb3IgKGkgPSAwOyBpIDwgMzI7IGkrKykNCiAJCXRhc2tsZXRf
aW5pdChiaF90YXNrX3ZlYytpLCBiaF9hY3Rpb24sIGkpOw0KIA0KIAlvcGVu
X3NvZnRpcnEoVEFTS0xFVF9TT0ZUSVJRLCB0YXNrbGV0X2FjdGlvbiwgTlVM
TCk7DQpAQCAtMzU4LDYxICszMTgsMyBAQA0KIAkJCWYoZGF0YSk7DQogCX0N
CiB9DQotDQotc3RhdGljIGludCBrc29mdGlycWQodm9pZCAqIF9fYmluZF9j
cHUpDQotew0KLQlpbnQgYmluZF9jcHUgPSAqKGludCAqKSBfX2JpbmRfY3B1
Ow0KLQlpbnQgY3B1ID0gY3B1X2xvZ2ljYWxfbWFwKGJpbmRfY3B1KTsNCi0N
Ci0JZGFlbW9uaXplKCk7DQotCWN1cnJlbnQtPm5pY2UgPSAxOTsNCi0Jc2ln
ZmlsbHNldCgmY3VycmVudC0+YmxvY2tlZCk7DQotDQotCS8qIE1pZ3JhdGUg
dG8gdGhlIHJpZ2h0IENQVSAqLw0KLQljdXJyZW50LT5jcHVzX2FsbG93ZWQg
PSAxVUwgPDwgY3B1Ow0KLQl3aGlsZSAoc21wX3Byb2Nlc3Nvcl9pZCgpICE9
IGNwdSkNCi0JCXNjaGVkdWxlKCk7DQotDQotCXNwcmludGYoY3VycmVudC0+
Y29tbSwgImtzb2Z0aXJxZF9DUFUlZCIsIGJpbmRfY3B1KTsNCi0NCi0JX19z
ZXRfY3VycmVudF9zdGF0ZShUQVNLX0lOVEVSUlVQVElCTEUpOw0KLQltYigp
Ow0KLQ0KLQlrc29mdGlycWRfdGFzayhjcHUpID0gY3VycmVudDsNCi0NCi0J
Zm9yICg7Oykgew0KLQkJaWYgKCFzb2Z0aXJxX3BlbmRpbmcoY3B1KSkNCi0J
CQlzY2hlZHVsZSgpOw0KLQ0KLQkJX19zZXRfY3VycmVudF9zdGF0ZShUQVNL
X1JVTk5JTkcpOw0KLQ0KLQkJd2hpbGUgKHNvZnRpcnFfcGVuZGluZyhjcHUp
KSB7DQotCQkJZG9fc29mdGlycSgpOw0KLQkJCWlmIChjdXJyZW50LT5uZWVk
X3Jlc2NoZWQpDQotCQkJCXNjaGVkdWxlKCk7DQotCQl9DQotDQotCQlfX3Nl
dF9jdXJyZW50X3N0YXRlKFRBU0tfSU5URVJSVVBUSUJMRSk7DQotCX0NCi19
DQotDQotc3RhdGljIF9faW5pdCBpbnQgc3Bhd25fa3NvZnRpcnFkKHZvaWQp
DQotew0KLQlpbnQgY3B1Ow0KLQ0KLQlmb3IgKGNwdSA9IDA7IGNwdSA8IHNt
cF9udW1fY3B1czsgY3B1KyspIHsNCi0JCWlmIChrZXJuZWxfdGhyZWFkKGtz
b2Z0aXJxZCwgKHZvaWQgKikgJmNwdSwNCi0JCQkJICBDTE9ORV9GUyB8IENM
T05FX0ZJTEVTIHwgQ0xPTkVfU0lHTkFMKSA8IDApDQotCQkJcHJpbnRrKCJz
cGF3bl9rc29mdGlycWQoKSBmYWlsZWQgZm9yIGNwdSAlZFxuIiwgY3B1KTsN
Ci0JCWVsc2Ugew0KLQkJCXdoaWxlICgha3NvZnRpcnFkX3Rhc2soY3B1X2xv
Z2ljYWxfbWFwKGNwdSkpKSB7DQotCQkJCWN1cnJlbnQtPnBvbGljeSB8PSBT
Q0hFRF9ZSUVMRDsNCi0JCQkJc2NoZWR1bGUoKTsNCi0JCQl9DQotCQl9DQot
CX0NCi0NCi0JcmV0dXJuIDA7DQotfQ0KLQ0KLV9faW5pdGNhbGwoc3Bhd25f
a3NvZnRpcnFkKTsNCi0tLSBsaW51eC9rZXJuZWwvdGltZXIuYy5vcmlnCVR1
ZSBBdWcgMjEgMTQ6MjY6MTkgMjAwMQ0KKysrIGxpbnV4L2tlcm5lbC90aW1l
ci5jCU1vbiBPY3QgIDEgMjE6NTI6NDMgMjAwMQ0KQEAgLTY3NCw2ICs2NzQs
NyBAQA0KIHZvaWQgZG9fdGltZXIoc3RydWN0IHB0X3JlZ3MgKnJlZ3MpDQog
ew0KIAkoKih1bnNpZ25lZCBsb25nICopJmppZmZpZXMpKys7DQorCWlycV9y
YXRlX2NoZWNrKCk7DQogI2lmbmRlZiBDT05GSUdfU01QDQogCS8qIFNNUCBw
cm9jZXNzIGFjY291bnRpbmcgdXNlcyB0aGUgbG9jYWwgQVBJQyB0aW1lciAq
Lw0KIA0KLS0tIGxpbnV4L2luY2x1ZGUvbGludXgvbmV0ZGV2aWNlLmgub3Jp
ZwlNb24gT2N0ICAxIDIxOjUyOjI4IDIwMDENCisrKyBsaW51eC9pbmNsdWRl
L2xpbnV4L25ldGRldmljZS5oCU1vbiBPY3QgIDEgMjM6MDc6NDQgMjAwMQ0K
QEAgLTQ4Niw4ICs0ODYsOSBAQA0KIAkJbG9jYWxfaXJxX3NhdmUoZmxhZ3Mp
Ow0KIAkJZGV2LT5uZXh0X3NjaGVkID0gc29mdG5ldF9kYXRhW2NwdV0ub3V0
cHV0X3F1ZXVlOw0KIAkJc29mdG5ldF9kYXRhW2NwdV0ub3V0cHV0X3F1ZXVl
ID0gZGV2Ow0KLQkJY3B1X3JhaXNlX3NvZnRpcnEoY3B1LCBORVRfVFhfU09G
VElSUSk7DQorCQlfX2NwdV9yYWlzZV9zb2Z0aXJxKGNwdSwgTkVUX1RYX1NP
RlRJUlEpOw0KIAkJbG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOw0KKwkJcmVy
dW5fc29mdGlycXMoY3B1KTsNCiAJfQ0KIH0NCiANCkBAIC01MzUsOCArNTM2
LDkgQEANCiAJCWxvY2FsX2lycV9zYXZlKGZsYWdzKTsNCiAJCXNrYi0+bmV4
dCA9IHNvZnRuZXRfZGF0YVtjcHVdLmNvbXBsZXRpb25fcXVldWU7DQogCQlz
b2Z0bmV0X2RhdGFbY3B1XS5jb21wbGV0aW9uX3F1ZXVlID0gc2tiOw0KLQkJ
Y3B1X3JhaXNlX3NvZnRpcnEoY3B1LCBORVRfVFhfU09GVElSUSk7DQorCQlf
X2NwdV9yYWlzZV9zb2Z0aXJxKGNwdSwgTkVUX1RYX1NPRlRJUlEpOw0KIAkJ
bG9jYWxfaXJxX3Jlc3RvcmUoZmxhZ3MpOw0KKwkJcmVydW5fc29mdGlycXMo
Y3B1KTsNCiAJfQ0KIH0NCiANCi0tLSBsaW51eC9pbmNsdWRlL2xpbnV4L2lu
dGVycnVwdC5oLm9yaWcJTW9uIE9jdCAgMSAyMTo1MjozMiAyMDAxDQorKysg
bGludXgvaW5jbHVkZS9saW51eC9pbnRlcnJ1cHQuaAlNb24gT2N0ICAxIDIz
OjA3OjMzIDIwMDENCkBAIC03NCw5ICs3NCwxNSBAQA0KIGFzbWxpbmthZ2Ug
dm9pZCBkb19zb2Z0aXJxKHZvaWQpOw0KIGV4dGVybiB2b2lkIG9wZW5fc29m
dGlycShpbnQgbnIsIHZvaWQgKCphY3Rpb24pKHN0cnVjdCBzb2Z0aXJxX2Fj
dGlvbiopLCB2b2lkICpkYXRhKTsNCiBleHRlcm4gdm9pZCBzb2Z0aXJxX2lu
aXQodm9pZCk7DQotI2RlZmluZSBfX2NwdV9yYWlzZV9zb2Z0aXJxKGNwdSwg
bnIpIGRvIHsgc29mdGlycV9wZW5kaW5nKGNwdSkgfD0gMVVMIDw8IChucik7
IH0gd2hpbGUgKDApDQotZXh0ZXJuIHZvaWQgRkFTVENBTEwoY3B1X3JhaXNl
X3NvZnRpcnEodW5zaWduZWQgaW50IGNwdSwgdW5zaWduZWQgaW50IG5yKSk7
DQotZXh0ZXJuIHZvaWQgRkFTVENBTEwocmFpc2Vfc29mdGlycSh1bnNpZ25l
ZCBpbnQgbnIpKTsNCitleHRlcm4gdm9pZCBzaG93X3N0YWNrKHVuc2lnbmVk
IGxvbmcqIGVzcCk7DQorI2RlZmluZSBfX2NwdV9yYWlzZV9zb2Z0aXJxKGNw
dSwgbnIpIFwNCisJCWRvIHsgc29mdGlycV9wZW5kaW5nKGNwdSkgfD0gMVVM
IDw8IChucik7IH0gd2hpbGUgKDApDQorDQorI2RlZmluZSByZXJ1bl9zb2Z0
aXJxcyhjcHUpIAkJCQkJXA0KK2RvIHsJCQkJCQkJCVwNCisJaWYgKCEobG9j
YWxfaXJxX2NvdW50KGNwdSkgfCBsb2NhbF9iaF9jb3VudChjcHUpKSkJXA0K
KwkJZG9fc29mdGlycSgpOwkJCQkJXA0KK30gd2hpbGUgKDApOw0KIA0KIA0K
IA0KQEAgLTE4MiwxOCArMTg4LDggQEANCiAJc21wX21iKCk7DQogfQ0KIA0K
LXN0YXRpYyBpbmxpbmUgdm9pZCB0YXNrbGV0X2VuYWJsZShzdHJ1Y3QgdGFz
a2xldF9zdHJ1Y3QgKnQpDQotew0KLQlzbXBfbWJfX2JlZm9yZV9hdG9taWNf
ZGVjKCk7DQotCWF0b21pY19kZWMoJnQtPmNvdW50KTsNCi19DQotDQotc3Rh
dGljIGlubGluZSB2b2lkIHRhc2tsZXRfaGlfZW5hYmxlKHN0cnVjdCB0YXNr
bGV0X3N0cnVjdCAqdCkNCi17DQotCXNtcF9tYl9fYmVmb3JlX2F0b21pY19k
ZWMoKTsNCi0JYXRvbWljX2RlYygmdC0+Y291bnQpOw0KLX0NCi0NCitleHRl
cm4gdm9pZCB0YXNrbGV0X2VuYWJsZShzdHJ1Y3QgdGFza2xldF9zdHJ1Y3Qg
KnQpOw0KK2V4dGVybiB2b2lkIHRhc2tsZXRfaGlfZW5hYmxlKHN0cnVjdCB0
YXNrbGV0X3N0cnVjdCAqdCk7DQogZXh0ZXJuIHZvaWQgdGFza2xldF9raWxs
KHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCk7DQogZXh0ZXJuIHZvaWQgdGFz
a2xldF9pbml0KHN0cnVjdCB0YXNrbGV0X3N0cnVjdCAqdCwNCiAJCQkgdm9p
ZCAoKmZ1bmMpKHVuc2lnbmVkIGxvbmcpLCB1bnNpZ25lZCBsb25nIGRhdGEp
Ow0KQEAgLTI2Myw1ICsyNTksNiBAQA0KIGV4dGVybiB1bnNpZ25lZCBsb25n
IHByb2JlX2lycV9vbih2b2lkKTsJLyogcmV0dXJucyAwIG9uIGZhaWx1cmUg
Ki8NCiBleHRlcm4gaW50IHByb2JlX2lycV9vZmYodW5zaWduZWQgbG9uZyk7
CS8qIHJldHVybnMgMCBvciBuZWdhdGl2ZSBvbiBmYWlsdXJlICovDQogZXh0
ZXJuIHVuc2lnbmVkIGludCBwcm9iZV9pcnFfbWFzayh1bnNpZ25lZCBsb25n
KTsJLyogcmV0dXJucyBtYXNrIG9mIElTQSBpbnRlcnJ1cHRzICovDQorZXh0
ZXJuIHZvaWQgaXJxX3JhdGVfY2hlY2sodm9pZCk7DQogDQogI2VuZGlmDQot
LS0gbGludXgvaW5jbHVkZS9saW51eC9pcnEuaC5vcmlnCU1vbiBPY3QgIDEg
MjE6NTI6MzIgMjAwMQ0KKysrIGxpbnV4L2luY2x1ZGUvbGludXgvaXJxLmgJ
TW9uIE9jdCAgMSAyMzowNzoxOSAyMDAxDQpAQCAtMzEsNiArMzEsNyBAQA0K
ICNkZWZpbmUgSVJRX0xFVkVMCTY0CS8qIElSUSBsZXZlbCB0cmlnZ2VyZWQg
Ki8NCiAjZGVmaW5lIElSUV9NQVNLRUQJMTI4CS8qIElSUSBtYXNrZWQgLSBz
aG91bGRuJ3QgYmUgc2VlbiBhZ2FpbiAqLw0KICNkZWZpbmUgSVJRX1BFUl9D
UFUJMjU2CS8qIElSUSBpcyBwZXIgQ1BVICovDQorI2RlZmluZSBJUlFfTUlU
SUdBVEVECTUxMgkvKiBJUlEgZ290IHJhdGUtbGltaXRlZCAqLw0KIA0KIC8q
DQogICogSW50ZXJydXB0IGNvbnRyb2xsZXIgZGVzY3JpcHRvci4gVGhpcyBp
cyBhbGwgd2UgbmVlZA0KQEAgLTYyLDYgKzYzLDcgQEANCiAJc3RydWN0IGly
cWFjdGlvbiAqYWN0aW9uOwkvKiBJUlEgYWN0aW9uIGxpc3QgKi8NCiAJdW5z
aWduZWQgaW50IGRlcHRoOwkJLyogbmVzdGVkIGlycSBkaXNhYmxlcyAqLw0K
IAlzcGlubG9ja190IGxvY2s7DQorCXVuc2lnbmVkIGludCBjb3VudDsNCiB9
IF9fX19jYWNoZWxpbmVfYWxpZ25lZCBpcnFfZGVzY190Ow0KIA0KIGV4dGVy
biBpcnFfZGVzY190IGlycV9kZXNjIFtOUl9JUlFTXTsNCi0tLSBsaW51eC9p
bmNsdWRlL2FzbS1pMzg2L2lycS5oLm9yaWcJTW9uIE9jdCAgMSAyMzowNjo1
MyAyMDAxDQorKysgbGludXgvaW5jbHVkZS9hc20taTM4Ni9pcnEuaAlNb24g
T2N0ICAxIDIzOjA3OjA2IDIwMDENCkBAIC0zMyw2ICszMyw3IEBADQogZXh0
ZXJuIHZvaWQgZGlzYWJsZV9pcnEodW5zaWduZWQgaW50KTsNCiBleHRlcm4g
dm9pZCBkaXNhYmxlX2lycV9ub3N5bmModW5zaWduZWQgaW50KTsNCiBleHRl
cm4gdm9pZCBlbmFibGVfaXJxKHVuc2lnbmVkIGludCk7DQorZXh0ZXJuIHZv
aWQgc2V0X2lycV9yYXRlKHVuc2lnbmVkIGludCBpcnEsIHVuc2lnbmVkIGlu
dCByYXRlKTsNCiANCiAjaWZkZWYgQ09ORklHX1g4Nl9MT0NBTF9BUElDDQog
I2RlZmluZSBBUkNIX0hBU19OTUlfV0FUQ0hET0cJCS8qIFNlZSBpbmNsdWRl
L2xpbnV4L25taS5oICovDQotLS0gbGludXgvaW5jbHVkZS9hc20tbWlwcy9z
b2Z0aXJxLmgub3JpZwlNb24gT2N0ICAxIDIxOjUyOjMyIDIwMDENCisrKyBs
aW51eC9pbmNsdWRlL2FzbS1taXBzL3NvZnRpcnEuaAlNb24gT2N0ICAxIDIx
OjUyOjQzIDIwMDENCkBAIC00MCw2ICs0MCw0IEBADQogDQogI2RlZmluZSBp
bl9zb2Z0aXJxKCkgKGxvY2FsX2JoX2NvdW50KHNtcF9wcm9jZXNzb3JfaWQo
KSkgIT0gMCkNCiANCi0jZGVmaW5lIF9fY3B1X3JhaXNlX3NvZnRpcnEoY3B1
LCBucikJc2V0X2JpdChuciwgJnNvZnRpcnFfcGVuZGluZyhjcHUpKQ0KLQ0K
ICNlbmRpZiAvKiBfQVNNX1NPRlRJUlFfSCAqLw0KLS0tIGxpbnV4L2luY2x1
ZGUvYXNtLW1pcHM2NC9zb2Z0aXJxLmgub3JpZwlNb24gT2N0ICAxIDIxOjUy
OjMyIDIwMDENCisrKyBsaW51eC9pbmNsdWRlL2FzbS1taXBzNjQvc29mdGly
cS5oCU1vbiBPY3QgIDEgMjE6NTI6NDMgMjAwMQ0KQEAgLTM5LDE5ICszOSw0
IEBADQogDQogI2RlZmluZSBpbl9zb2Z0aXJxKCkgKGxvY2FsX2JoX2NvdW50
KHNtcF9wcm9jZXNzb3JfaWQoKSkgIT0gMCkNCiANCi1leHRlcm4gaW5saW5l
IHZvaWQgX19jcHVfcmFpc2Vfc29mdGlycShpbnQgY3B1LCBpbnQgbnIpDQot
ew0KLQl1bnNpZ25lZCBpbnQgKm0gPSAodW5zaWduZWQgaW50ICopICZzb2Z0
aXJxX3BlbmRpbmcoY3B1KTsNCi0JdW5zaWduZWQgaW50IHRlbXA7DQotDQot
CV9fYXNtX18gX192b2xhdGlsZV9fKA0KLQkJIjE6XHRsbFx0JTAsICUxXHRc
dFx0IyBfX2NwdV9yYWlzZV9zb2Z0aXJxXG5cdCINCi0JCSJvclx0JTAsICUy
XG5cdCINCi0JCSJzY1x0JTAsICUxXG5cdCINCi0JCSJiZXF6XHQlMCwgMWIi
DQotCQk6ICI9JnIiICh0ZW1wKSwgIj1tIiAoKm0pDQotCQk6ICJpciIgKDFV
TCA8PCBuciksICJtIiAoKm0pDQotCQk6ICJtZW1vcnkiKTsNCi19DQotDQog
I2VuZGlmIC8qIF9BU01fU09GVElSUV9IICovDQotLS0gbGludXgvbmV0L2Nv
cmUvZGV2LmMub3JpZwlNb24gT2N0ICAxIDIxOjUyOjMyIDIwMDENCisrKyBs
aW51eC9uZXQvY29yZS9kZXYuYwlNb24gT2N0ICAxIDIxOjUyOjQzIDIwMDEN
CkBAIC0xMjE4LDggKzEyMTgsOSBAQA0KIAkJCWRldl9ob2xkKHNrYi0+ZGV2
KTsNCiAJCQlfX3NrYl9xdWV1ZV90YWlsKCZxdWV1ZS0+aW5wdXRfcGt0X3F1
ZXVlLHNrYik7DQogCQkJLyogUnVucyBmcm9tIGlycXMgb3IgQkgncywgbm8g
bmVlZCB0byB3YWtlIEJIICovDQotCQkJY3B1X3JhaXNlX3NvZnRpcnEodGhp
c19jcHUsIE5FVF9SWF9TT0ZUSVJRKTsNCisJCQlfX2NwdV9yYWlzZV9zb2Z0
aXJxKHRoaXNfY3B1LCBORVRfUlhfU09GVElSUSk7DQogCQkJbG9jYWxfaXJx
X3Jlc3RvcmUoZmxhZ3MpOw0KKwkJCXJlcnVuX3NvZnRpcnFzKHRoaXNfY3B1
KTsNCiAjaWZuZGVmIE9GRkxJTkVfU0FNUExFDQogCQkJZ2V0X3NhbXBsZV9z
dGF0cyh0aGlzX2NwdSk7DQogI2VuZGlmDQpAQCAtMTUyOSw4ICsxNTMwLDkg
QEANCiAJbG9jYWxfaXJxX2Rpc2FibGUoKTsNCiAJbmV0ZGV2X3J4X3N0YXRb
dGhpc19jcHVdLnRpbWVfc3F1ZWV6ZSsrOw0KIAkvKiBUaGlzIGFscmVhZHkg
cnVucyBpbiBCSCBjb250ZXh0LCBubyBuZWVkIHRvIHdha2UgdXAgQkgncyAq
Lw0KLQljcHVfcmFpc2Vfc29mdGlycSh0aGlzX2NwdSwgTkVUX1JYX1NPRlRJ
UlEpOw0KKwlfX2NwdV9yYWlzZV9zb2Z0aXJxKHRoaXNfY3B1LCBORVRfUlhf
U09GVElSUSk7DQogCWxvY2FsX2lycV9lbmFibGUoKTsNCisJcmVydW5fc29m
dGlycXModGhpc19jcHUpOw0KIA0KIAlORVRfUFJPRklMRV9MRUFWRShzb2Z0
bmV0X3Byb2Nlc3MpOw0KIAlyZXR1cm47DQotLS0gbGludXgvYXJjaC9pMzg2
L2tlcm5lbC9pcnEuYy5vcmlnCU1vbiBPY3QgIDEgMjE6NTI6MjggMjAwMQ0K
KysrIGxpbnV4L2FyY2gvaTM4Ni9rZXJuZWwvaXJxLmMJTW9uIE9jdCAgMSAy
MzowNjoyNiAyMDAxDQpAQCAtMTgsNiArMTgsNyBAQA0KICAqLw0KIA0KICNp
bmNsdWRlIDxsaW51eC9jb25maWcuaD4NCisjaW5jbHVkZSA8bGludXgvY29t
cGlsZXIuaD4NCiAjaW5jbHVkZSA8bGludXgvcHRyYWNlLmg+DQogI2luY2x1
ZGUgPGxpbnV4L2Vycm5vLmg+DQogI2luY2x1ZGUgPGxpbnV4L3NpZ25hbC5o
Pg0KQEAgLTY4LDcgKzY5LDI0IEBADQogaXJxX2Rlc2NfdCBpcnFfZGVzY1tO
Ul9JUlFTXSBfX2NhY2hlbGluZV9hbGlnbmVkID0NCiAJeyBbMCAuLi4gTlJf
SVJRUy0xXSA9IHsgMCwgJm5vX2lycV90eXBlLCBOVUxMLCAwLCBTUElOX0xP
Q0tfVU5MT0NLRUR9fTsNCiANCi1zdGF0aWMgdm9pZCByZWdpc3Rlcl9pcnFf
cHJvYyAodW5zaWduZWQgaW50IGlycSk7DQorI2RlZmluZSBERUZBVUxUX0lS
UV9SQVRFIDIwMDAwDQorDQorLyoNCisgKiBNYXhpbXVtIG51bWJlciBvZiBp
bnRlcnJ1cHRzIGFsbG93ZWQsIHBlciBzZWNvbmQuDQorICogSW5kaXZpZHVh
bCB2YWx1ZXMgY2FuIGJlIHNldCB2aWEgZWNob2luZyB0aGUgbmV3DQorICog
ZGVjaW1hbCB2YWx1ZSBpbnRvIC9wcm9jL2lycS9JUlEvbWF4X3JhdGUuDQor
ICovDQorc3RhdGljIHVuc2lnbmVkIGludCBpcnFfcmF0ZSBbTlJfSVJRU10g
PQ0KKwkJeyBbMCAuLi4gTlJfSVJRUy0xXSA9IERFRkFVTFRfSVJRX1JBVEUg
fTsNCisNCisvKg0KKyAqIFByaW50IHdhcm5pbmdzIG9ubHkgb25jZS4gV2Ug
cmVzZXQgaXQgdG8gMSBpZiByYXRlDQorICogbGltaXQgaGFzIGJlZW4gY2hh
bmdlZC4NCisgKi8NCitzdGF0aWMgdW5zaWduZWQgaW50IHJhdGVfd2Fybmlu
ZyBbTlJfSVJRU10gPQ0KKwkJeyBbMCAuLi4gTlJfSVJRUy0xXSA9IDEgfTsN
CisNCitzdGF0aWMgdm9pZCByZWdpc3Rlcl9pcnFfcHJvYyh1bnNpZ25lZCBp
bnQgaXJxKTsNCiANCiAvKg0KICAqIFNwZWNpYWwgaXJxIGhhbmRsZXJzLg0K
QEAgLTIzMCwzNSArMjQ4LDggQEANCiAJc2hvd19zdGFjayhOVUxMKTsNCiAJ
cHJpbnRrKCJcbiIpOw0KIH0NCi0JDQotI2RlZmluZSBNQVhDT1VOVCAxMDAw
MDAwMDANCiANCi0vKg0KLSAqIEkgaGFkIGEgbG9ja3VwIHNjZW5hcmlvIHdo
ZXJlIGEgdGlnaHQgbG9vcCBkb2luZw0KLSAqIHNwaW5fdW5sb2NrKCkvc3Bp
bl9sb2NrKCkgb24gQ1BVIzEgd2FzIHJhY2luZyB3aXRoDQotICogc3Bpbl9s
b2NrKCkgb24gQ1BVIzAuIENQVSMwIHNob3VsZCBoYXZlIG5vdGljZWQgc3Bp
bl91bmxvY2soKSwgYnV0DQotICogYXBwYXJlbnRseSB0aGUgc3Bpbl91bmxv
Y2soKSBpbmZvcm1hdGlvbiBkaWQgbm90IG1ha2UgaXQNCi0gKiB0aHJvdWdo
IHRvIENQVSMwIC4uLiBuYXN0eSwgaXMgdGhpcyBieSBkZXNpZ24sIGRvIHdl
IGhhdmUgdG8gbGltaXQNCi0gKiAnbWVtb3J5IHVwZGF0ZSBvc2NpbGxhdGlv
biBmcmVxdWVuY3knIGFydGlmaWNpYWxseSBsaWtlIGhlcmU/DQotICoNCi0g
KiBTdWNoICdoaWdoIGZyZXF1ZW5jeSB1cGRhdGUnIHJhY2VzIGNhbiBiZSBh
dm9pZGVkIGJ5IGNhcmVmdWwgZGVzaWduLCBidXQNCi0gKiBzb21lIG9mIG91
ciBtYWpvciBjb25zdHJ1Y3RzIGxpa2Ugc3BpbmxvY2tzIHVzZSBzaW1pbGFy
IHRlY2huaXF1ZXMsDQotICogaXQgd291bGQgYmUgbmljZSB0byBjbGFyaWZ5
IHRoaXMgaXNzdWUuIFNldCB0aGlzIGRlZmluZSB0byAwIGlmIHlvdQ0KLSAq
IHdhbnQgdG8gY2hlY2sgd2hldGhlciB5b3VyIHN5c3RlbSBmcmVlemVzLiAg
SSBzdXNwZWN0IHRoZSBkZWxheSBkb25lDQotICogYnkgU1lOQ19PVEhFUl9D
T1JFUygpIGlzIGluIGNvcnJlbGF0aW9uIHdpdGggJ3Nub29waW5nIGxhdGVu
Y3knLCBidXQNCi0gKiBpIHRob3VnaHQgdGhhdCBzdWNoIHRoaW5ncyBhcmUg
Z3VhcmFudGVlZCBieSBkZXNpZ24sIHNpbmNlIHdlIHVzZQ0KLSAqIHRoZSAn
TE9DSycgcHJlZml4Lg0KLSAqLw0KLSNkZWZpbmUgU1VTUEVDVEVEX0NQVV9P
Ul9DSElQU0VUX0JVR19XT1JLQVJPVU5EIDANCi0NCi0jaWYgU1VTUEVDVEVE
X0NQVV9PUl9DSElQU0VUX0JVR19XT1JLQVJPVU5EDQotIyBkZWZpbmUgU1lO
Q19PVEhFUl9DT1JFUyh4KSB1ZGVsYXkoeCsxKQ0KLSNlbHNlDQotLyoNCi0g
KiBXZSBoYXZlIHRvIGFsbG93IGlycXMgdG8gYXJyaXZlIGJldHdlZW4gX19z
dGkgYW5kIF9fY2xpDQotICovDQotIyBkZWZpbmUgU1lOQ19PVEhFUl9DT1JF
Uyh4KSBfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIpDQotI2VuZGlmDQor
I2RlZmluZSBNQVhDT1VOVCAxMDAwMDAwMDANCiANCiBzdGF0aWMgaW5saW5l
IHZvaWQgd2FpdF9vbl9pcnEoaW50IGNwdSkNCiB7DQpAQCAtMjc2LDcgKzI2
Nyw3IEBADQogCQkJCWJyZWFrOw0KIA0KIAkJLyogRHVoLCB3ZSBoYXZlIHRv
IGxvb3AuIFJlbGVhc2UgdGhlIGxvY2sgdG8gYXZvaWQgZGVhZGxvY2tzICov
DQotCQljbGVhcl9iaXQoMCwmZ2xvYmFsX2lycV9sb2NrKTsNCisJCWNsZWFy
X2JpdCgwLCAmZ2xvYmFsX2lycV9sb2NrKTsNCiANCiAJCWZvciAoOzspIHsN
CiAJCQlpZiAoIS0tY291bnQpIHsNCkBAIC0yODQsNyArMjc1LDggQEANCiAJ
CQkJY291bnQgPSB+MDsNCiAJCQl9DQogCQkJX19zdGkoKTsNCi0JCQlTWU5D
X09USEVSX0NPUkVTKGNwdSk7DQorCQkJLyogQWxsb3cgaXJxcyB0byBhcnJp
dmUgKi8NCisJCQlfX2FzbV9fIF9fdm9sYXRpbGVfXyAoIm5vcCIpOw0KIAkJ
CV9fY2xpKCk7DQogCQkJaWYgKGlycXNfcnVubmluZygpKQ0KIAkJCQljb250
aW51ZTsNCkBAIC00NjcsNiArNDU5LDEzIEBADQogICogY29udHJvbGxlciBs
b2NrLiANCiAgKi8NCiAgDQoraW5saW5lIHZvaWQgX19kaXNhYmxlX2lycShp
cnFfZGVzY190ICpkZXNjLCB1bnNpZ25lZCBpbnQgaXJxKQ0KK3sNCisJaWYg
KCFkZXNjLT5kZXB0aCsrKSB7DQorCQlkZXNjLT5zdGF0dXMgfD0gSVJRX0RJ
U0FCTEVEOw0KKwkJZGVzYy0+aGFuZGxlci0+ZGlzYWJsZShpcnEpOw0KKwl9
DQorfQ0KIC8qKg0KICAqCWRpc2FibGVfaXJxX25vc3luYyAtIGRpc2FibGUg
YW4gaXJxIHdpdGhvdXQgd2FpdGluZw0KICAqCUBpcnE6IEludGVycnVwdCB0
byBkaXNhYmxlDQpAQCAtNDg1LDEwICs0ODQsNyBAQA0KIAl1bnNpZ25lZCBs
b25nIGZsYWdzOw0KIA0KIAlzcGluX2xvY2tfaXJxc2F2ZSgmZGVzYy0+bG9j
aywgZmxhZ3MpOw0KLQlpZiAoIWRlc2MtPmRlcHRoKyspIHsNCi0JCWRlc2Mt
PnN0YXR1cyB8PSBJUlFfRElTQUJMRUQ7DQotCQlkZXNjLT5oYW5kbGVyLT5k
aXNhYmxlKGlycSk7DQotCX0NCisJX19kaXNhYmxlX2lycShkZXNjLCBpcnEp
Ow0KIAlzcGluX3VubG9ja19pcnFyZXN0b3JlKCZkZXNjLT5sb2NrLCBmbGFn
cyk7DQogfQ0KIA0KQEAgLTUxNiwyMyArNTEyLDggQEANCiAJfQ0KIH0NCiAN
Ci0vKioNCi0gKgllbmFibGVfaXJxIC0gZW5hYmxlIGhhbmRsaW5nIG9mIGFu
IGlycQ0KLSAqCUBpcnE6IEludGVycnVwdCB0byBlbmFibGUNCi0gKg0KLSAq
CVVuZG9lcyB0aGUgZWZmZWN0IG9mIG9uZSBjYWxsIHRvIGRpc2FibGVfaXJx
KCkuICBJZiB0aGlzDQotICoJbWF0Y2hlcyB0aGUgbGFzdCBkaXNhYmxlLCBw
cm9jZXNzaW5nIG9mIGludGVycnVwdHMgb24gdGhpcw0KLSAqCUlSUSBsaW5l
IGlzIHJlLWVuYWJsZWQuDQotICoNCi0gKglUaGlzIGZ1bmN0aW9uIG1heSBi
ZSBjYWxsZWQgZnJvbSBJUlEgY29udGV4dC4NCi0gKi8NCi0gDQotdm9pZCBl
bmFibGVfaXJxKHVuc2lnbmVkIGludCBpcnEpDQorc3RhdGljIGlubGluZSB2
b2lkIF9fZW5hYmxlX2lycShpcnFfZGVzY190ICpkZXNjLCB1bnNpZ25lZCBp
bnQgaXJxKQ0KIHsNCi0JaXJxX2Rlc2NfdCAqZGVzYyA9IGlycV9kZXNjICsg
aXJxOw0KLQl1bnNpZ25lZCBsb25nIGZsYWdzOw0KLQ0KLQlzcGluX2xvY2tf
aXJxc2F2ZSgmZGVzYy0+bG9jaywgZmxhZ3MpOw0KIAlzd2l0Y2ggKGRlc2Mt
PmRlcHRoKSB7DQogCWNhc2UgMTogew0KIAkJdW5zaWduZWQgaW50IHN0YXR1
cyA9IGRlc2MtPnN0YXR1cyAmIH5JUlFfRElTQUJMRUQ7DQpAQCAtNTUxLDkg
KzUzMiw2OSBAQA0KIAkJcHJpbnRrKCJlbmFibGVfaXJxKCV1KSB1bmJhbGFu
Y2VkIGZyb20gJXBcbiIsIGlycSwNCiAJCSAgICAgICBfX2J1aWx0aW5fcmV0
dXJuX2FkZHJlc3MoMCkpOw0KIAl9DQorfQ0KKw0KKy8qKg0KKyAqCWVuYWJs
ZV9pcnEgLSBlbmFibGUgaGFuZGxpbmcgb2YgYW4gaXJxDQorICoJQGlycTog
SW50ZXJydXB0IHRvIGVuYWJsZQ0KKyAqDQorICoJVW5kb2VzIHRoZSBlZmZl
Y3Qgb2Ygb25lIGNhbGwgdG8gZGlzYWJsZV9pcnEoKS4gIElmIHRoaXMNCisg
KgltYXRjaGVzIHRoZSBsYXN0IGRpc2FibGUsIHByb2Nlc3Npbmcgb2YgaW50
ZXJydXB0cyBvbiB0aGlzDQorICoJSVJRIGxpbmUgaXMgcmUtZW5hYmxlZC4N
CisgKg0KKyAqCVRoaXMgZnVuY3Rpb24gbWF5IGJlIGNhbGxlZCBmcm9tIElS
USBjb250ZXh0Lg0KKyAqLw0KKyANCit2b2lkIGVuYWJsZV9pcnEodW5zaWdu
ZWQgaW50IGlycSkNCit7DQorCWlycV9kZXNjX3QgKmRlc2MgPSBpcnFfZGVz
YyArIGlycTsNCisJdW5zaWduZWQgbG9uZyBmbGFnczsNCisNCisJc3Bpbl9s
b2NrX2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsNCisJX19lbmFibGVf
aXJxKGRlc2MsIGlycSk7DQogCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRl
c2MtPmxvY2ssIGZsYWdzKTsNCiB9DQogDQordm9pZCBzZXRfaXJxX3JhdGUo
dW5zaWduZWQgaW50IGlycSwgdW5zaWduZWQgaW50IHJhdGUpDQorew0KKwlp
ZiAocmF0ZSA8IDIqSFopDQorCQlyYXRlID0gMipIWjsNCisJaWYgKGlycV9y
YXRlW2lycV0gIT0gcmF0ZSkNCisJCXJhdGVfd2FybmluZ1tpcnFdID0gMTsN
CisJaXJxX3JhdGVbaXJxXSA9IHJhdGU7DQorfQ0KKw0KK3N0YXRpYyBpbmxp
bmUgdm9pZCBfX2hhbmRsZV9taXRpZ2F0ZWQoaXJxX2Rlc2NfdCAqZGVzYywg
dW5zaWduZWQgaW50IGlycSkNCit7DQorCWRlc2MtPnN0YXR1cyAmPSB+SVJR
X01JVElHQVRFRDsNCisJX19lbmFibGVfaXJxKGRlc2MsIGlycSk7DQorfQ0K
Kw0KKy8qDQorICogVGhpcyBmdW5jdGlvbiwgcHJvdmlkZWQgYnkgZXZlcnkg
YXJjaGl0ZWN0dXJlLCByZXNldHMNCisgKiB0aGUgaXJxLWxpbWl0IGNvdW50
ZXJzIGluIGV2ZXJ5IGppZmZ5LiBPdmVyaGVhZCBpcw0KKyAqIGZhaXJseSBz
bWFsbCwgc2luY2UgaXQgZ2V0cyB0aGUgc3BpbmxvY2sgb25seSBpZiB0aGUg
SVJRDQorICogZ290IG1pdGlnYXRlZC4NCisgKi8NCisNCit2b2lkIGlycV9y
YXRlX2NoZWNrKHZvaWQpDQorew0KKwl1bnNpZ25lZCBsb25nIGZsYWdzOw0K
KwlpcnFfZGVzY190ICpkZXNjOw0KKwlpbnQgaTsNCisNCisJZm9yIChpID0g
MDsgaSA8IE5SX0lSUVM7IGkrKykgew0KKwkJZGVzYyA9IGlycV9kZXNjICsg
aTsNCisJCWlmIChkZXNjLT5jb3VudCA8PSAxKSB7DQorCQkJc3Bpbl9sb2Nr
X2lycXNhdmUoJmRlc2MtPmxvY2ssIGZsYWdzKTsNCisJCQlpZiAoZGVzYy0+
c3RhdHVzICYgSVJRX01JVElHQVRFRCkNCisJCQkJX19oYW5kbGVfbWl0aWdh
dGVkKGRlc2MsIGkpOw0KKwkJCXNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJmRl
c2MtPmxvY2ssIGZsYWdzKTsNCisJCX0NCisJCWRlc2MtPmNvdW50ID0gaXJx
X3JhdGVbaV0gLyBIWjsNCisJfQ0KK30NCisNCiAvKg0KICAqIGRvX0lSUSBo
YW5kbGVzIGFsbCBub3JtYWwgZGV2aWNlIElSUSdzICh0aGUgc3BlY2lhbA0K
ICAqIFNNUCBjcm9zcy1DUFUgaW50ZXJydXB0cyBoYXZlIHRoZWlyIG93biBz
cGVjaWZpYw0KQEAgLTU4NSw2ICs2MjYsMTMgQEANCiAJICAgV0FJVElORyBp
cyB1c2VkIGJ5IHByb2JlIHRvIG1hcmsgaXJxcyB0aGF0IGFyZSBiZWluZyB0
ZXN0ZWQNCiAJICAgKi8NCiAJc3RhdHVzID0gZGVzYy0+c3RhdHVzICYgfihJ
UlFfUkVQTEFZIHwgSVJRX1dBSVRJTkcpOw0KKwkvKg0KKwkgKiBPbmUgZGVj
cmVtZW50IGFuZCBvbmUgYnJhbmNoICh0ZXN0IGZvciB6ZXJvKSBpbnRvDQor
CSAqIGFuIHVubGlrZWx5LXByZWRpY3RlZCBicmFuY2guIEl0IGNhbm5vdCBi
ZSBjaGVhcGVyDQorCSAqIHRoYW4gdGhpcy4NCisJICovDQorCWlmICh1bmxp
a2VseSghLS1kZXNjLT5jb3VudCkpDQorCQlnb3RvIG1pdGlnYXRlOw0KIAlz
dGF0dXMgfD0gSVJRX1BFTkRJTkc7IC8qIHdlIF93YW50XyB0byBoYW5kbGUg
aXQgKi8NCiANCiAJLyoNCkBAIC02MzksNiArNjg3LDI3IEBADQogCWlmIChz
b2Z0aXJxX3BlbmRpbmcoY3B1KSkNCiAJCWRvX3NvZnRpcnEoKTsNCiAJcmV0
dXJuIDE7DQorDQorbWl0aWdhdGU6DQorCS8qDQorCSAqIFdlIHRha2UgYSBz
bGlnaHRseSBsb25nZXIgcGF0aCBoZXJlIHRvIG5vdCBwdXQNCisJICogb3Zl
cmhlYWQgaW50byB0aGUgSVJRIGhvdHBhdGg6DQorCSAqLw0KKwlkZXNjLT5j
b3VudCA9IDE7DQorCWlmIChzdGF0dXMgJiBJUlFfTUlUSUdBVEVEKQ0KKwkJ
Z290byBvdXQ7DQorCS8qDQorCSAqIERpc2FibGUgaW50ZXJydXB0IHNvdXJj
ZS4gSXQgd2lsbCBiZSByZS1lbmFibGVkDQorCSAqIGJ5IHRoZSBuZXh0IHRp
bWVyIGludGVycnVwdCAtIGFuZCBwb3NzaWJseSBiZQ0KKwkgKiByZXN0YXJ0
ZWQgaWYgbmVlZGVkLg0KKwkgKi8NCisJZGVzYy0+c3RhdHVzIHw9IElSUV9N
SVRJR0FURUQgfCBJUlFfUEVORElORzsNCisJX19kaXNhYmxlX2lycShkZXNj
LCBpcnEpOw0KKwlpZiAocmF0ZV93YXJuaW5nW2lycV0pIHsNCisJCXByaW50
ayhLRVJOX1dBUk5JTkcgIlJhdGUgbGltaXQgb2YgJWQgaXJxcy9zZWMgZXhj
ZWVkZWQgZm9yIElSUSVkISBUaHJvdHRsaW5nIGlycSBzb3VyY2UuXG4iLCBp
cnFfcmF0ZVtpcnFdLCBpcnEpOw0KKwkJcmF0ZV93YXJuaW5nW2lycV0gPSAw
Ow0KKwl9DQorCWdvdG8gb3V0Ow0KIH0NCiANCiAvKioNCkBAIC04MDksNyAr
ODc4LDcgQEANCiAJICogc29tZXRoaW5nIG1heSBoYXZlIGdlbmVyYXRlZCBh
biBpcnEgbG9uZyBhZ28gYW5kIHdlIHdhbnQgdG8NCiAJICogZmx1c2ggc3Vj
aCBhIGxvbmdzdGFuZGluZyBpcnEgYmVmb3JlIGNvbnNpZGVyaW5nIGl0IGFz
IHNwdXJpb3VzLiANCiAJICovDQotCWZvciAoaSA9IE5SX0lSUVMtMTsgaSA+
IDA7IGktLSkgIHsNCisJZm9yIChpID0gTlJfSVJRUy0xOyBpID4gMDsgaS0t
KSB7DQogCQlkZXNjID0gaXJxX2Rlc2MgKyBpOw0KIA0KIAkJc3Bpbl9sb2Nr
X2lycSgmZGVzYy0+bG9jayk7DQpAQCAtMTAzMCw5ICsxMDk5LDQ5IEBADQog
c3RhdGljIHN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqIHJvb3RfaXJxX2RpcjsN
CiBzdGF0aWMgc3RydWN0IHByb2NfZGlyX2VudHJ5ICogaXJxX2RpciBbTlJf
SVJRU107DQogDQorI2RlZmluZSBERUNfRElHSVRTIDkNCisNCisvKg0KKyAq
IFBhcnNlcyBmcm9tIDAgdG8gOTk5OTk5OTk5LiBNb3JlIHRoYW4gZW5vdWdo
IGZvciBJUlEgcHVycG9zZXMuDQorICovDQorc3RhdGljIHVuc2lnbmVkIGlu
dCBwYXJzZV9kZWNfdmFsdWUoY29uc3QgY2hhciAqYnVmZmVyLA0KKwkJdW5z
aWduZWQgbG9uZyBjb3VudCwgdW5zaWduZWQgbG9uZyAqcmV0KQ0KK3sNCisJ
dW5zaWduZWQgY2hhciBkZWNudW0gW0RFQ19ESUdJVFNdOw0KKwl1bnNpZ25l
ZCBsb25nIHZhbHVlOw0KKwlpbnQgaTsNCisNCisJaWYgKCFjb3VudCkNCisJ
CXJldHVybiAtRUlOVkFMOw0KKwlpZiAoY291bnQgPiBERUNfRElHSVRTKQ0K
KwkJY291bnQgPSBERUNfRElHSVRTOw0KKwlpZiAoY29weV9mcm9tX3VzZXIo
ZGVjbnVtLCBidWZmZXIsIGNvdW50KSkNCisJCXJldHVybiAtRUZBVUxUOw0K
Kw0KKwkvKg0KKwkgKiBQYXJzZSB0aGUgZmlyc3QgOSBjaGFyYWN0ZXJzIGFz
IGEgZGVjaW1hbCBzdHJpbmcsDQorCSAqIGFueSBub24tZGVjaW1hbCBjaGFy
IGlzIGVuZC1vZi1zdHJpbmcuDQorCSAqLw0KKwl2YWx1ZSA9IDA7DQorDQor
CWZvciAoaSA9IDA7IGkgPCBjb3VudDsgaSsrKSB7DQorCQl1bnNpZ25lZCBp
bnQgYyA9IGRlY251bVtpXTsNCisNCisJCXN3aXRjaCAoYykgew0KKwkJCWNh
c2UgJzAnIC4uLiAnOSc6IGMgLT0gJzAnOyBicmVhazsNCisJCWRlZmF1bHQ6
DQorCQkJZ290byBvdXQ7DQorCQl9DQorCQl2YWx1ZSA9IHZhbHVlICogMTAg
KyBjOw0KKwl9DQorb3V0Og0KKwkqcmV0ID0gdmFsdWU7DQorCXJldHVybiAw
Ow0KK30NCisNCiAjZGVmaW5lIEhFWF9ESUdJVFMgOA0KIA0KLXN0YXRpYyB1
bnNpZ25lZCBpbnQgcGFyc2VfaGV4X3ZhbHVlIChjb25zdCBjaGFyICpidWZm
ZXIsDQorc3RhdGljIHVuc2lnbmVkIGludCBwYXJzZV9oZXhfdmFsdWUoY29u
c3QgY2hhciAqYnVmZmVyLA0KIAkJdW5zaWduZWQgbG9uZyBjb3VudCwgdW5z
aWduZWQgbG9uZyAqcmV0KQ0KIHsNCiAJdW5zaWduZWQgY2hhciBoZXhudW0g
W0hFWF9ESUdJVFNdOw0KQEAgLTEwNzEsMTggKzExODAsMTcgQEANCiANCiAj
aWYgQ09ORklHX1NNUA0KIA0KLXN0YXRpYyBzdHJ1Y3QgcHJvY19kaXJfZW50
cnkgKiBzbXBfYWZmaW5pdHlfZW50cnkgW05SX0lSUVNdOw0KLQ0KIHN0YXRp
YyB1bnNpZ25lZCBsb25nIGlycV9hZmZpbml0eSBbTlJfSVJRU10gPSB7IFsw
IC4uLiBOUl9JUlFTLTFdID0gfjBVTCB9Ow0KLXN0YXRpYyBpbnQgaXJxX2Fm
ZmluaXR5X3JlYWRfcHJvYyAoY2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBv
ZmZfdCBvZmYsDQorDQorc3RhdGljIGludCBpcnFfYWZmaW5pdHlfcmVhZF9w
cm9jKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2ZmX3Qgb2ZmLA0KIAkJ
CWludCBjb3VudCwgaW50ICplb2YsIHZvaWQgKmRhdGEpDQogew0KLQlpZiAo
Y291bnQgPCBIRVhfRElHSVRTKzEpDQorCWlmIChjb3VudCA8PSBIRVhfRElH
SVRTKQ0KIAkJcmV0dXJuIC1FSU5WQUw7DQogCXJldHVybiBzcHJpbnRmIChw
YWdlLCAiJTA4bHhcbiIsIGlycV9hZmZpbml0eVsobG9uZylkYXRhXSk7DQog
fQ0KIA0KLXN0YXRpYyBpbnQgaXJxX2FmZmluaXR5X3dyaXRlX3Byb2MgKHN0
cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsDQorc3RhdGlj
IGludCBpcnFfYWZmaW5pdHlfd3JpdGVfcHJvYyhzdHJ1Y3QgZmlsZSAqZmls
ZSwgY29uc3QgY2hhciAqYnVmZmVyLA0KIAkJCQkJdW5zaWduZWQgbG9uZyBj
b3VudCwgdm9pZCAqZGF0YSkNCiB7DQogCWludCBpcnEgPSAobG9uZykgZGF0
YSwgZnVsbF9jb3VudCA9IGNvdW50LCBlcnI7DQpAQCAtMTEwOSwxNiArMTIx
NywxNiBAQA0KIA0KICNlbmRpZg0KIA0KLXN0YXRpYyBpbnQgcHJvZl9jcHVf
bWFza19yZWFkX3Byb2MgKGNoYXIgKnBhZ2UsIGNoYXIgKipzdGFydCwgb2Zm
X3Qgb2ZmLA0KK3N0YXRpYyBpbnQgcHJvZl9jcHVfbWFza19yZWFkX3Byb2Mo
Y2hhciAqcGFnZSwgY2hhciAqKnN0YXJ0LCBvZmZfdCBvZmYsDQogCQkJaW50
IGNvdW50LCBpbnQgKmVvZiwgdm9pZCAqZGF0YSkNCiB7DQogCXVuc2lnbmVk
IGxvbmcgKm1hc2sgPSAodW5zaWduZWQgbG9uZyAqKSBkYXRhOw0KLQlpZiAo
Y291bnQgPCBIRVhfRElHSVRTKzEpDQorCWlmIChjb3VudCA8PSBIRVhfRElH
SVRTKQ0KIAkJcmV0dXJuIC1FSU5WQUw7DQogCXJldHVybiBzcHJpbnRmIChw
YWdlLCAiJTA4bHhcbiIsICptYXNrKTsNCiB9DQogDQotc3RhdGljIGludCBw
cm9mX2NwdV9tYXNrX3dyaXRlX3Byb2MgKHN0cnVjdCBmaWxlICpmaWxlLCBj
b25zdCBjaGFyICpidWZmZXIsDQorc3RhdGljIGludCBwcm9mX2NwdV9tYXNr
X3dyaXRlX3Byb2Moc3RydWN0IGZpbGUgKmZpbGUsIGNvbnN0IGNoYXIgKmJ1
ZmZlciwNCiAJCQkJCXVuc2lnbmVkIGxvbmcgY291bnQsIHZvaWQgKmRhdGEp
DQogew0KIAl1bnNpZ25lZCBsb25nICptYXNrID0gKHVuc2lnbmVkIGxvbmcg
KikgZGF0YSwgZnVsbF9jb3VudCA9IGNvdW50LCBlcnI7DQpAQCAtMTEzMiwx
MCArMTI0MCw0NSBAQA0KIAlyZXR1cm4gZnVsbF9jb3VudDsNCiB9DQogDQor
c3RhdGljIGludCBpcnFfcmF0ZV9yZWFkX3Byb2MoY2hhciAqcGFnZSwgY2hh
ciAqKnN0YXJ0LCBvZmZfdCBvZmYsDQorCQkJaW50IGNvdW50LCBpbnQgKmVv
Ziwgdm9pZCAqZGF0YSkNCit7DQorCWludCBpcnEgPSAoaW50KSBkYXRhOw0K
KwlpZiAoY291bnQgPD0gREVDX0RJR0lUUykNCisJCXJldHVybiAtRUlOVkFM
Ow0KKwlyZXR1cm4gc3ByaW50ZiAocGFnZSwgIiVkXG4iLCBpcnFfcmF0ZVtp
cnFdKTsNCit9DQorDQorc3RhdGljIGludCBpcnFfcmF0ZV93cml0ZV9wcm9j
KHN0cnVjdCBmaWxlICpmaWxlLCBjb25zdCBjaGFyICpidWZmZXIsDQorCQkJ
CQl1bnNpZ25lZCBsb25nIGNvdW50LCB2b2lkICpkYXRhKQ0KK3sNCisJaW50
IGlycSA9IChpbnQpIGRhdGE7DQorCXVuc2lnbmVkIGxvbmcgZnVsbF9jb3Vu
dCA9IGNvdW50LCBlcnI7DQorCXVuc2lnbmVkIGxvbmcgbmV3X3ZhbHVlOw0K
Kw0KKwkvKiBkbyBub3QgYWxsb3cgdGhlIHRpbWVyIGludGVycnVwdCB0byBi
ZSByYXRlLWxpbWl0ZWQgLi4uIDotfCAqLw0KKwlpZiAoIWlycSkNCisJCXJl
dHVybiAtRUlOVkFMOw0KKwllcnIgPSBwYXJzZV9kZWNfdmFsdWUoYnVmZmVy
LCBjb3VudCwgJm5ld192YWx1ZSk7DQorCWlmIChlcnIpDQorCQlyZXR1cm4g
ZXJyOw0KKw0KKwkvKg0KKwkgKiBEbyBub3QgYWxsb3cgYSBmcmVxdWVuY3kg
dG8gYmUgbG93ZXIgdGhhbiAxIGludGVycnVwdA0KKwkgKiBwZXIgamlmZnku
DQorCSAqLw0KKwlpZiAoIW5ld192YWx1ZSkNCisJCXJldHVybiAtRUlOVkFM
Ow0KKw0KKwlzZXRfaXJxX3JhdGUoaXJxLCBuZXdfdmFsdWUpOw0KKwlyZXR1
cm4gZnVsbF9jb3VudDsNCit9DQorDQogI2RlZmluZSBNQVhfTkFNRUxFTiAx
MA0KIA0KLXN0YXRpYyB2b2lkIHJlZ2lzdGVyX2lycV9wcm9jICh1bnNpZ25l
ZCBpbnQgaXJxKQ0KK3N0YXRpYyB2b2lkIHJlZ2lzdGVyX2lycV9wcm9jKHVu
c2lnbmVkIGludCBpcnEpDQogew0KKwlzdHJ1Y3QgcHJvY19kaXJfZW50cnkg
KmVudHJ5Ow0KIAljaGFyIG5hbWUgW01BWF9OQU1FTEVOXTsNCiANCiAJaWYg
KCFyb290X2lycV9kaXIgfHwgKGlycV9kZXNjW2lycV0uaGFuZGxlciA9PSAm
bm9faXJxX3R5cGUpIHx8DQpAQCAtMTE0OCwyOCArMTI5MSwzMiBAQA0KIAkv
KiBjcmVhdGUgL3Byb2MvaXJxLzEyMzQgKi8NCiAJaXJxX2RpcltpcnFdID0g
cHJvY19ta2RpcihuYW1lLCByb290X2lycV9kaXIpOw0KIA0KLSNpZiBDT05G
SUdfU01QDQotCXsNCi0JCXN0cnVjdCBwcm9jX2Rpcl9lbnRyeSAqZW50cnk7
DQorCS8qIGNyZWF0ZSAvcHJvYy9pcnEvMTIzNC9tYXhfcmF0ZSAqLw0KKwll
bnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJtYXhfcmF0ZSIsIDA2MDAsIGly
cV9kaXJbaXJxXSk7DQogDQotCQkvKiBjcmVhdGUgL3Byb2MvaXJxLzEyMzQv
c21wX2FmZmluaXR5ICovDQotCQllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5
KCJzbXBfYWZmaW5pdHkiLCAwNjAwLCBpcnFfZGlyW2lycV0pOw0KKwlpZiAo
ZW50cnkpIHsNCisJCWVudHJ5LT5ubGluayA9IDE7DQorCQllbnRyeS0+ZGF0
YSA9ICh2b2lkICopaXJxOw0KKwkJZW50cnktPnJlYWRfcHJvYyA9IGlycV9y
YXRlX3JlYWRfcHJvYzsNCisJCWVudHJ5LT53cml0ZV9wcm9jID0gaXJxX3Jh
dGVfd3JpdGVfcHJvYzsNCisJfQ0KIA0KLQkJaWYgKGVudHJ5KSB7DQotCQkJ
ZW50cnktPm5saW5rID0gMTsNCi0JCQllbnRyeS0+ZGF0YSA9ICh2b2lkICop
KGxvbmcpaXJxOw0KLQkJCWVudHJ5LT5yZWFkX3Byb2MgPSBpcnFfYWZmaW5p
dHlfcmVhZF9wcm9jOw0KLQkJCWVudHJ5LT53cml0ZV9wcm9jID0gaXJxX2Fm
ZmluaXR5X3dyaXRlX3Byb2M7DQotCQl9DQorI2lmIENPTkZJR19TTVANCisJ
LyogY3JlYXRlIC9wcm9jL2lycS8xMjM0L3NtcF9hZmZpbml0eSAqLw0KKwll
bnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJzbXBfYWZmaW5pdHkiLCAwNjAw
LCBpcnFfZGlyW2lycV0pOw0KIA0KLQkJc21wX2FmZmluaXR5X2VudHJ5W2ly
cV0gPSBlbnRyeTsNCisJaWYgKGVudHJ5KSB7DQorCQllbnRyeS0+bmxpbmsg
PSAxOw0KKwkJZW50cnktPmRhdGEgPSAodm9pZCAqKShsb25nKWlycTsNCisJ
CWVudHJ5LT5yZWFkX3Byb2MgPSBpcnFfYWZmaW5pdHlfcmVhZF9wcm9jOw0K
KwkJZW50cnktPndyaXRlX3Byb2MgPSBpcnFfYWZmaW5pdHlfd3JpdGVfcHJv
YzsNCiAJfQ0KICNlbmRpZg0KIH0NCiANCiB1bnNpZ25lZCBsb25nIHByb2Zf
Y3B1X21hc2sgPSAtMTsNCiANCi12b2lkIGluaXRfaXJxX3Byb2MgKHZvaWQp
DQordm9pZCBpbml0X2lycV9wcm9jKHZvaWQpDQogew0KIAlzdHJ1Y3QgcHJv
Y19kaXJfZW50cnkgKmVudHJ5Ow0KIAlpbnQgaTsNCkBAIC0xMTgxLDcgKzEz
MjgsNyBAQA0KIAllbnRyeSA9IGNyZWF0ZV9wcm9jX2VudHJ5KCJwcm9mX2Nw
dV9tYXNrIiwgMDYwMCwgcm9vdF9pcnFfZGlyKTsNCiANCiAJaWYgKCFlbnRy
eSkNCi0JICAgIHJldHVybjsNCisJCXJldHVybjsNCiANCiAJZW50cnktPm5s
aW5rID0gMTsNCiAJZW50cnktPmRhdGEgPSAodm9pZCAqKSZwcm9mX2NwdV9t
YXNrOw0K
--8323328-1385438795-1001973739=:3759--
-
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/