Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 3 May 2019 11:11:15 -0400
From:      Drew Gallatin <gallatin@netflix.com>
To:        freebsd-transport@freebsd.org
Subject:   RFC: NUMA mods for SO_REUSEPORT_LB
Message-ID:  <CADLQ3sJg0wiqn_zg9bVvxJA5JQFZZVKJpZYt_g1xBk5k%2B9xLMw@mail.gmail.com>

next in thread | raw e-mail | index | archive | help
--00000000000026ab950587fd2a3a
Content-Type: text/plain; charset="UTF-8"

The next patch up in my NUMA patchset is my patch to
affinitize SO_REUSEPORT_LB sockets.   I have to admit that I'm not super
happy with it, and I was looking for constructive feedback.

In our (Netflix) workload, we have an nginx master process which creates N
different listen sockets when SO_REUSEPORT_LB is in use.  He forks off the
workers, and they then affinitize themselves as directed in the
nginx.conf.  (worker N might not be bound to CPU N).  They then take over
the listen sockets and start serving.

In order to deal with this, I made a TCP_REUSPORT_LB_NUMA socket option.

The inpcblbgroup struct has been modified to add an il_numa_domain field.
When a group is created, this is set to M_NODOM ("numa wildcard").   On
lookup, only groups with matching numa domains are considered when an mbuf
has a non-M_NODOM m_numa_domain field set.  (and a numa wildcard match is
done if no matches are found).

When nginx wants to use this, he calls setsockopt(...
TCP_REUSEPORT_LB_NUMA...) on the existing listen socket

This sockopt:

- gets the CPU affinity mask of the calling thread
- finds the current NUMA domain for the calling thread
- looks up the inp and removes it from the numa-wildcard (M_NODOM) group
and inserts it into a new group specific to that numa domain.

This actually works quite well for me, but I don't think it is ready for
prime-time.  The sockopt API was admittedly done to satisfy my particular
use case, and I'm looking for feedback on how to improve it.

Specifically:

1) Is it OK to add a new option that modifies an existing listen socket?
- This was the right choice for my application.  Is it too awkward in
general?

2) Should the sockopt put the job of selecting the appropriate numa domain
onto the caller?

Right now, everything is automatic.  Should it just take an argument which
corresponds to a NUMA domain (or -1 to remove the NUMA domain affinity)?
 Should it take an argument that corresponds to a CPUSET?

Any feedback is welcome.

Thanks,

Drew

--00000000000026ab950587fd2a3a
Content-Type: text/x-patch; charset="US-ASCII"; name="reuse_numa.diff"
Content-Disposition: attachment; filename="reuse_numa.diff"
Content-Transfer-Encoding: base64
Content-ID: <f_jv87smzc0>
X-Attachment-Id: f_jv87smzc0

