From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH 15/25] memremap: provide an optional internal refcount in struct dev_pagemap Date: Wed, 26 Jun 2019 14:27:14 +0200 Message-ID: <20190626122724.13313-16-hch@lst.de> References: <20190626122724.13313-1-hch@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190626122724.13313-1-hch-jcswGhMUV9g@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org, linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: dri-devel@lists.freedesktop.org UHJvdmlkZSBhbiBpbnRlcm5hbCByZWZjb3VudGluZyBsb2dpYyBpZiBubyAtPnJlZiBmaWVsZCBp cyBwcm92aWRlZAppbiB0aGUgcGFnZW1hcCBwYXNzZWQgaW50byBkZXZtX21lbXJlbWFwX3BhZ2Vz IHNvIHRoYXQgY2FsbGVycyBkb24ndApoYXZlIHRvIHJlaW52ZW50IGl0IHBvb3JseS4KClNpZ25l ZC1vZmYtYnk6IENocmlzdG9waCBIZWxsd2lnIDxoY2hAbHN0LmRlPgotLS0KIGluY2x1ZGUvbGlu dXgvbWVtcmVtYXAuaCAgICAgICAgICB8ICA0ICsrCiBrZXJuZWwvbWVtcmVtYXAuYyAgICAgICAg ICAgICAgICAgfCA2NCArKysrKysrKysrKysrKysrKysrKysrKystLS0tLS0tCiB0b29scy90ZXN0 aW5nL252ZGltbS90ZXN0L2lvbWFwLmMgfCA1OCArKysrKysrKysrKysrKysrKysrKysrLS0tLS0t CiAzIGZpbGVzIGNoYW5nZWQsIDEwMSBpbnNlcnRpb25zKCspLCAyNSBkZWxldGlvbnMoLSkKCmRp ZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21lbXJlbWFwLmggYi9pbmNsdWRlL2xpbnV4L21lbXJl bWFwLmgKaW5kZXggZTI1Njg1Yjg3OGU5Li5mOGE1YjJhMTk5NDUgMTAwNjQ0Ci0tLSBhL2luY2x1 ZGUvbGludXgvbWVtcmVtYXAuaAorKysgYi9pbmNsdWRlL2xpbnV4L21lbXJlbWFwLmgKQEAgLTk1 LDYgKzk1LDggQEAgc3RydWN0IGRldl9wYWdlbWFwX29wcyB7CiAgKiBAYWx0bWFwOiBwcmUtYWxs b2NhdGVkL3Jlc2VydmVkIG1lbW9yeSBmb3Igdm1lbW1hcCBhbGxvY2F0aW9ucwogICogQHJlczog cGh5c2ljYWwgYWRkcmVzcyByYW5nZSBjb3ZlcmVkIGJ5IEByZWYKICAqIEByZWY6IHJlZmVyZW5j ZSBjb3VudCB0aGF0IHBpbnMgdGhlIGRldm1fbWVtcmVtYXBfcGFnZXMoKSBtYXBwaW5nCisgKiBA aW50ZXJuYWxfcmVmOiBpbnRlcm5hbCByZWZlcmVuY2UgaWYgQHJlZiBpcyBub3QgcHJvdmlkZWQg YnkgdGhlIGNhbGxlcgorICogQGRvbmU6IGNvbXBsZXRpb24gZm9yIEBpbnRlcm5hbF9yZWYKICAq IEBkZXY6IGhvc3QgZGV2aWNlIG9mIHRoZSBtYXBwaW5nIGZvciBkZWJ1ZwogICogQGRhdGE6IHBy aXZhdGUgZGF0YSBwb2ludGVyIGZvciBwYWdlX2ZyZWUoKQogICogQHR5cGU6IG1lbW9yeSB0eXBl OiBzZWUgTUVNT1JZXyogaW4gbWVtb3J5X2hvdHBsdWcuaApAQCAtMTA1LDYgKzEwNyw4IEBAIHN0 cnVjdCBkZXZfcGFnZW1hcCB7CiAJc3RydWN0IHZtZW1fYWx0bWFwIGFsdG1hcDsKIAlzdHJ1Y3Qg cmVzb3VyY2UgcmVzOwogCXN0cnVjdCBwZXJjcHVfcmVmICpyZWY7CisJc3RydWN0IHBlcmNwdV9y ZWYgaW50ZXJuYWxfcmVmOworCXN0cnVjdCBjb21wbGV0aW9uIGRvbmU7CiAJc3RydWN0IGRldmlj ZSAqZGV2OwogCWVudW0gbWVtb3J5X3R5cGUgdHlwZTsKIAl1bnNpZ25lZCBpbnQgZmxhZ3M7CmRp ZmYgLS1naXQgYS9rZXJuZWwvbWVtcmVtYXAuYyBiL2tlcm5lbC9tZW1yZW1hcC5jCmluZGV4IGVl ZTQ5MGU3ZDdlMS4uYmVhNmY4ODdhZGFkIDEwMDY0NAotLS0gYS9rZXJuZWwvbWVtcmVtYXAuYwor KysgYi9rZXJuZWwvbWVtcmVtYXAuYwpAQCAtMjksNyArMjksNyBAQCBzdGF0aWMgdm9pZCBkZXZt YXBfbWFuYWdlZF9lbmFibGVfcHV0KHZvaWQgKmRhdGEpCiAKIHN0YXRpYyBpbnQgZGV2bWFwX21h bmFnZWRfZW5hYmxlX2dldChzdHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfcGFnZW1hcCAq cGdtYXApCiB7Ci0JaWYgKCFwZ21hcC0+b3BzLT5wYWdlX2ZyZWUpIHsKKwlpZiAoIXBnbWFwLT5v cHMgfHwgIXBnbWFwLT5vcHMtPnBhZ2VfZnJlZSkgewogCQlXQVJOKDEsICJNaXNzaW5nIHBhZ2Vf ZnJlZSBtZXRob2RcbiIpOwogCQlyZXR1cm4gLUVJTlZBTDsKIAl9CkBAIC03NSw2ICs3NSwyNCBA QCBzdGF0aWMgdW5zaWduZWQgbG9uZyBwZm5fbmV4dCh1bnNpZ25lZCBsb25nIHBmbikKICNkZWZp bmUgZm9yX2VhY2hfZGV2aWNlX3BmbihwZm4sIG1hcCkgXAogCWZvciAocGZuID0gcGZuX2ZpcnN0 KG1hcCk7IHBmbiA8IHBmbl9lbmQobWFwKTsgcGZuID0gcGZuX25leHQocGZuKSkKIAorc3RhdGlj IHZvaWQgZGV2X3BhZ2VtYXBfa2lsbChzdHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwKQoreworCWlm IChwZ21hcC0+b3BzICYmIHBnbWFwLT5vcHMtPmtpbGwpCisJCXBnbWFwLT5vcHMtPmtpbGwocGdt YXApOworCWVsc2UKKwkJcGVyY3B1X3JlZl9raWxsKHBnbWFwLT5yZWYpOworfQorCitzdGF0aWMg dm9pZCBkZXZfcGFnZW1hcF9jbGVhbnVwKHN0cnVjdCBkZXZfcGFnZW1hcCAqcGdtYXApCit7CisJ aWYgKHBnbWFwLT5vcHMgJiYgcGdtYXAtPm9wcy0+Y2xlYW51cCkgeworCQlwZ21hcC0+b3BzLT5j bGVhbnVwKHBnbWFwKTsKKwl9IGVsc2UgeworCQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwZ21hcC0+ ZG9uZSk7CisJCXBlcmNwdV9yZWZfZXhpdChwZ21hcC0+cmVmKTsKKwl9Cit9CisKIHN0YXRpYyB2 b2lkIGRldm1fbWVtcmVtYXBfcGFnZXNfcmVsZWFzZSh2b2lkICpkYXRhKQogewogCXN0cnVjdCBk ZXZfcGFnZW1hcCAqcGdtYXAgPSBkYXRhOwpAQCAtODQsMTAgKzEwMiwxMCBAQCBzdGF0aWMgdm9p ZCBkZXZtX21lbXJlbWFwX3BhZ2VzX3JlbGVhc2Uodm9pZCAqZGF0YSkKIAl1bnNpZ25lZCBsb25n IHBmbjsKIAlpbnQgbmlkOwogCi0JcGdtYXAtPm9wcy0+a2lsbChwZ21hcCk7CisJZGV2X3BhZ2Vt YXBfa2lsbChwZ21hcCk7CiAJZm9yX2VhY2hfZGV2aWNlX3BmbihwZm4sIHBnbWFwKQogCQlwdXRf cGFnZShwZm5fdG9fcGFnZShwZm4pKTsKLQlwZ21hcC0+b3BzLT5jbGVhbnVwKHBnbWFwKTsKKwlk ZXZfcGFnZW1hcF9jbGVhbnVwKHBnbWFwKTsKIAogCS8qIHBhZ2VzIGFyZSBkZWFkIGFuZCB1bnVz ZWQsIHVuZG8gdGhlIGFyY2ggbWFwcGluZyAqLwogCWFsaWduX3N0YXJ0ID0gcmVzLT5zdGFydCAm IH4oU0VDVElPTl9TSVpFIC0gMSk7CkBAIC0xMTQsMjAgKzEzMiwyOSBAQCBzdGF0aWMgdm9pZCBk ZXZtX21lbXJlbWFwX3BhZ2VzX3JlbGVhc2Uodm9pZCAqZGF0YSkKIAkJICAgICAgIiVzOiBmYWls ZWQgdG8gZnJlZSBhbGwgcmVzZXJ2ZWQgcGFnZXNcbiIsIF9fZnVuY19fKTsKIH0KIAorc3RhdGlj IHZvaWQgZGV2X3BhZ2VtYXBfcGVyY3B1X3JlbGVhc2Uoc3RydWN0IHBlcmNwdV9yZWYgKnJlZikK K3sKKwlzdHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwID0KKwkJY29udGFpbmVyX29mKHJlZiwgc3Ry dWN0IGRldl9wYWdlbWFwLCBpbnRlcm5hbF9yZWYpOworCisJY29tcGxldGUoJnBnbWFwLT5kb25l KTsKK30KKwogLyoqCiAgKiBkZXZtX21lbXJlbWFwX3BhZ2VzIC0gcmVtYXAgYW5kIHByb3ZpZGUg bWVtbWFwIGJhY2tpbmcgZm9yIHRoZSBnaXZlbiByZXNvdXJjZQogICogQGRldjogaG9zdGluZyBk ZXZpY2UgZm9yIEByZXMKICAqIEBwZ21hcDogcG9pbnRlciB0byBhIHN0cnVjdCBkZXZfcGFnZW1h cAogICoKICAqIE5vdGVzOgotICogMS8gQXQgYSBtaW5pbXVtIHRoZSByZXMsIHJlZiBhbmQgdHlw ZSBhbmQgb3BzIG1lbWJlcnMgb2YgQHBnbWFwIG11c3QgYmUKLSAqICAgIGluaXRpYWxpemVkIGJ5 IHRoZSBjYWxsZXIgYmVmb3JlIHBhc3NpbmcgaXQgdG8gdGhpcyBmdW5jdGlvbgorICogMS8gQXQg YSBtaW5pbXVtIHRoZSByZXMgYW5kIHR5cGUgbWVtYmVycyBvZiBAcGdtYXAgbXVzdCBiZSBpbml0 aWFsaXplZAorICogICAgYnkgdGhlIGNhbGxlciBiZWZvcmUgcGFzc2luZyBpdCB0byB0aGlzIGZ1 bmN0aW9uCiAgKgogICogMi8gVGhlIGFsdG1hcCBmaWVsZCBtYXkgb3B0aW9uYWxseSBiZSBpbml0 aWFsaXplZCwgaW4gd2hpY2ggY2FzZQogICogICAgUEdNQVBfQUxUTUFQX1ZBTElEIG11c3QgYmUg c2V0IGluIHBnbWFwLT5mbGFncy4KICAqCi0gKiAzLyBwZ21hcC0+cmVmIG11c3QgYmUgJ2xpdmUn IG9uIGVudHJ5IGFuZCB3aWxsIGJlIGtpbGxlZCBhbmQgcmVhcGVkCi0gKiAgICBhdCBkZXZtX21l bXJlbWFwX3BhZ2VzX3JlbGVhc2UoKSB0aW1lLCBvciBpZiB0aGlzIHJvdXRpbmUgZmFpbHMuCisg KiAzLyBUaGUgcmVmIGZpZWxkIG1heSBvcHRpb25hbGx5IGJlIHByb3ZpZGVkLCBpbiB3aGljaCBw Z21hcC0+cmVmIG11c3QgYmUKKyAqICAgICdsaXZlJyBvbiBlbnRyeSBhbmQgd2lsbCBiZSBraWxs ZWQgYW5kIHJlYXBlZCBhdAorICogICAgZGV2bV9tZW1yZW1hcF9wYWdlc19yZWxlYXNlKCkgdGlt ZSwgb3IgaWYgdGhpcyByb3V0aW5lIGZhaWxzLgogICoKICAqIDQvIHJlcyBpcyBleHBlY3RlZCB0 byBiZSBhIGhvc3QgbWVtb3J5IHJhbmdlIHRoYXQgY291bGQgZmVhc2libHkgYmUKICAqICAgIHRy ZWF0ZWQgYXMgYSAiU3lzdGVtIFJBTSIgcmFuZ2UsIGkuZS4gbm90IGEgZGV2aWNlIG1taW8gcmFu Z2UsIGJ1dApAQCAtMTc1LDEwICsyMDIsMjEgQEAgdm9pZCAqZGV2bV9tZW1yZW1hcF9wYWdlcyhz dHJ1Y3QgZGV2aWNlICpkZXYsIHN0cnVjdCBkZXZfcGFnZW1hcCAqcGdtYXApCiAJCWJyZWFrOwog CX0KIAotCWlmICghcGdtYXAtPnJlZiB8fCAhcGdtYXAtPm9wcyB8fCAhcGdtYXAtPm9wcy0+a2ls bCB8fAotCSAgICAhcGdtYXAtPm9wcy0+Y2xlYW51cCkgewotCQlXQVJOKDEsICJNaXNzaW5nIHJl ZmVyZW5jZSBjb3VudCB0ZWFyZG93biBkZWZpbml0aW9uXG4iKTsKLQkJcmV0dXJuIEVSUl9QVFIo LUVJTlZBTCk7CisJaWYgKCFwZ21hcC0+cmVmKSB7CisJCWlmIChwZ21hcC0+b3BzICYmIChwZ21h cC0+b3BzLT5raWxsIHx8IHBnbWFwLT5vcHMtPmNsZWFudXApKQorCQkJcmV0dXJuIEVSUl9QVFIo LUVJTlZBTCk7CisKKwkJaW5pdF9jb21wbGV0aW9uKCZwZ21hcC0+ZG9uZSk7CisJCWVycm9yID0g cGVyY3B1X3JlZl9pbml0KCZwZ21hcC0+aW50ZXJuYWxfcmVmLAorCQkJCWRldl9wYWdlbWFwX3Bl cmNwdV9yZWxlYXNlLCAwLCBHRlBfS0VSTkVMKTsKKwkJaWYgKGVycm9yKQorCQkJcmV0dXJuIEVS Ul9QVFIoZXJyb3IpOworCQlwZ21hcC0+cmVmID0gJnBnbWFwLT5pbnRlcm5hbF9yZWY7CisJfSBl bHNlIHsKKwkJaWYgKCFwZ21hcC0+b3BzIHx8ICFwZ21hcC0+b3BzLT5raWxsIHx8ICFwZ21hcC0+ b3BzLT5jbGVhbnVwKSB7CisJCQlXQVJOKDEsICJNaXNzaW5nIHJlZmVyZW5jZSBjb3VudCB0ZWFy ZG93biBkZWZpbml0aW9uXG4iKTsKKwkJCXJldHVybiBFUlJfUFRSKC1FSU5WQUwpOworCQl9CiAJ fQogCiAJaWYgKG5lZWRfZGV2bWFwX21hbmFnZWQpIHsKQEAgLTI5Niw4ICszMzQsOCBAQCB2b2lk ICpkZXZtX21lbXJlbWFwX3BhZ2VzKHN0cnVjdCBkZXZpY2UgKmRldiwgc3RydWN0IGRldl9wYWdl bWFwICpwZ21hcCkKICBlcnJfcGZuX3JlbWFwOgogCXBnbWFwX2FycmF5X2RlbGV0ZShyZXMpOwog IGVycl9hcnJheToKLQlwZ21hcC0+b3BzLT5raWxsKHBnbWFwKTsKLQlwZ21hcC0+b3BzLT5jbGVh bnVwKHBnbWFwKTsKKwlkZXZfcGFnZW1hcF9raWxsKHBnbWFwKTsKKwlkZXZfcGFnZW1hcF9jbGVh bnVwKHBnbWFwKTsKIAlyZXR1cm4gRVJSX1BUUihlcnJvcik7CiB9CiBFWFBPUlRfU1lNQk9MX0dQ TChkZXZtX21lbXJlbWFwX3BhZ2VzKTsKZGlmZiAtLWdpdCBhL3Rvb2xzL3Rlc3RpbmcvbnZkaW1t L3Rlc3QvaW9tYXAuYyBiL3Rvb2xzL3Rlc3RpbmcvbnZkaW1tL3Rlc3QvaW9tYXAuYwppbmRleCA4 MmY5MDE1NjllMDYuLmNkMDQwYjVhYmZmZSAxMDA2NDQKLS0tIGEvdG9vbHMvdGVzdGluZy9udmRp bW0vdGVzdC9pb21hcC5jCisrKyBiL3Rvb2xzL3Rlc3RpbmcvbnZkaW1tL3Rlc3QvaW9tYXAuYwpA QCAtMTAwLDI2ICsxMDAsNjAgQEAgc3RhdGljIHZvaWQgbmZpdF90ZXN0X2tpbGwodm9pZCAqX3Bn bWFwKQogewogCXN0cnVjdCBkZXZfcGFnZW1hcCAqcGdtYXAgPSBfcGdtYXA7CiAKLQlXQVJOX09O KCFwZ21hcCB8fCAhcGdtYXAtPnJlZiB8fCAhcGdtYXAtPm9wcyB8fCAhcGdtYXAtPm9wcy0+a2ls bCB8fAotCQkhcGdtYXAtPm9wcy0+Y2xlYW51cCk7Ci0JcGdtYXAtPm9wcy0+a2lsbChwZ21hcCk7 Ci0JcGdtYXAtPm9wcy0+Y2xlYW51cChwZ21hcCk7CisJV0FSTl9PTighcGdtYXAgfHwgIXBnbWFw LT5yZWYpOworCisJaWYgKHBnbWFwLT5vcHMgJiYgcGdtYXAtPm9wcy0+a2lsbCkKKwkJcGdtYXAt Pm9wcy0+a2lsbChwZ21hcCk7CisJZWxzZQorCQlwZXJjcHVfcmVmX2tpbGwocGdtYXAtPnJlZik7 CisKKwlpZiAocGdtYXAtPm9wcyAmJiBwZ21hcC0+b3BzLT5jbGVhbnVwKSB7CisJCXBnbWFwLT5v cHMtPmNsZWFudXAocGdtYXApOworCX0gZWxzZSB7CisJCXdhaXRfZm9yX2NvbXBsZXRpb24oJnBn bWFwLT5kb25lKTsKKwkJcGVyY3B1X3JlZl9leGl0KHBnbWFwLT5yZWYpOworCX0KK30KKworc3Rh dGljIHZvaWQgZGV2X3BhZ2VtYXBfcGVyY3B1X3JlbGVhc2Uoc3RydWN0IHBlcmNwdV9yZWYgKnJl ZikKK3sKKwlzdHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwID0KKwkJY29udGFpbmVyX29mKHJlZiwg c3RydWN0IGRldl9wYWdlbWFwLCBpbnRlcm5hbF9yZWYpOworCisJY29tcGxldGUoJnBnbWFwLT5k b25lKTsKIH0KIAogdm9pZCAqX193cmFwX2Rldm1fbWVtcmVtYXBfcGFnZXMoc3RydWN0IGRldmlj ZSAqZGV2LCBzdHJ1Y3QgZGV2X3BhZ2VtYXAgKnBnbWFwKQogeworCWludCBlcnJvcjsKIAlyZXNv dXJjZV9zaXplX3Qgb2Zmc2V0ID0gcGdtYXAtPnJlcy5zdGFydDsKIAlzdHJ1Y3QgbmZpdF90ZXN0 X3Jlc291cmNlICpuZml0X3JlcyA9IGdldF9uZml0X3JlcyhvZmZzZXQpOwogCi0JaWYgKG5maXRf cmVzKSB7Ci0JCWludCByYzsKLQotCQlyYyA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYs IG5maXRfdGVzdF9raWxsLCBwZ21hcCk7Ci0JCWlmIChyYykKLQkJCXJldHVybiBFUlJfUFRSKHJj KTsKLQkJcmV0dXJuIG5maXRfcmVzLT5idWYgKyBvZmZzZXQgLSBuZml0X3Jlcy0+cmVzLnN0YXJ0 OworCWlmICghbmZpdF9yZXMpCisJCXJldHVybiBkZXZtX21lbXJlbWFwX3BhZ2VzKGRldiwgcGdt YXApOworCisJcGdtYXAtPmRldiA9IGRldjsKKwlpZiAoIXBnbWFwLT5yZWYpIHsKKwkJaWYgKHBn bWFwLT5vcHMgJiYgKHBnbWFwLT5vcHMtPmtpbGwgfHwgcGdtYXAtPm9wcy0+Y2xlYW51cCkpCisJ CQlyZXR1cm4gRVJSX1BUUigtRUlOVkFMKTsKKworCQlpbml0X2NvbXBsZXRpb24oJnBnbWFwLT5k b25lKTsKKwkJZXJyb3IgPSBwZXJjcHVfcmVmX2luaXQoJnBnbWFwLT5pbnRlcm5hbF9yZWYsCisJ CQkJZGV2X3BhZ2VtYXBfcGVyY3B1X3JlbGVhc2UsIDAsIEdGUF9LRVJORUwpOworCQlpZiAoZXJy b3IpCisJCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJCXBnbWFwLT5yZWYgPSAmcGdtYXAtPmlu dGVybmFsX3JlZjsKKwl9IGVsc2UgeworCQlpZiAoIXBnbWFwLT5vcHMgfHwgIXBnbWFwLT5vcHMt PmtpbGwgfHwgIXBnbWFwLT5vcHMtPmNsZWFudXApIHsKKwkJCVdBUk4oMSwgIk1pc3NpbmcgcmVm ZXJlbmNlIGNvdW50IHRlYXJkb3duIGRlZmluaXRpb25cbiIpOworCQkJcmV0dXJuIEVSUl9QVFIo LUVJTlZBTCk7CisJCX0KIAl9Ci0JcmV0dXJuIGRldm1fbWVtcmVtYXBfcGFnZXMoZGV2LCBwZ21h cCk7CisKKwllcnJvciA9IGRldm1fYWRkX2FjdGlvbl9vcl9yZXNldChkZXYsIG5maXRfdGVzdF9r aWxsLCBwZ21hcCk7CisJaWYgKGVycm9yKQorCQlyZXR1cm4gRVJSX1BUUihlcnJvcik7CisJcmV0 dXJuIG5maXRfcmVzLT5idWYgKyBvZmZzZXQgLSBuZml0X3Jlcy0+cmVzLnN0YXJ0OwogfQogRVhQ T1JUX1NZTUJPTF9HUEwoX193cmFwX2Rldm1fbWVtcmVtYXBfcGFnZXMpOwogCi0tIAoyLjIwLjEK Cl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCk5vdXZlYXUg bWFpbGluZyBsaXN0Ck5vdXZlYXVAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlzdHMu ZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vbm91dmVhdQ==