From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from smtp.codeaurora.org ([198.145.29.96]) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iBEIT-0004ii-KU for ath10k@lists.infradead.org; Fri, 20 Sep 2019 08:29:47 +0000 MIME-Version: 1.0 Date: Fri, 20 Sep 2019 16:29:44 +0800 From: Yibo Zhao Subject: Re: [PATCH 2/4] mac80211: defer txqs removal from rbtree In-Reply-To: <87tv98fu6l.fsf@toke.dk> References: <1568639388-27291-1-git-send-email-yiboz@codeaurora.org> <1568639388-27291-2-git-send-email-yiboz@codeaurora.org> <87pnjyiq7o.fsf@toke.dk> <87sgothmpy.fsf@toke.dk> <8cdece5c030fd95817fb099021c38613@codeaurora.org> <87tv98fu6l.fsf@toke.dk> Message-ID: <1b4ab006d9b5c88035845aaac193ef48@codeaurora.org> List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "ath10k" Errors-To: ath10k-bounces+kvalo=adurom.com@lists.infradead.org To: =?UTF-8?Q?Toke_H=C3=B8iland-J=C3=B8rgensen?= Cc: linux-wireless-owner@vger.kernel.org, linux-wireless@vger.kernel.org, ath10k@lists.infradead.org T24gMjAxOS0wOS0xOSAxODozNywgVG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2VuIHdyb3RlOgo+IFlp Ym8gWmhhbyA8eWlib3pAY29kZWF1cm9yYS5vcmc+IHdyaXRlczoKPiAKPj4gT24gMjAxOS0wOS0x OCAxOToyMywgVG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2VuIHdyb3RlOgo+Pj4gWWlibyBaaGFvIDx5 aWJvekBjb2RlYXVyb3JhLm9yZz4gd3JpdGVzOgo+Pj4gCj4+Pj4gT24gMjAxOS0wOS0xOCAwNTox MCwgVG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2VuIHdyb3RlOgo+Pj4+PiBZaWJvIFpoYW8gPHlpYm96 QGNvZGVhdXJvcmEub3JnPiB3cml0ZXM6Cj4+Pj4+IAo+Pj4+Pj4gSW4gYSBsb29wIHR4cXMgZGVx dWV1ZSBzY2VuYXJpbywgaWYgdGhlIGZpcnN0IHR4cSBpbiB0aGUgcmJ0cmVlIAo+Pj4+Pj4gZ2V0 cwo+Pj4+Pj4gcmVtb3ZlZCBmcm9tIHJidHJlZSBpbW1lZGlhdGVseSBpbiB0aGUgaWVlZTgwMjEx X3JldHVybl90eHEoKSwgdGhlCj4+Pj4+PiBsb29wIHdpbGwgYnJlYWsgc29vbiBpbiB0aGUgaWVl ZTgwMjExX25leHRfdHhxKCkgZHVlIHRvIAo+Pj4+Pj4gc2NoZWR1bGVfcG9zCj4+Pj4+PiBub3Qg bGVhZGluZyB0byB0aGUgc2Vjb25kIHR4cSBpbiB0aGUgcmJ0cmVlLiBUaHVzLCBkZWZlcmluZyB0 aGUKPj4+Pj4+IHJlbW92YWwgcmlnaHQgYmVmb3JlIHRoZSBlbmQgb2YgdGhpcyBzY2hlZHVsZSBy b3VuZC4KPj4+Pj4+IAo+Pj4+Pj4gQ28tZGV2ZWxvcGVkLWJ5OiBZaWJvIFpoYW8gPHlpYm96QGNv ZGVhdXJvcmEub3JnPgo+Pj4+Pj4gU2lnbmVkLW9mZi1ieTogWWlibyBaaGFvIDx5aWJvekBjb2Rl YXVyb3JhLm9yZz4KPj4+Pj4+IFNpZ25lZC1vZmYtYnk6IFRva2UgSMO4aWxhbmQtSsO4cmdlbnNl biA8dG9rZUB0b2tlLmRrPgo+Pj4+PiAKPj4+Pj4gSSBkaWRuJ3Qgd3JpdGUgdGhpcyBwYXRjaCwg c28gcGxlYXNlIGRvbid0IHVzZSBteSBzaWduLW9mZi4gSSdsbCAKPj4+Pj4gYWRkCj4+Pj4+IGFj ayBvciByZXZpZXcgdGFncyBhcyBhcHByb3ByaWF0ZSBpbiByZXBseTsgYnV0IGEgZmV3IGNvbW1l bnRzIAo+Pj4+PiBmaXJzdDoKPj4+Pj4gCj4+Pj4+PiAtLS0KPj4+Pj4+ICBpbmNsdWRlL25ldC9t YWM4MDIxMS5oICAgICB8IDE2ICsrKysrKysrKystLQo+Pj4+Pj4gIG5ldC9tYWM4MDIxMS9pZWVl ODAyMTFfaS5oIHwgIDMgKysrCj4+Pj4+PiAgbmV0L21hYzgwMjExL21haW4uYyAgICAgICAgfCAg NiArKysrKwo+Pj4+Pj4gIG5ldC9tYWM4MDIxMS90eC5jICAgICAgICAgIHwgNjMKPj4+Pj4+ICsr KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKystLS0KPj4+Pj4+ICA0IGZp bGVzIGNoYW5nZWQsIDgzIGluc2VydGlvbnMoKyksIDUgZGVsZXRpb25zKC0pCj4+Pj4+PiAKPj4+ Pj4+IGRpZmYgLS1naXQgYS9pbmNsdWRlL25ldC9tYWM4MDIxMS5oIGIvaW5jbHVkZS9uZXQvbWFj ODAyMTEuaAo+Pj4+Pj4gaW5kZXggYWMyZWQ4ZS4uYmE1YTM0NSAxMDA2NDQKPj4+Pj4+IC0tLSBh L2luY2x1ZGUvbmV0L21hYzgwMjExLmgKPj4+Pj4+ICsrKyBiL2luY2x1ZGUvbmV0L21hYzgwMjEx LmgKPj4+Pj4+IEBAIC05MjUsNiArOTI1LDggQEAgc3RydWN0IGllZWU4MDIxMV90eF9yYXRlIHsK Pj4+Pj4+IAo+Pj4+Pj4gICNkZWZpbmUgSUVFRTgwMjExX01BWF9UWF9SRVRSWQkJMzEKPj4+Pj4+ IAo+Pj4+Pj4gKyNkZWZpbmUgSUVFRTgwMjExX0FJUlRJTUVfVFhRX1JNX0NIS19JTlRWX0lOX01T IDEwMAo+Pj4+Pj4gKwo+Pj4+Pj4gIHN0YXRpYyBpbmxpbmUgdm9pZCBpZWVlODAyMTFfcmF0ZV9z ZXRfdmh0KHN0cnVjdCAKPj4+Pj4+IGllZWU4MDIxMV90eF9yYXRlCj4+Pj4+PiAqcmF0ZSwKPj4+ Pj4+ICAJCQkJCSAgdTggbWNzLCB1OCBuc3MpCj4+Pj4+PiAgewo+Pj4+Pj4gQEAgLTYyMzIsNyAr NjIzNCw4IEBAIHN0cnVjdCBza19idWZmICppZWVlODAyMTFfdHhfZGVxdWV1ZShzdHJ1Y3QKPj4+ Pj4+IGllZWU4MDIxMV9odyAqaHcsCj4+Pj4+PiAgICogQGFjOiBBQyBudW1iZXIgdG8gcmV0dXJu IHBhY2tldHMgZnJvbS4KPj4+Pj4+ICAgKgo+Pj4+Pj4gICAqIFNob3VsZCBvbmx5IGJlIGNhbGxl ZCBiZXR3ZWVuIGNhbGxzIHRvCj4+Pj4+PiBpZWVlODAyMTFfdHhxX3NjaGVkdWxlX3N0YXJ0KCkK Pj4+Pj4+IC0gKiBhbmQgaWVlZTgwMjExX3R4cV9zY2hlZHVsZV9lbmQoKS4KPj4+Pj4+ICsgKiBh bmQgaWVlZTgwMjExX3R4cV9zY2hlZHVsZV9lbmQoKS4gSWYgdGhlIHR4cSBpcyBlbXB0eSwgaXQg d2lsbAo+Pj4+Pj4gYmUKPj4+Pj4+IGFkZGVkCj4+Pj4+PiArICogdG8gYSByZW1vdmUgbGlzdCBh bmQgZ2V0IHJlbW92ZWQgbGF0ZXIuCj4+Pj4+PiAgICogUmV0dXJucyB0aGUgbmV4dCB0eHEgaWYg c3VjY2Vzc2Z1bCwgJU5VTEwgaWYgbm8gcXVldWUgaXMKPj4+Pj4+IGVsaWdpYmxlLgo+Pj4+Pj4g SWYgYSB0eHEKPj4+Pj4+ICAgKiBpcyByZXR1cm5lZCwgaXQgc2hvdWxkIGJlIHJldHVybmVkIHdp dGggaWVlZTgwMjExX3JldHVybl90eHEoKQo+Pj4+Pj4gYWZ0ZXIgdGhlCj4+Pj4+PiAgICogZHJp dmVyIGhhcyBmaW5pc2hlZCBzY2hlZHVsaW5nIGl0Lgo+Pj4+Pj4gQEAgLTYyNjgsNyArNjI3MSw4 IEBAIHZvaWQgaWVlZTgwMjExX3R4cV9zY2hlZHVsZV9zdGFydChzdHJ1Y3QKPj4+Pj4+IGllZWU4 MDIxMV9odyAqaHcsIHU4IGFjKQo+Pj4+Pj4gICAqIEBodzogcG9pbnRlciBhcyBvYnRhaW5lZCBm cm9tIGllZWU4MDIxMV9hbGxvY19odygpCj4+Pj4+PiAgICogQGFjOiBBQyBudW1iZXIgdG8gYWNx dWlyZSBsb2NrcyBmb3IKPj4+Pj4+ICAgKgo+Pj4+Pj4gLSAqIFJlbGVhc2UgbG9ja3MgcHJldmlv dXNseSBhY3F1aXJlZCBieQo+Pj4+Pj4gaWVlZTgwMjExX3R4cV9zY2hlZHVsZV9lbmQoKS4KPj4+ Pj4+ICsgKiBSZWxlYXNlIGxvY2tzIHByZXZpb3VzbHkgYWNxdWlyZWQgYnkKPj4+Pj4+IGllZWU4 MDIxMV90eHFfc2NoZWR1bGVfZW5kKCkuCj4+Pj4+PiBDaGVjawo+Pj4+Pj4gKyAqIGFuZCByZW1v dmUgdGhlIGVtcHR5IHR4cSBmcm9tIHJiLXRyZWUuCj4+Pj4+PiAgICovCj4+Pj4+PiAgdm9pZCBp ZWVlODAyMTFfdHhxX3NjaGVkdWxlX2VuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywgdTggYWMp Cj4+Pj4+PiAgCV9fcmVsZWFzZXModHhxX2xvY2spOwo+Pj4+Pj4gQEAgLTYyODcsNiArNjI5MSwx NCBAQCB2b2lkIGllZWU4MDIxMV9zY2hlZHVsZV90eHEoc3RydWN0Cj4+Pj4+PiBpZWVlODAyMTFf aHcKPj4+Pj4+ICpodywgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKPj4+Pj4+ICAJX19hY3F1 aXJlcyh0eHFfbG9jaykgX19yZWxlYXNlcyh0eHFfbG9jayk7Cj4+Pj4+PiAKPj4+Pj4+ICAvKioK Pj4+Pj4+ICsgKiBpZWVlODAyMTFfdHhxc19jaGVjayAtIENoZWNrIHR4cXMgd2FpdGluZyBmb3Ig cmVtb3ZhbAo+Pj4+Pj4gKyAqCj4+Pj4+PiArICogQHRtcjogcG9pbnRlciBhcyBvYnRhaW5lZCBm cm9tIGxvY2FsCj4+Pj4+PiArICoKPj4+Pj4+ICsgKi8KPj4+Pj4+ICt2b2lkIGllZWU4MDIxMV90 eHFzX2NoZWNrKHN0cnVjdCB0aW1lcl9saXN0ICp0bXIpOwo+Pj4+Pj4gKwo+Pj4+Pj4gKy8qKgo+ Pj4+Pj4gICAqIGllZWU4MDIxMV90eHFfbWF5X3RyYW5zbWl0IC0gY2hlY2sgd2hldGhlciBUWFEg aXMgYWxsb3dlZCB0bwo+Pj4+Pj4gdHJhbnNtaXQKPj4+Pj4+ICAgKgo+Pj4+Pj4gICAqIFRoaXMg ZnVuY3Rpb24gaXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIGdpdmVuIHR4cSBpcyBhbGxvd2VkIHRv Cj4+Pj4+PiB0cmFuc21pdCBieQo+Pj4+Pj4gZGlmZiAtLWdpdCBhL25ldC9tYWM4MDIxMS9pZWVl ODAyMTFfaS5oIAo+Pj4+Pj4gYi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAo+Pj4+Pj4gaW5k ZXggYTQ1NTZmOS4uNDlhYTE0M2UgMTAwNjQ0Cj4+Pj4+PiAtLS0gYS9uZXQvbWFjODAyMTEvaWVl ZTgwMjExX2kuaAo+Pj4+Pj4gKysrIGIvbmV0L21hYzgwMjExL2llZWU4MDIxMV9pLmgKPj4+Pj4+ IEBAIC04NDcsNiArODQ3LDcgQEAgc3RydWN0IHR4cV9pbmZvIHsKPj4+Pj4+ICAJc3RydWN0IGNv ZGVsX3N0YXRzIGNzdGF0czsKPj4+Pj4+ICAJc3RydWN0IHNrX2J1ZmZfaGVhZCBmcmFnczsKPj4+ Pj4+ICAJc3RydWN0IHJiX25vZGUgc2NoZWR1bGVfb3JkZXI7Cj4+Pj4+PiArCXN0cnVjdCBsaXN0 X2hlYWQgY2FuZGlkYXRlOwo+Pj4+Pj4gIAl1bnNpZ25lZCBsb25nIGZsYWdzOwo+Pj4+Pj4gCj4+ Pj4+PiAgCS8qIGtlZXAgbGFzdCEgKi8KPj4+Pj4+IEBAIC0xMTQ1LDYgKzExNDYsOCBAQCBzdHJ1 Y3QgaWVlZTgwMjExX2xvY2FsIHsKPj4+Pj4+ICAJdTY0IGFpcnRpbWVfdl90W0lFRUU4MDIxMV9O VU1fQUNTXTsKPj4+Pj4+ICAJdTY0IGFpcnRpbWVfd2VpZ2h0X3N1bVtJRUVFODAyMTFfTlVNX0FD U107Cj4+Pj4+PiAKPj4+Pj4+ICsJc3RydWN0IGxpc3RfaGVhZCByZW1vdmVfbGlzdFtJRUVFODAy MTFfTlVNX0FDU107Cj4+Pj4+PiArCXN0cnVjdCB0aW1lcl9saXN0IHJlbW92ZV90aW1lcjsKPj4+ Pj4+ICAJdTE2IGFpcnRpbWVfZmxhZ3M7Cj4+Pj4+PiAKPj4+Pj4+ICAJY29uc3Qgc3RydWN0IGll ZWU4MDIxMV9vcHMgKm9wczsKPj4+Pj4+IGRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvbWFpbi5j IGIvbmV0L21hYzgwMjExL21haW4uYwo+Pj4+Pj4gaW5kZXggZTlmZmE4ZS4uNzhmZTI0YSAxMDA2 NDQKPj4+Pj4+IC0tLSBhL25ldC9tYWM4MDIxMS9tYWluLmMKPj4+Pj4+ICsrKyBiL25ldC9tYWM4 MDIxMS9tYWluLmMKPj4+Pj4+IEBAIC02NjcsMTAgKzY2NywxNSBAQCBzdHJ1Y3QgaWVlZTgwMjEx X2h3Cj4+Pj4+PiAqaWVlZTgwMjExX2FsbG9jX2h3X25tKHNpemVfdCBwcml2X2RhdGFfbGVuLAo+ Pj4+Pj4gCj4+Pj4+PiAgCWZvciAoaSA9IDA7IGkgPCBJRUVFODAyMTFfTlVNX0FDUzsgaSsrKSB7 Cj4+Pj4+PiAgCQlsb2NhbC0+YWN0aXZlX3R4cXNbaV0gPSBSQl9ST09UX0NBQ0hFRDsKPj4+Pj4+ ICsJCUlOSVRfTElTVF9IRUFEKCZsb2NhbC0+cmVtb3ZlX2xpc3RbaV0pOwo+Pj4+Pj4gIAkJc3Bp bl9sb2NrX2luaXQoJmxvY2FsLT5hY3RpdmVfdHhxX2xvY2tbaV0pOwo+Pj4+Pj4gIAl9Cj4+Pj4+ PiAgCWxvY2FsLT5haXJ0aW1lX2ZsYWdzID0gQUlSVElNRV9VU0VfVFggfCBBSVJUSU1FX1VTRV9S WDsKPj4+Pj4+IAo+Pj4+Pj4gKwl0aW1lcl9zZXR1cCgmbG9jYWwtPnJlbW92ZV90aW1lciwgaWVl ZTgwMjExX3R4cXNfY2hlY2ssIDApOwo+Pj4+Pj4gKwltb2RfdGltZXIoJmxvY2FsLT5yZW1vdmVf dGltZXIsCj4+Pj4+PiArCQkgIGppZmZpZXMgKwo+Pj4+Pj4gbXNlY3NfdG9famlmZmllcyhJRUVF ODAyMTFfQUlSVElNRV9UWFFfUk1fQ0hLX0lOVFZfSU5fTVMpKTsKPj4+Pj4+ICsKPj4+Pj4+ICAJ SU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5jaGFuY3R4X2xpc3QpOwo+Pj4+Pj4gIAltdXRleF9pbml0 KCZsb2NhbC0+Y2hhbmN0eF9tdHgpOwo+Pj4+Pj4gCj4+Pj4+PiBAQCAtMTMwNSw2ICsxMzEwLDcg QEAgdm9pZCBpZWVlODAyMTFfdW5yZWdpc3Rlcl9odyhzdHJ1Y3QKPj4+Pj4+IGllZWU4MDIxMV9o dwo+Pj4+Pj4gKmh3KQo+Pj4+Pj4gIAl0YXNrbGV0X2tpbGwoJmxvY2FsLT50eF9wZW5kaW5nX3Rh c2tsZXQpOwo+Pj4+Pj4gIAl0YXNrbGV0X2tpbGwoJmxvY2FsLT50YXNrbGV0KTsKPj4+Pj4+IAo+ Pj4+Pj4gKwlkZWxfdGltZXJfc3luYygmbG9jYWwtPnJlbW92ZV90aW1lcik7Cj4+Pj4+PiAgI2lm ZGVmIENPTkZJR19JTkVUCj4+Pj4+PiAgCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmxv Y2FsLT5pZmFfbm90aWZpZXIpOwo+Pj4+Pj4gICNlbmRpZgo+Pj4+Pj4gZGlmZiAtLWdpdCBhL25l dC9tYWM4MDIxMS90eC5jIGIvbmV0L21hYzgwMjExL3R4LmMKPj4+Pj4+IGluZGV4IGQwMGJhYWEu LjQyY2EwMTAgMTAwNjQ0Cj4+Pj4+PiAtLS0gYS9uZXQvbWFjODAyMTEvdHguYwo+Pj4+Pj4gKysr IGIvbmV0L21hYzgwMjExL3R4LmMKPj4+Pj4+IEBAIC0xNDUwLDYgKzE0NTAsNyBAQCB2b2lkIGll ZWU4MDIxMV90eHFfaW5pdChzdHJ1Y3QKPj4+Pj4+IGllZWU4MDIxMV9zdWJfaWZfZGF0YSAqc2Rh dGEsCj4+Pj4+PiAgCWNvZGVsX3N0YXRzX2luaXQoJnR4cWktPmNzdGF0cyk7Cj4+Pj4+PiAgCV9f c2tiX3F1ZXVlX2hlYWRfaW5pdCgmdHhxaS0+ZnJhZ3MpOwo+Pj4+Pj4gIAlSQl9DTEVBUl9OT0RF KCZ0eHFpLT5zY2hlZHVsZV9vcmRlcik7Cj4+Pj4+PiArCUlOSVRfTElTVF9IRUFEKCZ0eHFpLT5j YW5kaWRhdGUpOwo+Pj4+Pj4gCj4+Pj4+PiAgCXR4cWktPnR4cS52aWYgPSAmc2RhdGEtPnZpZjsK Pj4+Pj4+IAo+Pj4+Pj4gQEAgLTM3MjQsNiArMzcyNSw5IEBAIHZvaWQgaWVlZTgwMjExX3NjaGVk dWxlX3R4cShzdHJ1Y3QKPj4+Pj4+IGllZWU4MDIxMV9odwo+Pj4+Pj4gKmh3LAo+Pj4+Pj4gCj4+ Pj4+PiAgCXNwaW5fbG9ja19iaCgmbG9jYWwtPmFjdGl2ZV90eHFfbG9ja1thY10pOwo+Pj4+Pj4g Cj4+Pj4+PiArCWlmICghbGlzdF9lbXB0eSgmdHhxaS0+Y2FuZGlkYXRlKSkKPj4+Pj4+ICsJCWxp c3RfZGVsX2luaXQoJnR4cWktPmNhbmRpZGF0ZSk7Cj4+Pj4+PiArCj4+Pj4+PiAgCWlmICghUkJf RU1QVFlfTk9ERSgmdHhxaS0+c2NoZWR1bGVfb3JkZXIpKQo+Pj4+Pj4gIAkJZ290byBvdXQ7Cj4+ Pj4+PiAKPj4+Pj4+IEBAIC0zNzgzLDYgKzM3ODcsMjAgQEAgc3RhdGljIHZvaWQgCj4+Pj4+PiBf X2llZWU4MDIxMV91bnNjaGVkdWxlX3R4cShzdHJ1Y3QKPj4+Pj4+IGllZWU4MDIxMV9odyAqaHcs Cj4+Pj4+PiAgCVJCX0NMRUFSX05PREUoJnR4cWktPnNjaGVkdWxlX29yZGVyKTsKPj4+Pj4+ICB9 Cj4+Pj4+PiAKPj4+Pj4+ICt2b2lkIGllZWU4MDIxMV9yZW1vdmVfdHhxKHN0cnVjdCBpZWVlODAy MTFfaHcgKmh3LAo+Pj4+Pj4gKwkJCSAgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKPj4+Pj4+ ICt7Cj4+Pj4+PiArCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9jYWwo aHcpOwo+Pj4+Pj4gKwlzdHJ1Y3QgdHhxX2luZm8gKnR4cWkgPSB0b190eHFfaW5mbyh0eHEpOwo+ Pj4+Pj4gKwo+Pj4+Pj4gKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+YWN0aXZlX3R4cV9s b2NrW3R4cS0+YWNdKTsKPj4+Pj4+ICsKPj4+Pj4+ICsJaWYgKCFSQl9FTVBUWV9OT0RFKCZ0eHFp LT5zY2hlZHVsZV9vcmRlcikpIHsKPj4+Pj4+ICsJCV9faWVlZTgwMjExX3Vuc2NoZWR1bGVfdHhx KGh3LCB0eHEpOwo+Pj4+Pj4gKwkJbGlzdF9kZWxfaW5pdCgmdHhxaS0+Y2FuZGlkYXRlKTsKPj4+ Pj4+ICsJfQo+Pj4+Pj4gK30KPj4+Pj4+ICsKPj4+Pj4+ICB2b2lkIGllZWU4MDIxMV91bnNjaGVk dWxlX3R4cShzdHJ1Y3QgaWVlZTgwMjExX2h3ICpodywKPj4+Pj4+ICAJCQkgICAgICBzdHJ1Y3Qg aWVlZTgwMjExX3R4cSAqdHhxKQo+Pj4+Pj4gIAlfX2FjcXVpcmVzKHR4cV9sb2NrKSBfX3JlbGVh c2VzKHR4cV9sb2NrKQo+Pj4+Pj4gQEAgLTM3OTAsNyArMzgwOCw3IEBAIHZvaWQgaWVlZTgwMjEx X3Vuc2NoZWR1bGVfdHhxKHN0cnVjdAo+Pj4+Pj4gaWVlZTgwMjExX2h3ICpodywKPj4+Pj4+ICAJ c3RydWN0IGllZWU4MDIxMV9sb2NhbCAqbG9jYWwgPSBod190b19sb2NhbChodyk7Cj4+Pj4+PiAK Pj4+Pj4+ICAJc3Bpbl9sb2NrX2JoKCZsb2NhbC0+YWN0aXZlX3R4cV9sb2NrW3R4cS0+YWNdKTsK Pj4+Pj4+IC0JX19pZWVlODAyMTFfdW5zY2hlZHVsZV90eHEoaHcsIHR4cSk7Cj4+Pj4+PiArCWll ZWU4MDIxMV9yZW1vdmVfdHhxKGh3LCB0eHEpOwo+Pj4+Pj4gIAlzcGluX3VubG9ja19iaCgmbG9j YWwtPmFjdGl2ZV90eHFfbG9ja1t0eHEtPmFjXSk7Cj4+Pj4+PiAgfQo+Pj4+Pj4gCj4+Pj4+PiBA QCAtMzgwMywxMSArMzgyMSw0OCBAQCB2b2lkIGllZWU4MDIxMV9yZXR1cm5fdHhxKHN0cnVjdAo+ Pj4+Pj4gaWVlZTgwMjExX2h3Cj4+Pj4+PiAqaHcsCj4+Pj4+PiAgCWxvY2tkZXBfYXNzZXJ0X2hl bGQoJmxvY2FsLT5hY3RpdmVfdHhxX2xvY2tbdHhxLT5hY10pOwo+Pj4+Pj4gCj4+Pj4+PiAgCWlm ICghUkJfRU1QVFlfTk9ERSgmdHhxaS0+c2NoZWR1bGVfb3JkZXIpICYmCj4+Pj4+PiAtCSAgICAo c2tiX3F1ZXVlX2VtcHR5KCZ0eHFpLT5mcmFncykgJiYgCj4+Pj4+PiAhdHhxaS0+dGluLmJhY2ts b2dfcGFja2V0cykpCj4+Pj4+PiAtCQlfX2llZWU4MDIxMV91bnNjaGVkdWxlX3R4cShodywgdHhx KTsKPj4+Pj4+ICsJCSF0eHFfaGFzX3F1ZXVlKCZ0eHFpLT50eHEpICYmCj4+Pj4+PiArCQlsaXN0 X2VtcHR5KCZ0eHFpLT5jYW5kaWRhdGUpKQo+Pj4+Pj4gKwkJbGlzdF9hZGRfdGFpbCgmdHhxaS0+ Y2FuZGlkYXRlLCAmbG9jYWwtPnJlbW92ZV9saXN0W3R4cS0+YWNdKTsKPj4+Pj4+ICsKPj4+Pj4+ ICB9Cj4+Pj4+PiAgRVhQT1JUX1NZTUJPTChpZWVlODAyMTFfcmV0dXJuX3R4cSk7Cj4+Pj4+PiAK Pj4+Pj4+ICt2b2lkIF9faWVlZTgwMjExX2NoZWNrX3R4cXMoc3RydWN0IGllZWU4MDIxMV9sb2Nh bCAqbG9jYWwsIGludCAKPj4+Pj4+IGFjKQo+Pj4+Pj4gK3sKPj4+Pj4+ICsJc3RydWN0IHR4cV9p bmZvICppdGVyLCAqdG1wOwo+Pj4+Pj4gKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKPj4+Pj4+ICsK Pj4+Pj4+ICsJbG9ja2RlcF9hc3NlcnRfaGVsZCgmbG9jYWwtPmFjdGl2ZV90eHFfbG9ja1thY10p Owo+Pj4+Pj4gKwo+Pj4+Pj4gKwlsaXN0X2Zvcl9lYWNoX2VudHJ5X3NhZmUoaXRlciwgdG1wLCAm bG9jYWwtPnJlbW92ZV9saXN0W2FjXSwKPj4+Pj4+ICsJCQkJIGNhbmRpZGF0ZSkgewo+Pj4+Pj4g KwkJc3RhID0gY29udGFpbmVyX29mKGl0ZXItPnR4cS5zdGEsIHN0cnVjdCBzdGFfaW5mbywgc3Rh KTsKPj4+Pj4+ICsKPj4+Pj4+ICsJCWlmICh0eHFfaGFzX3F1ZXVlKCZpdGVyLT50eHEpKQo+Pj4+ Pj4gKwkJCWxpc3RfZGVsX2luaXQoJml0ZXItPmNhbmRpZGF0ZSk7Cj4+Pj4+PiArCQllbHNlCj4+ Pj4+PiArCQkJaWVlZTgwMjExX3JlbW92ZV90eHEoJmxvY2FsLT5odywgJml0ZXItPnR4cSk7Cj4+ Pj4+PiArCX0KPj4+Pj4+ICt9Cj4+Pj4+PiArCj4+Pj4+PiArdm9pZCBpZWVlODAyMTFfdHhxc19j aGVjayhzdHJ1Y3QgdGltZXJfbGlzdCAqdCkKPj4+Pj4+ICt7Cj4+Pj4+PiArCXN0cnVjdCBpZWVl ODAyMTFfbG9jYWwgKmxvY2FsID0gZnJvbV90aW1lcihsb2NhbCwgdCwKPj4+Pj4+IHJlbW92ZV90 aW1lcik7Cj4+Pj4+PiArCXN0cnVjdCB0eHFfaW5mbyAqaXRlciwgKnRtcDsKPj4+Pj4+ICsJc3Ry dWN0IHN0YV9pbmZvICpzdGE7Cj4+Pj4+PiArCWludCBhYzsKPj4+Pj4+ICsKPj4+Pj4+ICsJZm9y IChhYyA9IDA7IGFjIDwgSUVFRTgwMjExX05VTV9BQ1M7IGFjKyspIHsKPj4+Pj4+ICsJCXNwaW5f bG9ja19iaCgmbG9jYWwtPmFjdGl2ZV90eHFfbG9ja1thY10pOwo+Pj4+Pj4gKwkJX19pZWVlODAy MTFfY2hlY2tfdHhxcyhsb2NhbCwgYWMpOwo+Pj4+Pj4gKwkJc3Bpbl91bmxvY2tfYmgoJmxvY2Fs LT5hY3RpdmVfdHhxX2xvY2tbYWNdKTsKPj4+Pj4+ICsJfQo+Pj4+Pj4gKwo+Pj4+Pj4gKwltb2Rf dGltZXIoJmxvY2FsLT5yZW1vdmVfdGltZXIsCj4+Pj4+PiArCQkgIGppZmZpZXMgKwo+Pj4+Pj4g bXNlY3NfdG9famlmZmllcyhJRUVFODAyMTFfQUlSVElNRV9UWFFfUk1fQ0hLX0lOVFZfSU5fTVMp KTsKPj4+Pj4+ICt9Cj4+Pj4+IAo+Pj4+PiBJJ2xsIGFzayB0aGUgc2FtZSBhcyBJIGRpZCBsYXN0 IHRpbWUgKHdoZXJlIHlvdSB0b2xkIG1lIHRvIGhvbGQgb2ZmCj4+Pj4+IHVudGlsIHRoaXMgcm91 bmQpOgo+Pj4+PiAKPj4+Pj4gV2h5IGRvIHlvdSBuZWVkIHRoZSB0aW1lciBhbmQgdGhlIHBlcmlv ZGljIGNoZWNrPyBJZiBUWFFzIGFyZSBhZGRlZAo+Pj4+PiB0bwo+Pj4+PiB0aGUgcmVtb3ZlIGxp c3QgZHVyaW5nIHRoZSBzY2hlZHVsaW5nIHJ1biwgYW5kCj4+Pj4+IF9faWVlZTgwMjExX2NoZWNr X3R4cXMoKQo+Pj4+PiBpcyBydW4gZnJvbSBzY2hlZHVsZV9lbmQoKSwgaXNuJ3QgdGhhdCBzdWZm aWNpZW50IHRvIGNsZWFyIHRoZSAKPj4+Pj4gbGlzdD8KPj4+PiBJcyBpdCBwb3NzaWJsZSB0aGF0 IGEgdHhxIGlzIG5vdCBhZGRlZCB0byB0aGUgcmVtb3ZlIGxpc3QgYnV0IHRoZW4KPj4+PiBwYWNr ZXRzIGluIGl0IGFyZSBkcm9wcGVkIGJ5IGZxX2NvZGVsIGFsZ28/IExpa2UgdGhlIHN0YXRpb24K Pj4+PiBkaXNjb25uZWN0cwo+Pj4+IHdpdGhvdXQgYW55IG5vdGlmaWNhdGlvbi4KPj4+IAo+Pj4g V2VsbCBhcyBsb25nIGFzIGFsbCB0aGUgb3RoZXIgY2xlYW51cCBwYXRocyBjYWxsIGRpcmVjdGx5 IGludG8KPj4+IF9fdW5zY2hlZHVsZV90eHEoKSwgdGhhdCBzaG91bGQgcmVtb3ZlIHN0YXRpb25z IGZyb20gdGhlIHNjaGVkdWxlciAKPj4+IHdoZW4KPj4+IHRoZXkgZGlzY29ubmVjdCBldGMuCj4+ IFllcywgdGhlIGRpc2Nvbm5lY3Qgc2NlbmFyaW8gaXMgYSBiYWQgZXhhbXBsZS4gTXkgY29uY2Vy biBpcywgc2F5LCB3ZQo+PiBoYXZlIDEwIHN0YXRpb25zIGFuZCBvbmx5IG9uZSBvZiB0aGVtIGlz IGFzc2lnbmVkIGEgdmVyeSBzbWFsbCB3ZWlnaHQKPj4gY29tcGFyZWQgd2l0aCB0aGF0IG9mIG90 aGVycy4gU3VwcG9zZSwgYWZ0ZXIgaXRzIGNoYW5jZSBvZiBUeCwgaXQgaXMKPj4gbW9zdCBsaWtl bHkgdG8gYmUgcGxhY2VkIGluIHRoZSByaWdodG1vc3Qoc3RpbGwgaGFzIHNvbWUgcGFja2V0cyBp biAKPj4gdGhlCj4+IHR4cSkgYW5kIG5vIG1vcmUgaW5jb21pbmcgZGF0YSBmb3IgaXQuIFRoZSBy ZW1haW5pbmcgcGFja2V0cyBpbiB0eHEgCj4+IHdpbGwKPj4gYmUgZHJvcHBlZCBkdWUgdG8gdGlt ZW91dCBhbGdvIGluIGNvZGVsKGNvcnJlY3QgbWUgaWYgSSBhbSB3cm9uZykgYnV0Cj4+IHRoaXMg ZW1wdHkgdHhxIHdpbGwgc3RheSBvbiB0aGUgcmJ0cmVlIHVudGlsIG90aGVyIHR4cXMgZ2V0IGRy YWluZWQgb3IKPj4gZ2xvYmFsIHZ0IGNhdGNoIHVwIHdpdGggaXRzIHZ0LiBUaGUgc3RheWluZyB0 aW1lIGNvdWxkIGJlIGxvbmcgaWYgCj4+IHdlaWdodAo+PiBpcyBleHRyZW1lbHkgc21hbGwuIFRo ZW4gZG8gd2UgbmVlZCB0aW1lciB0byBjaGVjayBvciBhbnkgb3RoZXIgYmV0dGVyCj4+IHNvbHV0 aW9uPwo+IAo+IEFoLCBJIHNlZSB3aGF0IHlvdSBtZWFuLiBObywgSSBkb24ndCB0aGluayB0aGlz IHdpbGwgYmUgYSBwcm9ibGVtOyB0aGUKPiBzY2VuYXJpbyB5b3UncmUgZGVzY3JpYmluZyB3b3Vs ZCBwbGF5IG91dCBsaWtlIHRoaXM6Cj4gCj4gMS4gU3RhdGlvbiBlbmRzIHRyYW5zbWl0dGluZywg c3RpbGwgaGFzIGEgc2luZ2xlIHBhY2tldCBxdWV1ZWQsIGdldHMKPiAgICBtb3ZlZCB0byB0aGUg ZW5kIG9mIHRoZSByYnRyZWUgKGFuZCBzdGF5cyB0aGVyZSBmb3IgYSB3aGlsZSkuCj4gCj4gMi4g V2hlbiB3ZSBmaW5hbGx5IGdldCB0byB0aGUgcG9pbnQgd2hlcmUgdGhpcyBzdGF0aW9uIGdldHMg YW5vdGhlcgo+ICAgIGNoYW5jZSB0byB0cmFuc21pdCwgdGhlIENvRGVsIGRyb3AgdGltZXIgdHJp Z2dlcnMgYW5kIHRoZSBsYXN0IAo+IHBhY2tldAo+ICAgIGlzIGRyb3BwZWRbMF0uIFRoaXMgbWVh bnMgdGhhdCB0aGUgcXVldWUgd2lsbCBqdXN0IGJlIGVtcHR5Cj4gICAgKGFuZCBpZWVlODAyMTFf dHhfZGVxdWV1ZSgpIHdpbGwgcmV0dXJuIE5VTEwpLgo+IAo+IDMuIEJlY2F1c2UgdGhlIHF1ZXVl IGlzIGVtcHR5LCBpZWVlODAyMTFfcmV0dXJuX3R4cSgpIHdpbGwgbm90IHB1dCBpdAo+ICAgIGJh Y2sgb24gdGhlIHJidHJlZS4KPiAKPiBDcnVjaWFsbHksIGluIDIuIHRoZSBDb0RlbCBhbGdvcml0 aG0gZG9lc24ndCBraWNrIGluIHVudGlsIHRoZSBwb2ludCBvZgo+IHBhY2tldCBkZXF1ZXVlLiBC dXQgZXZlbiBpZiBhbiBlbXB0eSBxdWV1ZSBzdGF5cyBvbiB0aGUgcmJ0cmVlIGZvciBhCj4gd2hp bGUsIHRoZXJlIGlzIG5vIGhhcm0gaW4gdGhhdDogZXZlbnR1YWxseSBpdCB3aWxsIGdldCBpdHMg dHVybiwgaXQKPiB3aWxsIHR1cm4gb3V0IHRvIGJlIGVtcHR5LCBhbmQganVzdCBiZSBza2lwcGVk IG92ZXIuClRoZW4gdGhhdCB3aWxsIGJlIGZpbmUuIFRoYW5rcyBmb3IgdGhlIGV4cGxhbmF0aW9u IG9mIHRoZSBkcm9wcGluZyBwYXJ0IAppbiBDb0RlbCBhbGdvcml0aG0uCj4gCj4gVGhlIGlzc3Vl IHdlIG5lZWQgdG8gYmUgY29uY2VybmVkIGFib3V0IGlzIHRoZSBvcHBvc2l0ZTogSWYgd2UgaGF2 ZSBhCj4gcXVldWUgdGhhdCAqZG9lcyogaGF2ZSBwYWNrZXRzIHF1ZXVlZCwgYnV0IHdoaWNoIGlz ICpub3QqIHNjaGVkdWxlZCBmb3IKPiB0cmFuc21pc3Npb24sIHRoYXQgd2lsbCBzdGFsbCBUWC4K SXMgaXQgYnkgZGVzaWduIHNpbmNlIGl0cyB2dCBpcyBtb3JlIHRoYW4gZ2xvYmFsIHZ0LCByaWdo dD8gVGhlIGxhdHRlbmN5IAptYXkgc29tZWhvdyBnZXQgaW1wYWN0ZWQgdGhvdWdoLgo+IAo+IFsw XSBDb0RlbCBpbiBtb3N0IGNhc2VzIG9ubHkgZHJvcHMgYSBzaW5nbGUgcGFja2V0IGF0IGEgdGlt ZSwgc28gaXQgCj4gd2lsbAo+IG5vdCBjbGVhciBvdXQgYW4gZW50aXJlIHF1ZXVlIHdpdGggbXVs dGlwbGUgcGFja2V0cyBpbiBvbmUgZ28uIEJ1dCB5b3UKPiBhcmUgcmlnaHQgdGhhdCBpdCBjb3Vs ZCBjb25jZWl2YWJseSBkcm9wIHRoZSBsYXN0IHBhY2tldCBpbiBhIHF1ZXVlLgo+IAo+Pj4gV2Ug b25seSBuZWVkIHRvIGRlZmVyIHJlbW92YWwgaW5zaWRlIGEgc2luZ2xlICJzY2hlZHVsaW5nIHJv dW5kIiAKPj4+IChpLmUuLAo+Pj4gYmV0d2VlbiBhIHBhaXIgb2YgaWVlZTgwMjExX3R4cV9zY2hl ZHVsZV9zdGFydC9lbmQuIFNvIGlmIHdlIGp1c3QgCj4+PiB3YWxrCj4+PiB0aGUgcmVtb3ZlIGxp c3QgaW4gc2NoZWR1bGVfZW5kKCkgd2Ugc2hvdWxkIGJlIGVub3VnaCwgbm8/Cj4+PiAKPj4+IEht bSwgb3IgbWF5YmUgYSBzaW1wbGVyIHdheSB0byBmaXggdGhlIG9yaWdpbmFsIGlzc3VlIGlzIGp1 c3QgdG8gaGF2ZQo+Pj4gdW5zY2hlZHVsZV90eHEoKSB1cGRhdGUgdGhlIHNjaGVkdWxlX3Bvcygp IHBvaW50ZXI/Cj4+PiAKPj4+IEkuZS4sIHVuc2NoZWR1bGVfdHhxIGNoZWNrcyBpZiB0aGUgdHhx IGJlaW5nIHJlbW92ZWQgaXMgY3VycmVudGx5IAo+Pj4gYmVpbmcKPj4+IHBvaW50ZWQgdG8gYnkg c2NoZWR1bGVfcG9zW2FjXSwgYW5kIGlmIGl0IGlzLCBpdCB1cGRhdGVzIHNjaGVkdWxlX3Bvcwo+ Pj4gdG8KPj4+IGJlIHRoZSByYl9uZXh0IG9mIHRoZSBjdXJyZW50IHZhbHVlPwo+PiBBY3R1YWxs eSwgaWYgc2NoZWR1bGVfcG9zIGlzIHVwZGF0ZWQgdG8gcmJfbmV4dCBvZiB0aGUgY3VycmVudCB2 YWx1ZSwKPj4gdGhlbiBpbiB0aGUgbmV4dF90eHEoKSB3aGVyZSB3ZSBhcmUgZ29pbmcgdG8gdXNl IHJiX25leHQgYWdhaW4gYW5kCj4+IGZpbmFsbHkgcGljayB0aGUgbmV4dCBub2RlIG9mIHRoZSBu b2RlIHdlIHJlYWxseSB3YW50LiBJcyBpdCBmaW5lIHRvCj4+IHVwZGF0ZSBzY2hlZHVsZV9wb3Mg dG8gTlVMTD8KPiAKPiBIbW0sIHllYWgsIGdvb2QgcG9pbnQuCj4gCj4gSWYgd2UgZG8gZW5kIHVw IHNldHRpbmcgc2NoZWR1bGVfcG9zIHRvIE5VTEwgaW4gdGhlIG1pZGRsZSBvZiBhCj4gc2NoZWR1 bGluZyByb3VuZCwgdGhhdCB3aWxsIG1ha2UgbmV4dF90eHEoKSAic3RhcnQgb3ZlciIsIGFuZCBk byAKPiBhbm90aGVyCj4gbG9vcCB0aHJvdWdoIHRoZSB3aG9sZSB0aGluZy4gSSBndWVzcyB3ZSBt YXkgYmUgYWJsZSBoaXQgYSBjYXNlIHdoZXJlCj4gdGhpbmdzIGNhbiBvc2NpbGxhdGUgYmFjayBh bmQgZm9ydGggYmV0d2VlbiBhZGRpdGlvbiBhbmQgcmVtb3ZhbAo+IHJlc3VsdGluZyBpbiBhbiBp bmZpbml0ZSBsb29wPyBOb3Qgc3VyZSwgYnV0IGF0IGxlYXN0IEkgY2FuJ3Qgc2VlbSB0bwo+IGNv bnZpbmNlIG15c2VsZiB0aGF0IHRoaXMgY2FuJ3QgaGFwcGVuLgoKQXMgdGhlIGxvb3Agb2YgbmV4 dF90eHEgdW5kZXIgbG9jayBwcm90ZWN0aW9uIGFzIGJlbG93LAoKdHhxX3NjaGVkdWxlX3N0YXJ0 KCk7CndoaWxlKHR4cT1uZXh0X3R4cSgpKXsKLi4uCnJldHVybl90eHEodHhxKTsKfQp0eHFfc2No ZWR1bGVfZW5kKCk7CgpJIGRvIG5vdCBzZWUgYW55IGNoYW5jZSBvZiBhZGRpdGlvbiwgbm8/Cklu IGF0aDEwaywgd2Ugd2lsbCB1c3VhbGx5IHB1c2ggcGFja2V0cyBvZiBmaXJzdCB0eHEgYXMgbWFu eSBhcyB3ZSBjYW4gCnVudGlsIGl0IGlzIGRyYWluZWQgYW5kIHRoZW4gbW92ZSB0byB0aGUgbmV4 dCBvbmUuIFNvIGlmIGEgdHhxIGdldHMgCnJlbW92ZWQgaW4gdGhlIHJldHVybl90eHEsIGl0IHNo b3VsZCBhbHdheXMgYmUgdGhlIGxlZnRtb3N0LiBBbmQgZHVyaW5nIAp0aGlzIHBlcmlvZCwgbmVp dGhlciB2dCBvZiBhbnkgc3RhdGlvbiBvciBnbG9iYWwgdnQgY2FuIGJlIHVwZGF0ZWQgZHVlIAp0 byBsb2NrIHByb3RlY3Rpb24uCgo+IAo+IEJ1dCBpbiB0aGF0IGNhc2UsIHdlIGNvdWxkIGZpeCBp dCBieSBqdXN0IGNvbmRpdGlvbmFsbHkgYXNzaWduaW5nIAo+IGVpdGhlcgo+IHJiX25leHQgb3Ig cmJfcHJldiB0byB0aGUgc2NoZWR1bGVfcG9zIGluIHVuc2NoZWR1bGVfdHhxKCk/IEkuZS4sCj4g c29tZXRoaW5nIGxpa2U6Cj4gCj4gbG9jYWwtPnNjaGVkdWxlX3Bvc1thY10gPSByYl9uZXh0KG5v ZGUpID86IHJiX3ByZXYobm9kZSk7CkkgYW0gbm90IHN1cmUgSSBhbSBnZXR0aW5nIHlvdXIgcG9p bnQuIFN0aWxsIGluIG5leHRfdHhxLCAKc2NoZWR1bGVfcG9zW2FjXSB3aWxsIGxlYWQgdXMgdG8g dGhlIG5leHQgbm9kZSBvZiB0aGUgb25lIHdlIHdhbnQuCj4gCj4gLVRva2UKCi0tIApZaWJvCgpf X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwphdGgxMGsgbWFp bGluZyBsaXN0CmF0aDEwa0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRl YWQub3JnL21haWxtYW4vbGlzdGluZm8vYXRoMTBrCg== From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-6.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id DA3CFC49ED7 for ; Fri, 20 Sep 2019 08:29:48 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id A44A72080F for ; Fri, 20 Sep 2019 08:29:48 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="Z4DbnXfb"; dkim=fail reason="key not found in DNS" (0-bit key) header.d=codeaurora.org header.i=@codeaurora.org header.b="B/lXF2Nq" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2408194AbfITI3s (ORCPT ); Fri, 20 Sep 2019 04:29:48 -0400 Received: from smtp.codeaurora.org ([198.145.29.96]:54758 "EHLO smtp.codeaurora.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S2405437AbfITI3r (ORCPT ); Fri, 20 Sep 2019 04:29:47 -0400 Received: by smtp.codeaurora.org (Postfix, from userid 1000) id 076B26141B; Fri, 20 Sep 2019 08:29:46 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1568968186; bh=po+eh5stL8hcqg3N0m0FhhYOQeepkwxi+k0bIJXTXJ0=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=Z4DbnXfbedDBEaPl/4gpVNUBan3rkYFifsLFRNnAcrwjQl+JKacH1UoOSm+oXcPex 0ZSBRcg+wp0Fk1fZD2vau1OUK0+oXnagH4Y05N3LSjcbCqanveNgLlfw5WYjhlGuwp 1RGdLdqAYEm8E69sNDEQhW7TOwvgEVqwY0gmaDS0= Received: from mail.codeaurora.org (localhost.localdomain [127.0.0.1]) by smtp.codeaurora.org (Postfix) with ESMTP id 2C28460850; Fri, 20 Sep 2019 08:29:44 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=codeaurora.org; s=default; t=1568968184; bh=po+eh5stL8hcqg3N0m0FhhYOQeepkwxi+k0bIJXTXJ0=; h=Date:From:To:Cc:Subject:In-Reply-To:References:From; b=B/lXF2Nq9wV0AwRbJOB6/XMBy15HL7QYb5t/lRfW+iI+VcF+xLp91NSSJ3wv3X/Ng iSZeq3ccxFFppCaOisP8VPXwgmme5+BEza2dSv8/psHq61qSTlfeQg1017H1J5kGYG j3V9PAXo7J4bygFKTY4C2h3LxVsT+G/Sw5aKcPJ0= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit Date: Fri, 20 Sep 2019 16:29:44 +0800 From: Yibo Zhao To: =?UTF-8?Q?Toke_H=C3=B8iland-J=C3=B8rgensen?= Cc: ath10k@lists.infradead.org, linux-wireless@vger.kernel.org, linux-wireless-owner@vger.kernel.org Subject: Re: [PATCH 2/4] mac80211: defer txqs removal from rbtree In-Reply-To: <87tv98fu6l.fsf@toke.dk> References: <1568639388-27291-1-git-send-email-yiboz@codeaurora.org> <1568639388-27291-2-git-send-email-yiboz@codeaurora.org> <87pnjyiq7o.fsf@toke.dk> <87sgothmpy.fsf@toke.dk> <8cdece5c030fd95817fb099021c38613@codeaurora.org> <87tv98fu6l.fsf@toke.dk> Message-ID: <1b4ab006d9b5c88035845aaac193ef48@codeaurora.org> X-Sender: yiboz@codeaurora.org User-Agent: Roundcube Webmail/1.2.5 Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org On 2019-09-19 18:37, Toke Høiland-Jørgensen wrote: > Yibo Zhao writes: > >> On 2019-09-18 19:23, Toke Høiland-Jørgensen wrote: >>> Yibo Zhao writes: >>> >>>> On 2019-09-18 05:10, Toke Høiland-Jørgensen wrote: >>>>> Yibo Zhao writes: >>>>> >>>>>> In a loop txqs dequeue scenario, if the first txq in the rbtree >>>>>> gets >>>>>> removed from rbtree immediately in the ieee80211_return_txq(), the >>>>>> loop will break soon in the ieee80211_next_txq() due to >>>>>> schedule_pos >>>>>> not leading to the second txq in the rbtree. Thus, defering the >>>>>> removal right before the end of this schedule round. >>>>>> >>>>>> Co-developed-by: Yibo Zhao >>>>>> Signed-off-by: Yibo Zhao >>>>>> Signed-off-by: Toke Høiland-Jørgensen >>>>> >>>>> I didn't write this patch, so please don't use my sign-off. I'll >>>>> add >>>>> ack or review tags as appropriate in reply; but a few comments >>>>> first: >>>>> >>>>>> --- >>>>>> include/net/mac80211.h | 16 ++++++++++-- >>>>>> net/mac80211/ieee80211_i.h | 3 +++ >>>>>> net/mac80211/main.c | 6 +++++ >>>>>> net/mac80211/tx.c | 63 >>>>>> +++++++++++++++++++++++++++++++++++++++++++--- >>>>>> 4 files changed, 83 insertions(+), 5 deletions(-) >>>>>> >>>>>> diff --git a/include/net/mac80211.h b/include/net/mac80211.h >>>>>> index ac2ed8e..ba5a345 100644 >>>>>> --- a/include/net/mac80211.h >>>>>> +++ b/include/net/mac80211.h >>>>>> @@ -925,6 +925,8 @@ struct ieee80211_tx_rate { >>>>>> >>>>>> #define IEEE80211_MAX_TX_RETRY 31 >>>>>> >>>>>> +#define IEEE80211_AIRTIME_TXQ_RM_CHK_INTV_IN_MS 100 >>>>>> + >>>>>> static inline void ieee80211_rate_set_vht(struct >>>>>> ieee80211_tx_rate >>>>>> *rate, >>>>>> u8 mcs, u8 nss) >>>>>> { >>>>>> @@ -6232,7 +6234,8 @@ struct sk_buff *ieee80211_tx_dequeue(struct >>>>>> ieee80211_hw *hw, >>>>>> * @ac: AC number to return packets from. >>>>>> * >>>>>> * Should only be called between calls to >>>>>> ieee80211_txq_schedule_start() >>>>>> - * and ieee80211_txq_schedule_end(). >>>>>> + * and ieee80211_txq_schedule_end(). If the txq is empty, it will >>>>>> be >>>>>> added >>>>>> + * to a remove list and get removed later. >>>>>> * Returns the next txq if successful, %NULL if no queue is >>>>>> eligible. >>>>>> If a txq >>>>>> * is returned, it should be returned with ieee80211_return_txq() >>>>>> after the >>>>>> * driver has finished scheduling it. >>>>>> @@ -6268,7 +6271,8 @@ void ieee80211_txq_schedule_start(struct >>>>>> ieee80211_hw *hw, u8 ac) >>>>>> * @hw: pointer as obtained from ieee80211_alloc_hw() >>>>>> * @ac: AC number to acquire locks for >>>>>> * >>>>>> - * Release locks previously acquired by >>>>>> ieee80211_txq_schedule_end(). >>>>>> + * Release locks previously acquired by >>>>>> ieee80211_txq_schedule_end(). >>>>>> Check >>>>>> + * and remove the empty txq from rb-tree. >>>>>> */ >>>>>> void ieee80211_txq_schedule_end(struct ieee80211_hw *hw, u8 ac) >>>>>> __releases(txq_lock); >>>>>> @@ -6287,6 +6291,14 @@ void ieee80211_schedule_txq(struct >>>>>> ieee80211_hw >>>>>> *hw, struct ieee80211_txq *txq) >>>>>> __acquires(txq_lock) __releases(txq_lock); >>>>>> >>>>>> /** >>>>>> + * ieee80211_txqs_check - Check txqs waiting for removal >>>>>> + * >>>>>> + * @tmr: pointer as obtained from local >>>>>> + * >>>>>> + */ >>>>>> +void ieee80211_txqs_check(struct timer_list *tmr); >>>>>> + >>>>>> +/** >>>>>> * ieee80211_txq_may_transmit - check whether TXQ is allowed to >>>>>> transmit >>>>>> * >>>>>> * This function is used to check whether given txq is allowed to >>>>>> transmit by >>>>>> diff --git a/net/mac80211/ieee80211_i.h >>>>>> b/net/mac80211/ieee80211_i.h >>>>>> index a4556f9..49aa143e 100644 >>>>>> --- a/net/mac80211/ieee80211_i.h >>>>>> +++ b/net/mac80211/ieee80211_i.h >>>>>> @@ -847,6 +847,7 @@ struct txq_info { >>>>>> struct codel_stats cstats; >>>>>> struct sk_buff_head frags; >>>>>> struct rb_node schedule_order; >>>>>> + struct list_head candidate; >>>>>> unsigned long flags; >>>>>> >>>>>> /* keep last! */ >>>>>> @@ -1145,6 +1146,8 @@ struct ieee80211_local { >>>>>> u64 airtime_v_t[IEEE80211_NUM_ACS]; >>>>>> u64 airtime_weight_sum[IEEE80211_NUM_ACS]; >>>>>> >>>>>> + struct list_head remove_list[IEEE80211_NUM_ACS]; >>>>>> + struct timer_list remove_timer; >>>>>> u16 airtime_flags; >>>>>> >>>>>> const struct ieee80211_ops *ops; >>>>>> diff --git a/net/mac80211/main.c b/net/mac80211/main.c >>>>>> index e9ffa8e..78fe24a 100644 >>>>>> --- a/net/mac80211/main.c >>>>>> +++ b/net/mac80211/main.c >>>>>> @@ -667,10 +667,15 @@ struct ieee80211_hw >>>>>> *ieee80211_alloc_hw_nm(size_t priv_data_len, >>>>>> >>>>>> for (i = 0; i < IEEE80211_NUM_ACS; i++) { >>>>>> local->active_txqs[i] = RB_ROOT_CACHED; >>>>>> + INIT_LIST_HEAD(&local->remove_list[i]); >>>>>> spin_lock_init(&local->active_txq_lock[i]); >>>>>> } >>>>>> local->airtime_flags = AIRTIME_USE_TX | AIRTIME_USE_RX; >>>>>> >>>>>> + timer_setup(&local->remove_timer, ieee80211_txqs_check, 0); >>>>>> + mod_timer(&local->remove_timer, >>>>>> + jiffies + >>>>>> msecs_to_jiffies(IEEE80211_AIRTIME_TXQ_RM_CHK_INTV_IN_MS)); >>>>>> + >>>>>> INIT_LIST_HEAD(&local->chanctx_list); >>>>>> mutex_init(&local->chanctx_mtx); >>>>>> >>>>>> @@ -1305,6 +1310,7 @@ void ieee80211_unregister_hw(struct >>>>>> ieee80211_hw >>>>>> *hw) >>>>>> tasklet_kill(&local->tx_pending_tasklet); >>>>>> tasklet_kill(&local->tasklet); >>>>>> >>>>>> + del_timer_sync(&local->remove_timer); >>>>>> #ifdef CONFIG_INET >>>>>> unregister_inetaddr_notifier(&local->ifa_notifier); >>>>>> #endif >>>>>> diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c >>>>>> index d00baaa..42ca010 100644 >>>>>> --- a/net/mac80211/tx.c >>>>>> +++ b/net/mac80211/tx.c >>>>>> @@ -1450,6 +1450,7 @@ void ieee80211_txq_init(struct >>>>>> ieee80211_sub_if_data *sdata, >>>>>> codel_stats_init(&txqi->cstats); >>>>>> __skb_queue_head_init(&txqi->frags); >>>>>> RB_CLEAR_NODE(&txqi->schedule_order); >>>>>> + INIT_LIST_HEAD(&txqi->candidate); >>>>>> >>>>>> txqi->txq.vif = &sdata->vif; >>>>>> >>>>>> @@ -3724,6 +3725,9 @@ void ieee80211_schedule_txq(struct >>>>>> ieee80211_hw >>>>>> *hw, >>>>>> >>>>>> spin_lock_bh(&local->active_txq_lock[ac]); >>>>>> >>>>>> + if (!list_empty(&txqi->candidate)) >>>>>> + list_del_init(&txqi->candidate); >>>>>> + >>>>>> if (!RB_EMPTY_NODE(&txqi->schedule_order)) >>>>>> goto out; >>>>>> >>>>>> @@ -3783,6 +3787,20 @@ static void >>>>>> __ieee80211_unschedule_txq(struct >>>>>> ieee80211_hw *hw, >>>>>> RB_CLEAR_NODE(&txqi->schedule_order); >>>>>> } >>>>>> >>>>>> +void ieee80211_remove_txq(struct ieee80211_hw *hw, >>>>>> + struct ieee80211_txq *txq) >>>>>> +{ >>>>>> + struct ieee80211_local *local = hw_to_local(hw); >>>>>> + struct txq_info *txqi = to_txq_info(txq); >>>>>> + >>>>>> + lockdep_assert_held(&local->active_txq_lock[txq->ac]); >>>>>> + >>>>>> + if (!RB_EMPTY_NODE(&txqi->schedule_order)) { >>>>>> + __ieee80211_unschedule_txq(hw, txq); >>>>>> + list_del_init(&txqi->candidate); >>>>>> + } >>>>>> +} >>>>>> + >>>>>> void ieee80211_unschedule_txq(struct ieee80211_hw *hw, >>>>>> struct ieee80211_txq *txq) >>>>>> __acquires(txq_lock) __releases(txq_lock) >>>>>> @@ -3790,7 +3808,7 @@ void ieee80211_unschedule_txq(struct >>>>>> ieee80211_hw *hw, >>>>>> struct ieee80211_local *local = hw_to_local(hw); >>>>>> >>>>>> spin_lock_bh(&local->active_txq_lock[txq->ac]); >>>>>> - __ieee80211_unschedule_txq(hw, txq); >>>>>> + ieee80211_remove_txq(hw, txq); >>>>>> spin_unlock_bh(&local->active_txq_lock[txq->ac]); >>>>>> } >>>>>> >>>>>> @@ -3803,11 +3821,48 @@ void ieee80211_return_txq(struct >>>>>> ieee80211_hw >>>>>> *hw, >>>>>> lockdep_assert_held(&local->active_txq_lock[txq->ac]); >>>>>> >>>>>> if (!RB_EMPTY_NODE(&txqi->schedule_order) && >>>>>> - (skb_queue_empty(&txqi->frags) && >>>>>> !txqi->tin.backlog_packets)) >>>>>> - __ieee80211_unschedule_txq(hw, txq); >>>>>> + !txq_has_queue(&txqi->txq) && >>>>>> + list_empty(&txqi->candidate)) >>>>>> + list_add_tail(&txqi->candidate, &local->remove_list[txq->ac]); >>>>>> + >>>>>> } >>>>>> EXPORT_SYMBOL(ieee80211_return_txq); >>>>>> >>>>>> +void __ieee80211_check_txqs(struct ieee80211_local *local, int >>>>>> ac) >>>>>> +{ >>>>>> + struct txq_info *iter, *tmp; >>>>>> + struct sta_info *sta; >>>>>> + >>>>>> + lockdep_assert_held(&local->active_txq_lock[ac]); >>>>>> + >>>>>> + list_for_each_entry_safe(iter, tmp, &local->remove_list[ac], >>>>>> + candidate) { >>>>>> + sta = container_of(iter->txq.sta, struct sta_info, sta); >>>>>> + >>>>>> + if (txq_has_queue(&iter->txq)) >>>>>> + list_del_init(&iter->candidate); >>>>>> + else >>>>>> + ieee80211_remove_txq(&local->hw, &iter->txq); >>>>>> + } >>>>>> +} >>>>>> + >>>>>> +void ieee80211_txqs_check(struct timer_list *t) >>>>>> +{ >>>>>> + struct ieee80211_local *local = from_timer(local, t, >>>>>> remove_timer); >>>>>> + struct txq_info *iter, *tmp; >>>>>> + struct sta_info *sta; >>>>>> + int ac; >>>>>> + >>>>>> + for (ac = 0; ac < IEEE80211_NUM_ACS; ac++) { >>>>>> + spin_lock_bh(&local->active_txq_lock[ac]); >>>>>> + __ieee80211_check_txqs(local, ac); >>>>>> + spin_unlock_bh(&local->active_txq_lock[ac]); >>>>>> + } >>>>>> + >>>>>> + mod_timer(&local->remove_timer, >>>>>> + jiffies + >>>>>> msecs_to_jiffies(IEEE80211_AIRTIME_TXQ_RM_CHK_INTV_IN_MS)); >>>>>> +} >>>>> >>>>> I'll ask the same as I did last time (where you told me to hold off >>>>> until this round): >>>>> >>>>> Why do you need the timer and the periodic check? If TXQs are added >>>>> to >>>>> the remove list during the scheduling run, and >>>>> __ieee80211_check_txqs() >>>>> is run from schedule_end(), isn't that sufficient to clear the >>>>> list? >>>> Is it possible that a txq is not added to the remove list but then >>>> packets in it are dropped by fq_codel algo? Like the station >>>> disconnects >>>> without any notification. >>> >>> Well as long as all the other cleanup paths call directly into >>> __unschedule_txq(), that should remove stations from the scheduler >>> when >>> they disconnect etc. >> Yes, the disconnect scenario is a bad example. My concern is, say, we >> have 10 stations and only one of them is assigned a very small weight >> compared with that of others. Suppose, after its chance of Tx, it is >> most likely to be placed in the rightmost(still has some packets in >> the >> txq) and no more incoming data for it. The remaining packets in txq >> will >> be dropped due to timeout algo in codel(correct me if I am wrong) but >> this empty txq will stay on the rbtree until other txqs get drained or >> global vt catch up with its vt. The staying time could be long if >> weight >> is extremely small. Then do we need timer to check or any other better >> solution? > > Ah, I see what you mean. No, I don't think this will be a problem; the > scenario you're describing would play out like this: > > 1. Station ends transmitting, still has a single packet queued, gets > moved to the end of the rbtree (and stays there for a while). > > 2. When we finally get to the point where this station gets another > chance to transmit, the CoDel drop timer triggers and the last > packet > is dropped[0]. This means that the queue will just be empty > (and ieee80211_tx_dequeue() will return NULL). > > 3. Because the queue is empty, ieee80211_return_txq() will not put it > back on the rbtree. > > Crucially, in 2. the CoDel algorithm doesn't kick in until the point of > packet dequeue. But even if an empty queue stays on the rbtree for a > while, there is no harm in that: eventually it will get its turn, it > will turn out to be empty, and just be skipped over. Then that will be fine. Thanks for the explanation of the dropping part in CoDel algorithm. > > The issue we need to be concerned about is the opposite: If we have a > queue that *does* have packets queued, but which is *not* scheduled for > transmission, that will stall TX. Is it by design since its vt is more than global vt, right? The lattency may somehow get impacted though. > > [0] CoDel in most cases only drops a single packet at a time, so it > will > not clear out an entire queue with multiple packets in one go. But you > are right that it could conceivably drop the last packet in a queue. > >>> We only need to defer removal inside a single "scheduling round" >>> (i.e., >>> between a pair of ieee80211_txq_schedule_start/end. So if we just >>> walk >>> the remove list in schedule_end() we should be enough, no? >>> >>> Hmm, or maybe a simpler way to fix the original issue is just to have >>> unschedule_txq() update the schedule_pos() pointer? >>> >>> I.e., unschedule_txq checks if the txq being removed is currently >>> being >>> pointed to by schedule_pos[ac], and if it is, it updates schedule_pos >>> to >>> be the rb_next of the current value? >> Actually, if schedule_pos is updated to rb_next of the current value, >> then in the next_txq() where we are going to use rb_next again and >> finally pick the next node of the node we really want. Is it fine to >> update schedule_pos to NULL? > > Hmm, yeah, good point. > > If we do end up setting schedule_pos to NULL in the middle of a > scheduling round, that will make next_txq() "start over", and do > another > loop through the whole thing. I guess we may be able hit a case where > things can oscillate back and forth between addition and removal > resulting in an infinite loop? Not sure, but at least I can't seem to > convince myself that this can't happen. As the loop of next_txq under lock protection as below, txq_schedule_start(); while(txq=next_txq()){ ... return_txq(txq); } txq_schedule_end(); I do not see any chance of addition, no? In ath10k, we will usually push packets of first txq as many as we can until it is drained and then move to the next one. So if a txq gets removed in the return_txq, it should always be the leftmost. And during this period, neither vt of any station or global vt can be updated due to lock protection. > > But in that case, we could fix it by just conditionally assigning > either > rb_next or rb_prev to the schedule_pos in unschedule_txq()? I.e., > something like: > > local->schedule_pos[ac] = rb_next(node) ?: rb_prev(node); I am not sure I am getting your point. Still in next_txq, schedule_pos[ac] will lead us to the next node of the one we want. > > -Toke -- Yibo