Y29tbWl0IDNjOTViM2E0MzMyZWE0NjlhMTY0NDA0NjdmZGQ4MDdkYzQyYzY1OTIKQXV0aG9yOiBE
cmV3IEdhbGxhdGluIDxnYWxsYXRpbkBuZXRmbGl4LmNvbT4KRGF0ZTogICBTYXQgTWFyIDMwIDE0
OjA0OjUwIDIwMTkgLTA0MDAKCiAgICBUYWtlIG51bWEgYWZmaW5pdHkgaW50byBhY2NvdW50IGZv
ciBpbl9wY2JsYiBncm91cHMKICAgIAogICAgLSBJZiBhIHByb2Nlc3MgaGFzIENQVSBhZmZpbml0
eSBzZXQgd2hlbiBhIGxpc3RlbiBzb2NrZXQKICAgICAgICAgICAgbWFya2VkIGFzIGxvYWQtYmFs
YW5jZSBpcyBib3VuZCwgdGhlbiB0aGUgbGJncm91cAogICAgICAgICAgICB0YWtlcyB0aGUgTlVN
QSBkb21haW4gb2YgdGhlIGN1cnJlbnQgQ1BVIGFzIHRoZQogICAgICAgICAgICBhZmZpbml0eSB0
aGF0IHNob3VsZCBiZSB1c2VkIGZvciBkaXN0cmlidXRpbmcgY29ubmVjdGlvbnMuCiAgICAKICAg
IC0gSWYgYSBwcm9jZXNzIGNhbGxzIFRDUF9SRVVTUE9SVF9MQl9OVU1BIG9uIGEgYm91bmQKICAg
ICAgICAgICAgbGlzdGVuIHNvY2tldCBhZnRlciBzZXR0aW5nIGEgQ1BVIGFmZmluaXR5LAogICAg
ICAgICAgICB0aGUgaW5wIGlzIHRoZW4gcHVsbGVkIG91dCBvZiB0aGUgY3VycmVudAogICAgICAg
ICAgICBsYiBncm91cCBhbmQgaW5zZXJ0ZWQgaW50byBvbmUgd2l0aCB0aGUKICAgICAgICAgICAg
YXBwcm9wcmlhdGUgYWZmaW5pdHkgc2V0LgogICAgCiAgICBKSVJBOiBOQ0QtNDI3NQoKZGlmZiAt
LWdpdCBhL0ZyZWVCU0Qvc3lzL25ldGluZXQvaW5fcGNiLmMgYi9GcmVlQlNEL3N5cy9uZXRpbmV0
L2luX3BjYi5jCmluZGV4IDFkMjA2NDc2M2VmOS4uMzgwMDU4MDIxYzdkIDEwMDY0NAotLS0gYS9G
cmVlQlNEL3N5cy9uZXRpbmV0L2luX3BjYi5jCisrKyBiL0ZyZWVCU0Qvc3lzL25ldGluZXQvaW5f
cGNiLmMKQEAgLTE0OCw3ICsxNDgsNyBAQCBzdGF0aWMgdm9pZAlpbl9wY2JyZW1saXN0cyhzdHJ1
Y3QgaW5wY2IgKmlucCk7CiBzdGF0aWMgc3RydWN0IGlucGNiCSppbl9wY2Jsb29rdXBfaGFzaF9s
b2NrZWQoc3RydWN0IGlucGNiaW5mbyAqcGNiaW5mbywKIAkJCSAgICBzdHJ1Y3QgaW5fYWRkciBm
YWRkciwgdV9pbnQgZnBvcnRfYXJnLAogCQkJICAgIHN0cnVjdCBpbl9hZGRyIGxhZGRyLCB1X2lu
dCBscG9ydF9hcmcsCi0JCQkgICAgaW50IGxvb2t1cGZsYWdzLCBzdHJ1Y3QgaWZuZXQgKmlmcCk7
CisJCQkgICAgaW50IGxvb2t1cGZsYWdzLCBzdHJ1Y3QgaWZuZXQgKmlmcCwgaW50IG51bWFfZG9t
YWluKTsKIAogI2RlZmluZSBSQU5HRUNISyh2YXIsIG1pbiwgbWF4KSBcCiAJaWYgKCh2YXIpIDwg
KG1pbikpIHsgKHZhcikgPSAobWluKTsgfSBcCkBAIC0yNTAsNiArMjUwLDcgQEAgaW5fcGNibGJn
cm91cF9hbGxvYyhzdHJ1Y3QgaW5wY2JsYmdyb3VwaGVhZCAqaGRyLCB1X2NoYXIgdmZsYWcsCiAJ
CXJldHVybiAoTlVMTCk7CiAJZ3JwLT5pbF92ZmxhZyA9IHZmbGFnOwogCWdycC0+aWxfbHBvcnQg
PSBwb3J0OworCWdycC0+aWxfbnVtYV9kb21haW4gPSBNX05PRE9NOwogCWdycC0+aWxfZGVwZW5k
bGFkZHIgPSAqYWRkcjsKIAlncnAtPmlsX2lucHNpeiA9IHNpemU7CiAJQ0tfTElTVF9JTlNFUlRf
SEVBRChoZHIsIGdycCwgaWxfbGlzdCk7CkBAIC0yOTAsNiArMjkxLDcgQEAgaW5fcGNibGJncm91
cF9yZXNpemUoc3RydWN0IGlucGNibGJncm91cGhlYWQgKmhkciwKIAkgICAgKCJpbnZhbGlkIG5l
dyBsb2NhbCBncm91cCBzaXplICVkIGFuZCBvbGQgbG9jYWwgZ3JvdXAgY291bnQgJWQiLAogCSAg
ICAgZ3JwLT5pbF9pbnBzaXosIG9sZF9ncnAtPmlsX2lucGNudCkpOwogCisJZ3JwLT5pbF9udW1h
X2RvbWFpbiA9IG9sZF9ncnAtPmlsX251bWFfZG9tYWluOwogCWZvciAoaSA9IDA7IGkgPCBvbGRf
Z3JwLT5pbF9pbnBjbnQ7ICsraSkKIAkJZ3JwLT5pbF9pbnBbaV0gPSBvbGRfZ3JwLT5pbF9pbnBb
aV07CiAJZ3JwLT5pbF9pbnBjbnQgPSBvbGRfZ3JwLT5pbF9pbnBjbnQ7CkBAIC0zMjEsNiArMzIz
LDI0IEBAIGluX3BjYmxiZ3JvdXBfcmVvcmRlcihzdHJ1Y3QgaW5wY2JsYmdyb3VwaGVhZCAqaGRy
LCBzdHJ1Y3QgaW5wY2JsYmdyb3VwICoqZ3JwcCwKIAl9CiB9CiAKK3N0YXRpYyBfX25vaW5saW5l
IGludAoraW5fcGNiZ2V0ZG9tKHZvaWQpCit7CisJc3RydWN0IGNwdXNldCAqYzsKKworCWMgPSBj
dXJ0aHJlYWQtPnRkX2NwdXNldDsKKwlpZiAoQ1BVX0NPVU5UKCZjLT5jc19tYXNrKSA9PSBtcF9u
Y3B1cykKKwkJcmV0dXJuIChNX05PRE9NKTsKKworCS8qCisJICogc29tZWJvZHkgc2V0IHRoZSBh
ZmZpbml0eSBhbmQgdGhleSBhcmUgdXNpbmcKKwkgKiBTT19SRVVTRVBPUlRfTEIsIGFzc3VtZSB0
aGV5IHdhbnQgdGhlaXIgZ3JvdXAKKwkgKiBib3VuZCB0byB0aGUgYXBwcm9wcmlhdGUgbnVtYSBk
b21haW4gZm9yIHRoZQorCSAqIENQVSB0aGV5IGFyZSBydW5uaW5nIG9uCisJICovCisJcmV0dXJu
IChQQ1BVX0dFVChkb21haW4pKTsKK30KKwogLyoKICAqIEFkZCBQQ0IgdG8gbG9hZCBiYWxhbmNl
IGdyb3VwIGZvciBTT19SRVVTRVBPUlRfTEIgb3B0aW9uLgogICovCkBAIC0zMzMsNiArMzUzLDcg
QEAgaW5fcGNiaW5zbGJncm91cGhhc2goc3RydWN0IGlucGNiICppbnApCiAJc3RydWN0IGlucGNi
bGJncm91cGhlYWQgKmhkcjsKIAlzdHJ1Y3QgaW5wY2JsYmdyb3VwICpncnA7CiAJdWludDMyX3Qg
aWR4OworCWludCBudW1hX2RvbWFpbjsKIAogCXBjYmluZm8gPSBpbnAtPmlucF9wY2JpbmZvOwog
CkBAIC0zNTYsMTEgKzM3NywxMyBAQCBpbl9wY2JpbnNsYmdyb3VwaGFzaChzdHJ1Y3QgaW5wY2Ig
KmlucCkKIAl9CiAjZW5kaWYKIAorCW51bWFfZG9tYWluID0gaW5fcGNiZ2V0ZG9tKCk7CiAJaWR4
ID0gSU5QX1BDQlBPUlRIQVNIKGlucC0+aW5wX2xwb3J0LCBwY2JpbmZvLT5pcGlfbGJncm91cGhh
c2htYXNrKTsKIAloZHIgPSAmcGNiaW5mby0+aXBpX2xiZ3JvdXBoYXNoYmFzZVtpZHhdOwogCUNL
X0xJU1RfRk9SRUFDSChncnAsIGhkciwgaWxfbGlzdCkgewogCQlpZiAoZ3JwLT5pbF92ZmxhZyA9
PSBpbnAtPmlucF92ZmxhZyAmJgogCQkgICAgZ3JwLT5pbF9scG9ydCA9PSBpbnAtPmlucF9scG9y
dCAmJgorCQkgICAgZ3JwLT5pbF9udW1hX2RvbWFpbiA9PSBudW1hX2RvbWFpbiAmJgogCQkgICAg
bWVtY21wKCZncnAtPmlsX2RlcGVuZGxhZGRyLAogCQkgICAgJmlucC0+aW5wX2luYy5pbmNfaWUu
aWVfZGVwZW5kbGFkZHIsCiAJCSAgICBzaXplb2YoZ3JwLT5pbF9kZXBlbmRsYWRkcikpID09IDAp
CkBAIC0zNzMsNiArMzk2LDcgQEAgaW5fcGNiaW5zbGJncm91cGhhc2goc3RydWN0IGlucGNiICpp
bnApCiAJCSAgICBJTlBDQkxCR1JPVVBfU0laTUlOKTsKIAkJaWYgKGdycCA9PSBOVUxMKQogCQkJ
cmV0dXJuIChFTk9CVUZTKTsKKwkJZ3JwLT5pbF9udW1hX2RvbWFpbiA9IG51bWFfZG9tYWluOwog
CX0gZWxzZSBpZiAoZ3JwLT5pbF9pbnBjbnQgPT0gZ3JwLT5pbF9pbnBzaXopIHsKIAkJaWYgKGdy
cC0+aWxfaW5wc2l6ID49IElOUENCTEJHUk9VUF9TSVpNQVgpIHsKIAkJCWlmIChyYXRlY2hlY2so
Jmxhc3RwcmludCwgJmludGVydmFsKSkKQEAgLTQzMSw2ICs0NTUsNTcgQEAgaW5fcGNicmVtbGJn
cm91cGhhc2goc3RydWN0IGlucGNiICppbnApCiAJfQogfQogCitpbnQKK2luX3BjYmxiZ3JvdXBf
bnVtYShzdHJ1Y3QgaW5wY2IgKmlucCkKK3sKKwlzdHJ1Y3QgaW5wY2JpbmZvICpwY2JpbmZvOwor
CXN0cnVjdCBpbnBjYmxiZ3JvdXBoZWFkICpoZHI7CisJc3RydWN0IGlucGNibGJncm91cCAqZ3Jw
OworCWludCBlcnIsIGksIG51bWFfZG9tYWluOworCisJcGNiaW5mbyA9IGlucC0+aW5wX3BjYmlu
Zm87CisKKwllcnIgPSBFTk9FTlQ7CisJbnVtYV9kb21haW4gPSBpbl9wY2JnZXRkb20oKTsKKwlp
ZiAobnVtYV9kb21haW4gPT0gTV9OT0RPTSkKKwkJcmV0dXJuIChFSU5WQUwpOworCisJSU5QX1dM
T0NLX0FTU0VSVChpbnApOworCUlOUF9IQVNIX1dMT0NLKGlucC0+aW5wX3BjYmluZm8pOworCisK
KwloZHIgPSAmcGNiaW5mby0+aXBpX2xiZ3JvdXBoYXNoYmFzZVsKKwkgICAgSU5QX1BDQlBPUlRI
QVNIKGlucC0+aW5wX2xwb3J0LCBwY2JpbmZvLT5pcGlfbGJncm91cGhhc2htYXNrKV07CisJQ0tf
TElTVF9GT1JFQUNIKGdycCwgaGRyLCBpbF9saXN0KSB7CisJCWZvciAoaSA9IDA7IGkgPCBncnAt
PmlsX2lucGNudDsgKytpKSB7CisJCQlpZiAoZ3JwLT5pbF9pbnBbaV0gIT0gaW5wKQorCQkJCWNv
bnRpbnVlOworCisJCQlpZiAoZ3JwLT5pbF9udW1hX2RvbWFpbiA9PSBudW1hX2RvbWFpbikgewor
CQkJCWVyciA9IDA7CisJCQkJZ290byBhYm9ydF93aXRoX2hhc2hfd2xvY2s7CisJCQl9CisJCQlp
ZiAoZ3JwLT5pbF9udW1hX2RvbWFpbiAhPSBNX05PRE9NKSB7CisJCQkJc3RhdGljIGludCBsaW1p
dCA9IDU7CisJCQkJaWYgKGxpbWl0ID4gMCkgeworCQkJCQlsaW1pdC0tOworCQkJCQlwcmludGYo
ImRvbSAlZCAtPiAlZFxuIiwKKwkJCQkJICAgIGdycC0+aWxfbnVtYV9kb21haW4sIG51bWFfZG9t
YWluKTsKKwkJCQl9CisJCQl9CisJCQkvKiByZW1vdmUgaXQgZnJvbSB0aGUgb2xkIGdyb3VwICov
CisJCQlpbl9wY2JyZW1sYmdyb3VwaGFzaChpbnApOworCQkJLyogYWRkIGl0IHRvIHRoZSBuZXcg
Z3JvdXAgYmFzZWQgb24gbnVtYSBkb21haW4gKi8KKwkJCWluX3BjYmluc2xiZ3JvdXBoYXNoKGlu
cCk7CisJCQllcnIgPSAwOworCQkJZ290byBhYm9ydF93aXRoX2hhc2hfd2xvY2s7CisJCX0KKwl9
CithYm9ydF93aXRoX2hhc2hfd2xvY2s6CisJSU5QX0hBU0hfV1VOTE9DSyhpbnAtPmlucF9wY2Jp
bmZvKTsKKwlyZXR1cm4gKGVycik7Cit9CisKIC8qCiAgKiBEaWZmZXJlbnQgcHJvdG9jb2xzIGlu
aXRpYWxpemUgdGhlaXIgaW5wY2JzIGRpZmZlcmVudGx5IC0gZ2l2aW5nCiAgKiBkaWZmZXJlbnQg
bmFtZSB0byB0aGUgbG9jay4gIEJ1dCB0aGV5IGFsbCBhcmUgZGlzcG9zZWQgdGhlIHNhbWUuCkBA
IC0xMzQ1LDcgKzE0MjAsNyBAQCBpbl9wY2Jjb25uZWN0X3NldHVwKHN0cnVjdCBpbnBjYiAqaW5w
LCBzdHJ1Y3Qgc29ja2FkZHIgKm5hbSwKIAkJCXJldHVybiAoZXJyb3IpOwogCX0KIAlvaW5wID0g
aW5fcGNibG9va3VwX2hhc2hfbG9ja2VkKGlucC0+aW5wX3BjYmluZm8sIGZhZGRyLCBmcG9ydCwK
LQkgICAgbGFkZHIsIGxwb3J0LCAwLCBOVUxMKTsKKwkgICAgbGFkZHIsIGxwb3J0LCAwLCBOVUxM
LCBNX05PRE9NKTsKIAlpZiAob2lucCAhPSBOVUxMKSB7CiAJCWlmIChvaW5wcCAhPSBOVUxMKQog
CQkJKm9pbnBwID0gb2lucDsKQEAgLTE5NjAsOSArMjAzNSwxMCBAQCBpbl9wY2Jsb29rdXBfbG9j
YWwoc3RydWN0IGlucGNiaW5mbyAqcGNiaW5mbywgc3RydWN0IGluX2FkZHIgbGFkZHIsCiBzdGF0
aWMgX19ub2lubGluZSBzdHJ1Y3QgaW5wY2IgKgogaW5fcGNibG9va3VwX2xiZ3JvdXAoY29uc3Qg
c3RydWN0IGlucGNiaW5mbyAqcGNiaW5mbywKICAgICBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqbGFk
ZHIsIHVpbnQxNl90IGxwb3J0LCBjb25zdCBzdHJ1Y3QgaW5fYWRkciAqZmFkZHIsCi0gICAgdWlu
dDE2X3QgZnBvcnQsIGludCBsb29rdXBmbGFncykKKyAgICB1aW50MTZfdCBmcG9ydCwgaW50IGxv
b2t1cGZsYWdzLCBpbnQgbnVtYV9kb21haW4pCiB7CiAJc3RydWN0IGlucGNiICpsb2NhbF93aWxk
OworCXN0cnVjdCBpbnBjYiAqbnVtYV93aWxkOwogCWNvbnN0IHN0cnVjdCBpbnBjYmxiZ3JvdXBo
ZWFkICpoZHI7CiAJc3RydWN0IGlucGNibGJncm91cCAqZ3JwOwogCXVpbnQzMl90IGlkeDsKQEAg
LTE5ODIsNiArMjA1OCw3IEBAIGluX3BjYmxvb2t1cF9sYmdyb3VwKGNvbnN0IHN0cnVjdCBpbnBj
YmluZm8gKnBjYmluZm8sCiAJICogLSBMb2FkIGJhbGFuY2VkIGdyb3VwIGRvZXMgbm90IGNvbnRh
aW4gSVB2NCBtYXBwZWQgSU5FVDYgd2lsZCBzb2NrZXRzCiAJICovCiAJbG9jYWxfd2lsZCA9IE5V
TEw7CisJbnVtYV93aWxkID0gTlVMTDsKIAlDS19MSVNUX0ZPUkVBQ0goZ3JwLCBoZHIsIGlsX2xp
c3QpIHsKICNpZmRlZiBJTkVUNgogCQlpZiAoIShncnAtPmlsX3ZmbGFnICYgSU5QX0lQVjQpKQpA
QCAtMTk5MiwxMiArMjA2OSwyNCBAQCBpbl9wY2Jsb29rdXBfbGJncm91cChjb25zdCBzdHJ1Y3Qg
aW5wY2JpbmZvICpwY2JpbmZvLAogCiAJCWlkeCA9IElOUF9QQ0JMQkdST1VQX1BLVEhBU0goZmFk
ZHItPnNfYWRkciwgbHBvcnQsIGZwb3J0KSAlCiAJCSAgICBncnAtPmlsX2lucGNudDsKLQkJaWYg
KGdycC0+aWxfbGFkZHIuc19hZGRyID09IGxhZGRyLT5zX2FkZHIpCi0JCQlyZXR1cm4gKGdycC0+
aWxfaW5wW2lkeF0pOworCQlpZiAoZ3JwLT5pbF9sYWRkci5zX2FkZHIgPT0gbGFkZHItPnNfYWRk
cikgeworCQkJaWYgKG51bWFfZG9tYWluID09IE1fTk9ET00gfHwKKwkJCSAgICBncnAtPmlsX251
bWFfZG9tYWluID09IG51bWFfZG9tYWluKSB7CisJCQkJcmV0dXJuIChncnAtPmlsX2lucFtpZHhd
KTsKKwkJCX0gZWxzZQorCQkJCW51bWFfd2lsZCA9IGdycC0+aWxfaW5wW2lkeF07CisJCX0KIAkJ
aWYgKGdycC0+aWxfbGFkZHIuc19hZGRyID09IElOQUREUl9BTlkgJiYKLQkJICAgIChsb29rdXBm
bGFncyAmIElOUExPT0tVUF9XSUxEQ0FSRCkgIT0gMCkKLQkJCWxvY2FsX3dpbGQgPSBncnAtPmls
X2lucFtpZHhdOworCQkgICAgKGxvb2t1cGZsYWdzICYgSU5QTE9PS1VQX1dJTERDQVJEKSAhPSAw
KSB7CisJCQlpZiAobG9jYWxfd2lsZCA9PSBOVUxMIHx8IG51bWFfZG9tYWluID09IE1fTk9ET00p
CisJCQkJbG9jYWxfd2lsZCA9IGdycC0+aWxfaW5wW2lkeF07CisJCQlpZiAoZ3JwLT5pbF9udW1h
X2RvbWFpbiA9PSBudW1hX2RvbWFpbikKKwkJCQlsb2NhbF93aWxkID0gZ3JwLT5pbF9pbnBbaWR4
XTsKKwkJfQogCX0KKwlpZiAobnVtYV93aWxkICE9IE5VTEwpCisJCXJldHVybiAobnVtYV93aWxk
KTsKKwogCXJldHVybiAobG9jYWxfd2lsZCk7CiB9CiAKQEAgLTIyNDQsNyArMjMzMyw3IEBAIGlu
X3BjYmxvb2t1cF9ncm91cChzdHJ1Y3QgaW5wY2JpbmZvICpwY2JpbmZvLCBzdHJ1Y3QgaW5wY2Jn
cm91cCAqcGNiZ3JvdXAsCiBzdGF0aWMgc3RydWN0IGlucGNiICoKIGluX3BjYmxvb2t1cF9oYXNo
X2xvY2tlZChzdHJ1Y3QgaW5wY2JpbmZvICpwY2JpbmZvLCBzdHJ1Y3QgaW5fYWRkciBmYWRkciwK
ICAgICB1X2ludCBmcG9ydF9hcmcsIHN0cnVjdCBpbl9hZGRyIGxhZGRyLCB1X2ludCBscG9ydF9h
cmcsIGludCBsb29rdXBmbGFncywKLSAgICBzdHJ1Y3QgaWZuZXQgKmlmcCkKKyAgICBzdHJ1Y3Qg
aWZuZXQgKmlmcCwgaW50IG51bWFfZG9tYWluKQogewogCXN0cnVjdCBpbnBjYmhlYWQgKmhlYWQ7
CiAJc3RydWN0IGlucGNiICppbnAsICp0bXBpbnA7CkBAIC0yMjkxLDcgKzIzODAsNyBAQCBpbl9w
Y2Jsb29rdXBfaGFzaF9sb2NrZWQoc3RydWN0IGlucGNiaW5mbyAqcGNiaW5mbywgc3RydWN0IGlu
X2FkZHIgZmFkZHIsCiAJICovCiAJaWYgKChsb29rdXBmbGFncyAmIElOUExPT0tVUF9XSUxEQ0FS
RCkgIT0gMCkgewogCQlpbnAgPSBpbl9wY2Jsb29rdXBfbGJncm91cChwY2JpbmZvLCAmbGFkZHIs
IGxwb3J0LCAmZmFkZHIsCi0JCSAgICBmcG9ydCwgbG9va3VwZmxhZ3MpOworCQkgICAgZnBvcnQs
IGxvb2t1cGZsYWdzLCBudW1hX2RvbWFpbik7CiAJCWlmIChpbnAgIT0gTlVMTCkKIAkJCXJldHVy
biAoaW5wKTsKIAl9CkBAIC0yMzc4LDEzICsyNDY3LDE0IEBAIGluX3BjYmxvb2t1cF9oYXNoX2xv
Y2tlZChzdHJ1Y3QgaW5wY2JpbmZvICpwY2JpbmZvLCBzdHJ1Y3QgaW5fYWRkciBmYWRkciwKIHN0
YXRpYyBzdHJ1Y3QgaW5wY2IgKgogaW5fcGNibG9va3VwX2hhc2goc3RydWN0IGlucGNiaW5mbyAq
cGNiaW5mbywgc3RydWN0IGluX2FkZHIgZmFkZHIsCiAgICAgdV9pbnQgZnBvcnQsIHN0cnVjdCBp
bl9hZGRyIGxhZGRyLCB1X2ludCBscG9ydCwgaW50IGxvb2t1cGZsYWdzLAotICAgIHN0cnVjdCBp
Zm5ldCAqaWZwKQorICAgIHN0cnVjdCBpZm5ldCAqaWZwLCBpbnQgbnVtYV9kb21haW4pCiB7CiAJ
c3RydWN0IGlucGNiICppbnA7CiAKIAlJTlBfSEFTSF9STE9DSyhwY2JpbmZvKTsKIAlpbnAgPSBp
bl9wY2Jsb29rdXBfaGFzaF9sb2NrZWQocGNiaW5mbywgZmFkZHIsIGZwb3J0LCBsYWRkciwgbHBv
cnQsCi0JICAgIChsb29rdXBmbGFncyAmIH4oSU5QTE9PS1VQX1JMT0NLUENCIHwgSU5QTE9PS1VQ
X1dMT0NLUENCKSksIGlmcCk7CisJICAgIChsb29rdXBmbGFncyAmIH4oSU5QTE9PS1VQX1JMT0NL
UENCIHwgSU5QTE9PS1VQX1dMT0NLUENCKSksIGlmcCwKKwkgICAgbnVtYV9kb21haW4pOwogCWlm
IChpbnAgIT0gTlVMTCkgewogCQlpZiAobG9va3VwZmxhZ3MgJiBJTlBMT09LVVBfV0xPQ0tQQ0Ip
IHsKIAkJCUlOUF9XTE9DSyhpbnApOwpAQCAtMjQ1MSw3ICsyNTQxLDcgQEAgaW5fcGNibG9va3Vw
KHN0cnVjdCBpbnBjYmluZm8gKnBjYmluZm8sIHN0cnVjdCBpbl9hZGRyIGZhZGRyLCB1X2ludCBm
cG9ydCwKIAl9CiAjZW5kaWYKIAlyZXR1cm4gKGluX3BjYmxvb2t1cF9oYXNoKHBjYmluZm8sIGZh
ZGRyLCBmcG9ydCwgbGFkZHIsIGxwb3J0LAotCSAgICBsb29rdXBmbGFncywgaWZwKSk7CisJICAg
IGxvb2t1cGZsYWdzLCBpZnAsIE1fTk9ET00pKTsKIH0KIAogc3RydWN0IGlucGNiICoKQEAgLTI0
OTMsNyArMjU4Myw3IEBAIGluX3BjYmxvb2t1cF9tYnVmKHN0cnVjdCBpbnBjYmluZm8gKnBjYmlu
Zm8sIHN0cnVjdCBpbl9hZGRyIGZhZGRyLAogCX0KICNlbmRpZgogCXJldHVybiAoaW5fcGNibG9v
a3VwX2hhc2gocGNiaW5mbywgZmFkZHIsIGZwb3J0LCBsYWRkciwgbHBvcnQsCi0JICAgIGxvb2t1
cGZsYWdzLCBpZnApKTsKKwkgICAgbG9va3VwZmxhZ3MsIGlmcCwgbS0+bV9wa3RoZHIubnVtYV9k
b21haW4pKTsKIH0KICNlbmRpZiAvKiBJTkVUICovCiAKZGlmZiAtLWdpdCBhL0ZyZWVCU0Qvc3lz
L25ldGluZXQvaW5fcGNiLmggYi9GcmVlQlNEL3N5cy9uZXRpbmV0L2luX3BjYi5oCmluZGV4IDM2
MDFlYTA3YTA1OC4uMDUwNWM4YjNlMjU2IDEwMDY0NAotLS0gYS9GcmVlQlNEL3N5cy9uZXRpbmV0
L2luX3BjYi5oCisrKyBiL0ZyZWVCU0Qvc3lzL25ldGluZXQvaW5fcGNiLmgKQEAgLTU3Miw3ICs1
NzIsNyBAQCBzdHJ1Y3QgaW5wY2JsYmdyb3VwIHsKIAlzdHJ1Y3QgZXBvY2hfY29udGV4dCBpbF9l
cG9jaF9jdHg7CiAJdWludDE2X3QJaWxfbHBvcnQ7CQkJLyogKGMpICovCiAJdV9jaGFyCQlpbF92
ZmxhZzsJCQkvKiAoYykgKi8KLQl1X2NoYXIJCWlsX3BhZDsKKwl1X2NoYXIJCWlsX251bWFfZG9t
YWluOwogCXVpbnQzMl90CWlsX3BhZDI7CiAJdW5pb24gaW5fZGVwZW5kYWRkciBpbF9kZXBlbmRs
YWRkcjsJCS8qIChjKSAqLwogI2RlZmluZQlpbF9sYWRkcglpbF9kZXBlbmRsYWRkci5pZDQ2X2Fk
ZHIuaWE0Nl9hZGRyNApAQCAtODYwLDYgKzg2MCw3IEBAIGludAlpbl9wY2JpbnNoYXNoKHN0cnVj
dCBpbnBjYiAqKTsKIGludAlpbl9wY2JpbnNoYXNoX25vcGNiZ3JvdXAoc3RydWN0IGlucGNiICop
OwogaW50CWluX3BjYmxhZGRyKHN0cnVjdCBpbnBjYiAqLCBzdHJ1Y3QgaW5fYWRkciAqLCBzdHJ1
Y3QgaW5fYWRkciAqLAogCSAgICBzdHJ1Y3QgdWNyZWQgKik7CitpbnQJaW5fcGNibGJncm91cF9u
dW1hKHN0cnVjdCBpbnBjYiAqKTsKIHN0cnVjdCBpbnBjYiAqCiAJaW5fcGNibG9va3VwX2xvY2Fs
KHN0cnVjdCBpbnBjYmluZm8gKiwKIAkgICAgc3RydWN0IGluX2FkZHIsIHVfc2hvcnQsIGludCwg
c3RydWN0IHVjcmVkICopOwpkaWZmIC0tZ2l0IGEvRnJlZUJTRC9zeXMvbmV0aW5ldC90Y3AuaCBi
L0ZyZWVCU0Qvc3lzL25ldGluZXQvdGNwLmgKaW5kZXggZmUxMjNmZWYzZGVmLi5hMWYxNzIyM2Y1
YjIgMTAwNjQ0Ci0tLSBhL0ZyZWVCU0Qvc3lzL25ldGluZXQvdGNwLmgKKysrIGIvRnJlZUJTRC9z
eXMvbmV0aW5ldC90Y3AuaApAQCAtMTk0LDYgKzE5NCw3IEBAIHN0cnVjdCB0Y3BoZHIgewogI2Rl
ZmluZQlUQ1BfS0VFUENOVAkxMDI0CS8qIEwsTiBudW1iZXIgb2Yga2VlcGFsaXZlcyBiZWZvcmUg
Y2xvc2UgKi8KICNkZWZpbmUJVENQX0ZBU1RPUEVOCTEwMjUJLyogZW5hYmxlIFRGTyAvIHdhcyBj
cmVhdGVkIHZpYSBURk8gKi8KICNkZWZpbmUJVENQX1RMU19FTkFCTEUJMTAyNgkvKiBUTFMgQ3J5
cHQgZW5hYmxlICovCisjZGVmaW5lCVRDUF9SRVVTUE9SVF9MQl9OVU1BICAgMTAyNwkvKiBzZXQg
bGlzdGVuIHNvY2tldCBudW1hIGRvbWFpbiAqLwogCiAjZGVmaW5lIFRDUF9SQUNLX1BST1AJICAg
ICAgMTA1MSAvKiBSQUNLIHByb3BvcnRpb25hbCByYXRlIHJlZHVjdGlvbiAoYm9vbCkgKi8KICNk
ZWZpbmUgVENQX1JBQ0tfVExQX1JFRFVDRSAgIDEwNTIgLyogUkFDSyBUTFAgY3duZCByZWR1Y3Rp
b24gKGJvb2wpICovCkBAIC0yNjAsNiArMjYxLDcgQEAgc3RydWN0IHRjcGhkciB7CiAjZGVmaW5l
IFRDUF9CQlJfTUlOX1RPUEFDRU9VVCAgMTEwOQkvKiBEbyB3ZSBzdXNwZW5kIHBhY2luZyB1bnRp
bCAqLwogI2RlZmluZSBUQ1BfQkJSX1RTVE1QX1JBSVNFUyAgIDExMTAJLyogQ2FuIGEgdGltZXN0
YW1wIG1lYXN1cmVtZW50IHJhaXNlIHRoZSBiL3cgKi8KIAorCiAjZGVmaW5lCVRDUF9QQ0FQX09V
VAkyMDQ4CS8qIG51bWJlciBvZiBvdXRwdXQgcGFja2V0cyB0byBrZWVwICovCiAjZGVmaW5lCVRD
UF9QQ0FQX0lOCTQwOTYJLyogbnVtYmVyIG9mIGlucHV0IHBhY2tldHMgdG8ga2VlcCAqLwogI2Rl
ZmluZSBUQ1BfRlVOQ1RJT05fQkxLIDgxOTIJLyogU2V0IHRoZSB0Y3AgZnVuY3Rpb24gcG9pbnRl
cnMgdG8gdGhlIHNwZWNpZmllZCBzdGFjayAqLwpkaWZmIC0tZ2l0IGEvRnJlZUJTRC9zeXMvbmV0
aW5ldC90Y3BfdXNycmVxLmMgYi9GcmVlQlNEL3N5cy9uZXRpbmV0L3RjcF91c3JyZXEuYwppbmRl
eCA3NTg1YjhlZDRiOTkuLmU2NzI1OGQ1ZTg5OSAxMDA2NDQKLS0tIGEvRnJlZUJTRC9zeXMvbmV0
aW5ldC90Y3BfdXNycmVxLmMKKysrIGIvRnJlZUJTRC9zeXMvbmV0aW5ldC90Y3BfdXNycmVxLmMK
QEAgLTIwOTIsNiArMjA5MiwxNyBAQCB0Y3BfZGVmYXVsdF9jdGxvdXRwdXQoc3RydWN0IHNvY2tl
dCAqc28sIHN0cnVjdCBzb2Nrb3B0ICpzb3B0LCBzdHJ1Y3QgaW5wY2IgKmlucAogCQkJSU5QX1dV
TkxPQ0soaW5wKTsKIAkJCWJyZWFrOwogCisJCWNhc2UgVENQX1JFVVNQT1JUX0xCX05VTUE6CisJ
CQlJTlBfV1VOTE9DSyhpbnApOworCQkJZXJyb3IgPSBzb29wdGNvcHlpbihzb3B0LCAmb3B0dmFs
LCBzaXplb2Yob3B0dmFsKSwKKwkJCSAgICBzaXplb2Yob3B0dmFsKSk7CisJCQlJTlBfV0xPQ0tf
UkVDSEVDSyhpbnApOworCQkJaWYgKCFlcnJvcikKKwkJCQllcnJvciA9IGluX3BjYmxiZ3JvdXBf
bnVtYShpbnApOworCQkJdGNwX2xvZ19zb2NrZXRfb3B0aW9uKHRwLCBzb3B0LT5zb3B0X25hbWUs
IDAsIGVycm9yKTsKKwkJCUlOUF9XVU5MT0NLKGlucCk7CisJCQlicmVhazsKKwogCQljYXNlIFRD
UF9NQVhVTkFDS1RJTUU6CiAJCWNhc2UgVENQX0tFRVBJRExFOgogCQljYXNlIFRDUF9LRUVQSU5U
Vkw6CmRpZmYgLS1naXQgYS9GcmVlQlNEL3N5cy9uZXRpbmV0Ni9pbjZfcGNiLmMgYi9GcmVlQlNE
L3N5cy9uZXRpbmV0Ni9pbjZfcGNiLmMKaW5kZXggOTEyMTUyMmYyMWMxLi5hNGI4MjU1M2YxYzUg
MTAwNjQ0Ci0tLSBhL0ZyZWVCU0Qvc3lzL25ldGluZXQ2L2luNl9wY2IuYworKysgYi9GcmVlQlNE
L3N5cy9uZXRpbmV0Ni9pbjZfcGNiLmMKQEAgLTExMyw3ICsxMTMsNyBAQCBfX0ZCU0RJRCgiJEZy
ZWVCU0QkIik7CiAjaW5jbHVkZSA8bmV0aW5ldDYvc2NvcGU2X3Zhci5oPgogCiBzdGF0aWMgc3Ry
dWN0IGlucGNiICppbjZfcGNibG9va3VwX2hhc2hfbG9ja2VkKHN0cnVjdCBpbnBjYmluZm8gKiwK
LSAgICBzdHJ1Y3QgaW42X2FkZHIgKiwgdV9pbnQsIHN0cnVjdCBpbjZfYWRkciAqLCB1X2ludCwg
aW50LCBzdHJ1Y3QgaWZuZXQgKik7CisgICAgc3RydWN0IGluNl9hZGRyICosIHVfaW50LCBzdHJ1
Y3QgaW42X2FkZHIgKiwgdV9pbnQsIGludCwgc3RydWN0IGlmbmV0ICosIGludCk7CiAKIGludAog
aW42X3BjYmJpbmQoc3RydWN0IGlucGNiICppbnAsIHN0cnVjdCBzb2NrYWRkciAqbmFtLApAQCAt
NDMzLDcgKzQzMyw3IEBAIGluNl9wY2Jjb25uZWN0X21idWYoc3RydWN0IGlucGNiICppbnAsIHN0
cnVjdCBzb2NrYWRkciAqbmFtLAogCQkJICAgICAgIHNpbjYtPnNpbjZfcG9ydCwKIAkJCSAgICAg
IElONl9JU19BRERSX1VOU1BFQ0lGSUVEKCZpbnAtPmluNnBfbGFkZHIpCiAJCQkgICAgICA/ICZh
ZGRyNiA6ICZpbnAtPmluNnBfbGFkZHIsCi0JCQkgICAgICBpbnAtPmlucF9scG9ydCwgMCwgTlVM
TCkgIT0gTlVMTCkgeworCQkJICAgICAgaW5wLT5pbnBfbHBvcnQsIDAsIE5VTEwsIE1fTk9ET00p
ICE9IE5VTEwpIHsKIAkJcmV0dXJuIChFQUREUklOVVNFKTsKIAl9CiAJaWYgKElONl9JU19BRERS
X1VOU1BFQ0lGSUVEKCZpbnAtPmluNnBfbGFkZHIpKSB7CkBAIC04NzEsOSArODcxLDkgQEAgaW42
X3J0Y2hhbmdlKHN0cnVjdCBpbnBjYiAqaW5wLCBpbnQgZXJybm8gX191bnVzZWQpCiBzdGF0aWMg
c3RydWN0IGlucGNiICoKIGluNl9wY2Jsb29rdXBfbGJncm91cChjb25zdCBzdHJ1Y3QgaW5wY2Jp
bmZvICpwY2JpbmZvLAogICAgIGNvbnN0IHN0cnVjdCBpbjZfYWRkciAqbGFkZHIsIHVpbnQxNl90
IGxwb3J0LCBjb25zdCBzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyLAotICAgIHVpbnQxNl90IGZwb3J0
LCBpbnQgbG9va3VwZmxhZ3MpCisgICAgdWludDE2X3QgZnBvcnQsIGludCBsb29rdXBmbGFncywg
aW50IG51bWFfZG9tYWluKQogewotCXN0cnVjdCBpbnBjYiAqbG9jYWxfd2lsZDsKKwlzdHJ1Y3Qg
aW5wY2IgKmxvY2FsX3dpbGQsICpudW1hX3dpbGQ7CiAJY29uc3Qgc3RydWN0IGlucGNibGJncm91
cGhlYWQgKmhkcjsKIAlzdHJ1Y3QgaW5wY2JsYmdyb3VwICpncnA7CiAJdWludDMyX3QgaWR4OwpA
QCAtODkzLDYgKzg5Myw3IEBAIGluNl9wY2Jsb29rdXBfbGJncm91cChjb25zdCBzdHJ1Y3QgaW5w
Y2JpbmZvICpwY2JpbmZvLAogCSAqIC0gTG9hZCBiYWxhbmNlZCBkb2VzIG5vdCBjb250YWluIElQ
djQgbWFwcGVkIElORVQ2IHdpbGQgc29ja2V0cy4KIAkgKi8KIAlsb2NhbF93aWxkID0gTlVMTDsK
KwludW1hX3dpbGQgPSBOVUxMOwogCUNLX0xJU1RfRk9SRUFDSChncnAsIGhkciwgaWxfbGlzdCkg
ewogI2lmZGVmIElORVQKIAkJaWYgKCEoZ3JwLT5pbF92ZmxhZyAmIElOUF9JUFY2KSkKQEAgLTkw
MywxMiArOTA0LDI0IEBAIGluNl9wY2Jsb29rdXBfbGJncm91cChjb25zdCBzdHJ1Y3QgaW5wY2Jp
bmZvICpwY2JpbmZvLAogCiAJCWlkeCA9IElOUF9QQ0JMQkdST1VQX1BLVEhBU0goSU5QNl9QQ0JI
QVNIS0VZKGZhZGRyKSwgbHBvcnQsCiAJCSAgICBmcG9ydCkgJSBncnAtPmlsX2lucGNudDsKLQkJ
aWYgKElONl9BUkVfQUREUl9FUVVBTCgmZ3JwLT5pbDZfbGFkZHIsIGxhZGRyKSkKLQkJCXJldHVy
biAoZ3JwLT5pbF9pbnBbaWR4XSk7CisJCWlmIChJTjZfQVJFX0FERFJfRVFVQUwoJmdycC0+aWw2
X2xhZGRyLCBsYWRkcikpIHsKKwkJCWlmIChudW1hX2RvbWFpbiA9PSBNX05PRE9NIHx8CisJCQkg
ICAgZ3JwLT5pbF9udW1hX2RvbWFpbiA9PSBudW1hX2RvbWFpbikgeworCQkJCXJldHVybiAoZ3Jw
LT5pbF9pbnBbaWR4XSk7CisJCQl9CisJCQllbHNlCisJCQkJbnVtYV93aWxkID0gZ3JwLT5pbF9p
bnBbaWR4XTsKKwkJfQogCQlpZiAoSU42X0lTX0FERFJfVU5TUEVDSUZJRUQoJmdycC0+aWw2X2xh
ZGRyKSAmJgotCQkgICAgKGxvb2t1cGZsYWdzICYgSU5QTE9PS1VQX1dJTERDQVJEKSAhPSAwKQot
CQkJbG9jYWxfd2lsZCA9IGdycC0+aWxfaW5wW2lkeF07CisJCSAgICAobG9va3VwZmxhZ3MgJiBJ
TlBMT09LVVBfV0lMRENBUkQpICE9IDApIHsKKwkJCWlmIChsb2NhbF93aWxkID09IE5VTEwgfHwg
bnVtYV9kb21haW4gPT0gTV9OT0RPTSkKKwkJCQlsb2NhbF93aWxkID0gZ3JwLT5pbF9pbnBbaWR4
XTsKKwkJCWlmIChncnAtPmlsX251bWFfZG9tYWluID09IG51bWFfZG9tYWluKQorCQkJCWxvY2Fs
X3dpbGQgPSBncnAtPmlsX2lucFtpZHhdOworCQl9CiAJfQorCWlmIChudW1hX3dpbGQgIT0gTlVM
TCkKKwkJcmV0dXJuIChudW1hX3dpbGQpOwogCXJldHVybiAobG9jYWxfd2lsZCk7CiB9CiAKQEAg
LTExMTksNyArMTEzMiw3IEBAIGluNl9wY2Jsb29rdXBfZ3JvdXAoc3RydWN0IGlucGNiaW5mbyAq
cGNiaW5mbywgc3RydWN0IGlucGNiZ3JvdXAgKnBjYmdyb3VwLAogc3RhdGljIHN0cnVjdCBpbnBj
YiAqCiBpbjZfcGNibG9va3VwX2hhc2hfbG9ja2VkKHN0cnVjdCBpbnBjYmluZm8gKnBjYmluZm8s
IHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsCiAgICAgdV9pbnQgZnBvcnRfYXJnLCBzdHJ1Y3QgaW42
X2FkZHIgKmxhZGRyLCB1X2ludCBscG9ydF9hcmcsCi0gICAgaW50IGxvb2t1cGZsYWdzLCBzdHJ1
Y3QgaWZuZXQgKmlmcCkKKyAgICBpbnQgbG9va3VwZmxhZ3MsIHN0cnVjdCBpZm5ldCAqaWZwLCBp
bnQgbnVtYV9kb21haW4pCiB7CiAJc3RydWN0IGlucGNiaGVhZCAqaGVhZDsKIAlzdHJ1Y3QgaW5w
Y2IgKmlucCwgKnRtcGlucDsKQEAgLTExNjMsNyArMTE3Niw3IEBAIGluNl9wY2Jsb29rdXBfaGFz
aF9sb2NrZWQoc3RydWN0IGlucGNiaW5mbyAqcGNiaW5mbywgc3RydWN0IGluNl9hZGRyICpmYWRk
ciwKIAkgKi8KIAlpZiAoKGxvb2t1cGZsYWdzICYgSU5QTE9PS1VQX1dJTERDQVJEKSAhPSAwKSB7
CiAJCWlucCA9IGluNl9wY2Jsb29rdXBfbGJncm91cChwY2JpbmZvLCBsYWRkciwgbHBvcnQsIGZh
ZGRyLAotCQkgICAgZnBvcnQsIGxvb2t1cGZsYWdzKTsKKwkJICAgIGZwb3J0LCBsb29rdXBmbGFn
cywgbnVtYV9kb21haW4pOwogCQlpZiAoaW5wICE9IE5VTEwpCiAJCQlyZXR1cm4gKGlucCk7CiAJ
fQpAQCAtMTI0MSwxMyArMTI1NCwxNCBAQCBpbjZfcGNibG9va3VwX2hhc2hfbG9ja2VkKHN0cnVj
dCBpbnBjYmluZm8gKnBjYmluZm8sIHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsCiBzdGF0aWMgc3Ry
dWN0IGlucGNiICoKIGluNl9wY2Jsb29rdXBfaGFzaChzdHJ1Y3QgaW5wY2JpbmZvICpwY2JpbmZv
LCBzdHJ1Y3QgaW42X2FkZHIgKmZhZGRyLAogICAgIHVfaW50IGZwb3J0LCBzdHJ1Y3QgaW42X2Fk
ZHIgKmxhZGRyLCB1X2ludCBscG9ydCwgaW50IGxvb2t1cGZsYWdzLAotICAgIHN0cnVjdCBpZm5l
dCAqaWZwKQorICAgIHN0cnVjdCBpZm5ldCAqaWZwLCBpbnQgbnVtYV9kb21haW4pCiB7CiAJc3Ry
dWN0IGlucGNiICppbnA7CiAKIAlJTlBfSEFTSF9STE9DSyhwY2JpbmZvKTsKIAlpbnAgPSBpbjZf
cGNibG9va3VwX2hhc2hfbG9ja2VkKHBjYmluZm8sIGZhZGRyLCBmcG9ydCwgbGFkZHIsIGxwb3J0
LAotCSAgICAobG9va3VwZmxhZ3MgJiB+KElOUExPT0tVUF9STE9DS1BDQiB8IElOUExPT0tVUF9X
TE9DS1BDQikpLCBpZnApOworCSAgICAobG9va3VwZmxhZ3MgJiB+KElOUExPT0tVUF9STE9DS1BD
QiB8IElOUExPT0tVUF9XTE9DS1BDQikpLCBpZnAsCisJICAgIG51bWFfZG9tYWluKTsKIAlpZiAo
aW5wICE9IE5VTEwpIHsKIAkJaWYgKGxvb2t1cGZsYWdzICYgSU5QTE9PS1VQX1dMT0NLUENCKSB7
CiAJCQlJTlBfV0xPQ0soaW5wKTsKQEAgLTEzMTQsNyArMTMyOCw3IEBAIGluNl9wY2Jsb29rdXAo
c3RydWN0IGlucGNiaW5mbyAqcGNiaW5mbywgc3RydWN0IGluNl9hZGRyICpmYWRkciwgdV9pbnQg
ZnBvcnQsCiAJfQogI2VuZGlmCiAJcmV0dXJuIChpbjZfcGNibG9va3VwX2hhc2gocGNiaW5mbywg
ZmFkZHIsIGZwb3J0LCBsYWRkciwgbHBvcnQsCi0JICAgIGxvb2t1cGZsYWdzLCBpZnApKTsKKwkg
ICAgbG9va3VwZmxhZ3MsIGlmcCwgTV9OT0RPTSkpOwogfQogCiBzdHJ1Y3QgaW5wY2IgKgpAQCAt
MTM1Niw3ICsxMzcwLDcgQEAgaW42X3BjYmxvb2t1cF9tYnVmKHN0cnVjdCBpbnBjYmluZm8gKnBj
YmluZm8sIHN0cnVjdCBpbjZfYWRkciAqZmFkZHIsCiAJfQogI2VuZGlmCiAJcmV0dXJuIChpbjZf
cGNibG9va3VwX2hhc2gocGNiaW5mbywgZmFkZHIsIGZwb3J0LCBsYWRkciwgbHBvcnQsCi0JICAg
IGxvb2t1cGZsYWdzLCBpZnApKTsKKwkgICAgbG9va3VwZmxhZ3MsIGlmcCwgbS0+bV9wa3RoZHIu
bnVtYV9kb21haW4pKTsKIH0KIAogdm9pZAo=
--00000000000026ab950587fd2a3a--



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?CADLQ3sJg0wiqn_zg9bVvxJA5JQFZZVKJpZYt_g1xBk5k%2B9xLMw>