[patch] QNX-style scheduling for Linux 2.0

Adam McKee (amckee@poboxes.com)
Sat, 26 Jul 1997 00:45:18 -0600 (CST)


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.

--12583424-762705930-869899518=:1352
Content-Type: TEXT/PLAIN; charset=US-ASCII

QNX-style Scheduling v1.00 for Linux 2.0

by

Adam McKee

INTRODUCTION

This patch provides QNX-style scheduling for Linux 2.0. The intent is to
provide more flexible and powerful scheduling, and to provide improved
interactive performance under heavy CPU load. This scheduler does not provide
increased throughput however. In fact, there is a very small price to pay in
terms of throughput in order to achieve the aforementioned goals. So that you
can appreciate exactly what the patch does, I will give a (oversimplified)
explanation of how scheduling is normally done under Linux 2.0, followed by a
description of the QNX scheduler (as implemented). If you use this patch, you
will need to re-think how you re-nice tasks, so a brief discussion of
re-nicing tasks is given.

NORMAL SCHEDULING UNDER LINUX 2.0

There is a single run-queue. Each task may be assigned a priority or
"niceness" which will determine how long a timeslice it gets. For example, if
you give a task a niceness of -20, the kernel will not directly use the -20.
but will instead use this number to determine how long/often the task should
be allowed to run. The "counter" attribute of each task determines how much
time it has left in its timeslice. After every task on the run-queue has used
up its timeslice (counter = 0), the counter for each task is reset to the
original priority. This scheduler has some nice properties:

o It obeys the KISS principle (Keep It Simple, Stupid!). There is
always a danger that trying to get "too clever" will introduce
unexpected problems.

o It guarantees that no task will starve.

o It allows the user to have some control over the scheduling.

Some drawbacks:

o Interactive performance under heavy CPU load is not good.

o Limited control over scheduling -- for example, it is not possible
to tell the scheduler to *never* run a particular task unless
*nothing* else wants to run ("idle-eating task"). Those of you who
have been participating in the RC5 contest can appreciate the need
for something like this :-)

THE QNX SCHEDULER

My understanding of the QNX scheduler is based entirely on a short blurb I
read about it, so I would not be surprised to find that the following
discussion contains errors and/or omissions. However, please do read
on... :-)

There are 32 separate run-queues, numbered 0-31. When the scheduler is
looking for a task to run, it will select a task from the lowest-numbered
run-queue that has a runnable task on it. This means that, for example, a
task on run-queue 1 will *not* run until there are no task on run-queue 0 that
want to run. The init task has a minimum run-queue of 10. Newly created
tasks inherit their minimum run-queue from their parent.

Three scheduling policies are supported:

--- FIFO

The selected task will run until:

o it blocks
-OR-
o a task on a lower-numbered run-queue wants to run

--- Round-Robin

The selected task will run until:

o it blocks
-OR-
o a task on a lower-numbered run-queue wants to run
-OR
o 50ms have passed

--- Adaptive

This is the default policy, and the most interesting policy. Adaptive
scheduling is like Round-Robin, but it also tries to "intelligently" move
tasks between run-queues in order to provide good interactive response.
Here are the rules for adaptive scheduling:

o Each task has a 'minimum run-queue' attribute that tells the
scheduler the lowest-numbered run-queue the task can be on.
"Normal" tasks have minimum run-queue = 10.

o When a task is initially started, it is placed on its minimum
run-queue.

o If a task blocks (does not use all of its timeslice), it will
be placed on its minimum run-queue when it becomes runnable again.

o If a task uses up all of its timeslice, and there is at least one
other task on the same run-queue that wants to run, its run-queue
will be incremented ("demotion").

o If a task has been starving for one second, and its current run-queue
is greater than its minimum run-queue, its run-queue will be
decremented ("promotion").

The result of applying these rules is that tasks with heavy CPU requirements
will tend to migrate to higher-numbered run-queues, whereas tasks with light
CPU requirements will tend to stay on lower-numbered run-queues. This is
*good* for interactive performance!

RE-NICING OF TASKS WITH QNX SCHEDULING

When you re-nice a task, you are actually changing its minimum run-queue. For
example, if you give your X-server a niceness of -20, you are actually setting
its minimum run-queue to 0. If you give it a niceness of 20, you are setting
its minimum run-queue to 31. The priority of a task is its *current*
run-queue (which may be larger than its minimum run-queue in the case of an
adaptively scheduled task).

You must take care when re-nicing tasks. Unlike the normal Linux scheduler,
the QNX scheduler does not guarantee tasks will not starve. When you re-nice
a task, you may create one of the following problems:

o The task hogs the CPU, and starves out other tasks (in the case of
a negative niceness).

o The task is starved out by higher-priority tasks (in the case of a
positive niceness).

Here are a few general tips for re-nicing tasks:

o On a machine whose primary function is web-serving or news-serving,
you may want to give the httpd or innd task a negative niceness.
Other tasks would then only be allowed to consume "left-over" CPU
time.

o It's probably a good idea to give your X-server a negative niceness.
Interactive performance will likely benefit from this.

o When starting a CPU-intensive job that may take awhile to complete,
you may want to give it a positive niceness to ensure the absolute
minimum impact on interactive performance. When compiling a kernel,
you might do 'nice make zlilo' -- users of the system would probably
not even notice any slowdown!

o It's almost never a good idea to give a totally CPU-intensive task
a negative niceness. Doing this with the normal Linux scheduler
can result in a sluggish system -- with this scheduler it can result
in an *unusable* system.

In general, don't re-nice a task unless you understand how the scheduler
works, and you can really convince yourself that it's a good idea.

CONCLUSION

Please let me know how well this patch works for you. I am particularly
interested to hear from SMP users, as I do not have SMP myself and the patch
is currently *untested* with SMP. Also, if you find my implementation of QNX
scheduling is incorrect or incomplete, I would be very glad to hear from you.

Happy task-switching 8)

-- Adam McKee <amckee@poboxes.com>

--12583424-762705930-869899518=:1352
Content-Type: TEXT/PLAIN; charset=US-ASCII; name="QNX-scheduler-2.0.30-1.patch"
Content-Transfer-Encoding: BASE64
Content-ID: <Pine.LNX.3.95.970726004518.1352D@titan.acua.org>
Content-Description:

