All of lore.kernel.org
 help / color / mirror / Atom feed
diff for duplicates of <1486601331.11028.5.camel@primarydata.com>

diff --git a/a/1.txt b/N1/1.txt
index 60a3689..40b05f4 100644
--- a/a/1.txt
+++ b/N1/1.txt
@@ -1,130 +1,227 @@
-T24gV2VkLCAyMDE3LTAyLTA4IGF0IDE5OjE5IC0wNTAwLCBDaHVjayBMZXZlciB3cm90ZToNCj4g
-PiBPbiBGZWIgOCwgMjAxNywgYXQgNzowNSBQTSwgVHJvbmQgTXlrbGVidXN0IDx0cm9uZG15QHBy
-aW1hcnlkYXRhLmNvDQo+ID4gbT4gd3JvdGU6DQo+ID4gDQo+ID4gT24gV2VkLCAyMDE3LTAyLTA4
-IGF0IDE3OjAxIC0wNTAwLCBDaHVjayBMZXZlciB3cm90ZToNCj4gPiA+IEFsbG93IFJQQy1vdmVy
-LVJETUEgdG8gc2VuZCBOVUxMIHBpbmdzIGV2ZW4gd2hlbiB0aGUgdHJhbnNwb3J0DQo+ID4gPiBo
-YXMNCj4gPiA+IGhpdCBpdHMgY3JlZGl0IGxpbWl0LiBPbmUgUlBDLW92ZXItUkRNQSBjcmVkaXQg
-aXMgcmVzZXJ2ZWQgZm9yDQo+ID4gPiBvcGVyYXRpb25zIGxpa2Uga2VlcGFsaXZlLg0KPiA+ID4g
-DQo+ID4gPiBGb3IgdHJhbnNwb3J0cyB0aGF0IGNvbnZleSBORlN2NCwgaXQgc2VlbXMgbGlrZSBs
-ZWFzZSByZW5ld2FsDQo+ID4gPiB3b3VsZA0KPiA+ID4gYWxzbyBiZSBhIGNhbmRpZGF0ZSBmb3Ig
-dXNpbmcgYSBwcmlvcml0eSB0cmFuc3BvcnQgc2xvdC4gSSdkIGxpa2UNCj4gPiA+IHRvDQo+ID4g
-PiBzZWUgYSBtZWNoYW5pc20gYmV0dGVyIHRoYW4gUlBDUkRNQV9QUklPUklUWSB0aGF0IGNhbiBl
-bnN1cmUgb25seQ0KPiA+ID4gb25lIHByaW9yaXR5IG9wZXJhdGlvbiBpcyBpbiB1c2UgYXQgYSB0
-aW1lLg0KPiA+ID4gDQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBDaHVjayBMZXZlciA8Y2h1Y2subGV2
-ZXJAb3JhY2xlLmNvbT4NCj4gPiA+IC0tLQ0KPiA+ID4gwqBpbmNsdWRlL2xpbnV4L3N1bnJwYy9z
-Y2hlZC5owqDCoMKgwqB8wqDCoMKgwqAyICsrDQo+ID4gPiDCoG5ldC9zdW5ycGMveHBydC5jwqDC
-oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgNCArKysrDQo+ID4gPiDCoG5ldC9z
-dW5ycGMveHBydHJkbWEvdHJhbnNwb3J0LmMgfMKgwqDCoMKgMyArKy0NCj4gPiA+IMKgbmV0L3N1
-bnJwYy94cHJ0cmRtYS92ZXJicy5jwqDCoMKgwqDCoHzCoMKgwqAxMyArKysrKysrKy0tLS0tDQo+
-ID4gPiDCoDQgZmlsZXMgY2hhbmdlZCwgMTYgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkN
-Cj4gPiA+IA0KPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgN
-Cj4gPiA+IGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaA0KPiA+ID4gaW5kZXggMTM4MjJl
-Ni4uZmNlYTE1OCAxMDA2NDQNCj4gPiA+IC0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVk
-LmgNCj4gPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgNCj4gPiA+IEBAIC0x
-MjcsNiArMTI3LDcgQEAgc3RydWN0IHJwY190YXNrX3NldHVwIHsNCj4gPiA+IMKgI2RlZmluZSBS
-UENfVEFTS19USU1FT1VUCTB4MTAwMAkJLyogZmFpbA0KPiA+ID4gd2l0aA0KPiA+ID4gRVRJTUVE
-T1VUIG9uIHRpbWVvdXQgKi8NCj4gPiA+IMKgI2RlZmluZSBSUENfVEFTS19OT0NPTk5FQ1QJMHgy
-MDAwCQkvKg0KPiA+ID4gcmV0dXJuDQo+ID4gPiBFTk9UQ09OTiBpZiBub3QgY29ubmVjdGVkICov
-DQo+ID4gPiDCoCNkZWZpbmUgUlBDX1RBU0tfTk9fUkVUUkFOU19USU1FT1VUCTB4NDAwMAkJDQo+
-ID4gPiAvKg0KPiA+ID4gd2FpdCBmb3JldmVyIGZvciBhIHJlcGx5ICovDQo+ID4gPiArI2RlZmlu
-ZSBSUENfVEFTS19OT19DT05HCTB4ODAwMAkJLyogc2tpcA0KPiA+ID4gY29uZ2VzdGlvbiBjb250
-cm9sICovDQo+ID4gPiDCoA0KPiA+ID4gwqAjZGVmaW5lIFJQQ19UQVNLX1NPRlRQSU5HCShSUENf
-VEFTS19TT0ZUIHwNCj4gPiA+IFJQQ19UQVNLX1NPRlRDT05OKQ0KPiA+ID4gwqANCj4gPiA+IEBA
-IC0xMzcsNiArMTM4LDcgQEAgc3RydWN0IHJwY190YXNrX3NldHVwIHsNCj4gPiA+IMKgI2RlZmlu
-ZSBSUENfSVNfU09GVCh0KQkJKCh0KS0+dGtfZmxhZ3MgJg0KPiA+ID4gKFJQQ19UQVNLX1NPRlR8
-UlBDX1RBU0tfVElNRU9VVCkpDQo+ID4gPiDCoCNkZWZpbmUgUlBDX0lTX1NPRlRDT05OKHQpCSgo
-dCktPnRrX2ZsYWdzICYNCj4gPiA+IFJQQ19UQVNLX1NPRlRDT05OKQ0KPiA+ID4gwqAjZGVmaW5l
-IFJQQ19XQVNfU0VOVCh0KQkJKCh0KS0+dGtfZmxhZ3MgJg0KPiA+ID4gUlBDX1RBU0tfU0VOVCkN
-Cj4gPiA+ICsjZGVmaW5lIFJQQ19TS0lQX0NPTkcodCkJKCh0KS0+dGtfZmxhZ3MgJg0KPiA+ID4g
-UlBDX1RBU0tfTk9fQ09ORykNCj4gPiA+IMKgDQo+ID4gPiDCoCNkZWZpbmUgUlBDX1RBU0tfUlVO
-TklORwkwDQo+ID4gPiDCoCNkZWZpbmUgUlBDX1RBU0tfUVVFVUVECQkxDQo+ID4gPiBkaWZmIC0t
-Z2l0IGEvbmV0L3N1bnJwYy94cHJ0LmMgYi9uZXQvc3VucnBjL3hwcnQuYw0KPiA+ID4gaW5kZXgg
-YjUzMGEyOC4uYTQ3N2VlNiAxMDA2NDQNCj4gPiA+IC0tLSBhL25ldC9zdW5ycGMveHBydC5jDQo+
-ID4gPiArKysgYi9uZXQvc3VucnBjL3hwcnQuYw0KPiA+ID4gQEAgLTM5Miw2ICszOTIsMTAgQEAg
-c3RhdGljIGlubGluZSB2b2lkIHhwcnRfcmVsZWFzZV93cml0ZShzdHJ1Y3QNCj4gPiA+IHJwY194
-cHJ0ICp4cHJ0LCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhDQo+ID4gPiDCoHsNCj4gPiA+IMKgCXN0cnVj
-dCBycGNfcnFzdCAqcmVxID0gdGFzay0+dGtfcnFzdHA7DQo+ID4gPiDCoA0KPiA+ID4gKwlpZiAo
-UlBDX1NLSVBfQ09ORyh0YXNrKSkgew0KPiA+ID4gKwkJcmVxLT5ycV9jb25nID0gMDsNCj4gPiA+
-ICsJCXJldHVybiAxOw0KPiA+ID4gKwl9DQo+ID4gDQo+ID4gV2h5IG5vdCBqdXN0IGhhdmUgdGhl
-IFJETUEgbGF5ZXIgY2FsbCB4cHJ0X3Jlc2VydmVfeHBydCgpIChhbmQNCj4gPiB4cHJ0X3JlbGVh
-c2VfeHBydCgpKSBpZiB0aGlzIGZsYWcgaXMgc2V0PyBJdCBzZWVtcyB0byBtZSB0aGF0IHlvdQ0K
-PiA+IHdpbGwNCj4gPiBuZWVkIHNvbWUga2luZCBvZiBleHRyYSBjb25nZXN0aW9uIGNvbnRyb2wg
-aW4gdGhlIFJETUEgbGF5ZXIgYW55d2F5DQo+ID4gc2luY2UgeW91IG9ubHkgaGF2ZSBvbmUgcmVz
-ZXJ2ZWQgY3JlZGl0IGZvciB0aGVzZSBwcml2aWxlZ2VkIHRhc2tzDQo+ID4gKG9yDQo+ID4gZGlk
-IEkgbWlzcyB3aGVyZSB0aGF0IGlzIGJlaW5nIGdhdGVkPykuDQo+IA0KPiBUaGFua3MgZm9yIHRo
-ZSByZXZpZXcuDQo+IA0KPiBTZWUgUlBDUkRNQV9JQV9SU1ZEX0NSRURJVCBpbiAxMS8xMi4gSXQn
-cyBhIGhhY2sgSSdtIG5vdA0KPiB0ZXJyaWJseSBoYXBweSB3aXRoLg0KPiANCj4gU28sIEkgdGhp
-bmsgeW91IGFyZSBzdWdnZXN0aW5nIHJlcGxhY2luZyB4cHJ0cmRtYSdzDQo+IC0+cmVzZXJ2ZV94
-cHJ0IHdpdGggc29tZXRoaW5nIGxpa2U6DQo+IA0KPiBpbnQgeHBydF9yZG1hX3Jlc2VydmVfeHBy
-dCh4cHJ0LCB0YXNrKQ0KPiB7DQo+IMKgwqDCoMKgwqDCoGlmIChSUENfU0tJUF9DT05HKHRhc2sp
-KQ0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHhwcnRfcmVzZXJ2ZV94cHJ0KHhwcnQs
-IHRhc2spOw0KPiDCoMKgwqDCoMKgwqByZXR1cm4geHBydF9yZXNlcnZlX3hwcnRfY29uZyh4cHJ0
-LCB0YXNrKTsNCj4gfQ0KPiANCj4gYW5kIGxpa2V3aXNlIGZvciAtPnJlbGVhc2VfeHBydCA/DQoN
-ClJpZ2h0Lg0KDQo+IFdoYXQgSSdkIHJlYWxseSBsaWtlIHRvIGRvIGlzIGhhdmUgdGhlIFJQQyBs
-YXllcg0KPiBwcmV2ZW50IG1vcmUgdGhhbiBvbmUgUlBDIGF0IGEgdGltZSBmcm9tIHVzaW5nIHRo
-ZQ0KPiBleHRyYSBjcmVkaXQsIGFuZCBzb21laG93IGVuc3VyZSB0aGF0IHRob3NlIFJQQ3MNCj4g
-YXJlIGdvaW5nIHRvIGJlIHNob3J0LWxpdmVkIChTT0ZUIHwgU09GVENPTk4sDQo+IG1heWJlKS4N
-Cg0KQ3JlZGl0cyBhcmUgYSB0cmFuc3BvcnQgbGF5ZXIgdGhpbmcsIHRob3VnaC4gVGhlcmUgaXMg
-bm8gZXF1aXZhbGVudCBpbg0KdGhlIG5vbi1SRE1BIHdvcmxkLiBUQ1AgYW5kIFVEUCBzaG91bGQg
-bm9ybWFsbHkgYm90aCBiZSBmaW5lIHdpdGgNCnRyYW5zbWl0dGluZyBhbiBleHRyYSBSUEMgY2Fs
-bC4NCg0KRXZlbiB0aW1lb3V0cyBhcmUgYSB0cmFuc3BvcnQgbGF5ZXIgaXNzdWU7IHNlZSB0aGUg
-cGF0Y2hlcyBJIHB1dCBvdXQNCnRoaXMgbW9ybmluZyBpbiBvcmRlciB0byByZWR1Y2UgdGhlIFRD
-UCBjb25uZWN0aW9uIHRpbWVvdXRzIGFuZCBwdXQNCnRoZW0gbW9yZSBpbiBsaW5lIHdpdGggdGhl
-IGxlYXNlIHBlcmlvZC4gU29tZXRoaW5nIGxpa2UgdGhhdCBtYWtlcyBubw0Kc2Vuc2UgaW4gdGhl
-IFVEUCB3b3JsZCAobm8gY29ubmVjdGlvbnMpLCBvciBldmVuIGluIEFGX0xPQ0FMIChubw0Kcm91
-dGluZyksIHdoaWNoIGlzIHdoeSBJIGFkZGVkIHRoZSBzZXRfY29ubmVjdGlvbl90aW1lb3V0KCkg
-Y2FsbGJhY2suDQoNCj4gDQo+ID4gPiDCoAlpZiAocmVxLT5ycV9jb25nKQ0KPiA+ID4gwqAJCXJl
-dHVybiAxOw0KPiA+ID4gwqAJZHByaW50aygiUlBDOiAlNXUgeHBydF9jd25kX2xpbWl0ZWQgY29u
-ZyA9ICVsdSBjd25kID0NCj4gPiA+ICVsdVxuIiwNCj4gPiA+IGRpZmYgLS1naXQgYS9uZXQvc3Vu
-cnBjL3hwcnRyZG1hL3RyYW5zcG9ydC5jDQo+ID4gPiBiL25ldC9zdW5ycGMveHBydHJkbWEvdHJh
-bnNwb3J0LmMNCj4gPiA+IGluZGV4IDNhNWE4MDUuLjA3M2ZlY2QgMTAwNjQ0DQo+ID4gPiAtLS0g
-YS9uZXQvc3VucnBjL3hwcnRyZG1hL3RyYW5zcG9ydC5jDQo+ID4gPiArKysgYi9uZXQvc3VucnBj
-L3hwcnRyZG1hL3RyYW5zcG9ydC5jDQo+ID4gPiBAQCAtNTQ2LDcgKzU0Niw4IEBAIHN0YXRpYyB2
-b2lkIHJwY3JkbWFfa2VlcGFsaXZlX3JlbGVhc2Uodm9pZA0KPiA+ID4gKmNhbGxkYXRhKQ0KPiA+
-ID4gwqANCj4gPiA+IMKgCWRhdGEgPSB4cHJ0X2dldCh4cHJ0KTsNCj4gPiA+IMKgCW51bGxfdGFz
-ayA9IHJwY19jYWxsX251bGxfaGVscGVyKHRhc2stPnRrX2NsaWVudCwgeHBydCwNCj4gPiA+IE5V
-TEwsDQo+ID4gPiAtCQkJCQnCoFJQQ19UQVNLX1NPRlRQSU5HIHwNCj4gPiA+IFJQQ19UQVNLX0FT
-WU5DLA0KPiA+ID4gKwkJCQkJwqBSUENfVEFTS19TT0ZUUElORyB8DQo+ID4gPiBSUENfVEFTS19B
-U1lOQyB8DQo+ID4gPiArCQkJCQnCoFJQQ19UQVNLX05PX0NPTkcsDQo+ID4gPiDCoAkJCQkJwqAm
-cnBjcmRtYV9rZWVwYWxpdmVfY2FsbA0KPiA+ID4gX29wcw0KPiA+ID4gLCBkYXRhKTsNCj4gPiA+
-IMKgCWlmICghSVNfRVJSKG51bGxfdGFzaykpDQo+ID4gPiDCoAkJcnBjX3B1dF90YXNrKG51bGxf
-dGFzayk7DQo+ID4gPiBkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jDQo+
-ID4gPiBiL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYw0KPiA+ID4gaW5kZXggODFjZDMxYS4u
-ZDliNWZhNyAxMDA2NDQNCj4gPiA+IC0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYw0K
-PiA+ID4gKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jDQo+ID4gPiBAQCAtMTM2LDE5
-ICsxMzYsMjAgQEANCj4gPiA+IMKgc3RhdGljIHZvaWQNCj4gPiA+IMKgcnBjcmRtYV91cGRhdGVf
-Z3JhbnRlZF9jcmVkaXRzKHN0cnVjdCBycGNyZG1hX3JlcCAqcmVwKQ0KPiA+ID4gwqB7DQo+ID4g
-PiAtCXN0cnVjdCBycGNyZG1hX21zZyAqcm1zZ3AgPSByZG1hYl90b19tc2cocmVwLQ0KPiA+ID4g
-PnJyX3JkbWFidWYpOw0KPiA+ID4gwqAJc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWZmZXIgPSAm
-cmVwLT5ycl9yeHBydC0+cnhfYnVmOw0KPiA+ID4gKwlfX2JlMzIgKnAgPSByZXAtPnJyX3JkbWFi
-dWYtPnJnX2Jhc2U7DQo+ID4gPiDCoAl1MzIgY3JlZGl0czsNCj4gPiA+IMKgDQo+ID4gPiDCoAlp
-ZiAocmVwLT5ycl9sZW4gPCBSUENSRE1BX0hEUkxFTl9FUlIpDQo+ID4gPiDCoAkJcmV0dXJuOw0K
-PiA+ID4gwqANCj4gPiA+IC0JY3JlZGl0cyA9IGJlMzJfdG9fY3B1KHJtc2dwLT5ybV9jcmVkaXQp
-Ow0KPiA+ID4gKwljcmVkaXRzID0gYmUzMl90b19jcHVwKHAgKyAyKTsNCj4gPiA+ICsJaWYgKGNy
-ZWRpdHMgPiBidWZmZXItPnJiX21heF9yZXF1ZXN0cykNCj4gPiA+ICsJCWNyZWRpdHMgPSBidWZm
-ZXItPnJiX21heF9yZXF1ZXN0czsNCj4gPiA+ICsJLyogUmVzZXJ2ZSBvbmUgY3JlZGl0IGZvciBr
-ZWVwYWxpdmUgcGluZyAqLw0KPiA+ID4gKwljcmVkaXRzLS07DQo+ID4gPiDCoAlpZiAoY3JlZGl0
-cyA9PSAwKQ0KPiA+ID4gwqAJCWNyZWRpdHMgPSAxOwkvKiBkb24ndCBkZWFkbG9jayAqLw0KPiA+
-ID4gLQllbHNlIGlmIChjcmVkaXRzID4gYnVmZmVyLT5yYl9tYXhfcmVxdWVzdHMpDQo+ID4gPiAt
-CQljcmVkaXRzID0gYnVmZmVyLT5yYl9tYXhfcmVxdWVzdHM7DQo+ID4gPiAtDQo+ID4gPiDCoAlh
-dG9taWNfc2V0KCZidWZmZXItPnJiX2NyZWRpdHMsIGNyZWRpdHMpOw0KPiA+ID4gwqB9DQo+ID4g
-PiDCoA0KPiA+ID4gQEAgLTkxNSw2ICs5MTYsOCBAQCBzdHJ1Y3QgcnBjcmRtYV9yZXAgKg0KPiA+
-ID4gwqAJc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWYgPSAmcl94cHJ0LT5yeF9idWY7DQo+ID4g
-PiDCoAlpbnQgaSwgcmM7DQo+ID4gPiDCoA0KPiA+ID4gKwlpZiAocl94cHJ0LT5yeF9kYXRhLm1h
-eF9yZXF1ZXN0cyA8IDIpDQo+ID4gPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiA+IMKgCWJ1Zi0+
-cmJfbWF4X3JlcXVlc3RzID0gcl94cHJ0LT5yeF9kYXRhLm1heF9yZXF1ZXN0czsNCj4gPiA+IMKg
-CWJ1Zi0+cmJfYmNfc3J2X21heF9yZXF1ZXN0cyA9IDA7DQo+ID4gPiDCoAlhdG9taWNfc2V0KCZi
-dWYtPnJiX2NyZWRpdHMsIDEpOw0KPiA+ID4gDQo+ID4gPiAtLQ0KPiA+ID4gVG8gdW5zdWJzY3Jp
-YmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGxpbnV4LQ0KPiA+
-ID4gbmZzIg0KPiA+ID4gaW4NCj4gPiA+IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRv
-bW9Admdlci5rZXJuZWwub3JnDQo+ID4gPiBNb3JlIG1ham9yZG9tbyBpbmZvIGF0wqDCoGh0dHA6
-Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtDQo+ID4gPiBsDQo+ID4gPiANCj4g
-PiANCj4gPiAtLcKgDQo+ID4gDQo+ID4gDQo+ID4gCQ0KPiA+IAkNCj4gPiANCj4gPiANCj4gPiBU
-cm9uZCBNeWtsZWJ1c3QNCj4gPiBQcmluY2lwYWwgU3lzdGVtIEFyY2hpdGVjdA0KPiA+IDQzMDAg
-RWwgQ2FtaW5vIFJlYWwgfCBTdWl0ZSAxMDANCj4gPiBMb3MgQWx0b3MsIENBwqDCoDk0MDIyDQo+
-ID4gVzogNjUwLTQyMi0zODAwDQo+ID4gQzogODAxLTkyMS00NTgzwqANCj4gPiB3d3cucHJpbWFy
-eWRhdGEuY29tDQo+IA0KPiAtLQ0KPiBDaHVjayBMZXZlcg0KPiANCj4gDQo+IA0KLS0gDQoNCg0K
-DQoJDQoJDQoNCg0KVHJvbmQgTXlrbGVidXN0DQpQcmluY2lwYWwgU3lzdGVtIEFyY2hpdGVjdA0K
-NDMwMCBFbCBDYW1pbm8gUmVhbCB8IFN1aXRlIDEwMA0KTG9zIEFsdG9zLCBDQcKgwqA5NDAyMg0K
-VzogNjUwLTQyMi0zODAwDQpDOiA4MDEtOTIxLTQ1ODPCoA0Kd3d3LnByaW1hcnlkYXRhLmNvbQ0K
-DQoNCg0KDQo=
+On Wed, 2017-02-08 at 19:19 -0500, Chuck Lever wrote:
+> > On Feb 8, 2017, at 7:05 PM, Trond Myklebust <trondmy@primarydata.co
+> > m> wrote:
+> > 
+> > On Wed, 2017-02-08 at 17:01 -0500, Chuck Lever wrote:
+> > > Allow RPC-over-RDMA to send NULL pings even when the transport
+> > > has
+> > > hit its credit limit. One RPC-over-RDMA credit is reserved for
+> > > operations like keepalive.
+> > > 
+> > > For transports that convey NFSv4, it seems like lease renewal
+> > > would
+> > > also be a candidate for using a priority transport slot. I'd like
+> > > to
+> > > see a mechanism better than RPCRDMA_PRIORITY that can ensure only
+> > > one priority operation is in use at a time.
+> > > 
+> > > Signed-off-by: Chuck Lever <chuck.lever@oracle.com>
+> > > ---
+> > >  include/linux/sunrpc/sched.h    |    2 ++
+> > >  net/sunrpc/xprt.c               |    4 ++++
+> > >  net/sunrpc/xprtrdma/transport.c |    3 ++-
+> > >  net/sunrpc/xprtrdma/verbs.c     |   13 ++++++++-----
+> > >  4 files changed, 16 insertions(+), 6 deletions(-)
+> > > 
+> > > diff --git a/include/linux/sunrpc/sched.h
+> > > b/include/linux/sunrpc/sched.h
+> > > index 13822e6..fcea158 100644
+> > > --- a/include/linux/sunrpc/sched.h
+> > > +++ b/include/linux/sunrpc/sched.h
+> > > @@ -127,6 +127,7 @@ struct rpc_task_setup {
+> > >  #define RPC_TASK_TIMEOUT	0x1000		/* fail
+> > > with
+> > > ETIMEDOUT on timeout */
+> > >  #define RPC_TASK_NOCONNECT	0x2000		/*
+> > > return
+> > > ENOTCONN if not connected */
+> > >  #define RPC_TASK_NO_RETRANS_TIMEOUT	0x4000		
+> > > /*
+> > > wait forever for a reply */
+> > > +#define RPC_TASK_NO_CONG	0x8000		/* skip
+> > > congestion control */
+> > >  
+> > >  #define RPC_TASK_SOFTPING	(RPC_TASK_SOFT |
+> > > RPC_TASK_SOFTCONN)
+> > >  
+> > > @@ -137,6 +138,7 @@ struct rpc_task_setup {
+> > >  #define RPC_IS_SOFT(t)		((t)->tk_flags &
+> > > (RPC_TASK_SOFT|RPC_TASK_TIMEOUT))
+> > >  #define RPC_IS_SOFTCONN(t)	((t)->tk_flags &
+> > > RPC_TASK_SOFTCONN)
+> > >  #define RPC_WAS_SENT(t)		((t)->tk_flags &
+> > > RPC_TASK_SENT)
+> > > +#define RPC_SKIP_CONG(t)	((t)->tk_flags &
+> > > RPC_TASK_NO_CONG)
+> > >  
+> > >  #define RPC_TASK_RUNNING	0
+> > >  #define RPC_TASK_QUEUED		1
+> > > diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c
+> > > index b530a28..a477ee6 100644
+> > > --- a/net/sunrpc/xprt.c
+> > > +++ b/net/sunrpc/xprt.c
+> > > @@ -392,6 +392,10 @@ static inline void xprt_release_write(struct
+> > > rpc_xprt *xprt, struct rpc_task *ta
+> > >  {
+> > >  	struct rpc_rqst *req = task->tk_rqstp;
+> > >  
+> > > +	if (RPC_SKIP_CONG(task)) {
+> > > +		req->rq_cong = 0;
+> > > +		return 1;
+> > > +	}
+> > 
+> > Why not just have the RDMA layer call xprt_reserve_xprt() (and
+> > xprt_release_xprt()) if this flag is set? It seems to me that you
+> > will
+> > need some kind of extra congestion control in the RDMA layer anyway
+> > since you only have one reserved credit for these privileged tasks
+> > (or
+> > did I miss where that is being gated?).
+> 
+> Thanks for the review.
+> 
+> See RPCRDMA_IA_RSVD_CREDIT in 11/12. It's a hack I'm not
+> terribly happy with.
+> 
+> So, I think you are suggesting replacing xprtrdma's
+> ->reserve_xprt with something like:
+> 
+> int xprt_rdma_reserve_xprt(xprt, task)
+> {
+>       if (RPC_SKIP_CONG(task))
+>            return xprt_reserve_xprt(xprt, task);
+>       return xprt_reserve_xprt_cong(xprt, task);
+> }
+> 
+> and likewise for ->release_xprt ?
+
+Right.
+
+> What I'd really like to do is have the RPC layer
+> prevent more than one RPC at a time from using the
+> extra credit, and somehow ensure that those RPCs
+> are going to be short-lived (SOFT | SOFTCONN,
+> maybe).
+
+Credits are a transport layer thing, though. There is no equivalent in
+the non-RDMA world. TCP and UDP should normally both be fine with
+transmitting an extra RPC call.
+
+Even timeouts are a transport layer issue; see the patches I put out
+this morning in order to reduce the TCP connection timeouts and put
+them more in line with the lease period. Something like that makes no
+sense in the UDP world (no connections), or even in AF_LOCAL (no
+routing), which is why I added the set_connection_timeout() callback.
+
+> 
+> > >  	if (req->rq_cong)
+> > >  		return 1;
+> > >  	dprintk("RPC: %5u xprt_cwnd_limited cong = %lu cwnd =
+> > > %lu\n",
+> > > diff --git a/net/sunrpc/xprtrdma/transport.c
+> > > b/net/sunrpc/xprtrdma/transport.c
+> > > index 3a5a805..073fecd 100644
+> > > --- a/net/sunrpc/xprtrdma/transport.c
+> > > +++ b/net/sunrpc/xprtrdma/transport.c
+> > > @@ -546,7 +546,8 @@ static void rpcrdma_keepalive_release(void
+> > > *calldata)
+> > >  
+> > >  	data = xprt_get(xprt);
+> > >  	null_task = rpc_call_null_helper(task->tk_client, xprt,
+> > > NULL,
+> > > -					 RPC_TASK_SOFTPING |
+> > > RPC_TASK_ASYNC,
+> > > +					 RPC_TASK_SOFTPING |
+> > > RPC_TASK_ASYNC |
+> > > +					 RPC_TASK_NO_CONG,
+> > >  					 &rpcrdma_keepalive_call
+> > > _ops
+> > > , data);
+> > >  	if (!IS_ERR(null_task))
+> > >  		rpc_put_task(null_task);
+> > > diff --git a/net/sunrpc/xprtrdma/verbs.c
+> > > b/net/sunrpc/xprtrdma/verbs.c
+> > > index 81cd31a..d9b5fa7 100644
+> > > --- a/net/sunrpc/xprtrdma/verbs.c
+> > > +++ b/net/sunrpc/xprtrdma/verbs.c
+> > > @@ -136,19 +136,20 @@
+> > >  static void
+> > >  rpcrdma_update_granted_credits(struct rpcrdma_rep *rep)
+> > >  {
+> > > -	struct rpcrdma_msg *rmsgp = rdmab_to_msg(rep-
+> > > >rr_rdmabuf);
+> > >  	struct rpcrdma_buffer *buffer = &rep->rr_rxprt->rx_buf;
+> > > +	__be32 *p = rep->rr_rdmabuf->rg_base;
+> > >  	u32 credits;
+> > >  
+> > >  	if (rep->rr_len < RPCRDMA_HDRLEN_ERR)
+> > >  		return;
+> > >  
+> > > -	credits = be32_to_cpu(rmsgp->rm_credit);
+> > > +	credits = be32_to_cpup(p + 2);
+> > > +	if (credits > buffer->rb_max_requests)
+> > > +		credits = buffer->rb_max_requests;
+> > > +	/* Reserve one credit for keepalive ping */
+> > > +	credits--;
+> > >  	if (credits == 0)
+> > >  		credits = 1;	/* don't deadlock */
+> > > -	else if (credits > buffer->rb_max_requests)
+> > > -		credits = buffer->rb_max_requests;
+> > > -
+> > >  	atomic_set(&buffer->rb_credits, credits);
+> > >  }
+> > >  
+> > > @@ -915,6 +916,8 @@ struct rpcrdma_rep *
+> > >  	struct rpcrdma_buffer *buf = &r_xprt->rx_buf;
+> > >  	int i, rc;
+> > >  
+> > > +	if (r_xprt->rx_data.max_requests < 2)
+> > > +		return -EINVAL;
+> > >  	buf->rb_max_requests = r_xprt->rx_data.max_requests;
+> > >  	buf->rb_bc_srv_max_requests = 0;
+> > >  	atomic_set(&buf->rb_credits, 1);
+> > > 
+> > > --
+> > > To unsubscribe from this list: send the line "unsubscribe linux-
+> > > nfs"
+> > > in
+> > > the body of a message to majordomo@vger.kernel.org
+> > > More majordomo info at  http://vger.kernel.org/majordomo-info.htm
+> > > l
+> > > 
+> > 
+> > -- 
+> > 
+> > 
+> > 	
+> > 	
+> > 
+> > 
+> > Trond Myklebust
+> > Principal System Architect
+> > 4300 El Camino Real | Suite 100
+> > Los Altos, CA  94022
+> > W: 650-422-3800
+> > C: 801-921-4583 
+> > www.primarydata.com
+> 
+> --
+> Chuck Lever
+> 
+> 
+> 
+-- 
+
+
+
+	
+	
+
+
+Trond Myklebust
+Principal System Architect
+4300 El Camino Real | Suite 100
+Los Altos, CA  94022
+W: 650-422-3800
+C: 801-921-4583 
+www.primarydata.com
diff --git a/a/content_digest b/N1/content_digest
index 51e658b..0f46cbd 100644
--- a/a/content_digest
+++ b/N1/content_digest
@@ -2,144 +2,242 @@
  "ref\020170208220116.7152.87626.stgit@manet.1015granger.net\0"
  "ref\01486598713.11028.3.camel@primarydata.com\0"
  "ref\09D6B8B44-9C23-427C-9E06-7C92302EB04D@oracle.com\0"
- "From\0Trond Myklebust <trondmy@primarydata.com>\0"
+ "ref\09D6B8B44-9C23-427C-9E06-7C92302EB04D-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org\0"
+ "From\0Trond Myklebust <trondmy-7I+n7zu2hftEKMMhf/gKZA@public.gmane.org>\0"
  "Subject\0Re: [PATCH v3 12/12] sunrpc: Allow keepalive ping on a credit-full transport\0"
  "Date\0Thu, 9 Feb 2017 00:48:54 +0000\0"
- "To\0chuck.lever@oracle.com <chuck.lever@oracle.com>\0"
- "Cc\0anna.schumaker@netapp.com <anna.schumaker@netapp.com>"
-  linux-rdma@vger.kernel.org <linux-rdma@vger.kernel.org>
- " linux-nfs@vger.kernel.org <linux-nfs@vger.kernel.org>\0"
+ "To\0chuck.lever-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org <chuck.lever-QHcLZuEGTsvQT0dZR+AlfA@public.gmane.org>\0"
+ "Cc\0anna.schumaker-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org <anna.schumaker-HgOvQuBEEgTQT0dZR+AlfA@public.gmane.org>"
+  linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org <linux-rdma-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>
+ " linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org <linux-nfs-u79uwXL29TY76Z2rM5mHXA@public.gmane.org>\0"
  "\00:1\0"
  "b\0"
- "T24gV2VkLCAyMDE3LTAyLTA4IGF0IDE5OjE5IC0wNTAwLCBDaHVjayBMZXZlciB3cm90ZToNCj4g\n"
- "PiBPbiBGZWIgOCwgMjAxNywgYXQgNzowNSBQTSwgVHJvbmQgTXlrbGVidXN0IDx0cm9uZG15QHBy\n"
- "aW1hcnlkYXRhLmNvDQo+ID4gbT4gd3JvdGU6DQo+ID4gDQo+ID4gT24gV2VkLCAyMDE3LTAyLTA4\n"
- "IGF0IDE3OjAxIC0wNTAwLCBDaHVjayBMZXZlciB3cm90ZToNCj4gPiA+IEFsbG93IFJQQy1vdmVy\n"
- "LVJETUEgdG8gc2VuZCBOVUxMIHBpbmdzIGV2ZW4gd2hlbiB0aGUgdHJhbnNwb3J0DQo+ID4gPiBo\n"
- "YXMNCj4gPiA+IGhpdCBpdHMgY3JlZGl0IGxpbWl0LiBPbmUgUlBDLW92ZXItUkRNQSBjcmVkaXQg\n"
- "aXMgcmVzZXJ2ZWQgZm9yDQo+ID4gPiBvcGVyYXRpb25zIGxpa2Uga2VlcGFsaXZlLg0KPiA+ID4g\n"
- "DQo+ID4gPiBGb3IgdHJhbnNwb3J0cyB0aGF0IGNvbnZleSBORlN2NCwgaXQgc2VlbXMgbGlrZSBs\n"
- "ZWFzZSByZW5ld2FsDQo+ID4gPiB3b3VsZA0KPiA+ID4gYWxzbyBiZSBhIGNhbmRpZGF0ZSBmb3Ig\n"
- "dXNpbmcgYSBwcmlvcml0eSB0cmFuc3BvcnQgc2xvdC4gSSdkIGxpa2UNCj4gPiA+IHRvDQo+ID4g\n"
- "PiBzZWUgYSBtZWNoYW5pc20gYmV0dGVyIHRoYW4gUlBDUkRNQV9QUklPUklUWSB0aGF0IGNhbiBl\n"
- "bnN1cmUgb25seQ0KPiA+ID4gb25lIHByaW9yaXR5IG9wZXJhdGlvbiBpcyBpbiB1c2UgYXQgYSB0\n"
- "aW1lLg0KPiA+ID4gDQo+ID4gPiBTaWduZWQtb2ZmLWJ5OiBDaHVjayBMZXZlciA8Y2h1Y2subGV2\n"
- "ZXJAb3JhY2xlLmNvbT4NCj4gPiA+IC0tLQ0KPiA+ID4gwqBpbmNsdWRlL2xpbnV4L3N1bnJwYy9z\n"
- "Y2hlZC5owqDCoMKgwqB8wqDCoMKgwqAyICsrDQo+ID4gPiDCoG5ldC9zdW5ycGMveHBydC5jwqDC\n"
- "oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgfMKgwqDCoMKgNCArKysrDQo+ID4gPiDCoG5ldC9z\n"
- "dW5ycGMveHBydHJkbWEvdHJhbnNwb3J0LmMgfMKgwqDCoMKgMyArKy0NCj4gPiA+IMKgbmV0L3N1\n"
- "bnJwYy94cHJ0cmRtYS92ZXJicy5jwqDCoMKgwqDCoHzCoMKgwqAxMyArKysrKysrKy0tLS0tDQo+\n"
- "ID4gPiDCoDQgZmlsZXMgY2hhbmdlZCwgMTYgaW5zZXJ0aW9ucygrKSwgNiBkZWxldGlvbnMoLSkN\n"
- "Cj4gPiA+IA0KPiA+ID4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgN\n"
- "Cj4gPiA+IGIvaW5jbHVkZS9saW51eC9zdW5ycGMvc2NoZWQuaA0KPiA+ID4gaW5kZXggMTM4MjJl\n"
- "Ni4uZmNlYTE1OCAxMDA2NDQNCj4gPiA+IC0tLSBhL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVk\n"
- "LmgNCj4gPiA+ICsrKyBiL2luY2x1ZGUvbGludXgvc3VucnBjL3NjaGVkLmgNCj4gPiA+IEBAIC0x\n"
- "MjcsNiArMTI3LDcgQEAgc3RydWN0IHJwY190YXNrX3NldHVwIHsNCj4gPiA+IMKgI2RlZmluZSBS\n"
- "UENfVEFTS19USU1FT1VUCTB4MTAwMAkJLyogZmFpbA0KPiA+ID4gd2l0aA0KPiA+ID4gRVRJTUVE\n"
- "T1VUIG9uIHRpbWVvdXQgKi8NCj4gPiA+IMKgI2RlZmluZSBSUENfVEFTS19OT0NPTk5FQ1QJMHgy\n"
- "MDAwCQkvKg0KPiA+ID4gcmV0dXJuDQo+ID4gPiBFTk9UQ09OTiBpZiBub3QgY29ubmVjdGVkICov\n"
- "DQo+ID4gPiDCoCNkZWZpbmUgUlBDX1RBU0tfTk9fUkVUUkFOU19USU1FT1VUCTB4NDAwMAkJDQo+\n"
- "ID4gPiAvKg0KPiA+ID4gd2FpdCBmb3JldmVyIGZvciBhIHJlcGx5ICovDQo+ID4gPiArI2RlZmlu\n"
- "ZSBSUENfVEFTS19OT19DT05HCTB4ODAwMAkJLyogc2tpcA0KPiA+ID4gY29uZ2VzdGlvbiBjb250\n"
- "cm9sICovDQo+ID4gPiDCoA0KPiA+ID4gwqAjZGVmaW5lIFJQQ19UQVNLX1NPRlRQSU5HCShSUENf\n"
- "VEFTS19TT0ZUIHwNCj4gPiA+IFJQQ19UQVNLX1NPRlRDT05OKQ0KPiA+ID4gwqANCj4gPiA+IEBA\n"
- "IC0xMzcsNiArMTM4LDcgQEAgc3RydWN0IHJwY190YXNrX3NldHVwIHsNCj4gPiA+IMKgI2RlZmlu\n"
- "ZSBSUENfSVNfU09GVCh0KQkJKCh0KS0+dGtfZmxhZ3MgJg0KPiA+ID4gKFJQQ19UQVNLX1NPRlR8\n"
- "UlBDX1RBU0tfVElNRU9VVCkpDQo+ID4gPiDCoCNkZWZpbmUgUlBDX0lTX1NPRlRDT05OKHQpCSgo\n"
- "dCktPnRrX2ZsYWdzICYNCj4gPiA+IFJQQ19UQVNLX1NPRlRDT05OKQ0KPiA+ID4gwqAjZGVmaW5l\n"
- "IFJQQ19XQVNfU0VOVCh0KQkJKCh0KS0+dGtfZmxhZ3MgJg0KPiA+ID4gUlBDX1RBU0tfU0VOVCkN\n"
- "Cj4gPiA+ICsjZGVmaW5lIFJQQ19TS0lQX0NPTkcodCkJKCh0KS0+dGtfZmxhZ3MgJg0KPiA+ID4g\n"
- "UlBDX1RBU0tfTk9fQ09ORykNCj4gPiA+IMKgDQo+ID4gPiDCoCNkZWZpbmUgUlBDX1RBU0tfUlVO\n"
- "TklORwkwDQo+ID4gPiDCoCNkZWZpbmUgUlBDX1RBU0tfUVVFVUVECQkxDQo+ID4gPiBkaWZmIC0t\n"
- "Z2l0IGEvbmV0L3N1bnJwYy94cHJ0LmMgYi9uZXQvc3VucnBjL3hwcnQuYw0KPiA+ID4gaW5kZXgg\n"
- "YjUzMGEyOC4uYTQ3N2VlNiAxMDA2NDQNCj4gPiA+IC0tLSBhL25ldC9zdW5ycGMveHBydC5jDQo+\n"
- "ID4gPiArKysgYi9uZXQvc3VucnBjL3hwcnQuYw0KPiA+ID4gQEAgLTM5Miw2ICszOTIsMTAgQEAg\n"
- "c3RhdGljIGlubGluZSB2b2lkIHhwcnRfcmVsZWFzZV93cml0ZShzdHJ1Y3QNCj4gPiA+IHJwY194\n"
- "cHJ0ICp4cHJ0LCBzdHJ1Y3QgcnBjX3Rhc2sgKnRhDQo+ID4gPiDCoHsNCj4gPiA+IMKgCXN0cnVj\n"
- "dCBycGNfcnFzdCAqcmVxID0gdGFzay0+dGtfcnFzdHA7DQo+ID4gPiDCoA0KPiA+ID4gKwlpZiAo\n"
- "UlBDX1NLSVBfQ09ORyh0YXNrKSkgew0KPiA+ID4gKwkJcmVxLT5ycV9jb25nID0gMDsNCj4gPiA+\n"
- "ICsJCXJldHVybiAxOw0KPiA+ID4gKwl9DQo+ID4gDQo+ID4gV2h5IG5vdCBqdXN0IGhhdmUgdGhl\n"
- "IFJETUEgbGF5ZXIgY2FsbCB4cHJ0X3Jlc2VydmVfeHBydCgpIChhbmQNCj4gPiB4cHJ0X3JlbGVh\n"
- "c2VfeHBydCgpKSBpZiB0aGlzIGZsYWcgaXMgc2V0PyBJdCBzZWVtcyB0byBtZSB0aGF0IHlvdQ0K\n"
- "PiA+IHdpbGwNCj4gPiBuZWVkIHNvbWUga2luZCBvZiBleHRyYSBjb25nZXN0aW9uIGNvbnRyb2wg\n"
- "aW4gdGhlIFJETUEgbGF5ZXIgYW55d2F5DQo+ID4gc2luY2UgeW91IG9ubHkgaGF2ZSBvbmUgcmVz\n"
- "ZXJ2ZWQgY3JlZGl0IGZvciB0aGVzZSBwcml2aWxlZ2VkIHRhc2tzDQo+ID4gKG9yDQo+ID4gZGlk\n"
- "IEkgbWlzcyB3aGVyZSB0aGF0IGlzIGJlaW5nIGdhdGVkPykuDQo+IA0KPiBUaGFua3MgZm9yIHRo\n"
- "ZSByZXZpZXcuDQo+IA0KPiBTZWUgUlBDUkRNQV9JQV9SU1ZEX0NSRURJVCBpbiAxMS8xMi4gSXQn\n"
- "cyBhIGhhY2sgSSdtIG5vdA0KPiB0ZXJyaWJseSBoYXBweSB3aXRoLg0KPiANCj4gU28sIEkgdGhp\n"
- "bmsgeW91IGFyZSBzdWdnZXN0aW5nIHJlcGxhY2luZyB4cHJ0cmRtYSdzDQo+IC0+cmVzZXJ2ZV94\n"
- "cHJ0IHdpdGggc29tZXRoaW5nIGxpa2U6DQo+IA0KPiBpbnQgeHBydF9yZG1hX3Jlc2VydmVfeHBy\n"
- "dCh4cHJ0LCB0YXNrKQ0KPiB7DQo+IMKgwqDCoMKgwqDCoGlmIChSUENfU0tJUF9DT05HKHRhc2sp\n"
- "KQ0KPiDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgcmV0dXJuIHhwcnRfcmVzZXJ2ZV94cHJ0KHhwcnQs\n"
- "IHRhc2spOw0KPiDCoMKgwqDCoMKgwqByZXR1cm4geHBydF9yZXNlcnZlX3hwcnRfY29uZyh4cHJ0\n"
- "LCB0YXNrKTsNCj4gfQ0KPiANCj4gYW5kIGxpa2V3aXNlIGZvciAtPnJlbGVhc2VfeHBydCA/DQoN\n"
- "ClJpZ2h0Lg0KDQo+IFdoYXQgSSdkIHJlYWxseSBsaWtlIHRvIGRvIGlzIGhhdmUgdGhlIFJQQyBs\n"
- "YXllcg0KPiBwcmV2ZW50IG1vcmUgdGhhbiBvbmUgUlBDIGF0IGEgdGltZSBmcm9tIHVzaW5nIHRo\n"
- "ZQ0KPiBleHRyYSBjcmVkaXQsIGFuZCBzb21laG93IGVuc3VyZSB0aGF0IHRob3NlIFJQQ3MNCj4g\n"
- "YXJlIGdvaW5nIHRvIGJlIHNob3J0LWxpdmVkIChTT0ZUIHwgU09GVENPTk4sDQo+IG1heWJlKS4N\n"
- "Cg0KQ3JlZGl0cyBhcmUgYSB0cmFuc3BvcnQgbGF5ZXIgdGhpbmcsIHRob3VnaC4gVGhlcmUgaXMg\n"
- "bm8gZXF1aXZhbGVudCBpbg0KdGhlIG5vbi1SRE1BIHdvcmxkLiBUQ1AgYW5kIFVEUCBzaG91bGQg\n"
- "bm9ybWFsbHkgYm90aCBiZSBmaW5lIHdpdGgNCnRyYW5zbWl0dGluZyBhbiBleHRyYSBSUEMgY2Fs\n"
- "bC4NCg0KRXZlbiB0aW1lb3V0cyBhcmUgYSB0cmFuc3BvcnQgbGF5ZXIgaXNzdWU7IHNlZSB0aGUg\n"
- "cGF0Y2hlcyBJIHB1dCBvdXQNCnRoaXMgbW9ybmluZyBpbiBvcmRlciB0byByZWR1Y2UgdGhlIFRD\n"
- "UCBjb25uZWN0aW9uIHRpbWVvdXRzIGFuZCBwdXQNCnRoZW0gbW9yZSBpbiBsaW5lIHdpdGggdGhl\n"
- "IGxlYXNlIHBlcmlvZC4gU29tZXRoaW5nIGxpa2UgdGhhdCBtYWtlcyBubw0Kc2Vuc2UgaW4gdGhl\n"
- "IFVEUCB3b3JsZCAobm8gY29ubmVjdGlvbnMpLCBvciBldmVuIGluIEFGX0xPQ0FMIChubw0Kcm91\n"
- "dGluZyksIHdoaWNoIGlzIHdoeSBJIGFkZGVkIHRoZSBzZXRfY29ubmVjdGlvbl90aW1lb3V0KCkg\n"
- "Y2FsbGJhY2suDQoNCj4gDQo+ID4gPiDCoAlpZiAocmVxLT5ycV9jb25nKQ0KPiA+ID4gwqAJCXJl\n"
- "dHVybiAxOw0KPiA+ID4gwqAJZHByaW50aygiUlBDOiAlNXUgeHBydF9jd25kX2xpbWl0ZWQgY29u\n"
- "ZyA9ICVsdSBjd25kID0NCj4gPiA+ICVsdVxuIiwNCj4gPiA+IGRpZmYgLS1naXQgYS9uZXQvc3Vu\n"
- "cnBjL3hwcnRyZG1hL3RyYW5zcG9ydC5jDQo+ID4gPiBiL25ldC9zdW5ycGMveHBydHJkbWEvdHJh\n"
- "bnNwb3J0LmMNCj4gPiA+IGluZGV4IDNhNWE4MDUuLjA3M2ZlY2QgMTAwNjQ0DQo+ID4gPiAtLS0g\n"
- "YS9uZXQvc3VucnBjL3hwcnRyZG1hL3RyYW5zcG9ydC5jDQo+ID4gPiArKysgYi9uZXQvc3VucnBj\n"
- "L3hwcnRyZG1hL3RyYW5zcG9ydC5jDQo+ID4gPiBAQCAtNTQ2LDcgKzU0Niw4IEBAIHN0YXRpYyB2\n"
- "b2lkIHJwY3JkbWFfa2VlcGFsaXZlX3JlbGVhc2Uodm9pZA0KPiA+ID4gKmNhbGxkYXRhKQ0KPiA+\n"
- "ID4gwqANCj4gPiA+IMKgCWRhdGEgPSB4cHJ0X2dldCh4cHJ0KTsNCj4gPiA+IMKgCW51bGxfdGFz\n"
- "ayA9IHJwY19jYWxsX251bGxfaGVscGVyKHRhc2stPnRrX2NsaWVudCwgeHBydCwNCj4gPiA+IE5V\n"
- "TEwsDQo+ID4gPiAtCQkJCQnCoFJQQ19UQVNLX1NPRlRQSU5HIHwNCj4gPiA+IFJQQ19UQVNLX0FT\n"
- "WU5DLA0KPiA+ID4gKwkJCQkJwqBSUENfVEFTS19TT0ZUUElORyB8DQo+ID4gPiBSUENfVEFTS19B\n"
- "U1lOQyB8DQo+ID4gPiArCQkJCQnCoFJQQ19UQVNLX05PX0NPTkcsDQo+ID4gPiDCoAkJCQkJwqAm\n"
- "cnBjcmRtYV9rZWVwYWxpdmVfY2FsbA0KPiA+ID4gX29wcw0KPiA+ID4gLCBkYXRhKTsNCj4gPiA+\n"
- "IMKgCWlmICghSVNfRVJSKG51bGxfdGFzaykpDQo+ID4gPiDCoAkJcnBjX3B1dF90YXNrKG51bGxf\n"
- "dGFzayk7DQo+ID4gPiBkaWZmIC0tZ2l0IGEvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jDQo+\n"
- "ID4gPiBiL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYw0KPiA+ID4gaW5kZXggODFjZDMxYS4u\n"
- "ZDliNWZhNyAxMDA2NDQNCj4gPiA+IC0tLSBhL25ldC9zdW5ycGMveHBydHJkbWEvdmVyYnMuYw0K\n"
- "PiA+ID4gKysrIGIvbmV0L3N1bnJwYy94cHJ0cmRtYS92ZXJicy5jDQo+ID4gPiBAQCAtMTM2LDE5\n"
- "ICsxMzYsMjAgQEANCj4gPiA+IMKgc3RhdGljIHZvaWQNCj4gPiA+IMKgcnBjcmRtYV91cGRhdGVf\n"
- "Z3JhbnRlZF9jcmVkaXRzKHN0cnVjdCBycGNyZG1hX3JlcCAqcmVwKQ0KPiA+ID4gwqB7DQo+ID4g\n"
- "PiAtCXN0cnVjdCBycGNyZG1hX21zZyAqcm1zZ3AgPSByZG1hYl90b19tc2cocmVwLQ0KPiA+ID4g\n"
- "PnJyX3JkbWFidWYpOw0KPiA+ID4gwqAJc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWZmZXIgPSAm\n"
- "cmVwLT5ycl9yeHBydC0+cnhfYnVmOw0KPiA+ID4gKwlfX2JlMzIgKnAgPSByZXAtPnJyX3JkbWFi\n"
- "dWYtPnJnX2Jhc2U7DQo+ID4gPiDCoAl1MzIgY3JlZGl0czsNCj4gPiA+IMKgDQo+ID4gPiDCoAlp\n"
- "ZiAocmVwLT5ycl9sZW4gPCBSUENSRE1BX0hEUkxFTl9FUlIpDQo+ID4gPiDCoAkJcmV0dXJuOw0K\n"
- "PiA+ID4gwqANCj4gPiA+IC0JY3JlZGl0cyA9IGJlMzJfdG9fY3B1KHJtc2dwLT5ybV9jcmVkaXQp\n"
- "Ow0KPiA+ID4gKwljcmVkaXRzID0gYmUzMl90b19jcHVwKHAgKyAyKTsNCj4gPiA+ICsJaWYgKGNy\n"
- "ZWRpdHMgPiBidWZmZXItPnJiX21heF9yZXF1ZXN0cykNCj4gPiA+ICsJCWNyZWRpdHMgPSBidWZm\n"
- "ZXItPnJiX21heF9yZXF1ZXN0czsNCj4gPiA+ICsJLyogUmVzZXJ2ZSBvbmUgY3JlZGl0IGZvciBr\n"
- "ZWVwYWxpdmUgcGluZyAqLw0KPiA+ID4gKwljcmVkaXRzLS07DQo+ID4gPiDCoAlpZiAoY3JlZGl0\n"
- "cyA9PSAwKQ0KPiA+ID4gwqAJCWNyZWRpdHMgPSAxOwkvKiBkb24ndCBkZWFkbG9jayAqLw0KPiA+\n"
- "ID4gLQllbHNlIGlmIChjcmVkaXRzID4gYnVmZmVyLT5yYl9tYXhfcmVxdWVzdHMpDQo+ID4gPiAt\n"
- "CQljcmVkaXRzID0gYnVmZmVyLT5yYl9tYXhfcmVxdWVzdHM7DQo+ID4gPiAtDQo+ID4gPiDCoAlh\n"
- "dG9taWNfc2V0KCZidWZmZXItPnJiX2NyZWRpdHMsIGNyZWRpdHMpOw0KPiA+ID4gwqB9DQo+ID4g\n"
- "PiDCoA0KPiA+ID4gQEAgLTkxNSw2ICs5MTYsOCBAQCBzdHJ1Y3QgcnBjcmRtYV9yZXAgKg0KPiA+\n"
- "ID4gwqAJc3RydWN0IHJwY3JkbWFfYnVmZmVyICpidWYgPSAmcl94cHJ0LT5yeF9idWY7DQo+ID4g\n"
- "PiDCoAlpbnQgaSwgcmM7DQo+ID4gPiDCoA0KPiA+ID4gKwlpZiAocl94cHJ0LT5yeF9kYXRhLm1h\n"
- "eF9yZXF1ZXN0cyA8IDIpDQo+ID4gPiArCQlyZXR1cm4gLUVJTlZBTDsNCj4gPiA+IMKgCWJ1Zi0+\n"
- "cmJfbWF4X3JlcXVlc3RzID0gcl94cHJ0LT5yeF9kYXRhLm1heF9yZXF1ZXN0czsNCj4gPiA+IMKg\n"
- "CWJ1Zi0+cmJfYmNfc3J2X21heF9yZXF1ZXN0cyA9IDA7DQo+ID4gPiDCoAlhdG9taWNfc2V0KCZi\n"
- "dWYtPnJiX2NyZWRpdHMsIDEpOw0KPiA+ID4gDQo+ID4gPiAtLQ0KPiA+ID4gVG8gdW5zdWJzY3Jp\n"
- "YmUgZnJvbSB0aGlzIGxpc3Q6IHNlbmQgdGhlIGxpbmUgInVuc3Vic2NyaWJlIGxpbnV4LQ0KPiA+\n"
- "ID4gbmZzIg0KPiA+ID4gaW4NCj4gPiA+IHRoZSBib2R5IG9mIGEgbWVzc2FnZSB0byBtYWpvcmRv\n"
- "bW9Admdlci5rZXJuZWwub3JnDQo+ID4gPiBNb3JlIG1ham9yZG9tbyBpbmZvIGF0wqDCoGh0dHA6\n"
- "Ly92Z2VyLmtlcm5lbC5vcmcvbWFqb3Jkb21vLWluZm8uaHRtDQo+ID4gPiBsDQo+ID4gPiANCj4g\n"
- "PiANCj4gPiAtLcKgDQo+ID4gDQo+ID4gDQo+ID4gCQ0KPiA+IAkNCj4gPiANCj4gPiANCj4gPiBU\n"
- "cm9uZCBNeWtsZWJ1c3QNCj4gPiBQcmluY2lwYWwgU3lzdGVtIEFyY2hpdGVjdA0KPiA+IDQzMDAg\n"
- "RWwgQ2FtaW5vIFJlYWwgfCBTdWl0ZSAxMDANCj4gPiBMb3MgQWx0b3MsIENBwqDCoDk0MDIyDQo+\n"
- "ID4gVzogNjUwLTQyMi0zODAwDQo+ID4gQzogODAxLTkyMS00NTgzwqANCj4gPiB3d3cucHJpbWFy\n"
- "eWRhdGEuY29tDQo+IA0KPiAtLQ0KPiBDaHVjayBMZXZlcg0KPiANCj4gDQo+IA0KLS0gDQoNCg0K\n"
- "DQoJDQoJDQoNCg0KVHJvbmQgTXlrbGVidXN0DQpQcmluY2lwYWwgU3lzdGVtIEFyY2hpdGVjdA0K\n"
- "NDMwMCBFbCBDYW1pbm8gUmVhbCB8IFN1aXRlIDEwMA0KTG9zIEFsdG9zLCBDQcKgwqA5NDAyMg0K\n"
- "VzogNjUwLTQyMi0zODAwDQpDOiA4MDEtOTIxLTQ1ODPCoA0Kd3d3LnByaW1hcnlkYXRhLmNvbQ0K\n"
- DQoNCg0KDQo=
+ "On Wed, 2017-02-08 at 19:19 -0500, Chuck Lever wrote:\n"
+ "> > On Feb 8, 2017, at 7:05 PM, Trond Myklebust <trondmy@primarydata.co\n"
+ "> > m> wrote:\n"
+ "> > \n"
+ "> > On Wed, 2017-02-08 at 17:01 -0500, Chuck Lever wrote:\n"
+ "> > > Allow RPC-over-RDMA to send NULL pings even when the transport\n"
+ "> > > has\n"
+ "> > > hit its credit limit. One RPC-over-RDMA credit is reserved for\n"
+ "> > > operations like keepalive.\n"
+ "> > > \n"
+ "> > > For transports that convey NFSv4, it seems like lease renewal\n"
+ "> > > would\n"
+ "> > > also be a candidate for using a priority transport slot. I'd like\n"
+ "> > > to\n"
+ "> > > see a mechanism better than RPCRDMA_PRIORITY that can ensure only\n"
+ "> > > one priority operation is in use at a time.\n"
+ "> > > \n"
+ "> > > Signed-off-by: Chuck Lever <chuck.lever@oracle.com>\n"
+ "> > > ---\n"
+ "> > > \302\240include/linux/sunrpc/sched.h\302\240\302\240\302\240\302\240|\302\240\302\240\302\240\302\2402 ++\n"
+ "> > > \302\240net/sunrpc/xprt.c\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240|\302\240\302\240\302\240\302\2404 ++++\n"
+ "> > > \302\240net/sunrpc/xprtrdma/transport.c |\302\240\302\240\302\240\302\2403 ++-\n"
+ "> > > \302\240net/sunrpc/xprtrdma/verbs.c\302\240\302\240\302\240\302\240\302\240|\302\240\302\240\302\24013 ++++++++-----\n"
+ "> > > \302\2404 files changed, 16 insertions(+), 6 deletions(-)\n"
+ "> > > \n"
+ "> > > diff --git a/include/linux/sunrpc/sched.h\n"
+ "> > > b/include/linux/sunrpc/sched.h\n"
+ "> > > index 13822e6..fcea158 100644\n"
+ "> > > --- a/include/linux/sunrpc/sched.h\n"
+ "> > > +++ b/include/linux/sunrpc/sched.h\n"
+ "> > > @@ -127,6 +127,7 @@ struct rpc_task_setup {\n"
+ "> > > \302\240#define RPC_TASK_TIMEOUT\t0x1000\t\t/* fail\n"
+ "> > > with\n"
+ "> > > ETIMEDOUT on timeout */\n"
+ "> > > \302\240#define RPC_TASK_NOCONNECT\t0x2000\t\t/*\n"
+ "> > > return\n"
+ "> > > ENOTCONN if not connected */\n"
+ "> > > \302\240#define RPC_TASK_NO_RETRANS_TIMEOUT\t0x4000\t\t\n"
+ "> > > /*\n"
+ "> > > wait forever for a reply */\n"
+ "> > > +#define RPC_TASK_NO_CONG\t0x8000\t\t/* skip\n"
+ "> > > congestion control */\n"
+ "> > > \302\240\n"
+ "> > > \302\240#define RPC_TASK_SOFTPING\t(RPC_TASK_SOFT |\n"
+ "> > > RPC_TASK_SOFTCONN)\n"
+ "> > > \302\240\n"
+ "> > > @@ -137,6 +138,7 @@ struct rpc_task_setup {\n"
+ "> > > \302\240#define RPC_IS_SOFT(t)\t\t((t)->tk_flags &\n"
+ "> > > (RPC_TASK_SOFT|RPC_TASK_TIMEOUT))\n"
+ "> > > \302\240#define RPC_IS_SOFTCONN(t)\t((t)->tk_flags &\n"
+ "> > > RPC_TASK_SOFTCONN)\n"
+ "> > > \302\240#define RPC_WAS_SENT(t)\t\t((t)->tk_flags &\n"
+ "> > > RPC_TASK_SENT)\n"
+ "> > > +#define RPC_SKIP_CONG(t)\t((t)->tk_flags &\n"
+ "> > > RPC_TASK_NO_CONG)\n"
+ "> > > \302\240\n"
+ "> > > \302\240#define RPC_TASK_RUNNING\t0\n"
+ "> > > \302\240#define RPC_TASK_QUEUED\t\t1\n"
+ "> > > diff --git a/net/sunrpc/xprt.c b/net/sunrpc/xprt.c\n"
+ "> > > index b530a28..a477ee6 100644\n"
+ "> > > --- a/net/sunrpc/xprt.c\n"
+ "> > > +++ b/net/sunrpc/xprt.c\n"
+ "> > > @@ -392,6 +392,10 @@ static inline void xprt_release_write(struct\n"
+ "> > > rpc_xprt *xprt, struct rpc_task *ta\n"
+ "> > > \302\240{\n"
+ "> > > \302\240\tstruct rpc_rqst *req = task->tk_rqstp;\n"
+ "> > > \302\240\n"
+ "> > > +\tif (RPC_SKIP_CONG(task)) {\n"
+ "> > > +\t\treq->rq_cong = 0;\n"
+ "> > > +\t\treturn 1;\n"
+ "> > > +\t}\n"
+ "> > \n"
+ "> > Why not just have the RDMA layer call xprt_reserve_xprt() (and\n"
+ "> > xprt_release_xprt()) if this flag is set? It seems to me that you\n"
+ "> > will\n"
+ "> > need some kind of extra congestion control in the RDMA layer anyway\n"
+ "> > since you only have one reserved credit for these privileged tasks\n"
+ "> > (or\n"
+ "> > did I miss where that is being gated?).\n"
+ "> \n"
+ "> Thanks for the review.\n"
+ "> \n"
+ "> See RPCRDMA_IA_RSVD_CREDIT in 11/12. It's a hack I'm not\n"
+ "> terribly happy with.\n"
+ "> \n"
+ "> So, I think you are suggesting replacing xprtrdma's\n"
+ "> ->reserve_xprt with something like:\n"
+ "> \n"
+ "> int xprt_rdma_reserve_xprt(xprt, task)\n"
+ "> {\n"
+ "> \302\240\302\240\302\240\302\240\302\240\302\240if (RPC_SKIP_CONG(task))\n"
+ "> \302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240\302\240return xprt_reserve_xprt(xprt, task);\n"
+ "> \302\240\302\240\302\240\302\240\302\240\302\240return xprt_reserve_xprt_cong(xprt, task);\n"
+ "> }\n"
+ "> \n"
+ "> and likewise for ->release_xprt ?\n"
+ "\n"
+ "Right.\n"
+ "\n"
+ "> What I'd really like to do is have the RPC layer\n"
+ "> prevent more than one RPC at a time from using the\n"
+ "> extra credit, and somehow ensure that those RPCs\n"
+ "> are going to be short-lived (SOFT | SOFTCONN,\n"
+ "> maybe).\n"
+ "\n"
+ "Credits are a transport layer thing, though. There is no equivalent in\n"
+ "the non-RDMA world. TCP and UDP should normally both be fine with\n"
+ "transmitting an extra RPC call.\n"
+ "\n"
+ "Even timeouts are a transport layer issue; see the patches I put out\n"
+ "this morning in order to reduce the TCP connection timeouts and put\n"
+ "them more in line with the lease period. Something like that makes no\n"
+ "sense in the UDP world (no connections), or even in AF_LOCAL (no\n"
+ "routing), which is why I added the set_connection_timeout() callback.\n"
+ "\n"
+ "> \n"
+ "> > > \302\240\tif (req->rq_cong)\n"
+ "> > > \302\240\t\treturn 1;\n"
+ "> > > \302\240\tdprintk(\"RPC: %5u xprt_cwnd_limited cong = %lu cwnd =\n"
+ "> > > %lu\\n\",\n"
+ "> > > diff --git a/net/sunrpc/xprtrdma/transport.c\n"
+ "> > > b/net/sunrpc/xprtrdma/transport.c\n"
+ "> > > index 3a5a805..073fecd 100644\n"
+ "> > > --- a/net/sunrpc/xprtrdma/transport.c\n"
+ "> > > +++ b/net/sunrpc/xprtrdma/transport.c\n"
+ "> > > @@ -546,7 +546,8 @@ static void rpcrdma_keepalive_release(void\n"
+ "> > > *calldata)\n"
+ "> > > \302\240\n"
+ "> > > \302\240\tdata = xprt_get(xprt);\n"
+ "> > > \302\240\tnull_task = rpc_call_null_helper(task->tk_client, xprt,\n"
+ "> > > NULL,\n"
+ "> > > -\t\t\t\t\t\302\240RPC_TASK_SOFTPING |\n"
+ "> > > RPC_TASK_ASYNC,\n"
+ "> > > +\t\t\t\t\t\302\240RPC_TASK_SOFTPING |\n"
+ "> > > RPC_TASK_ASYNC |\n"
+ "> > > +\t\t\t\t\t\302\240RPC_TASK_NO_CONG,\n"
+ "> > > \302\240\t\t\t\t\t\302\240&rpcrdma_keepalive_call\n"
+ "> > > _ops\n"
+ "> > > , data);\n"
+ "> > > \302\240\tif (!IS_ERR(null_task))\n"
+ "> > > \302\240\t\trpc_put_task(null_task);\n"
+ "> > > diff --git a/net/sunrpc/xprtrdma/verbs.c\n"
+ "> > > b/net/sunrpc/xprtrdma/verbs.c\n"
+ "> > > index 81cd31a..d9b5fa7 100644\n"
+ "> > > --- a/net/sunrpc/xprtrdma/verbs.c\n"
+ "> > > +++ b/net/sunrpc/xprtrdma/verbs.c\n"
+ "> > > @@ -136,19 +136,20 @@\n"
+ "> > > \302\240static void\n"
+ "> > > \302\240rpcrdma_update_granted_credits(struct rpcrdma_rep *rep)\n"
+ "> > > \302\240{\n"
+ "> > > -\tstruct rpcrdma_msg *rmsgp = rdmab_to_msg(rep-\n"
+ "> > > >rr_rdmabuf);\n"
+ "> > > \302\240\tstruct rpcrdma_buffer *buffer = &rep->rr_rxprt->rx_buf;\n"
+ "> > > +\t__be32 *p = rep->rr_rdmabuf->rg_base;\n"
+ "> > > \302\240\tu32 credits;\n"
+ "> > > \302\240\n"
+ "> > > \302\240\tif (rep->rr_len < RPCRDMA_HDRLEN_ERR)\n"
+ "> > > \302\240\t\treturn;\n"
+ "> > > \302\240\n"
+ "> > > -\tcredits = be32_to_cpu(rmsgp->rm_credit);\n"
+ "> > > +\tcredits = be32_to_cpup(p + 2);\n"
+ "> > > +\tif (credits > buffer->rb_max_requests)\n"
+ "> > > +\t\tcredits = buffer->rb_max_requests;\n"
+ "> > > +\t/* Reserve one credit for keepalive ping */\n"
+ "> > > +\tcredits--;\n"
+ "> > > \302\240\tif (credits == 0)\n"
+ "> > > \302\240\t\tcredits = 1;\t/* don't deadlock */\n"
+ "> > > -\telse if (credits > buffer->rb_max_requests)\n"
+ "> > > -\t\tcredits = buffer->rb_max_requests;\n"
+ "> > > -\n"
+ "> > > \302\240\tatomic_set(&buffer->rb_credits, credits);\n"
+ "> > > \302\240}\n"
+ "> > > \302\240\n"
+ "> > > @@ -915,6 +916,8 @@ struct rpcrdma_rep *\n"
+ "> > > \302\240\tstruct rpcrdma_buffer *buf = &r_xprt->rx_buf;\n"
+ "> > > \302\240\tint i, rc;\n"
+ "> > > \302\240\n"
+ "> > > +\tif (r_xprt->rx_data.max_requests < 2)\n"
+ "> > > +\t\treturn -EINVAL;\n"
+ "> > > \302\240\tbuf->rb_max_requests = r_xprt->rx_data.max_requests;\n"
+ "> > > \302\240\tbuf->rb_bc_srv_max_requests = 0;\n"
+ "> > > \302\240\tatomic_set(&buf->rb_credits, 1);\n"
+ "> > > \n"
+ "> > > --\n"
+ "> > > To unsubscribe from this list: send the line \"unsubscribe linux-\n"
+ "> > > nfs\"\n"
+ "> > > in\n"
+ "> > > the body of a message to majordomo@vger.kernel.org\n"
+ "> > > More majordomo info at\302\240\302\240http://vger.kernel.org/majordomo-info.htm\n"
+ "> > > l\n"
+ "> > > \n"
+ "> > \n"
+ "> > --\302\240\n"
+ "> > \n"
+ "> > \n"
+ "> > \t\n"
+ "> > \t\n"
+ "> > \n"
+ "> > \n"
+ "> > Trond Myklebust\n"
+ "> > Principal System Architect\n"
+ "> > 4300 El Camino Real | Suite 100\n"
+ "> > Los Altos, CA\302\240\302\24094022\n"
+ "> > W: 650-422-3800\n"
+ "> > C: 801-921-4583\302\240\n"
+ "> > www.primarydata.com\n"
+ "> \n"
+ "> --\n"
+ "> Chuck Lever\n"
+ "> \n"
+ "> \n"
+ "> \n"
+ "-- \n"
+ "\n"
+ "\n"
+ "\n"
+ "\t\n"
+ "\t\n"
+ "\n"
+ "\n"
+ "Trond Myklebust\n"
+ "Principal System Architect\n"
+ "4300 El Camino Real | Suite 100\n"
+ "Los Altos, CA\302\240\302\24094022\n"
+ "W: 650-422-3800\n"
+ "C: 801-921-4583\302\240\n"
+ www.primarydata.com
 
-dd78601cc01c5a93d1e348bf47c98c2b424a0ed80aaad470f2e1c3d8bcea4ce6
+0921d28bd25d857fd3fccc51280763442e2c3bde7e829d1dd3c46496f1ce0f55

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.