Message ID | 20150923044211.36490.18084.stgit@dwillia2-desk3.jf.intel.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 09/22/2015 09:42 PM, Dan Williams wrote: > /* > + * __pfn_t: encapsulates a page-frame number that is optionally backed > + * by memmap (struct page). Whether a __pfn_t has a 'struct page' > + * backing is indicated by flags in the low bits of the value; > + */ > +typedef struct { > + unsigned long val; > +} __pfn_t; > + > +/* > + * PFN_SG_CHAIN - pfn is a pointer to the next scatterlist entry > + * PFN_SG_LAST - pfn references a page and is the last scatterlist entry > + * PFN_DEV - pfn is not covered by system memmap by default > + * PFN_MAP - pfn has a dynamic page mapping established by a device driver > + */ > +enum { > + PFN_SHIFT = 4, > + PFN_MASK = (1UL << PFN_SHIFT) - 1, > + PFN_SG_CHAIN = (1UL << 0), > + PFN_SG_LAST = (1UL << 1), > + PFN_DEV = (1UL << 2), > + PFN_MAP = (1UL << 3), > +}; Please forgive a little bikeshedding here... Why __pfn_t? Because the KVM code has a pfn_t? If so, I think we should rescue pfn_t from KVM and give them a kvm_pfn_t. I think you should do one of two things: Make PFN_SHIFT 12 so that a physical addr can be stored in a __pfn_t with no work. Or, use the *high* 12 bits of __pfn_t.val. If you use the high bits, *and* make it store a plain pfn when all the bits are 0, then you get a zero-cost pfn<->__pfn_t conversion which will hopefully generate the exact same code which is there today. The one disadvantage here is that it makes it more likely that somebody that's just setting __pfn_t.val=foo will get things subtly wrong somehow, but that it will work most of the time. Also, about naming... PFN_SHIFT is pretty awful name for this. It probably needs to be __PFN_T_SOMETHING. We don't want folks doing craziness like: unsigned long phys_addr = pfn << PFN_SHIFT. Which *looks* OK. -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
WyBhZGRpbmcga3ZtQHZnZXIua2VybmVsLm9yZyBdDQoNCk9uIFdlZCwgMjAxNS0wOS0yMyBhdCAw OTowMiAtMDcwMCwgRGF2ZSBIYW5zZW4gd3JvdGU6DQo+IE9uIDA5LzIyLzIwMTUgMDk6NDIgUE0s IERhbiBXaWxsaWFtcyB3cm90ZToNCj4gPiAgLyoNCj4gPiArICogX19wZm5fdDogZW5jYXBzdWxh dGVzIGEgcGFnZS1mcmFtZSBudW1iZXIgdGhhdCBpcyBvcHRpb25hbGx5IGJhY2tlZA0KPiA+ICsg KiBieSBtZW1tYXAgKHN0cnVjdCBwYWdlKS4gIFdoZXRoZXIgYSBfX3Bmbl90IGhhcyBhICdzdHJ1 Y3QgcGFnZScNCj4gPiArICogYmFja2luZyBpcyBpbmRpY2F0ZWQgYnkgZmxhZ3MgaW4gdGhlIGxv dyBiaXRzIG9mIHRoZSB2YWx1ZTsNCj4gPiArICovDQo+ID4gK3R5cGVkZWYgc3RydWN0IHsNCj4g PiArCXVuc2lnbmVkIGxvbmcgdmFsOw0KPiA+ICt9IF9fcGZuX3Q7DQo+ID4gKw0KPiA+ICsvKg0K PiA+ICsgKiBQRk5fU0dfQ0hBSU4gLSBwZm4gaXMgYSBwb2ludGVyIHRvIHRoZSBuZXh0IHNjYXR0 ZXJsaXN0IGVudHJ5DQo+ID4gKyAqIFBGTl9TR19MQVNUIC0gcGZuIHJlZmVyZW5jZXMgYSBwYWdl IGFuZCBpcyB0aGUgbGFzdCBzY2F0dGVybGlzdCBlbnRyeQ0KPiA+ICsgKiBQRk5fREVWIC0gcGZu IGlzIG5vdCBjb3ZlcmVkIGJ5IHN5c3RlbSBtZW1tYXAgYnkgZGVmYXVsdA0KPiA+ICsgKiBQRk5f TUFQIC0gcGZuIGhhcyBhIGR5bmFtaWMgcGFnZSBtYXBwaW5nIGVzdGFibGlzaGVkIGJ5IGEgZGV2 aWNlIGRyaXZlcg0KPiA+ICsgKi8NCj4gPiArZW51bSB7DQo+ID4gKwlQRk5fU0hJRlQgPSA0LA0K PiA+ICsJUEZOX01BU0sgPSAoMVVMIDw8IFBGTl9TSElGVCkgLSAxLA0KPiA+ICsJUEZOX1NHX0NI QUlOID0gKDFVTCA8PCAwKSwNCj4gPiArCVBGTl9TR19MQVNUID0gKDFVTCA8PCAxKSwNCj4gPiAr CVBGTl9ERVYgPSAoMVVMIDw8IDIpLA0KPiA+ICsJUEZOX01BUCA9ICgxVUwgPDwgMyksDQo+ID4g K307DQo+IA0KPiBQbGVhc2UgZm9yZ2l2ZSBhIGxpdHRsZSBiaWtlc2hlZGRpbmcgaGVyZS4uLg0K PiANCj4gV2h5IF9fcGZuX3Q/ICBCZWNhdXNlIHRoZSBLVk0gY29kZSBoYXMgYSBwZm5fdD8gIElm IHNvLCBJIHRoaW5rIHdlDQo+IHNob3VsZCByZXNjdWUgcGZuX3QgZnJvbSBLVk0gYW5kIGdpdmUg dGhlbSBhIGt2bV9wZm5fdC4NCg0KU291bmRzIGdvb2QsIG9uY2UgMGRheSBoYXMgYSBjaGFuY2Ug dG8gY2hldyBvbiB0aGUgY29udmVyc2lvbiBJJ2xsIHNlbmQNCml0IG91dC4NCg0KPiBJIHRoaW5r IHlvdSBzaG91bGQgZG8gb25lIG9mIHR3byB0aGluZ3M6ICBNYWtlIFBGTl9TSElGVCAxMiBzbyB0 aGF0IGENCj4gcGh5c2ljYWwgYWRkciBjYW4gYmUgc3RvcmVkIGluIGEgX19wZm5fdCB3aXRoIG5v IHdvcmsuICBPciwgdXNlIHRoZQ0KPiAqaGlnaCogMTIgYml0cyBvZiBfX3Bmbl90LnZhbC4NCj4g DQoNCnBmbiB0byBwZm5fdCBjb252ZXJzaW9ucyBhcmUgbW9yZSBsaWtlbHksIHNvIHRoZSBoaWdo IGJpdHMgc291bmRzDQpiZXR0ZXIuDQoNCj4gSWYgeW91IHVzZSB0aGUgaGlnaCBiaXRzLCAqYW5k KiBtYWtlIGl0IHN0b3JlIGEgcGxhaW4gcGZuIHdoZW4gYWxsIHRoZQ0KPiBiaXRzIGFyZSAwLCB0 aGVuIHlvdSBnZXQgYSB6ZXJvLWNvc3QgcGZuPC0+X19wZm5fdCBjb252ZXJzaW9uIHdoaWNoIHdp bGwNCj4gaG9wZWZ1bGx5IGdlbmVyYXRlIHRoZSBleGFjdCBzYW1lIGNvZGUgd2hpY2ggaXMgdGhl cmUgdG9kYXkuDQo+IA0KPiBUaGUgb25lIGRpc2FkdmFudGFnZSBoZXJlIGlzIHRoYXQgaXQgbWFr ZXMgaXQgbW9yZSBsaWtlbHkgdGhhdCBzb21lYm9keQ0KPiB0aGF0J3MganVzdCBzZXR0aW5nIF9f cGZuX3QudmFsPWZvbyB3aWxsIGdldCB0aGluZ3Mgc3VidGx5IHdyb25nDQo+IHNvbWVob3csIGJ1 dCB0aGF0IGl0IHdpbGwgd29yayBtb3N0IG9mIHRoZSB0aW1lLg0KPiANCj4gQWxzbywgYWJvdXQg bmFtaW5nLi4uICBQRk5fU0hJRlQgaXMgcHJldHR5IGF3ZnVsIG5hbWUgZm9yIHRoaXMuICBJdA0K PiBwcm9iYWJseSBuZWVkcyB0byBiZSBfX1BGTl9UX1NPTUVUSElORy4gIFdlIGRvbid0IHdhbnQg Zm9sa3MgZG9pbmcNCj4gY3JhemluZXNzIGxpa2U6DQo+IA0KPiAJdW5zaWduZWQgbG9uZyBwaHlz X2FkZHIgPSBwZm4gPDwgUEZOX1NISUZULg0KPiANCj4gV2hpY2ggKmxvb2tzKiBPSy4NCg0KSGVo LCB0cnVlLiAgSXQncyBub3cgUEZOX0ZMQUdTX01BU0sgaW4gdGhlIHJld29ya2VkIHBhdGNoLi4u DQoNCg0KODwtLS0NClN1YmplY3Q6IG1tLCBkYXgsIHBtZW06IGludHJvZHVjZSBwZm5fdA0KDQpG cm9tOiBEYW4gV2lsbGlhbXMgPGRhbi5qLndpbGxpYW1zQGludGVsLmNvbT4NCg0KSW4gcHJlcGFy YXRpb24gZm9yIGVuYWJsaW5nIGdldF91c2VyX3BhZ2VzKCkgb3BlcmF0aW9ucyBvbiBkYXggbWFw cGluZ3MsDQppbnRyb2R1Y2UgYSB0eXBlIHRoYXQgZW5jYXBzdWxhdGVzIGEgcGFnZS1mcmFtZS1u dW1iZXIgdGhhdCBjYW4gYWxzbyBiZQ0KdXNlZCB0byBlbmNvZGUgb3RoZXIgaW5mb3JtYXRpb24u ICBUaGlzIG90aGVyIGluZm9ybWF0aW9uIGlzIHRoZQ0KaGlzdG9yaWNhbCAicGFnZV9saW5rIiBl bmNvZGluZyBpbiBhIHNjYXR0ZXJsaXN0LCBidXQgY2FuIGFsc28gZGVub3RlDQoiZGV2aWNlIG1l bW9yeSIuICBXaGVyZSAiZGV2aWNlIG1lbW9yeSIgaXMgYSBzZXQgb2YgcGZucyB0aGF0IGFyZSBu b3QNCnBhcnQgb2YgdGhlIGtlcm5lbCdzIGxpbmVhciBtYXBwaW5nIGJ5IGRlZmF1bHQsIGJ1dCBh cmUgYWNjZXNzZWQgdmlhIHRoZQ0Kc2FtZSBtZW1vcnkgY29udHJvbGxlciBhcyByYW0uICBUaGUg bW90aXZhdGlvbiBmb3IgdGhpcyBuZXcgdHlwZSBpcw0KbGFyZ2UgY2FwYWNpdHkgcGVyc2lzdGVu dCBtZW1vcnkgdGhhdCBvcHRpb25hbGx5IGhhcyBzdHJ1Y3QgcGFnZSBlbnRyaWVzDQppbiB0aGUg J21lbW1hcCcuDQoNCldoZW4gYSBkcml2ZXIsIGxpa2UgcG1lbSwgaGFzIGVzdGFibGlzaGVkIGEg ZGV2bV9tZW1yZW1hcF9wYWdlcygpDQptYXBwaW5nIGl0IG5lZWRzIHRvIGNvbW11bmljYXRlIHRv IHVwcGVyIGxheWVycyB0aGF0IHRoZSBwZm4gaGFzIGEgcGFnZQ0KYmFja2luZy4gIFRoaXMgcHJv cGVydHkgd2lsbCBiZSBsZXZlcmFnZWQgaW4gYSBsYXRlciBwYXRjaCB0byBlbmFibGUNCmRheC1n dXAuICBGb3Igbm93LCB1cGRhdGUgYWxsIHRoZSAtPmRpcmVjdF9hY2Nlc3MoKSBpbXBsZW1lbnRh dGlvbnMgdG8NCmNvbW11bmljYXRlIHdoZXRoZXIgdGhlIHJldHVybmVkIHBmbiByYW5nZSBpcyBt YXBwZWQuDQoNCkNjOiBDaHJpc3RvcGggSGVsbHdpZyA8aGNoQGxzdC5kZT4NCkNjOiBEYXZlIEhh bnNlbiA8ZGF2ZUBzcjcxLm5ldD4NCkNjOiBBbmRyZXcgTW9ydG9uIDxha3BtQGxpbnV4LWZvdW5k YXRpb24ub3JnPg0KQ2M6IFJvc3MgWndpc2xlciA8cm9zcy56d2lzbGVyQGxpbnV4LmludGVsLmNv bT4NClNpZ25lZC1vZmYtYnk6IERhbiBXaWxsaWFtcyA8ZGFuLmoud2lsbGlhbXNAaW50ZWwuY29t Pg0KLS0tDQogYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMgfCAgICA4ICsrLS0tDQogZHJp dmVycy9ibG9jay9icmQuYyAgICAgICAgICAgfCAgICA0ICstLQ0KIGRyaXZlcnMvbnZkaW1tL3Bt ZW0uYyAgICAgICAgIHwgICAyNyArKysrKysrKystLS0tLS0tLQ0KIGRyaXZlcnMvczM5MC9ibG9j ay9kY3NzYmxrLmMgIHwgICAxMCArKystLS0NCiBmcy9ibG9ja19kZXYuYyAgICAgICAgICAgICAg ICB8ICAgIDIgKw0KIGZzL2RheC5jICAgICAgICAgICAgICAgICAgICAgIHwgICAyMyArKysrKysr Ky0tLS0tLS0NCiBpbmNsdWRlL2xpbnV4L2Jsa2Rldi5oICAgICAgICB8ICAgIDQgKy0tDQogaW5j bHVkZS9saW51eC9tbS5oICAgICAgICAgICAgfCAgIDY1ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrDQogaW5jbHVkZS9saW51eC9wZm4uaCAgICAgICAgICAgfCAgICA5 ICsrKysrKw0KIDkgZmlsZXMgY2hhbmdlZCwgMTEyIGluc2VydGlvbnMoKyksIDQwIGRlbGV0aW9u cygtKQ0KDQpkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMgYi9hcmNo L3Bvd2VycGMvc3lzZGV2L2F4b25yYW0uYw0KaW5kZXggMjRmZmFiMjU3MmU4Li5lYzNiMDcyZDIw Y2YgMTAwNjQ0DQotLS0gYS9hcmNoL3Bvd2VycGMvc3lzZGV2L2F4b25yYW0uYw0KKysrIGIvYXJj aC9wb3dlcnBjL3N5c2Rldi9heG9ucmFtLmMNCkBAIC0xNDEsMTUgKzE0MSwxMyBAQCBheG9uX3Jh bV9tYWtlX3JlcXVlc3Qoc3RydWN0IHJlcXVlc3RfcXVldWUgKnF1ZXVlLCBzdHJ1Y3QgYmlvICpi aW8pDQogICovDQogc3RhdGljIGxvbmcNCiBheG9uX3JhbV9kaXJlY3RfYWNjZXNzKHN0cnVjdCBi bG9ja19kZXZpY2UgKmRldmljZSwgc2VjdG9yX3Qgc2VjdG9yLA0KLQkJICAgICAgIHZvaWQgX19w bWVtICoqa2FkZHIsIHVuc2lnbmVkIGxvbmcgKnBmbikNCisJCSAgICAgICB2b2lkIF9fcG1lbSAq KmthZGRyLCBwZm5fdCAqcGZuKQ0KIHsNCiAJc3RydWN0IGF4b25fcmFtX2JhbmsgKmJhbmsgPSBk ZXZpY2UtPmJkX2Rpc2stPnByaXZhdGVfZGF0YTsNCiAJbG9mZl90IG9mZnNldCA9IChsb2ZmX3Qp c2VjdG9yIDw8IEFYT05fUkFNX1NFQ1RPUl9TSElGVDsNCi0Jdm9pZCAqYWRkciA9ICh2b2lkICop KGJhbmstPnBoX2FkZHIgKyBvZmZzZXQpOw0KLQ0KLQkqa2FkZHIgPSAodm9pZCBfX3BtZW0gKilh ZGRyOw0KLQkqcGZuID0gdmlydF90b19waHlzKGFkZHIpID4+IFBBR0VfU0hJRlQ7DQogDQorCSpr YWRkciA9ICh2b2lkIF9fcG1lbSBfX2ZvcmNlICopIGJhbmstPmlvX2FkZHIgKyBvZmZzZXQ7DQor CSpwZm4gPSBwaHlzX3RvX3Bmbl90KGJhbmstPnBoX2FkZHIgKyBvZmZzZXQsIFBGTl9ERVYpOw0K IAlyZXR1cm4gYmFuay0+c2l6ZSAtIG9mZnNldDsNCiB9DQogDQpkaWZmIC0tZ2l0IGEvZHJpdmVy cy9ibG9jay9icmQuYyBiL2RyaXZlcnMvYmxvY2svYnJkLmMNCmluZGV4IGY2NDVhNzFhZTgyNy4u Nzk2MTEyZTkxNzRiIDEwMDY0NA0KLS0tIGEvZHJpdmVycy9ibG9jay9icmQuYw0KKysrIGIvZHJp dmVycy9ibG9jay9icmQuYw0KQEAgLTM3NCw3ICszNzQsNyBAQCBzdGF0aWMgaW50IGJyZF9yd19w YWdlKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwNCiANCiAjaWZk ZWYgQ09ORklHX0JMS19ERVZfUkFNX0RBWA0KIHN0YXRpYyBsb25nIGJyZF9kaXJlY3RfYWNjZXNz KHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY3RvciwNCi0JCQl2b2lkIF9f cG1lbSAqKmthZGRyLCB1bnNpZ25lZCBsb25nICpwZm4pDQorCQkJdm9pZCBfX3BtZW0gKiprYWRk ciwgcGZuX3QgKnBmbikNCiB7DQogCXN0cnVjdCBicmRfZGV2aWNlICpicmQgPSBiZGV2LT5iZF9k aXNrLT5wcml2YXRlX2RhdGE7DQogCXN0cnVjdCBwYWdlICpwYWdlOw0KQEAgLTM4NSw3ICszODUs NyBAQCBzdGF0aWMgbG9uZyBicmRfZGlyZWN0X2FjY2VzcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpi ZGV2LCBzZWN0b3JfdCBzZWN0b3IsDQogCWlmICghcGFnZSkNCiAJCXJldHVybiAtRU5PU1BDOw0K IAkqa2FkZHIgPSAodm9pZCBfX3BtZW0gKilwYWdlX2FkZHJlc3MocGFnZSk7DQotCSpwZm4gPSBw YWdlX3RvX3BmbihwYWdlKTsNCisJKnBmbiA9IHBhZ2VfdG9fcGZuX3QocGFnZSk7DQogDQogCXJl dHVybiBQQUdFX1NJWkU7DQogfQ0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvbnZkaW1tL3BtZW0uYyBi L2RyaXZlcnMvbnZkaW1tL3BtZW0uYw0KaW5kZXggM2VlMDJhZjczYWQwLi5hZjgwYzhlYzJjYzkg MTAwNjQ0DQotLS0gYS9kcml2ZXJzL252ZGltbS9wbWVtLmMNCisrKyBiL2RyaXZlcnMvbnZkaW1t L3BtZW0uYw0KQEAgLTM5LDYgKzM5LDcgQEAgc3RydWN0IHBtZW1fZGV2aWNlIHsNCiAJcGh5c19h ZGRyX3QJCXBoeXNfYWRkcjsNCiAJLyogd2hlbiBub24temVybyB0aGlzIGRldmljZSBpcyBob3N0 aW5nIGEgJ3BmbicgaW5zdGFuY2UgKi8NCiAJcGh5c19hZGRyX3QJCWRhdGFfb2Zmc2V0Ow0KKwl1 bnNpZ25lZCBsb25nCQlwZm5fZmxhZ3M7DQogCXZvaWQgX19wbWVtCQkqdmlydF9hZGRyOw0KIAlz aXplX3QJCQlzaXplOw0KIH07DQpAQCAtMTA4LDI1ICsxMDksMjIgQEAgc3RhdGljIGludCBwbWVt X3J3X3BhZ2Uoc3RydWN0IGJsb2NrX2RldmljZSAqYmRldiwgc2VjdG9yX3Qgc2VjdG9yLA0KIH0N CiANCiBzdGF0aWMgbG9uZyBwbWVtX2RpcmVjdF9hY2Nlc3Moc3RydWN0IGJsb2NrX2RldmljZSAq YmRldiwgc2VjdG9yX3Qgc2VjdG9yLA0KLQkJICAgICAgdm9pZCBfX3BtZW0gKiprYWRkciwgdW5z aWduZWQgbG9uZyAqcGZuKQ0KKwkJICAgICAgdm9pZCBfX3BtZW0gKiprYWRkciwgcGZuX3QgKnBm bikNCiB7DQogCXN0cnVjdCBwbWVtX2RldmljZSAqcG1lbSA9IGJkZXYtPmJkX2Rpc2stPnByaXZh dGVfZGF0YTsNCiAJcmVzb3VyY2Vfc2l6ZV90IG9mZnNldCA9IHNlY3RvciAqIDUxMiArIHBtZW0t PmRhdGFfb2Zmc2V0Ow0KLQlyZXNvdXJjZV9zaXplX3Qgc2l6ZTsNCisJcmVzb3VyY2Vfc2l6ZV90 IHNpemUgPSBwbWVtLT5zaXplIC0gb2Zmc2V0Ow0KIA0KLQlpZiAocG1lbS0+ZGF0YV9vZmZzZXQp IHsNCisJKmthZGRyID0gcG1lbS0+dmlydF9hZGRyICsgb2Zmc2V0Ow0KKwkqcGZuID0gcGh5c190 b19wZm5fdChwbWVtLT5waHlzX2FkZHIgKyBvZmZzZXQsIHBtZW0tPnBmbl9mbGFncyk7DQorDQor CWlmIChwZm5fdF9oYXNfcGFnZSgqcGZuKSkgew0KIAkJLyoNCiAJCSAqIExpbWl0IHRoZSBkaXJl Y3RfYWNjZXNzKCkgc2l6ZSB0byB3aGF0IGlzIGNvdmVyZWQgYnkNCiAJCSAqIHRoZSBtZW1tYXAN CiAJCSAqLw0KLQkJc2l6ZSA9IChwbWVtLT5zaXplIC0gb2Zmc2V0KSAmIH5ORF9QRk5fTUFTSzsN Ci0JfSBlbHNlDQotCQlzaXplID0gcG1lbS0+c2l6ZSAtIG9mZnNldDsNCi0NCi0JLyogRklYTUUg Y29udmVydCBEQVggdG8gY29tcHJlaGVuZCB0aGF0IHRoaXMgbWFwcGluZyBoYXMgYSBsaWZldGlt ZSAqLw0KLQkqa2FkZHIgPSBwbWVtLT52aXJ0X2FkZHIgKyBvZmZzZXQ7DQotCSpwZm4gPSAocG1l bS0+cGh5c19hZGRyICsgb2Zmc2V0KSA+PiBQQUdFX1NISUZUOw0KLQ0KKwkJc2l6ZSAmPSB+TkRf UEZOX01BU0s7DQorCX0NCiAJcmV0dXJuIHNpemU7DQogfQ0KIA0KQEAgLTE1OCw5ICsxNTYsMTEg QEAgc3RhdGljIHN0cnVjdCBwbWVtX2RldmljZSAqcG1lbV9hbGxvYyhzdHJ1Y3QgZGV2aWNlICpk ZXYsDQogCQlyZXR1cm4gRVJSX1BUUigtRUJVU1kpOw0KIAl9DQogDQotCWlmIChwbWVtX3Nob3Vs ZF9tYXBfcGFnZXMoZGV2KSkNCisJcG1lbS0+cGZuX2ZsYWdzID0gUEZOX0RFVjsNCisJaWYgKHBt ZW1fc2hvdWxkX21hcF9wYWdlcyhkZXYpKSB7DQogCQlwbWVtLT52aXJ0X2FkZHIgPSAodm9pZCBf X3BtZW0gKikgZGV2bV9tZW1yZW1hcF9wYWdlcyhkZXYsIHJlcyk7DQotCWVsc2UNCisJCXBtZW0t PnBmbl9mbGFncyB8PSBQRk5fTUFQOw0KKwl9IGVsc2UNCiAJCXBtZW0tPnZpcnRfYWRkciA9ICh2 b2lkIF9fcG1lbSAqKSBkZXZtX21lbXJlbWFwKGRldiwNCiAJCQkJcG1lbS0+cGh5c19hZGRyLCBw bWVtLT5zaXplLA0KIAkJCQlBUkNIX01FTVJFTUFQX1BNRU0pOw0KQEAgLTM3MSw2ICszNzEsNyBA QCBzdGF0aWMgaW50IG52ZGltbV9uYW1lc3BhY2VfYXR0YWNoX3BmbihzdHJ1Y3QgbmRfbmFtZXNw YWNlX2NvbW1vbiAqbmRucykNCiAJcG1lbSA9IGRldl9nZXRfZHJ2ZGF0YShkZXYpOw0KIAlkZXZt X21lbXVubWFwKGRldiwgKHZvaWQgX19mb3JjZSAqKSBwbWVtLT52aXJ0X2FkZHIpOw0KIAlwbWVt LT52aXJ0X2FkZHIgPSAodm9pZCBfX3BtZW0gKikgZGV2bV9tZW1yZW1hcF9wYWdlcyhkZXYsICZu c2lvLT5yZXMpOw0KKwlwbWVtLT5wZm5fZmxhZ3MgfD0gUEZOX01BUDsNCiAJaWYgKElTX0VSUihw bWVtLT52aXJ0X2FkZHIpKSB7DQogCQlyYyA9IFBUUl9FUlIocG1lbS0+dmlydF9hZGRyKTsNCiAJ CWdvdG8gZXJyOw0KZGlmZiAtLWdpdCBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMgYi9k cml2ZXJzL3MzOTAvYmxvY2svZGNzc2Jsay5jDQppbmRleCBjMjEyY2U5MjVlZTYuLmYzNWQ2Yzhm NWZiYiAxMDA2NDQNCi0tLSBhL2RyaXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMNCisrKyBiL2Ry aXZlcnMvczM5MC9ibG9jay9kY3NzYmxrLmMNCkBAIC0yOSw3ICsyOSw3IEBAIHN0YXRpYyBpbnQg ZGNzc2Jsa19vcGVuKHN0cnVjdCBibG9ja19kZXZpY2UgKmJkZXYsIGZtb2RlX3QgbW9kZSk7DQog c3RhdGljIHZvaWQgZGNzc2Jsa19yZWxlYXNlKHN0cnVjdCBnZW5kaXNrICpkaXNrLCBmbW9kZV90 IG1vZGUpOw0KIHN0YXRpYyB2b2lkIGRjc3NibGtfbWFrZV9yZXF1ZXN0KHN0cnVjdCByZXF1ZXN0 X3F1ZXVlICpxLCBzdHJ1Y3QgYmlvICpiaW8pOw0KIHN0YXRpYyBsb25nIGRjc3NibGtfZGlyZWN0 X2FjY2VzcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpiZGV2LCBzZWN0b3JfdCBzZWNudW0sDQotCQkJ IHZvaWQgX19wbWVtICoqa2FkZHIsIHVuc2lnbmVkIGxvbmcgKnBmbik7DQorCQkJIHZvaWQgX19w bWVtICoqa2FkZHIsIHBmbl90ICpwZm4pOw0KIA0KIHN0YXRpYyBjaGFyIGRjc3NibGtfc2VnbWVu dHNbRENTU0JMS19QQVJNX0xFTl0gPSAiXDAiOw0KIA0KQEAgLTg4MSwyMCArODgxLDE4IEBAIGZh aWw6DQogDQogc3RhdGljIGxvbmcNCiBkY3NzYmxrX2RpcmVjdF9hY2Nlc3MgKHN0cnVjdCBibG9j a19kZXZpY2UgKmJkZXYsIHNlY3Rvcl90IHNlY251bSwNCi0JCQl2b2lkIF9fcG1lbSAqKmthZGRy LCB1bnNpZ25lZCBsb25nICpwZm4pDQorCQkJdm9pZCBfX3BtZW0gKiprYWRkciwgcGZuX3QgKnBm bikNCiB7DQogCXN0cnVjdCBkY3NzYmxrX2Rldl9pbmZvICpkZXZfaW5mbzsNCiAJdW5zaWduZWQg bG9uZyBvZmZzZXQsIGRldl9zejsNCi0Jdm9pZCAqYWRkcjsNCiANCiAJZGV2X2luZm8gPSBiZGV2 LT5iZF9kaXNrLT5wcml2YXRlX2RhdGE7DQogCWlmICghZGV2X2luZm8pDQogCQlyZXR1cm4gLUVO T0RFVjsNCiAJZGV2X3N6ID0gZGV2X2luZm8tPmVuZCAtIGRldl9pbmZvLT5zdGFydDsNCiAJb2Zm c2V0ID0gc2VjbnVtICogNTEyOw0KLQlhZGRyID0gKHZvaWQgKikgKGRldl9pbmZvLT5zdGFydCAr IG9mZnNldCk7DQotCSpwZm4gPSB2aXJ0X3RvX3BoeXMoYWRkcikgPj4gUEFHRV9TSElGVDsNCi0J KmthZGRyID0gKHZvaWQgX19wbWVtICopIGFkZHI7DQorCSprYWRkciA9ICh2b2lkIF9fcG1lbSAq KSAoZGV2X2luZm8tPnN0YXJ0ICsgb2Zmc2V0KTsNCisJKnBmbiA9IHBoeXNfdG9fcGZuX3QoZGV2 X2luZm8tPnN0YXJ0ICsgb2Zmc2V0LCBQRk5fREVWKTsNCiANCiAJcmV0dXJuIGRldl9zeiAtIG9m ZnNldDsNCiB9DQpkaWZmIC0tZ2l0IGEvZnMvYmxvY2tfZGV2LmMgYi9mcy9ibG9ja19kZXYuYw0K aW5kZXggMDczYmI1N2FkYWIxLi5jMzdhMTkzNjk1ZDQgMTAwNjQ0DQotLS0gYS9mcy9ibG9ja19k ZXYuYw0KKysrIGIvZnMvYmxvY2tfZGV2LmMNCkBAIC00NDIsNyArNDQyLDcgQEAgRVhQT1JUX1NZ TUJPTF9HUEwoYmRldl93cml0ZV9wYWdlKTsNCiAgKiBhY2Nlc3NpYmxlIGF0IHRoaXMgYWRkcmVz cy4NCiAgKi8NCiBsb25nIGJkZXZfZGlyZWN0X2FjY2VzcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICpi ZGV2LCBzZWN0b3JfdCBzZWN0b3IsDQotCQkJdm9pZCBfX3BtZW0gKiphZGRyLCB1bnNpZ25lZCBs b25nICpwZm4sIGxvbmcgc2l6ZSkNCisJCQl2b2lkIF9fcG1lbSAqKmFkZHIsIHBmbl90ICpwZm4s IGxvbmcgc2l6ZSkNCiB7DQogCWxvbmcgYXZhaWw7DQogCWNvbnN0IHN0cnVjdCBibG9ja19kZXZp Y2Vfb3BlcmF0aW9ucyAqb3BzID0gYmRldi0+YmRfZGlzay0+Zm9wczsNCmRpZmYgLS1naXQgYS9m cy9kYXguYyBiL2ZzL2RheC5jDQppbmRleCAzNThlZWEzOWU5ODIuLjdiZDgxYjQ4YTcxZCAxMDA2 NDQNCi0tLSBhL2ZzL2RheC5jDQorKysgYi9mcy9kYXguYw0KQEAgLTM3LDcgKzM3LDcgQEAgaW50 IGRheF9jbGVhcl9ibG9ja3Moc3RydWN0IGlub2RlICppbm9kZSwgc2VjdG9yX3QgYmxvY2ssIGxv bmcgc2l6ZSkNCiAJbWlnaHRfc2xlZXAoKTsNCiAJZG8gew0KIAkJdm9pZCBfX3BtZW0gKmFkZHI7 DQotCQl1bnNpZ25lZCBsb25nIHBmbjsNCisJCXBmbl90IHBmbjsNCiAJCWxvbmcgY291bnQ7DQog DQogCQljb3VudCA9IGJkZXZfZGlyZWN0X2FjY2VzcyhiZGV2LCBzZWN0b3IsICZhZGRyLCAmcGZu LCBzaXplKTsNCkBAIC02NCw3ICs2NCw3IEBAIGludCBkYXhfY2xlYXJfYmxvY2tzKHN0cnVjdCBp bm9kZSAqaW5vZGUsIHNlY3Rvcl90IGJsb2NrLCBsb25nIHNpemUpDQogRVhQT1JUX1NZTUJPTF9H UEwoZGF4X2NsZWFyX2Jsb2Nrcyk7DQogDQogc3RhdGljIHZvaWQgX19wbWVtICpfX2RheF9tYXBf YmgoY29uc3Qgc3RydWN0IGJ1ZmZlcl9oZWFkICpiaCwgdW5zaWduZWQgYmxrYml0cywNCi0JCXVu c2lnbmVkIGxvbmcgKnBmbiwgbG9uZyAqbGVuKQ0KKwkJcGZuX3QgKnBmbiwgbG9uZyAqbGVuKQ0K IHsNCiAJbG9uZyByYzsNCiAJdm9pZCBfX3BtZW0gKmFkZHI7DQpAQCAtODcsNyArODcsNyBAQCBz dGF0aWMgdm9pZCBfX3BtZW0gKl9fZGF4X21hcF9iaChjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQg KmJoLCB1bnNpZ25lZCBibGtiaXRzLA0KIA0KIHN0YXRpYyB2b2lkIF9fcG1lbSAqZGF4X21hcF9i aChjb25zdCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLCB1bnNpZ25lZCBibGtiaXRzKQ0KIHsNCi0J dW5zaWduZWQgbG9uZyBwZm47DQorCXBmbl90IHBmbjsNCiANCiAJcmV0dXJuIF9fZGF4X21hcF9i aChiaCwgYmxrYml0cywgJnBmbiwgTlVMTCk7DQogfQ0KQEAgLTEzOCw3ICsxMzgsNyBAQCBzdGF0 aWMgc3NpemVfdCBkYXhfaW8oc3RydWN0IGlub2RlICppbm9kZSwgc3RydWN0IGlvdl9pdGVyICpp dGVyLA0KIAlsb2ZmX3QgcG9zID0gc3RhcnQsIG1heCA9IHN0YXJ0LCBiaF9tYXggPSBzdGFydDsN CiAJaW50IHJ3ID0gaW92X2l0ZXJfcncoaXRlciksIHJjOw0KIAlsb25nIG1hcF9sZW4gPSAwOw0K LQl1bnNpZ25lZCBsb25nIHBmbjsNCisJcGZuX3QgcGZuOw0KIAl2b2lkIF9fcG1lbSAqYWRkciA9 IE5VTEw7DQogCXZvaWQgX19wbWVtICprbWFwID0gKHZvaWQgX19wbWVtICopIEVSUl9QVFIoLUVJ Tyk7DQogCWJvb2wgaG9sZSA9IGZhbHNlOw0KQEAgLTMyNCw5ICszMjQsOSBAQCBzdGF0aWMgaW50 IGRheF9pbnNlcnRfbWFwcGluZyhzdHJ1Y3QgaW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hl YWQgKmJoLA0KIAkJCXN0cnVjdCB2bV9hcmVhX3N0cnVjdCAqdm1hLCBzdHJ1Y3Qgdm1fZmF1bHQg KnZtZikNCiB7DQogCXVuc2lnbmVkIGxvbmcgdmFkZHIgPSAodW5zaWduZWQgbG9uZyl2bWYtPnZp cnR1YWxfYWRkcmVzczsNCi0JdW5zaWduZWQgbG9uZyBwZm47DQogCXZvaWQgX19wbWVtICphZGRy Ow0KIAlwZ29mZl90IHNpemU7DQorCXBmbl90IHBmbjsNCiAJaW50IGVycm9yOw0KIA0KIAkvKg0K QEAgLTM1NCw3ICszNTQsNyBAQCBzdGF0aWMgaW50IGRheF9pbnNlcnRfbWFwcGluZyhzdHJ1Y3Qg aW5vZGUgKmlub2RlLCBzdHJ1Y3QgYnVmZmVyX2hlYWQgKmJoLA0KIAl9DQogCWRheF91bm1hcF9i aChiaCwgYWRkcik7DQogDQotCWVycm9yID0gdm1faW5zZXJ0X21peGVkKHZtYSwgdmFkZHIsIHBm bik7DQorCWVycm9yID0gdm1faW5zZXJ0X21peGVkKHZtYSwgdmFkZHIsIHBmbl90X3RvX3Bmbihw Zm4pKTsNCiANCiAgb3V0Og0KIAlyZXR1cm4gZXJyb3I7DQpAQCAtNjA0LDcgKzYwNCw3IEBAIGlu dCBfX2RheF9wbWRfZmF1bHQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHVuc2lnbmVkIGxv bmcgYWRkcmVzcywNCiAJaWYgKGJ1ZmZlcl91bndyaXR0ZW4oJmJoKSB8fCBidWZmZXJfbmV3KCZi aCkpIHsNCiAJCWludCBpOw0KIAkJbG9uZyBsZW5ndGg7DQotCQl1bnNpZ25lZCBsb25nIHBmbjsN CisJCXBmbl90IHBmbjsNCiAJCXZvaWQgX19wbWVtICprYWRkciA9IF9fZGF4X21hcF9iaCgmYmgs IGJsa2JpdHMsICZwZm4sICZsZW5ndGgpOw0KIA0KIAkJaWYgKElTX0VSUihrYWRkcikpIHsNCkBA IC02MTIsNyArNjEyLDcgQEAgaW50IF9fZGF4X3BtZF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1 Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLA0KIAkJCWdvdG8gb3V0Ow0KIAkJfQ0KIA0K LQkJaWYgKChsZW5ndGggPCBQTURfU0laRSkgfHwgKHBmbiAmIFBHX1BNRF9DT0xPVVIpKQ0KKwkJ aWYgKChsZW5ndGggPCBQTURfU0laRSkgfHwgKHBmbl90X3RvX3BmbihwZm4pICYgUEdfUE1EX0NP TE9VUikpDQogCQkJZ290byBmYWxsYmFjazsNCiANCiAJCWZvciAoaSA9IDA7IGkgPCBQVFJTX1BF Ul9QTUQ7IGkrKykNCkBAIC02NjgsOCArNjY4LDggQEAgaW50IF9fZGF4X3BtZF9mYXVsdChzdHJ1 Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQgbG9uZyBhZGRyZXNzLA0KIAkJcmVzdWx0 ID0gVk1fRkFVTFRfTk9QQUdFOw0KIAkJc3Bpbl91bmxvY2socHRsKTsNCiAJfSBlbHNlIHsNCisJ CXBmbl90IHBmbjsNCiAJCWxvbmcgbGVuZ3RoOw0KLQkJdW5zaWduZWQgbG9uZyBwZm47DQogCQl2 b2lkIF9fcG1lbSAqa2FkZHIgPSBfX2RheF9tYXBfYmgoJmJoLCBibGtiaXRzLCAmcGZuLCAmbGVu Z3RoKTsNCiANCiAJCWlmIChJU19FUlIoa2FkZHIpKSB7DQpAQCAtNjc3LDEwICs2NzcsMTEgQEAg aW50IF9fZGF4X3BtZF9mYXVsdChzdHJ1Y3Qgdm1fYXJlYV9zdHJ1Y3QgKnZtYSwgdW5zaWduZWQg bG9uZyBhZGRyZXNzLA0KIAkJCWdvdG8gb3V0Ow0KIAkJfQ0KIAkJZGF4X3VubWFwX2JoKCZiaCwg a2FkZHIpOw0KLQkJaWYgKChsZW5ndGggPCBQTURfU0laRSkgfHwgKHBmbiAmIFBHX1BNRF9DT0xP VVIpKQ0KKwkJaWYgKChsZW5ndGggPCBQTURfU0laRSkgfHwgKHBmbl90X3RvX3BmbihwZm4pICYg UEdfUE1EX0NPTE9VUikpDQogCQkJZ290byBmYWxsYmFjazsNCiANCi0JCXJlc3VsdCB8PSB2bWZf aW5zZXJ0X3Bmbl9wbWQodm1hLCBhZGRyZXNzLCBwbWQsIHBmbiwgd3JpdGUpOw0KKwkJcmVzdWx0 IHw9IHZtZl9pbnNlcnRfcGZuX3BtZCh2bWEsIGFkZHJlc3MsIHBtZCwNCisJCQkJcGZuX3RfdG9f cGZuKHBmbiksIHdyaXRlKTsNCiAJfQ0KIA0KICBvdXQ6DQpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9s aW51eC9ibGtkZXYuaCBiL2luY2x1ZGUvbGludXgvYmxrZGV2LmgNCmluZGV4IDM2M2Q3ZGY4ZDY1 Yy4uMGJlOGRiYjk4MmYzIDEwMDY0NA0KLS0tIGEvaW5jbHVkZS9saW51eC9ibGtkZXYuaA0KKysr IGIvaW5jbHVkZS9saW51eC9ibGtkZXYuaA0KQEAgLTE2MzQsNyArMTYzNCw3IEBAIHN0cnVjdCBi bG9ja19kZXZpY2Vfb3BlcmF0aW9ucyB7DQogCWludCAoKmlvY3RsKSAoc3RydWN0IGJsb2NrX2Rl dmljZSAqLCBmbW9kZV90LCB1bnNpZ25lZCwgdW5zaWduZWQgbG9uZyk7DQogCWludCAoKmNvbXBh dF9pb2N0bCkgKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgZm1vZGVfdCwgdW5zaWduZWQsIHVuc2ln bmVkIGxvbmcpOw0KIAlsb25nICgqZGlyZWN0X2FjY2Vzcykoc3RydWN0IGJsb2NrX2RldmljZSAq LCBzZWN0b3JfdCwgdm9pZCBfX3BtZW0gKiosDQotCQkJdW5zaWduZWQgbG9uZyAqcGZuKTsNCisJ CQlwZm5fdCAqKTsNCiAJdW5zaWduZWQgaW50ICgqY2hlY2tfZXZlbnRzKSAoc3RydWN0IGdlbmRp c2sgKmRpc2ssDQogCQkJCSAgICAgIHVuc2lnbmVkIGludCBjbGVhcmluZyk7DQogCS8qIC0+bWVk aWFfY2hhbmdlZCgpIGlzIERFUFJFQ0FURUQsIHVzZSAtPmNoZWNrX2V2ZW50cygpIGluc3RlYWQg Ki8NCkBAIC0xNjUzLDcgKzE2NTMsNyBAQCBleHRlcm4gaW50IGJkZXZfcmVhZF9wYWdlKHN0cnVj dCBibG9ja19kZXZpY2UgKiwgc2VjdG9yX3QsIHN0cnVjdCBwYWdlICopOw0KIGV4dGVybiBpbnQg YmRldl93cml0ZV9wYWdlKHN0cnVjdCBibG9ja19kZXZpY2UgKiwgc2VjdG9yX3QsIHN0cnVjdCBw YWdlICosDQogCQkJCQkJc3RydWN0IHdyaXRlYmFja19jb250cm9sICopOw0KIGV4dGVybiBsb25n IGJkZXZfZGlyZWN0X2FjY2VzcyhzdHJ1Y3QgYmxvY2tfZGV2aWNlICosIHNlY3Rvcl90LA0KLQkJ dm9pZCBfX3BtZW0gKiphZGRyLCB1bnNpZ25lZCBsb25nICpwZm4sIGxvbmcgc2l6ZSk7DQorCQl2 b2lkIF9fcG1lbSAqKmFkZHIsIHBmbl90ICpwZm4sIGxvbmcgc2l6ZSk7DQogI2Vsc2UgLyogQ09O RklHX0JMT0NLICovDQogDQogc3RydWN0IGJsb2NrX2RldmljZTsNCmRpZmYgLS1naXQgYS9pbmNs dWRlL2xpbnV4L21tLmggYi9pbmNsdWRlL2xpbnV4L21tLmgNCmluZGV4IDkxYzA4ZjZmMGRjOS4u YWJlNjBlYWRjOGFlIDEwMDY0NA0KLS0tIGEvaW5jbHVkZS9saW51eC9tbS5oDQorKysgYi9pbmNs dWRlL2xpbnV4L21tLmgNCkBAIC05MDYsNiArOTA2LDcxIEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBz ZXRfcGFnZV9saW5rcyhzdHJ1Y3QgcGFnZSAqcGFnZSwgZW51bSB6b25lX3R5cGUgem9uZSwNCiB9 DQogDQogLyoNCisgKiBQRk5fRkxBR1NfTUFTSyAtIG1hc2sgb2YgYWxsIHRoZSBwb3NzaWJsZSB2 YWxpZCBwZm5fdCBmbGFncw0KKyAqIFBGTl9TR19DSEFJTiAtIHBmbiBpcyBhIHBvaW50ZXIgdG8g dGhlIG5leHQgc2NhdHRlcmxpc3QgZW50cnkNCisgKiBQRk5fU0dfTEFTVCAtIHBmbiByZWZlcmVu Y2VzIGEgcGFnZSBhbmQgaXMgdGhlIGxhc3Qgc2NhdHRlcmxpc3QgZW50cnkNCisgKiBQRk5fREVW IC0gcGZuIGlzIG5vdCBjb3ZlcmVkIGJ5IHN5c3RlbSBtZW1tYXAgYnkgZGVmYXVsdA0KKyAqIFBG Tl9NQVAgLSBwZm4gaGFzIGEgZHluYW1pYyBwYWdlIG1hcHBpbmcgZXN0YWJsaXNoZWQgYnkgYSBk ZXZpY2UgZHJpdmVyDQorICovDQorI2RlZmluZSBQRk5fRkxBR1NfTUFTSyAoflBBR0VfTUFTSyA8 PCAoQklUU19QRVJfTE9ORyAtIFBBR0VfU0hJRlQpKQ0KKyNkZWZpbmUgUEZOX1NHX0NIQUlOICgx VUwgPDwgKEJJVFNfUEVSX0xPTkcgLSAxKSkNCisjZGVmaW5lIFBGTl9TR19MQVNUICgxVUwgPDwg KEJJVFNfUEVSX0xPTkcgLSAyKSkNCisjZGVmaW5lIFBGTl9ERVYgKDFVTCA8PCAoQklUU19QRVJf TE9ORyAtIDMpKQ0KKyNkZWZpbmUgUEZOX01BUCAoMVVMIDw8IChCSVRTX1BFUl9MT05HIC0gNCkp DQorDQorc3RhdGljIGlubGluZSBwZm5fdCBfX3Bmbl90b19wZm5fdCh1bnNpZ25lZCBsb25nIHBm biwgdW5zaWduZWQgbG9uZyBmbGFncykNCit7DQorCXBmbl90IHBmbl90ID0geyAudmFsID0gcGZu IHwgKGZsYWdzICYgUEZOX0ZMQUdTX01BU0spLCB9Ow0KKw0KKwlyZXR1cm4gcGZuX3Q7DQorfQ0K Kw0KKy8qIGEgZGVmYXVsdCBwZm4gdG8gcGZuX3QgY29udmVyc2lvbiBhc3N1bWVzIHRoYXQgQHBm biBpcyBwZm5fdmFsaWQoKSAqLw0KK3N0YXRpYyBpbmxpbmUgcGZuX3QgcGZuX3RvX3Bmbl90KHVu c2lnbmVkIGxvbmcgcGZuKQ0KK3sNCisJcmV0dXJuIF9fcGZuX3RvX3Bmbl90KHBmbiwgMCk7DQor fQ0KKw0KK3N0YXRpYyBpbmxpbmUgcGZuX3QgcGh5c190b19wZm5fdChkbWFfYWRkcl90IGFkZHIs IHVuc2lnbmVkIGxvbmcgZmxhZ3MpDQorew0KKwlyZXR1cm4gX19wZm5fdG9fcGZuX3QoYWRkciA+ PiBQQUdFX1NISUZULCBmbGFncyk7DQorfQ0KKw0KK3N0YXRpYyBpbmxpbmUgYm9vbCBwZm5fdF9o YXNfcGFnZShwZm5fdCBwZm4pDQorew0KKwlyZXR1cm4gKHBmbi52YWwgJiBQRk5fTUFQKSA9PSBQ Rk5fTUFQIHx8IChwZm4udmFsICYgUEZOX0RFVikgPT0gMDsNCit9DQorDQorc3RhdGljIGlubGlu ZSB1bnNpZ25lZCBsb25nIHBmbl90X3RvX3BmbihwZm5fdCBwZm4pDQorew0KKwlyZXR1cm4gcGZu LnZhbCAmIH5QRk5fRkxBR1NfTUFTSzsNCit9DQorDQorc3RhdGljIGlubGluZSBzdHJ1Y3QgcGFn ZSAqcGZuX3RfdG9fcGFnZShwZm5fdCBwZm4pDQorew0KKwlpZiAocGZuX3RfaGFzX3BhZ2UocGZu KSkNCisJCXJldHVybiBwZm5fdG9fcGFnZShwZm5fdF90b19wZm4ocGZuKSk7DQorCXJldHVybiBO VUxMOw0KK30NCisNCitzdGF0aWMgaW5saW5lIGRtYV9hZGRyX3QgcGZuX3RfdG9fcGh5cyhwZm5f dCBwZm4pDQorew0KKwlyZXR1cm4gUEZOX1BIWVMocGZuX3RfdG9fcGZuKHBmbikpOw0KK30NCisN CitzdGF0aWMgaW5saW5lIHZvaWQgKnBmbl90X3RvX3ZpcnQocGZuX3QgcGZuKQ0KK3sNCisJaWYg KHBmbl90X2hhc19wYWdlKHBmbikpDQorCQlyZXR1cm4gX192YShwZm5fdF90b19waHlzKHBmbikp Ow0KKwlyZXR1cm4gTlVMTDsNCit9DQorDQorc3RhdGljIGlubGluZSBwZm5fdCBwYWdlX3RvX3Bm bl90KHN0cnVjdCBwYWdlICpwYWdlKQ0KK3sNCisJcmV0dXJuIHBmbl90b19wZm5fdChwYWdlX3Rv X3BmbihwYWdlKSk7DQorfQ0KKw0KKy8qDQogICogU29tZSBpbmxpbmUgZnVuY3Rpb25zIGluIHZt c3RhdC5oIGRlcGVuZCBvbiBwYWdlX3pvbmUoKQ0KICAqLw0KICNpbmNsdWRlIDxsaW51eC92bXN0 YXQuaD4NCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L3Bmbi5oIGIvaW5jbHVkZS9saW51eC9w Zm4uaA0KaW5kZXggNzY0NjYzNzIyMWYzLi45NmRmODU5ODVmMTYgMTAwNjQ0DQotLS0gYS9pbmNs dWRlL2xpbnV4L3Bmbi5oDQorKysgYi9pbmNsdWRlL2xpbnV4L3Bmbi5oDQpAQCAtMyw2ICszLDE1 IEBADQogDQogI2lmbmRlZiBfX0FTU0VNQkxZX18NCiAjaW5jbHVkZSA8bGludXgvdHlwZXMuaD4N CisNCisvKg0KKyAqIHBmbl90OiBlbmNhcHN1bGF0ZXMgYSBwYWdlLWZyYW1lIG51bWJlciB0aGF0 IGlzIG9wdGlvbmFsbHkgYmFja2VkDQorICogYnkgbWVtbWFwIChzdHJ1Y3QgcGFnZSkuICBXaGV0 aGVyIGEgcGZuX3QgaGFzIGEgJ3N0cnVjdCBwYWdlJw0KKyAqIGJhY2tpbmcgaXMgaW5kaWNhdGVk IGJ5IGZsYWdzIGluIHRoZSBoaWdoIGJpdHMgb2YgdGhlIHZhbHVlLg0KKyAqLw0KK3R5cGVkZWYg c3RydWN0IHsNCisJdW5zaWduZWQgbG9uZyB2YWw7DQorfSBwZm5fdDsNCiAjZW5kaWYNCiANCiAj ZGVmaW5lIFBGTl9BTElHTih4KQkoKCh1bnNpZ25lZCBsb25nKSh4KSArIChQQUdFX1NJWkUgLSAx KSkgJiBQQUdFX01BU0spDQoNCg0K -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/powerpc/sysdev/axonram.c b/arch/powerpc/sysdev/axonram.c index 24ffab2572e8..35eff52c0a38 100644 --- a/arch/powerpc/sysdev/axonram.c +++ b/arch/powerpc/sysdev/axonram.c @@ -141,15 +141,13 @@ axon_ram_make_request(struct request_queue *queue, struct bio *bio) */ static long axon_ram_direct_access(struct block_device *device, sector_t sector, - void __pmem **kaddr, unsigned long *pfn) + void __pmem **kaddr, __pfn_t *pfn) { struct axon_ram_bank *bank = device->bd_disk->private_data; loff_t offset = (loff_t)sector << AXON_RAM_SECTOR_SHIFT; - void *addr = (void *)(bank->ph_addr + offset); - - *kaddr = (void __pmem *)addr; - *pfn = virt_to_phys(addr) >> PAGE_SHIFT; + *kaddr = (void __pmem __force *) bank->io_addr + offset; + *pfn = phys_to_pfn_t(bank->ph_addr + offset, PFN_DEV); return bank->size - offset; } diff --git a/drivers/block/brd.c b/drivers/block/brd.c index f645a71ae827..50e78b1ea26c 100644 --- a/drivers/block/brd.c +++ b/drivers/block/brd.c @@ -374,7 +374,7 @@ static int brd_rw_page(struct block_device *bdev, sector_t sector, #ifdef CONFIG_BLK_DEV_RAM_DAX static long brd_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, unsigned long *pfn) + void __pmem **kaddr, __pfn_t *pfn) { struct brd_device *brd = bdev->bd_disk->private_data; struct page *page; @@ -385,7 +385,7 @@ static long brd_direct_access(struct block_device *bdev, sector_t sector, if (!page) return -ENOSPC; *kaddr = (void __pmem *)page_address(page); - *pfn = page_to_pfn(page); + *pfn = page_to_pfn_t(page); return PAGE_SIZE; } diff --git a/drivers/nvdimm/pmem.c b/drivers/nvdimm/pmem.c index 3ee02af73ad0..1c670775129b 100644 --- a/drivers/nvdimm/pmem.c +++ b/drivers/nvdimm/pmem.c @@ -39,6 +39,7 @@ struct pmem_device { phys_addr_t phys_addr; /* when non-zero this device is hosting a 'pfn' instance */ phys_addr_t data_offset; + unsigned long pfn_flags; void __pmem *virt_addr; size_t size; }; @@ -108,25 +109,22 @@ static int pmem_rw_page(struct block_device *bdev, sector_t sector, } static long pmem_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **kaddr, unsigned long *pfn) + void __pmem **kaddr, __pfn_t *pfn) { struct pmem_device *pmem = bdev->bd_disk->private_data; resource_size_t offset = sector * 512 + pmem->data_offset; - resource_size_t size; + resource_size_t size = pmem->size - offset; - if (pmem->data_offset) { + *kaddr = pmem->virt_addr + offset; + *pfn = phys_to_pfn_t(pmem->phys_addr + offset, pmem->pfn_flags); + + if (__pfn_t_has_page(*pfn)) { /* * Limit the direct_access() size to what is covered by * the memmap */ - size = (pmem->size - offset) & ~ND_PFN_MASK; - } else - size = pmem->size - offset; - - /* FIXME convert DAX to comprehend that this mapping has a lifetime */ - *kaddr = pmem->virt_addr + offset; - *pfn = (pmem->phys_addr + offset) >> PAGE_SHIFT; - + size &= ~ND_PFN_MASK; + } return size; } @@ -158,9 +156,11 @@ static struct pmem_device *pmem_alloc(struct device *dev, return ERR_PTR(-EBUSY); } - if (pmem_should_map_pages(dev)) + pmem->pfn_flags = PFN_DEV; + if (pmem_should_map_pages(dev)) { pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, res); - else + pmem->pfn_flags |= PFN_MAP; + } else pmem->virt_addr = (void __pmem *) devm_memremap(dev, pmem->phys_addr, pmem->size, ARCH_MEMREMAP_PMEM); @@ -371,6 +371,7 @@ static int nvdimm_namespace_attach_pfn(struct nd_namespace_common *ndns) pmem = dev_get_drvdata(dev); devm_memunmap(dev, (void __force *) pmem->virt_addr); pmem->virt_addr = (void __pmem *) devm_memremap_pages(dev, &nsio->res); + pmem->pfn_flags |= PFN_MAP; if (IS_ERR(pmem->virt_addr)) { rc = PTR_ERR(pmem->virt_addr); goto err; diff --git a/drivers/s390/block/dcssblk.c b/drivers/s390/block/dcssblk.c index c212ce925ee6..4dfa8cfbdd9a 100644 --- a/drivers/s390/block/dcssblk.c +++ b/drivers/s390/block/dcssblk.c @@ -29,7 +29,7 @@ static int dcssblk_open(struct block_device *bdev, fmode_t mode); static void dcssblk_release(struct gendisk *disk, fmode_t mode); static void dcssblk_make_request(struct request_queue *q, struct bio *bio); static long dcssblk_direct_access(struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, unsigned long *pfn); + void __pmem **kaddr, __pfn_t *pfn); static char dcssblk_segments[DCSSBLK_PARM_LEN] = "\0"; @@ -881,20 +881,18 @@ fail: static long dcssblk_direct_access (struct block_device *bdev, sector_t secnum, - void __pmem **kaddr, unsigned long *pfn) + void __pmem **kaddr, __pfn_t *pfn) { struct dcssblk_dev_info *dev_info; unsigned long offset, dev_sz; - void *addr; dev_info = bdev->bd_disk->private_data; if (!dev_info) return -ENODEV; dev_sz = dev_info->end - dev_info->start; offset = secnum * 512; - addr = (void *) (dev_info->start + offset); - *pfn = virt_to_phys(addr) >> PAGE_SHIFT; - *kaddr = (void __pmem *) addr; + *kaddr = (void __pmem *) (dev_info->start + offset); + *pfn = phys_to_pfn_t(dev_info->start + offset, PFN_DEV); return dev_sz - offset; } diff --git a/fs/block_dev.c b/fs/block_dev.c index 073bb57adab1..74c507059f8d 100644 --- a/fs/block_dev.c +++ b/fs/block_dev.c @@ -442,7 +442,7 @@ EXPORT_SYMBOL_GPL(bdev_write_page); * accessible at this address. */ long bdev_direct_access(struct block_device *bdev, sector_t sector, - void __pmem **addr, unsigned long *pfn, long size) + void __pmem **addr, __pfn_t *pfn, long size) { long avail; const struct block_device_operations *ops = bdev->bd_disk->fops; diff --git a/fs/dax.c b/fs/dax.c index 358eea39e982..41d4f76e93ef 100644 --- a/fs/dax.c +++ b/fs/dax.c @@ -37,7 +37,7 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size) might_sleep(); do { void __pmem *addr; - unsigned long pfn; + __pfn_t pfn; long count; count = bdev_direct_access(bdev, sector, &addr, &pfn, size); @@ -64,7 +64,7 @@ int dax_clear_blocks(struct inode *inode, sector_t block, long size) EXPORT_SYMBOL_GPL(dax_clear_blocks); static void __pmem *__dax_map_bh(const struct buffer_head *bh, unsigned blkbits, - unsigned long *pfn, long *len) + __pfn_t *pfn, long *len) { long rc; void __pmem *addr; @@ -87,7 +87,7 @@ static void __pmem *__dax_map_bh(const struct buffer_head *bh, unsigned blkbits, static void __pmem *dax_map_bh(const struct buffer_head *bh, unsigned blkbits) { - unsigned long pfn; + __pfn_t pfn; return __dax_map_bh(bh, blkbits, &pfn, NULL); } @@ -138,7 +138,7 @@ static ssize_t dax_io(struct inode *inode, struct iov_iter *iter, loff_t pos = start, max = start, bh_max = start; int rw = iov_iter_rw(iter), rc; long map_len = 0; - unsigned long pfn; + __pfn_t pfn; void __pmem *addr = NULL; void __pmem *kmap = (void __pmem *) ERR_PTR(-EIO); bool hole = false; @@ -324,9 +324,9 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, struct vm_area_struct *vma, struct vm_fault *vmf) { unsigned long vaddr = (unsigned long)vmf->virtual_address; - unsigned long pfn; void __pmem *addr; pgoff_t size; + __pfn_t pfn; int error; /* @@ -354,7 +354,7 @@ static int dax_insert_mapping(struct inode *inode, struct buffer_head *bh, } dax_unmap_bh(bh, addr); - error = vm_insert_mixed(vma, vaddr, pfn); + error = vm_insert_mixed(vma, vaddr, __pfn_t_to_pfn(pfn)); out: return error; @@ -604,7 +604,7 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, if (buffer_unwritten(&bh) || buffer_new(&bh)) { int i; long length; - unsigned long pfn; + __pfn_t pfn; void __pmem *kaddr = __dax_map_bh(&bh, blkbits, &pfn, &length); if (IS_ERR(kaddr)) { @@ -612,7 +612,7 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, goto out; } - if ((length < PMD_SIZE) || (pfn & PG_PMD_COLOUR)) + if ((length < PMD_SIZE) || (__pfn_t_to_pfn(pfn) & PG_PMD_COLOUR)) goto fallback; for (i = 0; i < PTRS_PER_PMD; i++) @@ -668,8 +668,8 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, result = VM_FAULT_NOPAGE; spin_unlock(ptl); } else { + __pfn_t pfn; long length; - unsigned long pfn; void __pmem *kaddr = __dax_map_bh(&bh, blkbits, &pfn, &length); if (IS_ERR(kaddr)) { @@ -677,10 +677,11 @@ int __dax_pmd_fault(struct vm_area_struct *vma, unsigned long address, goto out; } dax_unmap_bh(&bh, kaddr); - if ((length < PMD_SIZE) || (pfn & PG_PMD_COLOUR)) + if ((length < PMD_SIZE) || (__pfn_t_to_pfn(pfn) & PG_PMD_COLOUR)) goto fallback; - result |= vmf_insert_pfn_pmd(vma, address, pmd, pfn, write); + result |= vmf_insert_pfn_pmd(vma, address, pmd, + __pfn_t_to_pfn(pfn), write); } out: diff --git a/include/linux/blkdev.h b/include/linux/blkdev.h index 363d7df8d65c..e893f30ad520 100644 --- a/include/linux/blkdev.h +++ b/include/linux/blkdev.h @@ -1634,7 +1634,7 @@ struct block_device_operations { int (*ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); int (*compat_ioctl) (struct block_device *, fmode_t, unsigned, unsigned long); long (*direct_access)(struct block_device *, sector_t, void __pmem **, - unsigned long *pfn); + __pfn_t *); unsigned int (*check_events) (struct gendisk *disk, unsigned int clearing); /* ->media_changed() is DEPRECATED, use ->check_events() instead */ @@ -1653,7 +1653,7 @@ extern int bdev_read_page(struct block_device *, sector_t, struct page *); extern int bdev_write_page(struct block_device *, sector_t, struct page *, struct writeback_control *); extern long bdev_direct_access(struct block_device *, sector_t, - void __pmem **addr, unsigned long *pfn, long size); + void __pmem **addr, __pfn_t *pfn, long size); #else /* CONFIG_BLOCK */ struct block_device; diff --git a/include/linux/mm.h b/include/linux/mm.h index 91c08f6f0dc9..6ea922de6870 100644 --- a/include/linux/mm.h +++ b/include/linux/mm.h @@ -906,6 +906,78 @@ static inline void set_page_links(struct page *page, enum zone_type zone, } /* + * __pfn_t: encapsulates a page-frame number that is optionally backed + * by memmap (struct page). Whether a __pfn_t has a 'struct page' + * backing is indicated by flags in the low bits of the value; + */ +typedef struct { + unsigned long val; +} __pfn_t; + +/* + * PFN_SG_CHAIN - pfn is a pointer to the next scatterlist entry + * PFN_SG_LAST - pfn references a page and is the last scatterlist entry + * PFN_DEV - pfn is not covered by system memmap by default + * PFN_MAP - pfn has a dynamic page mapping established by a device driver + */ +enum { + PFN_SHIFT = 4, + PFN_MASK = (1UL << PFN_SHIFT) - 1, + PFN_SG_CHAIN = (1UL << 0), + PFN_SG_LAST = (1UL << 1), + PFN_DEV = (1UL << 2), + PFN_MAP = (1UL << 3), +}; + +static inline __pfn_t pfn_to_pfn_t(unsigned long pfn, unsigned long flags) +{ + __pfn_t pfn_t = { .val = (pfn << PFN_SHIFT) | (flags & PFN_MASK), }; + + return pfn_t; +} + +static inline __pfn_t phys_to_pfn_t(dma_addr_t addr, unsigned long flags) +{ + return pfn_to_pfn_t(addr >> PAGE_SHIFT, flags); +} + +static inline bool __pfn_t_has_page(__pfn_t pfn) +{ + return (pfn.val & PFN_MAP) == PFN_MAP || (pfn.val & PFN_DEV) == 0; +} + +static inline unsigned long __pfn_t_to_pfn(__pfn_t pfn) +{ + return pfn.val >> PFN_SHIFT; +} + +static inline struct page *__pfn_t_to_page(__pfn_t pfn) +{ + if (__pfn_t_has_page(pfn)) + return pfn_to_page(__pfn_t_to_pfn(pfn)); + return NULL; +} + +static inline dma_addr_t __pfn_t_to_phys(__pfn_t pfn) +{ + return PFN_PHYS(__pfn_t_to_pfn(pfn)); +} + +static inline void *__pfn_t_to_virt(__pfn_t pfn) +{ + if (__pfn_t_has_page(pfn)) + return __va(__pfn_t_to_phys(pfn)); + return NULL; +} + +static inline __pfn_t page_to_pfn_t(struct page *page) +{ + __pfn_t pfn = { .val = page_to_pfn(page) << PFN_SHIFT, }; + + return pfn; +} + +/* * Some inline functions in vmstat.h depend on page_zone() */ #include <linux/vmstat.h>
In preparation for enabling get_user_pages() operations on dax mappings, introduce a type that encapsulates a page-frame-number that can also be used to encode other information. This other information is the historical "page_link" encoding in a scatterlist, but can also denote "device memory". Where "device memory" is a set of pfns that are not part of the kernel's linear mapping by default, but are accessed via the same memory controller as ram. The motivation for this new type is large capacity persistent memory that optionally has struct page entries in the 'memmap'. When a driver, like pmem, has established a devm_memremap_pages() mapping it needs to communicate to upper layers that the pfn has a page backing. This property will be leveraged in a later patch to enable dax-gup. For now, update all the ->direct_access() implementations to communicate whether the returned pfn range is mapped. Cc: Christoph Hellwig <hch@lst.de> Cc: Dave Hansen <dave@sr71.net> Cc: Andrew Morton <akpm@linux-foundation.org> Cc: Ross Zwisler <ross.zwisler@linux.intel.com> Signed-off-by: Dan Williams <dan.j.williams@intel.com> --- arch/powerpc/sysdev/axonram.c | 8 ++--- drivers/block/brd.c | 4 +- drivers/nvdimm/pmem.c | 27 ++++++++------- drivers/s390/block/dcssblk.c | 10 ++---- fs/block_dev.c | 2 + fs/dax.c | 23 +++++++------ include/linux/blkdev.h | 4 +- include/linux/mm.h | 72 +++++++++++++++++++++++++++++++++++++++++ 8 files changed, 110 insertions(+), 40 deletions(-) -- To unsubscribe from this list: send the line "unsubscribe linux-fsdevel" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html