LS0tIGxpbnV4L2ZzL3Byb2MvYXJyYXkuYy5vcmlnCVdlZCBKdWwgMjMgMjM6
MTM6NDMgMTk5Nw0KKysrIGxpbnV4L2ZzL3Byb2MvYXJyYXkuYwlUaHUgSnVs
IDI0IDA0OjA3OjE2IDE5OTcNCkBAIC02ODIsMTIgKzY4MiwzNCBAQA0KIAll
bHNlDQogCQl0dHlfcGdycCA9IC0xOw0KIA0KLQkvKiBzY2FsZSBwcmlvcml0
eSBhbmQgbmljZSB2YWx1ZXMgZnJvbSB0aW1lc2xpY2VzIHRvIC0yMC4uMjAg
Ki8NCisJLyogc2NhbGUgcHJpb3JpdHkgYW5kIG5pY2UgdmFsdWVzIGZyb20g
cnVuLXF1ZXVlICMgdG8gLTIwLi4yMCAqLw0KIAkvKiB0byBtYWtlIGl0IGxv
b2sgbGlrZSBhICJub3JtYWwiIHVuaXggcHJpb3JpdHkvbmljZSB2YWx1ZSAg
Ki8NCi0JcHJpb3JpdHkgPSB0c2stPmNvdW50ZXI7DQotCXByaW9yaXR5ID0g
MjAgLSAocHJpb3JpdHkgKiAxMCArIERFRl9QUklPUklUWSAvIDIpIC8gREVG
X1BSSU9SSVRZOw0KLQluaWNlID0gdHNrLT5wcmlvcml0eTsNCi0JbmljZSA9
IDIwIC0gKG5pY2UgKiAyMCArIERFRl9QUklPUklUWSAvIDIpIC8gREVGX1BS
SU9SSVRZOw0KKwlwcmlvcml0eSA9IHRzay0+cnVuX3E7DQorCWlmIChwcmlv
cml0eSA8IERFRl9SVU5fUVVFVUUpIHsNCisJICAgICAgICBwcmlvcml0eSAq
PSAxOTsNCisJCXByaW9yaXR5IC89IChERUZfUlVOX1FVRVVFIC0gMSk7DQor
CQlwcmlvcml0eSA9IC0yMCArIHByaW9yaXR5Ow0KKwl9IGVsc2UgaWYgKHBy
aW9yaXR5ID09IERFRl9SVU5fUVVFVUUpIHsNCisJICAgICAgICBwcmlvcml0
eSA9IDA7DQorCX0gZWxzZSB7DQorCSAgICAgICAgcHJpb3JpdHkgLT0gKERF
Rl9SVU5fUVVFVUUgKyAxKTsNCisJCXByaW9yaXR5ICo9IDE5Ow0KKwkJcHJp
b3JpdHkgLz0gKE5SX1JVTl9RVUVVRVMgLSBERUZfUlVOX1FVRVVFIC0gMik7
DQorCQlwcmlvcml0eSArPSAxOw0KKwl9DQorCW5pY2UgPSB0c2stPnJ1bl9x
X21pbjsNCisJaWYgKG5pY2UgPCBERUZfUlVOX1FVRVVFKSB7DQorCSAgICAg
ICAgbmljZSAqPSAxOTsNCisJCW5pY2UgLz0gKERFRl9SVU5fUVVFVUUgLSAx
KTsNCisJCW5pY2UgPSAtMjAgKyBuaWNlOw0KKwl9IGVsc2UgaWYgKG5pY2Ug
PT0gREVGX1JVTl9RVUVVRSkgew0KKwkgICAgICAgIG5pY2UgPSAwOw0KKwl9
IGVsc2Ugew0KKwkgICAgICAgIG5pY2UgLT0gKERFRl9SVU5fUVVFVUUgKyAx
KTsNCisJCW5pY2UgKj0gMTk7DQorCQluaWNlIC89IChOUl9SVU5fUVVFVUVT
IC0gREVGX1JVTl9RVUVVRSAtIDIpOw0KKwkJbmljZSArPSAxOw0KKwl9DQog
DQogCXJldHVybiBzcHJpbnRmKGJ1ZmZlciwiJWQgKCVzKSAlYyAlZCAlZCAl
ZCAlZCAlZCAlbHUgJWx1IFwNCiAlbHUgJWx1ICVsdSAlbHUgJWx1ICVsZCAl
bGQgJWxkICVsZCAlbGQgJWxkICVsdSAlbHUgJWxkICVsdSAlbHUgJWx1ICVs
dSAlbHUgXA0KLS0tIGxpbnV4L2tlcm5lbC9zeXMuYy5vcmlnCVdlZCBKdWwg
MjMgMjE6NTU6NDUgMTk5Nw0KKysrIGxpbnV4L2tlcm5lbC9zeXMuYwlUaHUg
SnVsIDI0IDE4OjM1OjA3IDE5OTcNCkBAIC02NywyMyArNjcsMjUgQEANCiB7
DQogCXN0cnVjdCB0YXNrX3N0cnVjdCAqcDsNCiAJaW50IGVycm9yID0gRVNS
Q0g7DQotCXVuc2lnbmVkIGludCBwcmlvcml0eTsNCisJdW5zaWduZWQgaW50
IHJ1bl9xOw0KIA0KIAlpZiAod2hpY2ggPiAyIHx8IHdoaWNoIDwgMCkNCiAJ
CXJldHVybiAtRUlOVkFMOw0KIA0KLQkvKiBub3JtYWxpemU6IGF2b2lkIHNp
Z25lZCBkaXZpc2lvbiAocm91bmRpbmcgcHJvYmxlbXMpICovDQotCXByaW9y
aXR5ID0gbmljZXZhbDsNCi0JaWYgKG5pY2V2YWwgPCAwKQ0KLQkJcHJpb3Jp
dHkgPSAtbmljZXZhbDsNCi0JaWYgKHByaW9yaXR5ID4gMjApDQotCQlwcmlv
cml0eSA9IDIwOw0KLQlwcmlvcml0eSA9IChwcmlvcml0eSAqIERFRl9QUklP
UklUWSArIDEwKSAvIDIwICsgREVGX1BSSU9SSVRZOw0KLQ0KLQlpZiAobmlj
ZXZhbCA+PSAwKSB7DQotCQlwcmlvcml0eSA9IDIqREVGX1BSSU9SSVRZIC0g
cHJpb3JpdHk7DQotCQlpZiAoIXByaW9yaXR5KQ0KLQkJCXByaW9yaXR5ID0g
MTsNCisJaWYgKG5pY2V2YWwgPCAtMjApIG5pY2V2YWwgPSAtMjA7DQorCWVs
c2UgaWYgKG5pY2V2YWwgPiAyMCkgbmljZXZhbCA9IDIwOw0KKwlpZiAobmlj
ZXZhbCA8IDApIHsNCisJICBydW5fcSA9IC1uaWNldmFsIC0gMTsNCisJICBy
dW5fcSAqPSAoREVGX1JVTl9RVUVVRSAtIDEpOw0KKwkgIHJ1bl9xIC89IDE5
OyANCisJICBydW5fcSA9IERFRl9SVU5fUVVFVUUgLSAxIC0gcnVuX3E7DQor
CX0gZWxzZSBpZiAoIW5pY2V2YWwpIHsNCisJICBydW5fcSA9IERFRl9SVU5f
UVVFVUU7DQorCX0gZWxzZSB7DQorCSAgcnVuX3EgPSBuaWNldmFsIC0gMTsN
CisJICBydW5fcSAqPSAoTlJfUlVOX1FVRVVFUyAtIERFRl9SVU5fUVVFVUUg
LSAyKTsNCisJICBydW5fcSAvPSAxOTsNCisJICBydW5fcSA9IERFRl9SVU5f
UVVFVUUgKyAxICsgcnVuX3E7DQogCX0NCiANCiAJZm9yX2VhY2hfdGFzayhw
KSB7DQpAQCAtOTYsMTAgKzk4LDEwIEBADQogCQl9DQogCQlpZiAoZXJyb3Ig
PT0gRVNSQ0gpDQogCQkJZXJyb3IgPSAwOw0KLQkJaWYgKHByaW9yaXR5ID4g
cC0+cHJpb3JpdHkgJiYgIXN1c2VyKCkpDQotCQkJZXJyb3IgPSBFQUNDRVM7
DQorCQlpZiAocnVuX3EgPCBwLT5ydW5fcV9taW4gJiYgIXN1c2VyKCkpDQor
CQkgICAgICAgIGVycm9yID0gRUFDQ0VTOw0KIAkJZWxzZQ0KLQkJCXAtPnBy
aW9yaXR5ID0gcHJpb3JpdHk7DQorCQkgICAgICAgIHAtPnJ1bl9xX3N3ID0g
cnVuX3E7DQogCX0NCiAJcmV0dXJuIC1lcnJvcjsNCiB9DQpAQCAtMTEyLDcg
KzExNCw3IEBADQogYXNtbGlua2FnZSBpbnQgc3lzX2dldHByaW9yaXR5KGlu
dCB3aGljaCwgaW50IHdobykNCiB7DQogCXN0cnVjdCB0YXNrX3N0cnVjdCAq
cDsNCi0JbG9uZyBtYXhfcHJpbyA9IC1FU1JDSDsNCisJdW5zaWduZWQgaW50
IHJ1bl9xX21pbiA9IE5SX1JVTl9RVUVVRVM7DQogDQogCWlmICh3aGljaCA+
IDIgfHwgd2hpY2ggPCAwKQ0KIAkJcmV0dXJuIC1FSU5WQUw7DQpAQCAtMTIw
LDE0ICsxMjIsMjcgQEANCiAJZm9yX2VhY2hfdGFzayAocCkgew0KIAkJaWYg
KCFwcm9jX3NlbChwLCB3aGljaCwgd2hvKSkNCiAJCQljb250aW51ZTsNCi0J
CWlmIChwLT5wcmlvcml0eSA+IG1heF9wcmlvKQ0KLQkJCW1heF9wcmlvID0g
cC0+cHJpb3JpdHk7DQorCQlpZiAocC0+cnVuX3FfbWluIDwgcnVuX3FfbWlu
KQ0KKwkJCXJ1bl9xX21pbiA9IHAtPnJ1bl9xX21pbjsNCiAJfQ0KIA0KLQkv
KiBzY2FsZSB0aGUgcHJpb3JpdHkgZnJvbSB0aW1lc2xpY2UgdG8gMC4uNDAg
Ki8NCi0JaWYgKG1heF9wcmlvID4gMCkNCi0JCW1heF9wcmlvID0gKG1heF9w
cmlvICogMjAgKyBERUZfUFJJT1JJVFkvMikgLyBERUZfUFJJT1JJVFk7DQot
CXJldHVybiBtYXhfcHJpbzsNCisgICAgICAgIGlmIChydW5fcV9taW4gPT0g
TlJfUlVOX1FVRVVFUykNCisgICAgICAgICAgICAgICAgcmV0dXJuIC1FU1JD
SDsNCisNCisJLyogc2NhbGUgdGhlIHJ1bl9xIHRvIDAuLjQwICovDQorCWlm
IChydW5fcV9taW4gPCBERUZfUlVOX1FVRVVFKSB7DQorCSAgICAgICAgcnVu
X3FfbWluICo9IDE5Ow0KKwkJcnVuX3FfbWluIC89IChERUZfUlVOX1FVRVVF
IC0gMSk7DQorCX0gZWxzZSBpZiAocnVuX3FfbWluID09IERFRl9SVU5fUVVF
VUUpIHsNCisJICAgICAgICBydW5fcV9taW4gPSAyMDsNCisJfSBlbHNlIHsN
CisJICAgICAgICBydW5fcV9taW4gLT0gKERFRl9SVU5fUVVFVUUgKyAxKTsN
CisJCXJ1bl9xX21pbiAqPSAxOTsNCisJCXJ1bl9xX21pbiAvPSAoTlJfUlVO
X1FVRVVFUyAtIERFRl9SVU5fUVVFVUUgLSAyKTsNCisJCXJ1bl9xX21pbiAr
PSAyMTsNCisJfQ0KKyAgICAgICAgcnVuX3FfbWluID0gNDAgLSBydW5fcV9t
aW47DQorCXJldHVybiBydW5fcV9taW47DQogfQ0KIA0KICNpZm5kZWYgX19h
bHBoYV9fDQotLS0gbGludXgva2VybmVsL3NjaGVkLmMub3JpZwlXZWQgSnVs
IDIzIDIxOjU1OjQ1IDE5OTcNCisrKyBsaW51eC9rZXJuZWwvc2NoZWQuYwlU
aHUgSnVsIDI0IDA0OjI0OjA4IDE5OTcNCkBAIC05Miw2ICs5Miw3IEBADQog
c3RhdGljIHN0cnVjdCBmc19zdHJ1Y3QgaW5pdF9mcyA9IElOSVRfRlM7DQog
c3RhdGljIHN0cnVjdCBmaWxlc19zdHJ1Y3QgaW5pdF9maWxlcyA9IElOSVRf
RklMRVM7DQogc3RhdGljIHN0cnVjdCBzaWduYWxfc3RydWN0IGluaXRfc2ln
bmFscyA9IElOSVRfU0lHTkFMUzsNCitzdGF0aWMgc3RydWN0IHRhc2tfc3Ry
dWN0ICogcnVuX3FbTlJfUlVOX1FVRVVFU107DQogDQogc3RydWN0IG1tX3N0
cnVjdCBpbml0X21tID0gSU5JVF9NTTsNCiBzdHJ1Y3QgdGFza19zdHJ1Y3Qg
aW5pdF90YXNrID0gSU5JVF9UQVNLOw0KQEAgLTEwNyw2ICsxMDgsNyBAQA0K
IA0KIHN0YXRpYyBpbmxpbmUgdm9pZCBhZGRfdG9fcnVucXVldWUoc3RydWN0
IHRhc2tfc3RydWN0ICogcCkNCiB7DQorICAgICAgICBzdHJ1Y3QgdGFza19z
dHJ1Y3QgKnFfaGVhZCA9IHJ1bl9xW3AtPnJ1bl9xXTsNCiAjaWZkZWYgX19T
TVBfXw0KIAlpbnQgY3B1PXNtcF9wcm9jZXNzb3JfaWQoKTsNCiAjZW5kaWYJ
DQpAQCAtMTE2LDEyICsxMTgsMjIgQEANCiAJCXJldHVybjsNCiAJfQ0KICNl
bmRpZg0KLQlpZiAocC0+Y291bnRlciA+IGN1cnJlbnQtPmNvdW50ZXIgKyAz
KQ0KKwlpZiAocC0+cnVuX3EgPCBjdXJyZW50LT5ydW5fcSkNCiAJCW5lZWRf
cmVzY2hlZCA9IDE7DQogCW5yX3J1bm5pbmcrKzsNCi0JKHAtPnByZXZfcnVu
ID0gaW5pdF90YXNrLnByZXZfcnVuKS0+bmV4dF9ydW4gPSBwOw0KLQlwLT5u
ZXh0X3J1biA9ICZpbml0X3Rhc2s7DQotCWluaXRfdGFzay5wcmV2X3J1biA9
IHA7DQorDQorCWlmIChxX2hlYWQgPT0gTlVMTCkgew0KKwkgIHJ1bl9xW3At
PnJ1bl9xXSA9IHA7DQorCSAgcC0+cHJldl9ydW4gPSBwOw0KKwkgIHAtPm5l
eHRfcnVuID0gcDsNCisJfSBlbHNlIHsNCisJICBwLT5wcmV2X3J1biA9IHFf
aGVhZC0+cHJldl9ydW47DQorCSAgcC0+bmV4dF9ydW4gPSBxX2hlYWQ7DQor
CSAgcV9oZWFkLT5wcmV2X3J1bi0+bmV4dF9ydW4gPSBwOw0KKwkgIHFfaGVh
ZC0+cHJldl9ydW4gPSBwOw0KKwl9DQorCXAtPmxhc3RfcnVuID0gamlmZmll
czsNCisNCiAjaWZkZWYgX19TTVBfXw0KIAkvKiB0aGlzIGlzIHNhZmUgb25s
eSBpZiBjYWxsZWQgd2l0aCBjbGkoKSovDQogCXdoaWxlKHNldF9iaXQoMzEs
JnNtcF9wcm9jZXNzX2F2YWlsYWJsZSkpDQpAQCAtMTU0LDggKzE2Niw5IEBA
DQogDQogc3RhdGljIGlubGluZSB2b2lkIGRlbF9mcm9tX3J1bnF1ZXVlKHN0
cnVjdCB0YXNrX3N0cnVjdCAqIHApDQogew0KLQlzdHJ1Y3QgdGFza19zdHJ1
Y3QgKm5leHQgPSBwLT5uZXh0X3J1bjsNCiAJc3RydWN0IHRhc2tfc3RydWN0
ICpwcmV2ID0gcC0+cHJldl9ydW47DQorCXN0cnVjdCB0YXNrX3N0cnVjdCAq
bmV4dCA9IHAtPm5leHRfcnVuOw0KKwlzdHJ1Y3QgdGFza19zdHJ1Y3QgKnFf
aGVhZCA9IHJ1bl9xW3AtPnJ1bl9xXTsNCiANCiAjaWYgMQkvKiBzYW5pdHkg
dGVzdHMgKi8NCiAJaWYgKCFuZXh0IHx8ICFwcmV2KSB7DQpAQCAtMTcyLDI2
ICsxODUsMjAgQEANCiAJCXJldHVybjsNCiAJfQ0KIAlucl9ydW5uaW5nLS07
DQotCW5leHQtPnByZXZfcnVuID0gcHJldjsNCi0JcHJldi0+bmV4dF9ydW4g
PSBuZXh0Ow0KLQlwLT5uZXh0X3J1biA9IE5VTEw7DQotCXAtPnByZXZfcnVu
ID0gTlVMTDsNCi19DQotDQotc3RhdGljIGlubGluZSB2b2lkIG1vdmVfbGFz
dF9ydW5xdWV1ZShzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwKQ0KLXsNCi0Jc3Ry
dWN0IHRhc2tfc3RydWN0ICpuZXh0ID0gcC0+bmV4dF9ydW47DQotCXN0cnVj
dCB0YXNrX3N0cnVjdCAqcHJldiA9IHAtPnByZXZfcnVuOw0KIA0KLQkvKiBy
ZW1vdmUgZnJvbSBsaXN0ICovDQotCW5leHQtPnByZXZfcnVuID0gcHJldjsN
CisJLyogcmVtb3ZlIGxpbmtzIHRvIHAgKi8NCiAJcHJldi0+bmV4dF9ydW4g
PSBuZXh0Ow0KLQkvKiBhZGQgYmFjayB0byBsaXN0ICovDQotCXAtPm5leHRf
cnVuID0gJmluaXRfdGFzazsNCi0JcHJldiA9IGluaXRfdGFzay5wcmV2X3J1
bjsNCi0JaW5pdF90YXNrLnByZXZfcnVuID0gcDsNCi0JcC0+cHJldl9ydW4g
PSBwcmV2Ow0KLQlwcmV2LT5uZXh0X3J1biA9IHA7DQorCW5leHQtPnByZXZf
cnVuID0gcHJldjsNCisJLyogc2V0IHAncyBsaW5rcyAqLw0KKwlwLT5wcmV2
X3J1biA9IE5VTEw7DQorCXAtPm5leHRfcnVuID0gTlVMTDsNCisgICAgICAg
CS8qIGlmIHAgd2FzIHRoZSBxX2hlYWQsIHJlc2V0IHFfaGVhZCAqLw0KKwlp
ZiAocCA9PSBxX2hlYWQpIHsNCisJICAgICAgICBpZiAobmV4dCA9PSBwKQ0K
KwkgICAgICAgICAgICAgICAgcnVuX3FbcC0+cnVuX3FdID0gTlVMTDsNCisJ
CWVsc2UNCisJCSAgICAgICAgcnVuX3FbcC0+cnVuX3FdID0gbmV4dDsNCisJ
fQ0KIH0NCiANCiAvKg0KQEAgLTIwNCw3ICsyMTEsNyBAQA0KICAqLw0KIGlu
bGluZSB2b2lkIHdha2VfdXBfcHJvY2VzcyhzdHJ1Y3QgdGFza19zdHJ1Y3Qg
KiBwKQ0KIHsNCi0JdW5zaWduZWQgbG9uZyBmbGFnczsNCisgICAgICAgIHVu
c2lnbmVkIGxvbmcgZmxhZ3M7DQogDQogCXNhdmVfZmxhZ3MoZmxhZ3MpOw0K
IAljbGkoKTsNCkBAIC0yMjIsODcgKzIyOSwzNyBAQA0KIAl3YWtlX3VwX3By
b2Nlc3MocCk7DQogfQ0KIA0KLS8qDQotICogVGhpcyBpcyB0aGUgZnVuY3Rp
b24gdGhhdCBkZWNpZGVzIGhvdyBkZXNpcmFibGUgYSBwcm9jZXNzIGlzLi4N
Ci0gKiBZb3UgY2FuIHdlaWdoIGRpZmZlcmVudCBwcm9jZXNzZXMgYWdhaW5z
dCBlYWNoIG90aGVyIGRlcGVuZGluZw0KLSAqIG9uIHdoYXQgQ1BVIHRoZXkn
dmUgcnVuIG9uIGxhdGVseSBldGMgdG8gdHJ5IHRvIGhhbmRsZSBjYWNoZQ0K
LSAqIGFuZCBUTEIgbWlzcyBwZW5hbHRpZXMuDQotICoNCi0gKiBSZXR1cm4g
dmFsdWVzOg0KLSAqCSAtMTAwMDogbmV2ZXIgc2VsZWN0IHRoaXMNCi0gKgkg
ICAgIDA6IG91dCBvZiB0aW1lLCByZWNhbGN1bGF0ZSBjb3VudGVycyAoYnV0
IGl0IG1pZ2h0IHN0aWxsIGJlDQotICoJCXNlbGVjdGVkKQ0KLSAqCSAgICt2
ZTogImdvb2RuZXNzIiB2YWx1ZSAodGhlIGxhcmdlciwgdGhlIGJldHRlcikN
Ci0gKgkgKzEwMDA6IHJlYWx0aW1lIHByb2Nlc3MsIHNlbGVjdCB0aGlzLg0K
LSAqLw0KLXN0YXRpYyBpbmxpbmUgaW50IGdvb2RuZXNzKHN0cnVjdCB0YXNr
X3N0cnVjdCAqIHAsIHN0cnVjdCB0YXNrX3N0cnVjdCAqIHByZXYsIGludCB0
aGlzX2NwdSkNCitzdGF0aWMgaW5saW5lIGludCBydW5uYWJsZShzdHJ1Y3Qg
dGFza19zdHJ1Y3QgKiBwLCBpbnQgdGhpc19jcHUpDQogew0KLQlpbnQgd2Vp
Z2h0Ow0KLQ0KICNpZmRlZiBfX1NNUF9fCQ0KIAkvKiBXZSBhcmUgbm90IHBl
cm1pdHRlZCB0byBydW4gYSB0YXNrIHNvbWVvbmUgZWxzZSBpcyBydW5uaW5n
ICovDQogCWlmIChwLT5wcm9jZXNzb3IgIT0gTk9fUFJPQ19JRCkNCi0JCXJl
dHVybiAtMTAwMDsNCisJICAgICAgICByZXR1cm4gMDsNCiAjaWZkZWYgUEFT
VF8yXzAJCQ0KIAkvKiBUaGlzIHByb2Nlc3MgaXMgbG9ja2VkIHRvIGEgcHJv
Y2Vzc29yIGdyb3VwICovDQotCWlmIChwLT5wcm9jZXNzb3JfbWFzayAmJiAh
KHAtPnByb2Nlc3Nvcl9tYXNrICYgKDE8PHRoaXNfY3B1KSkNCi0JCXJldHVy
biAtMTAwMDsNCi0jZW5kaWYJCQ0KKwlpZiAocC0+cHJvY2Vzc29yX21hc2sg
JiYgIShwLT5wcm9jZXNzb3JfbWFzayAmICgxPDx0aGlzX2NwdSkpKQ0KKwkJ
cmV0dXJuIDA7DQogI2VuZGlmDQotDQotCS8qDQotCSAqIFJlYWx0aW1lIHBy
b2Nlc3MsIHNlbGVjdCB0aGUgZmlyc3Qgb25lIG9uIHRoZQ0KLQkgKiBydW5x
dWV1ZSAodGFraW5nIHByaW9yaXRpZXMgd2l0aGluIHByb2Nlc3Nlcw0KLQkg
KiBpbnRvIGFjY291bnQpLg0KLQkgKi8NCi0JaWYgKHAtPnBvbGljeSAhPSBT
Q0hFRF9PVEhFUikNCi0JCXJldHVybiAxMDAwICsgcC0+cnRfcHJpb3JpdHk7
DQotDQotCS8qDQotCSAqIEdpdmUgdGhlIHByb2Nlc3MgYSBmaXJzdC1hcHBy
b3hpbWF0aW9uIGdvb2RuZXNzIHZhbHVlDQotCSAqIGFjY29yZGluZyB0byB0
aGUgbnVtYmVyIG9mIGNsb2NrLXRpY2tzIGl0IGhhcyBsZWZ0Lg0KLQkgKg0K
LQkgKiBEb24ndCBkbyBhbnkgb3RoZXIgY2FsY3VsYXRpb25zIGlmIHRoZSB0
aW1lIHNsaWNlIGlzDQotCSAqIG92ZXIuLg0KLQkgKi8NCi0Jd2VpZ2h0ID0g
cC0+Y291bnRlcjsNCi0JaWYgKHdlaWdodCkgew0KLQkJCQ0KLSNpZmRlZiBf
X1NNUF9fDQotCQkvKiBHaXZlIGEgbGFyZ2lzaCBhZHZhbnRhZ2UgdG8gdGhl
IHNhbWUgcHJvY2Vzc29yLi4uICAgKi8NCi0JCS8qICh0aGlzIGlzIGVxdWl2
YWxlbnQgdG8gcGVuYWxpemluZyBvdGhlciBwcm9jZXNzb3JzKSAqLw0KLQkJ
aWYgKHAtPmxhc3RfcHJvY2Vzc29yID09IHRoaXNfY3B1KQ0KLQkJCXdlaWdo
dCArPSBQUk9DX0NIQU5HRV9QRU5BTFRZOw0KKwlyZXR1cm4gMTsNCisjZWxz
ZQ0KKwlyZXR1cm4gMTsNCiAjZW5kaWYNCi0NCi0JCS8qIC4uIGFuZCBhIHNs
aWdodCBhZHZhbnRhZ2UgdG8gdGhlIGN1cnJlbnQgcHJvY2VzcyAqLw0KLQkJ
aWYgKHAgPT0gcHJldikNCi0JCQl3ZWlnaHQgKz0gMTsNCi0JfQ0KLQ0KLQly
ZXR1cm4gd2VpZ2h0Ow0KIH0NCiANCiAvKg0KLSAqICAnc2NoZWR1bGUoKScg
aXMgdGhlIHNjaGVkdWxlciBmdW5jdGlvbi4gSXQncyBhIHZlcnkgc2ltcGxl
IGFuZCBuaWNlDQotICogc2NoZWR1bGVyOiBpdCdzIG5vdCBwZXJmZWN0LCBi
dXQgY2VydGFpbmx5IHdvcmtzIGZvciBtb3N0IHRoaW5ncy4NCi0gKg0KLSAq
IFRoZSBnb3RvIGlzICJpbnRlcmVzdGluZyIuDQotICoNCi0gKiAgIE5PVEUh
ISAgVGFzayAwIGlzIHRoZSAnaWRsZScgdGFzaywgd2hpY2ggZ2V0cyBjYWxs
ZWQgd2hlbiBubyBvdGhlcg0KLSAqIHRhc2tzIGNhbiBydW4uIEl0IGNhbiBu
b3QgYmUga2lsbGVkLCBhbmQgaXQgY2Fubm90IHNsZWVwLiBUaGUgJ3N0YXRl
Jw0KLSAqIGluZm9ybWF0aW9uIGluIHRhc2tbMF0gaXMgbmV2ZXIgdXNlZC4N
CisgKiAgc2NoZWR1bGUoKSBkb2VzIHJ1bi1xdWV1ZSBtYWludGVuYW5jZSwg
YW5kIHBpY2tzIGEgcHJvY2VzcyB0byBydW4uDQorICogIEl0IGlzIGEgUU5Y
LWxpa2Ugc2NoZWR1bGVyIHRoYXQgdXNlcyAzMiBzZXBhcmF0ZSBydW4tcXVl
dWVzLg0KICAqLw0KIGFzbWxpbmthZ2Ugdm9pZCBzY2hlZHVsZSh2b2lkKQ0K
IHsNCi0JaW50IGM7DQorCXN0YXRpYyBpbnQgbmV4dF9tYWludGVuYW5jZSA9
IDA7DQorCWludCBxOw0KIAlzdHJ1Y3QgdGFza19zdHJ1Y3QgKiBwOw0KIAlz
dHJ1Y3QgdGFza19zdHJ1Y3QgKiBwcmV2LCAqIG5leHQ7DQogCXVuc2lnbmVk
IGxvbmcgdGltZW91dCA9IDA7DQogCWludCB0aGlzX2NwdT1zbXBfcHJvY2Vz
c29yX2lkKCk7DQogDQotLyogY2hlY2sgYWxhcm0sIHdha2UgdXAgYW55IGlu
dGVycnVwdGlibGUgdGFza3MgdGhhdCBoYXZlIGdvdCBhIHNpZ25hbCAqLw0K
LQ0KKwkvKiBjaGVjayBhbGFybSwgd2FrZSB1cCBhbnkgaW50ZXJydXB0aWJs
ZSB0YXNrcyB0aGF0IGhhdmUgZ290IGEgc2lnbmFsICovDQogCWlmIChpbnRy
X2NvdW50KQ0KIAkJZ290byBzY2hlZHVsaW5nX2luX2ludGVycnVwdDsNCiAN
CkBAIC0zMTcsMTEgKzI3NCw5IEBADQogCW5lZWRfcmVzY2hlZCA9IDA7DQog
CXByZXYgPSBjdXJyZW50Ow0KIAljbGkoKTsNCi0JLyogbW92ZSBhbiBleGhh
dXN0ZWQgUlIgcHJvY2VzcyB0byBiZSBsYXN0Li4gKi8NCi0JaWYgKCFwcmV2
LT5jb3VudGVyICYmIHByZXYtPnBvbGljeSA9PSBTQ0hFRF9SUikgew0KLQkJ
cHJldi0+Y291bnRlciA9IHByZXYtPnByaW9yaXR5Ow0KLQkJbW92ZV9sYXN0
X3J1bnF1ZXVlKHByZXYpOw0KLQl9DQorCS8qIG1vdmUgdGhlIGxhc3QgcHJv
Y2VzcyBydW4gdG8gdGhlIGVuZCBvZiB0aGUgcXVldWUgKi8NCisJaWYgKHBy
ZXYtPnBpZCAmJiBwcmV2LT5wb2xpY3kgIT0gU0NIRURfRklGTykNCisJICAg
ICAgICBydW5fcVtwcmV2LT5ydW5fcV0gPSBwcmV2LT5uZXh0X3J1bjsNCiAJ
c3dpdGNoIChwcmV2LT5zdGF0ZSkgew0KIAkJY2FzZSBUQVNLX0lOVEVSUlVQ
VElCTEU6DQogCQkJaWYgKHByZXYtPnNpZ25hbCAmIH5wcmV2LT5ibG9ja2Vk
KQ0KQEAgLTMzNiwxMSArMjkxLDQxIEBADQogCQkJfQ0KIAkJZGVmYXVsdDoN
CiAJCQlkZWxfZnJvbV9ydW5xdWV1ZShwcmV2KTsNCisJCQlwcmV2LT5ydW5f
cSA9IHByZXYtPnJ1bl9xX21pbjsNCiAJCWNhc2UgVEFTS19SVU5OSU5HOg0K
IAl9DQotCXAgPSBpbml0X3Rhc2submV4dF9ydW47DQogCXN0aSgpOw0KLQkN
CisNCisJLyoNCisJICogVGFrZSBjYXJlIG9mIHJlLW5pY2VkIHByb2Nlc3Nl
cywgcHJvbW90ZSBzdGFydmluZyBwcm9jZXNzZXMNCisJICovDQorCWlmIChq
aWZmaWVzID49IG5leHRfbWFpbnRlbmFuY2UpIHsNCisJICAgICAgICBmb3Jf
ZWFjaF90YXNrKHApIHsNCisJCSAgICAgICAgaWYgKHAtPnJ1bl9xX3N3IDwg
TlJfUlVOX1FVRVVFUykgew0KKwkJCSAgICAgICAgY2xpKCk7DQorCQkJCWlm
IChwLT5uZXh0X3J1bikgew0KKwkJCQkgICAgICAgIGRlbF9mcm9tX3J1bnF1
ZXVlKHApOw0KKwkJCQkJcC0+cnVuX3FfbWluID0gcC0+cnVuX3EgPSBwLT5y
dW5fcV9zdzsNCisJCQkJCWFkZF90b19ydW5xdWV1ZShwKTsNCisJCQkJfSBl
bHNlIHsNCisJCQkJCXAtPnJ1bl9xX21pbiA9IHAtPnJ1bl9xID0gcC0+cnVu
X3Ffc3c7DQorCQkJCX0NCisJCQkJcC0+cnVuX3Ffc3cgPSBOUl9SVU5fUVVF
VUVTOw0KKwkJCQlzdGkoKTsNCisJCSAgICAgICAgfSBlbHNlIGlmIChwLT5u
ZXh0X3J1biAmJg0KKwkJCQkgICAoamlmZmllcyAtIHAtPmxhc3RfcnVuID49
IEhaKSAmJg0KKwkJCQkgICAocC0+cnVuX3EgPiBwLT5ydW5fcV9taW4pKQ0K
KwkJCXsNCisJCQkgICAgICAgIGNsaSgpOw0KKwkJCQlkZWxfZnJvbV9ydW5x
dWV1ZShwKTsNCisJCQkJcC0+cnVuX3EtLTsNCisJCQkJYWRkX3RvX3J1bnF1
ZXVlKHApOw0KKwkJCQlzdGkoKTsNCisJCQl9DQorCQl9DQorCQluZXh0X21h
aW50ZW5hbmNlID0gamlmZmllcyArICg1MDAqSFovMTAwMCk7DQorCX0NCisN
CiAjaWZkZWYgX19TTVBfXw0KIAkvKg0KIAkgKglUaGlzIGlzIHNhZmUgYXMg
d2UgZG8gbm90IHBlcm1pdCByZS1lbnRyeSBvZiBzY2hlZHVsZSgpDQpAQCAt
MzQ5LDM1ICszMzQsNDkgQEANCiAjZGVmaW5lIGlkbGVfdGFzayAodGFza1tj
cHVfbnVtYmVyX21hcFt0aGlzX2NwdV1dKQ0KICNlbHNlDQogI2RlZmluZSBp
ZGxlX3Rhc2sgKCZpbml0X3Rhc2spDQotI2VuZGlmCQ0KKyNlbmRpZg0KIA0K
IC8qDQogICogTm90ZSEgdGhlcmUgbWF5IGFwcGVhciBuZXcgdGFza3Mgb24g
dGhlIHJ1bi1xdWV1ZSBkdXJpbmcgdGhpcywgYXMNCiAgKiBpbnRlcnJ1cHRz
IGFyZSBlbmFibGVkLiBIb3dldmVyLCB0aGV5IHdpbGwgYmUgcHV0IG9uIGZy
b250IG9mIHRoZQ0KICAqIGxpc3QsIHNvIG91ciBsaXN0IHN0YXJ0aW5nIGF0
ICJwIiBpcyBlc3NlbnRpYWxseSBmaXhlZC4NCiAgKi8NCi0vKiB0aGlzIGlz
IHRoZSBzY2hlZHVsZXIgcHJvcGVyOiAqLw0KLQljID0gLTEwMDA7DQorICAg
ICAgICAvKiBwaWNrIGEgcHJvY2VzcyAqLw0KIAluZXh0ID0gaWRsZV90YXNr
Ow0KLQl3aGlsZSAocCAhPSAmaW5pdF90YXNrKSB7DQotCQlpbnQgd2VpZ2h0
ID0gZ29vZG5lc3MocCwgcHJldiwgdGhpc19jcHUpOw0KLQkJaWYgKHdlaWdo
dCA+IGMpDQotCQkJYyA9IHdlaWdodCwgbmV4dCA9IHA7DQotCQlwID0gcC0+
bmV4dF9ydW47DQorCWZvciAocSA9IDA7IHEgPCBOUl9SVU5fUVVFVUVTOyBx
KyspIHsNCisJICAgICAgICBwID0gcnVuX3FbcV07DQorCQlpZiAoIXApIGNv
bnRpbnVlOw0KKwkJZG8gew0KKwkJICAgICAgICBpZiAocnVubmFibGUocCwg
dGhpc19jcHUpKSB7DQorCQkJICAgICAgICBuZXh0ID0gcDsNCisJCQkJZ290
byBmb3VuZF9wcm9jOw0KKwkJICAgICAgICB9DQorCQkJcCA9IHAtPm5leHRf
cnVuOw0KKwkJfSB3aGlsZSAocCAhPSBydW5fcVtxXSk7DQorCX0NCitmb3Vu
ZF9wcm9jOg0KKwluZXh0LT5sYXN0X3J1biA9IGppZmZpZXM7DQorCS8qIFBv
c3NpYmx5IGRlbW90ZSB0aGUgcHJldmlvdXMgdGFzayAqLw0KKwlpZiAocHJl
di0+cGlkICYmIG5leHQtPnBpZCAmJg0KKwkgICAgcHJldi0+bmV4dF9ydW4g
JiYNCisJICAgIChuZXh0ICE9IHByZXYpICYmDQorCSAgICAocSA9PSBwcmV2
LT5ydW5fcSkgJiYNCisJICAgIChxIDwgTlJfUlVOX1FVRVVFUyAtIDIpICYm
DQorCSAgICAocHJldi0+cG9saWN5ID09IFNDSEVEX0FEQVBUSVZFKSkNCisJ
ew0KKwkgICAgICAgIGNsaSgpOw0KKwkgICAgICAgIGRlbF9mcm9tX3J1bnF1
ZXVlKHByZXYpOw0KKwkJcHJldi0+cnVuX3ErKzsNCisJCWFkZF90b19ydW5x
dWV1ZShwcmV2KTsNCisJCXN0aSgpOw0KIAl9DQogDQotCS8qIGlmIGFsbCBy
dW5uYWJsZSBwcm9jZXNzZXMgaGF2ZSAiY291bnRlciA9PSAwIiwgcmUtY2Fs
Y3VsYXRlIGNvdW50ZXJzICovDQotCWlmICghYykgew0KLQkJZm9yX2VhY2hf
dGFzayhwKQ0KLQkJCXAtPmNvdW50ZXIgPSAocC0+Y291bnRlciA+PiAxKSAr
IHAtPnByaW9yaXR5Ow0KLQl9DQogI2lmZGVmIF9fU01QX18NCiAJLyoNCiAJ
ICoJQWxsb2NhdGUgcHJvY2VzcyB0byBDUFUNCiAJICovDQotCSANCi0JIG5l
eHQtPnByb2Nlc3NvciA9IHRoaXNfY3B1Ow0KLQkgbmV4dC0+bGFzdF9wcm9j
ZXNzb3IgPSB0aGlzX2NwdTsNCisJbmV4dC0+cHJvY2Vzc29yID0gdGhpc19j
cHU7DQorCW5leHQtPmxhc3RfcHJvY2Vzc29yID0gdGhpc19jcHU7DQogI2Vu
ZGlmCSANCiAjaWZkZWYgX19TTVBfUFJPRl9fIA0KIAkvKiBtYXJrIHByb2Nl
c3NvciBydW5uaW5nIGFuIGlkbGUgdGhyZWFkICovDQpAQCAtNjI0LDYgKzYy
Myw3IEBADQogCQlyZXR1cm47DQogCWlmIChjdXJyZW50ID09IHRhc2tbMF0p
DQogCQlwYW5pYygidGFza1swXSB0cnlpbmcgdG8gc2xlZXAiKTsNCisNCiAJ
Y3VycmVudC0+c3RhdGUgPSBzdGF0ZTsNCiAJc2F2ZV9mbGFncyhmbGFncyk7
DQogCWNsaSgpOw0KQEAgLTExMjksMTIgKzExMjksOSBAQA0KIAlzdHJ1Y3Qg
dGFza19zdHJ1Y3QgKiBwID0gY3VycmVudDsNCiAJdW5zaWduZWQgbG9uZyB1
c2VyID0gdGlja3MgLSBzeXN0ZW07DQogCWlmIChwLT5waWQpIHsNCi0JCXAt
PmNvdW50ZXIgLT0gdGlja3M7DQotCQlpZiAocC0+Y291bnRlciA8IDApIHsN
Ci0JCQlwLT5jb3VudGVyID0gMDsNCi0JCQluZWVkX3Jlc2NoZWQgPSAxOw0K
LQkJfQ0KLQkJaWYgKHAtPnByaW9yaXR5IDwgREVGX1BSSU9SSVRZKQ0KKwkg
ICAgICAgIGlmIChqaWZmaWVzIC0gcC0+bGFzdF9ydW4gPj0gREVGX1BSSU9S
SVRZKQ0KKyAgICAgICAgICAgICAgICAgICAgICAgIG5lZWRfcmVzY2hlZCA9
IDE7DQorCQlpZiAocC0+cnVuX3EgPiBERUZfUlVOX1FVRVVFKQ0KIAkJCWtz
dGF0LmNwdV9uaWNlICs9IHVzZXI7DQogCQllbHNlDQogCQkJa3N0YXQuY3B1
X3VzZXIgKz0gdXNlcjsNCkBAIC0xMTc2LDEwICsxMTczLDggQEANCiAJCQkJ
a3N0YXQuY3B1X3VzZXIgKz0gdXRpbWU7DQogCQkJa3N0YXQuY3B1X3N5c3Rl
bSArPSBzdGltZTsNCiANCi0JCQlwLT5jb3VudGVyIC09IHRpY2tzOw0KLQkJ
CWlmIChwLT5jb3VudGVyID49IDApDQotCQkJCWNvbnRpbnVlOw0KLQkJCXAt
PmNvdW50ZXIgPSAwOw0KKwkJCWlmIChqaWZmaWVzIC0gcC0+bGFzdF9ydW4g
PCBERUZfUFJJT1JJVFkpDQorCQkJICAgICAgICBjb250aW51ZTsNCiAJCX0g
ZWxzZSB7DQogCQkJLyoNCiAJCQkgKiBJZGxlIHByb2Nlc3NvciBmb3VuZCwg
ZG8gd2UgaGF2ZSBhbnl0aGluZw0KQEAgLTEzODAsMTYgKzEzNzUsMTYgQEAN
CiAJaWYgKHBvbGljeSA8IDApDQogCQlwb2xpY3kgPSBwLT5wb2xpY3k7DQog
CWVsc2UgaWYgKHBvbGljeSAhPSBTQ0hFRF9GSUZPICYmIHBvbGljeSAhPSBT
Q0hFRF9SUiAmJg0KLQkJIHBvbGljeSAhPSBTQ0hFRF9PVEhFUikNCisJCSBw
b2xpY3kgIT0gU0NIRURfQURBUFRJVkUpDQogCQlyZXR1cm4gLUVJTlZBTDsN
CiAJDQogCS8qDQogCSAqIFZhbGlkIHByaW9yaXRpZXMgZm9yIFNDSEVEX0ZJ
Rk8gYW5kIFNDSEVEX1JSIGFyZSAxLi45OSwgdmFsaWQNCi0JICogcHJpb3Jp
dHkgZm9yIFNDSEVEX09USEVSIGlzIDAuDQorCSAqIHByaW9yaXR5IGZvciBT
Q0hFRF9BREFQVElWRSBpcyAwLg0KIAkgKi8NCiAJaWYgKGxwLnNjaGVkX3By
aW9yaXR5IDwgMCB8fCBscC5zY2hlZF9wcmlvcml0eSA+IDk5KQ0KIAkJcmV0
dXJuIC1FSU5WQUw7DQotCWlmICgocG9saWN5ID09IFNDSEVEX09USEVSKSAh
PSAobHAuc2NoZWRfcHJpb3JpdHkgPT0gMCkpDQorCWlmICgocG9saWN5ID09
IFNDSEVEX0FEQVBUSVZFKSAhPSAobHAuc2NoZWRfcHJpb3JpdHkgPT0gMCkp
DQogCQlyZXR1cm4gLUVJTlZBTDsNCiANCiAJaWYgKChwb2xpY3kgPT0gU0NI
RURfRklGTyB8fCBwb2xpY3kgPT0gU0NIRURfUlIpICYmICFzdXNlcigpKQ0K
QEAgLTEzOTksMTAgKzEzOTQsMTAgQEANCiAJCXJldHVybiAtRVBFUk07DQog
DQogCXAtPnBvbGljeSA9IHBvbGljeTsNCi0JcC0+cnRfcHJpb3JpdHkgPSBs
cC5zY2hlZF9wcmlvcml0eTsNCisJcC0+cnVuX3Ffc3cgPSBwLT5ydW5fcV9t
aW47DQogCWNsaSgpOw0KLQlpZiAocC0+bmV4dF9ydW4pDQotCQltb3ZlX2xh
c3RfcnVucXVldWUocCk7DQorICAgICAgICBpZiAocC0+bmV4dF9ydW4pDQor
ICAgICAgICAgICAgICAgIHJ1bl9xW3AtPnJ1bl9xXSA9IHAtPm5leHRfcnVu
Ow0KIAlzdGkoKTsNCiAJbmVlZF9yZXNjaGVkID0gMTsNCiAJcmV0dXJuIDA7
DQpAQCAtMTQ2MCwxMCArMTQ1NSw5IEBADQogew0KIAljbGkoKTsNCiAJaWYg
KGN1cnJlbnQtPm5leHRfcnVuKSB7DQotCQltb3ZlX2xhc3RfcnVucXVldWUo
Y3VycmVudCk7IA0KLQkJY3VycmVudC0+Y291bnRlciA9IDA7DQotCQluZWVk
X3Jlc2NoZWQgPSAxOw0KLQl9DQorICAgICAgICAgICAgICAgIHJ1bl9xW2N1
cnJlbnQtPnJ1bl9xXSA9IGN1cnJlbnQtPm5leHRfcnVuOw0KKyAgICAgICAg
ICAgICAgICBuZWVkX3Jlc2NoZWQgPSAxOw0KKyAgICAgICAgfQ0KIAlzdGko
KTsNCiAJcmV0dXJuIDA7DQogfQ0KQEAgLTE0NzEsMTAgKzE0NjUsOSBAQA0K
IGFzbWxpbmthZ2UgaW50IHN5c19zY2hlZF9nZXRfcHJpb3JpdHlfbWF4KGlu
dCBwb2xpY3kpDQogew0KIAlzd2l0Y2ggKHBvbGljeSkgew0KKwkgICAgICBj
YXNlIFNDSEVEX0FEQVBUSVZFOg0KIAkgICAgICBjYXNlIFNDSEVEX0ZJRk86
DQogCSAgICAgIGNhc2UgU0NIRURfUlI6DQotCQlyZXR1cm4gOTk7DQotCSAg
ICAgIGNhc2UgU0NIRURfT1RIRVI6DQogCQlyZXR1cm4gMDsNCiAJfQ0KIA0K
QEAgLTE0ODQsMTAgKzE0NzcsOSBAQA0KIGFzbWxpbmthZ2UgaW50IHN5c19z
Y2hlZF9nZXRfcHJpb3JpdHlfbWluKGludCBwb2xpY3kpDQogew0KIAlzd2l0
Y2ggKHBvbGljeSkgew0KKwkgICAgICBjYXNlIFNDSEVEX0FEQVBUSVZFOg0K
IAkgICAgICBjYXNlIFNDSEVEX0ZJRk86DQogCSAgICAgIGNhc2UgU0NIRURf
UlI6DQotCQlyZXR1cm4gMTsNCi0JICAgICAgY2FzZSBTQ0hFRF9PVEhFUjoN
CiAJCXJldHVybiAwOw0KIAl9DQogDQpAQCAtMTU1NSw3ICsxNTQ3LDcgQEAN
CiAJCXJldHVybiAtRUlOVkFMOw0KIA0KIAlpZiAodC50dl9zZWMgPT0gMCAm
JiB0LnR2X25zZWMgPD0gMjAwMDAwMEwgJiYNCi0JICAgIGN1cnJlbnQtPnBv
bGljeSAhPSBTQ0hFRF9PVEhFUikgew0KKwkgICAgY3VycmVudC0+cG9saWN5
ICE9IFNDSEVEX0FEQVBUSVZFKSB7DQogCQkvKg0KIAkJICogU2hvcnQgZGVs
YXkgcmVxdWVzdHMgdXAgdG8gMiBtcyB3aWxsIGJlIGhhbmRsZWQgd2l0aA0K
IAkJICogaGlnaCBwcmVjaXNpb24gYnkgYSBidXN5IHdhaXQgZm9yIGFsbCBy
ZWFsLXRpbWUgcHJvY2Vzc2VzLg0KQEAgLTE2NDUsNyArMTYzNyw3IEBADQog
CSAqCVdlIGhhdmUgdG8gZG8gYSBsaXR0bGUgbWFnaWMgdG8gZ2V0IHRoZSBm
aXJzdA0KIAkgKglwcm9jZXNzIHJpZ2h0IGluIFNNUCBtb2RlLg0KIAkgKi8N
Ci0JaW50IGNwdT1zbXBfcHJvY2Vzc29yX2lkKCk7DQorCWludCBpLCBjcHU9
c21wX3Byb2Nlc3Nvcl9pZCgpOw0KICNpZm5kZWYgX19TTVBfXwkNCiAJY3Vy
cmVudF9zZXRbY3B1XT0maW5pdF90YXNrOw0KICNlbHNlDQpAQCAtMTY1Niw0
ICsxNjQ4LDggQEANCiAJaW5pdF9iaChUSU1FUl9CSCwgdGltZXJfYmgpOw0K
IAlpbml0X2JoKFRRVUVVRV9CSCwgdHF1ZXVlX2JoKTsNCiAJaW5pdF9iaChJ
TU1FRElBVEVfQkgsIGltbWVkaWF0ZV9iaCk7DQorDQorCWZvciAoaSA9IDA7
IGkgPCBOUl9SVU5fUVVFVUVTOyBpKyspDQorCSAgICAgICAgcnVuX3FbaV0g
PSBOVUxMOw0KKwlwcmludGsoIlFOWC1zdHlsZSBzY2hlZHVsaW5nIHYxLjAw
IDxhbWNrZWVAcG9ib3hlcy5jb20+XG4iKTsNCiB9DQotLS0gbGludXgva2Vy
bmVsL2ZvcmsuYy5vcmlnCVdlZCBKdWwgMjMgMjE6NTU6NDUgMTk5Nw0KKysr
IGxpbnV4L2tlcm5lbC9mb3JrLmMJRnJpIEp1bCAyNSAxNzowODozOSAxOTk3
DQpAQCAtMjY0LDYgKzI2NCw4IEBADQogCXAtPmxvY2tfZGVwdGggPSAxOw0K
ICNlbmRpZg0KIAlwLT5zdGFydF90aW1lID0gamlmZmllczsNCisgICAgICAg
IHAtPnBvbGljeSA9IFNDSEVEX0FEQVBUSVZFOw0KKwlwLT5ydW5fcV9zdyA9
IE5SX1JVTl9RVUVVRVM7DQogCXRhc2tbbnJdID0gcDsNCiAJU0VUX0xJTktT
KHApOw0KIAlucl90YXNrcysrOw0KQEAgLTI4NCw3ICsyODYsNyBAQA0KIAkv
KiBvaywgbm93IHdlIHNob3VsZCBiZSBzZXQgdXAuLiAqLw0KIAlwLT5zd2Fw
cGFibGUgPSAxOw0KIAlwLT5leGl0X3NpZ25hbCA9IGNsb25lX2ZsYWdzICYg
Q1NJR05BTDsNCi0JcC0+Y291bnRlciA9IChjdXJyZW50LT5jb3VudGVyID4+
PSAxKTsNCisJcC0+Y291bnRlciA9IDA7DQogCXdha2VfdXBfcHJvY2Vzcyhw
KTsJCQkvKiBkbyB0aGlzIGxhc3QsIGp1c3QgaW4gY2FzZSAqLw0KIAkrK3Rv
dGFsX2ZvcmtzOw0KIAlyZXR1cm4gcC0+cGlkOw0KLS0tIGxpbnV4L2luY2x1
ZGUvbGludXgvc2NoZWQuaC5vcmlnCVdlZCBKdWwgMjMgMjE6NTU6NDUgMTk5
Nw0KKysrIGxpbnV4L2luY2x1ZGUvbGludXgvc2NoZWQuaAlUaHUgSnVsIDI0
IDIwOjQ3OjEwIDE5OTcNCkBAIC04NywxMCArODcsMTMgQEANCiAjZGVmaW5l
IFRBU0tfU1RPUFBFRAkJNA0KICNkZWZpbmUgVEFTS19TV0FQUElORwkJNQ0K
IA0KKyNkZWZpbmUgTlJfUlVOX1FVRVVFUwkJMzIJLyogdGhlIHNjaGVkdWxl
ciB1c2VzIDMyIHJ1bi1xdWV1ZXMgKi8NCisjZGVmaW5lIERFRl9SVU5fUVVF
VUUJCTEwCS8qIGRlZmF1bHQgcnVuLXF1ZXVlICovDQorDQogLyoNCiAgKiBT
Y2hlZHVsaW5nIHBvbGljaWVzDQogICovDQotI2RlZmluZSBTQ0hFRF9PVEhF
UgkJMA0KKyNkZWZpbmUgU0NIRURfQURBUFRJVkUJCTANCiAjZGVmaW5lIFND
SEVEX0ZJRk8JCTENCiAjZGVmaW5lIFNDSEVEX1JSCQkyDQogDQpAQCAtMjQ0
LDYgKzI0Nyw5IEBADQogCXN0cnVjdCBtbV9zdHJ1Y3QgKm1tOw0KIC8qIHNp
Z25hbCBoYW5kbGVycyAqLw0KIAlzdHJ1Y3Qgc2lnbmFsX3N0cnVjdCAqc2ln
Ow0KKy8qIFFOWC1zdHlsZSBzY2hlZHVsZXIgKi8NCisgICAgICAgIHVuc2ln
bmVkIGxvbmcgbGFzdF9ydW47DQorICAgICAgICB1bnNpZ25lZCBpbnQgcnVu
X3EsIHJ1bl9xX21pbiwgcnVuX3Ffc3c7DQogI2lmZGVmIF9fU01QX18NCiAJ
aW50IHByb2Nlc3NvcjsNCiAJaW50IGxhc3RfcHJvY2Vzc29yOw0KQEAgLTI3
NSw3ICsyODEsNyBAQA0KICAqLw0KICNkZWZpbmUgX1NUS19MSU0JKDgqMTAy
NCoxMDI0KQ0KIA0KLSNkZWZpbmUgREVGX1BSSU9SSVRZCSgyMCpIWi8xMDAp
CS8qIDIwMCBtcyB0aW1lIHNsaWNlcyAqLw0KKyNkZWZpbmUgREVGX1BSSU9S
SVRZCSg1MCpIWi8xMDAwKQkvKiA1MCBtcyB0aW1lIHNsaWNlcyAqLw0KIA0K
IC8qDQogICogIElOSVRfVEFTSyBpcyB1c2VkIHRvIHNldCB1cCB0aGUgZmly
c3QgdGFzayB0YWJsZSwgdG91Y2ggYXQNCkBAIC0yOTMsNyArMjk5LDcgQEAN
CiAvKiBzdXBwbCBncnBzKi8ge05PR1JPVVAsfSwgXA0KIC8qIHByb2MgbGlu
a3MqLyAmaW5pdF90YXNrLCZpbml0X3Rhc2ssTlVMTCxOVUxMLE5VTEwsTlVM
TCwgXA0KIC8qIHVpZCBldGMgKi8JMCwwLDAsMCwwLDAsMCwwLCBcDQotLyog
dGltZW91dCAqLwkwLFNDSEVEX09USEVSLDAsMCwwLDAsMCwwLDAsIFwNCisv
KiB0aW1lb3V0ICovCTAsU0NIRURfQURBUFRJVkUsMCwwLDAsMCwwLDAsMCwg
XA0KIC8qIHRpbWVyICovCXsgTlVMTCwgTlVMTCwgMCwgMCwgaXRfcmVhbF9m
biB9LCBcDQogLyogdXRpbWUgKi8JMCwwLDAsMCwwLCBcDQogLyogZmx0ICov
CTAsMCwwLDAsMCwwLCBcDQpAQCAtMzA5LDYgKzMxNSw3IEBADQogLyogZmls
ZXMgKi8JJmluaXRfZmlsZXMsIFwNCiAvKiBtbSAqLwkmaW5pdF9tbSwgXA0K
IC8qIHNpZ25hbHMgKi8JJmluaXRfc2lnbmFscywgXA0KKy8qIFFOWCBzY2hl
ZCAqLyAwLCAxMCwgMTAsIE5SX1JVTl9RVUVVRVMgXA0KIH0NCiANCiBleHRl
cm4gc3RydWN0ICAgbW1fc3RydWN0IGluaXRfbW07DQo=
--12583424-762705930-869899518=:1352--