From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from us-smtp-delivery-1.mimecast.com ([205.139.110.120] helo=us-smtp-1.mimecast.com) by bombadil.infradead.org with esmtps (Exim 4.92.2 #3 (Red Hat Linux)) id 1iAtos-0000WA-8k for ath10k@lists.infradead.org; Thu, 19 Sep 2019 10:37:52 +0000 Received: by mail-ed1-f72.google.com with SMTP id s15so506786edj.1 for ; Thu, 19 Sep 2019 03:37:42 -0700 (PDT) From: Toke =?utf-8?Q?H=C3=B8iland-J=C3=B8rgensen?= Subject: Re: [PATCH 2/4] mac80211: defer txqs removal from rbtree In-Reply-To: <8cdece5c030fd95817fb099021c38613@codeaurora.org> 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> Date: Thu, 19 Sep 2019 12:37:38 +0200 Message-ID: <87tv98fu6l.fsf@toke.dk> MIME-Version: 1.0 List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "ath10k" Errors-To: ath10k-bounces+kvalo=adurom.com@lists.infradead.org To: Yibo Zhao Cc: linux-wireless-owner@vger.kernel.org, linux-wireless@vger.kernel.org, ath10k@lists.infradead.org WWlibyBaaGFvIDx5aWJvekBjb2RlYXVyb3JhLm9yZz4gd3JpdGVzOgoKPiBPbiAyMDE5LTA5LTE4 IDE5OjIzLCBUb2tlIEjDuGlsYW5kLUrDuHJnZW5zZW4gd3JvdGU6Cj4+IFlpYm8gWmhhbyA8eWli b3pAY29kZWF1cm9yYS5vcmc+IHdyaXRlczoKPj4gCj4+PiBPbiAyMDE5LTA5LTE4IDA1OjEwLCBU b2tlIEjDuGlsYW5kLUrDuHJnZW5zZW4gd3JvdGU6Cj4+Pj4gWWlibyBaaGFvIDx5aWJvekBjb2Rl YXVyb3JhLm9yZz4gd3JpdGVzOgo+Pj4+IAo+Pj4+PiBJbiBhIGxvb3AgdHhxcyBkZXF1ZXVlIHNj ZW5hcmlvLCBpZiB0aGUgZmlyc3QgdHhxIGluIHRoZSByYnRyZWUgZ2V0cwo+Pj4+PiByZW1vdmVk IGZyb20gcmJ0cmVlIGltbWVkaWF0ZWx5IGluIHRoZSBpZWVlODAyMTFfcmV0dXJuX3R4cSgpLCB0 aGUKPj4+Pj4gbG9vcCB3aWxsIGJyZWFrIHNvb24gaW4gdGhlIGllZWU4MDIxMV9uZXh0X3R4cSgp IGR1ZSB0byBzY2hlZHVsZV9wb3MKPj4+Pj4gbm90IGxlYWRpbmcgdG8gdGhlIHNlY29uZCB0eHEg aW4gdGhlIHJidHJlZS4gVGh1cywgZGVmZXJpbmcgdGhlCj4+Pj4+IHJlbW92YWwgcmlnaHQgYmVm b3JlIHRoZSBlbmQgb2YgdGhpcyBzY2hlZHVsZSByb3VuZC4KPj4+Pj4gCj4+Pj4+IENvLWRldmVs b3BlZC1ieTogWWlibyBaaGFvIDx5aWJvekBjb2RlYXVyb3JhLm9yZz4KPj4+Pj4gU2lnbmVkLW9m Zi1ieTogWWlibyBaaGFvIDx5aWJvekBjb2RlYXVyb3JhLm9yZz4KPj4+Pj4gU2lnbmVkLW9mZi1i eTogVG9rZSBIw7hpbGFuZC1Kw7hyZ2Vuc2VuIDx0b2tlQHRva2UuZGs+Cj4+Pj4gCj4+Pj4gSSBk aWRuJ3Qgd3JpdGUgdGhpcyBwYXRjaCwgc28gcGxlYXNlIGRvbid0IHVzZSBteSBzaWduLW9mZi4g SSdsbCBhZGQKPj4+PiBhY2sgb3IgcmV2aWV3IHRhZ3MgYXMgYXBwcm9wcmlhdGUgaW4gcmVwbHk7 IGJ1dCBhIGZldyBjb21tZW50cyBmaXJzdDoKPj4+PiAKPj4+Pj4gLS0tCj4+Pj4+ICBpbmNsdWRl L25ldC9tYWM4MDIxMS5oICAgICB8IDE2ICsrKysrKysrKystLQo+Pj4+PiAgbmV0L21hYzgwMjEx L2llZWU4MDIxMV9pLmggfCAgMyArKysKPj4+Pj4gIG5ldC9tYWM4MDIxMS9tYWluLmMgICAgICAg IHwgIDYgKysrKysKPj4+Pj4gIG5ldC9tYWM4MDIxMS90eC5jICAgICAgICAgIHwgNjMKPj4+Pj4g KysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0tLQo+Pj4+PiAgNCBm aWxlcyBjaGFuZ2VkLCA4MyBpbnNlcnRpb25zKCspLCA1IGRlbGV0aW9ucygtKQo+Pj4+PiAKPj4+ Pj4gZGlmZiAtLWdpdCBhL2luY2x1ZGUvbmV0L21hYzgwMjExLmggYi9pbmNsdWRlL25ldC9tYWM4 MDIxMS5oCj4+Pj4+IGluZGV4IGFjMmVkOGUuLmJhNWEzNDUgMTAwNjQ0Cj4+Pj4+IC0tLSBhL2lu Y2x1ZGUvbmV0L21hYzgwMjExLmgKPj4+Pj4gKysrIGIvaW5jbHVkZS9uZXQvbWFjODAyMTEuaAo+ Pj4+PiBAQCAtOTI1LDYgKzkyNSw4IEBAIHN0cnVjdCBpZWVlODAyMTFfdHhfcmF0ZSB7Cj4+Pj4+ IAo+Pj4+PiAgI2RlZmluZSBJRUVFODAyMTFfTUFYX1RYX1JFVFJZCQkzMQo+Pj4+PiAKPj4+Pj4g KyNkZWZpbmUgSUVFRTgwMjExX0FJUlRJTUVfVFhRX1JNX0NIS19JTlRWX0lOX01TIDEwMAo+Pj4+ PiArCj4+Pj4+ICBzdGF0aWMgaW5saW5lIHZvaWQgaWVlZTgwMjExX3JhdGVfc2V0X3ZodChzdHJ1 Y3QgaWVlZTgwMjExX3R4X3JhdGUKPj4+Pj4gKnJhdGUsCj4+Pj4+ICAJCQkJCSAgdTggbWNzLCB1 OCBuc3MpCj4+Pj4+ICB7Cj4+Pj4+IEBAIC02MjMyLDcgKzYyMzQsOCBAQCBzdHJ1Y3Qgc2tfYnVm ZiAqaWVlZTgwMjExX3R4X2RlcXVldWUoc3RydWN0Cj4+Pj4+IGllZWU4MDIxMV9odyAqaHcsCj4+ Pj4+ICAgKiBAYWM6IEFDIG51bWJlciB0byByZXR1cm4gcGFja2V0cyBmcm9tLgo+Pj4+PiAgICoK Pj4+Pj4gICAqIFNob3VsZCBvbmx5IGJlIGNhbGxlZCBiZXR3ZWVuIGNhbGxzIHRvCj4+Pj4+IGll ZWU4MDIxMV90eHFfc2NoZWR1bGVfc3RhcnQoKQo+Pj4+PiAtICogYW5kIGllZWU4MDIxMV90eHFf c2NoZWR1bGVfZW5kKCkuCj4+Pj4+ICsgKiBhbmQgaWVlZTgwMjExX3R4cV9zY2hlZHVsZV9lbmQo KS4gSWYgdGhlIHR4cSBpcyBlbXB0eSwgaXQgd2lsbCAKPj4+Pj4gYmUKPj4+Pj4gYWRkZWQKPj4+ Pj4gKyAqIHRvIGEgcmVtb3ZlIGxpc3QgYW5kIGdldCByZW1vdmVkIGxhdGVyLgo+Pj4+PiAgICog UmV0dXJucyB0aGUgbmV4dCB0eHEgaWYgc3VjY2Vzc2Z1bCwgJU5VTEwgaWYgbm8gcXVldWUgaXMg Cj4+Pj4+IGVsaWdpYmxlLgo+Pj4+PiBJZiBhIHR4cQo+Pj4+PiAgICogaXMgcmV0dXJuZWQsIGl0 IHNob3VsZCBiZSByZXR1cm5lZCB3aXRoIGllZWU4MDIxMV9yZXR1cm5fdHhxKCkKPj4+Pj4gYWZ0 ZXIgdGhlCj4+Pj4+ICAgKiBkcml2ZXIgaGFzIGZpbmlzaGVkIHNjaGVkdWxpbmcgaXQuCj4+Pj4+ IEBAIC02MjY4LDcgKzYyNzEsOCBAQCB2b2lkIGllZWU4MDIxMV90eHFfc2NoZWR1bGVfc3RhcnQo c3RydWN0Cj4+Pj4+IGllZWU4MDIxMV9odyAqaHcsIHU4IGFjKQo+Pj4+PiAgICogQGh3OiBwb2lu dGVyIGFzIG9idGFpbmVkIGZyb20gaWVlZTgwMjExX2FsbG9jX2h3KCkKPj4+Pj4gICAqIEBhYzog QUMgbnVtYmVyIHRvIGFjcXVpcmUgbG9ja3MgZm9yCj4+Pj4+ICAgKgo+Pj4+PiAtICogUmVsZWFz ZSBsb2NrcyBwcmV2aW91c2x5IGFjcXVpcmVkIGJ5IAo+Pj4+PiBpZWVlODAyMTFfdHhxX3NjaGVk dWxlX2VuZCgpLgo+Pj4+PiArICogUmVsZWFzZSBsb2NrcyBwcmV2aW91c2x5IGFjcXVpcmVkIGJ5 IAo+Pj4+PiBpZWVlODAyMTFfdHhxX3NjaGVkdWxlX2VuZCgpLgo+Pj4+PiBDaGVjawo+Pj4+PiAr ICogYW5kIHJlbW92ZSB0aGUgZW1wdHkgdHhxIGZyb20gcmItdHJlZS4KPj4+Pj4gICAqLwo+Pj4+ PiAgdm9pZCBpZWVlODAyMTFfdHhxX3NjaGVkdWxlX2VuZChzdHJ1Y3QgaWVlZTgwMjExX2h3ICpo dywgdTggYWMpCj4+Pj4+ICAJX19yZWxlYXNlcyh0eHFfbG9jayk7Cj4+Pj4+IEBAIC02Mjg3LDYg KzYyOTEsMTQgQEAgdm9pZCBpZWVlODAyMTFfc2NoZWR1bGVfdHhxKHN0cnVjdCAKPj4+Pj4gaWVl ZTgwMjExX2h3Cj4+Pj4+ICpodywgc3RydWN0IGllZWU4MDIxMV90eHEgKnR4cSkKPj4+Pj4gIAlf X2FjcXVpcmVzKHR4cV9sb2NrKSBfX3JlbGVhc2VzKHR4cV9sb2NrKTsKPj4+Pj4gCj4+Pj4+ICAv KioKPj4+Pj4gKyAqIGllZWU4MDIxMV90eHFzX2NoZWNrIC0gQ2hlY2sgdHhxcyB3YWl0aW5nIGZv ciByZW1vdmFsCj4+Pj4+ICsgKgo+Pj4+PiArICogQHRtcjogcG9pbnRlciBhcyBvYnRhaW5lZCBm cm9tIGxvY2FsCj4+Pj4+ICsgKgo+Pj4+PiArICovCj4+Pj4+ICt2b2lkIGllZWU4MDIxMV90eHFz X2NoZWNrKHN0cnVjdCB0aW1lcl9saXN0ICp0bXIpOwo+Pj4+PiArCj4+Pj4+ICsvKioKPj4+Pj4g ICAqIGllZWU4MDIxMV90eHFfbWF5X3RyYW5zbWl0IC0gY2hlY2sgd2hldGhlciBUWFEgaXMgYWxs b3dlZCB0bwo+Pj4+PiB0cmFuc21pdAo+Pj4+PiAgICoKPj4+Pj4gICAqIFRoaXMgZnVuY3Rpb24g aXMgdXNlZCB0byBjaGVjayB3aGV0aGVyIGdpdmVuIHR4cSBpcyBhbGxvd2VkIHRvCj4+Pj4+IHRy YW5zbWl0IGJ5Cj4+Pj4+IGRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaCBi L25ldC9tYWM4MDIxMS9pZWVlODAyMTFfaS5oCj4+Pj4+IGluZGV4IGE0NTU2ZjkuLjQ5YWExNDNl IDEwMDY0NAo+Pj4+PiAtLS0gYS9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAo+Pj4+PiArKysg Yi9uZXQvbWFjODAyMTEvaWVlZTgwMjExX2kuaAo+Pj4+PiBAQCAtODQ3LDYgKzg0Nyw3IEBAIHN0 cnVjdCB0eHFfaW5mbyB7Cj4+Pj4+ICAJc3RydWN0IGNvZGVsX3N0YXRzIGNzdGF0czsKPj4+Pj4g IAlzdHJ1Y3Qgc2tfYnVmZl9oZWFkIGZyYWdzOwo+Pj4+PiAgCXN0cnVjdCByYl9ub2RlIHNjaGVk dWxlX29yZGVyOwo+Pj4+PiArCXN0cnVjdCBsaXN0X2hlYWQgY2FuZGlkYXRlOwo+Pj4+PiAgCXVu c2lnbmVkIGxvbmcgZmxhZ3M7Cj4+Pj4+IAo+Pj4+PiAgCS8qIGtlZXAgbGFzdCEgKi8KPj4+Pj4g QEAgLTExNDUsNiArMTE0Niw4IEBAIHN0cnVjdCBpZWVlODAyMTFfbG9jYWwgewo+Pj4+PiAgCXU2 NCBhaXJ0aW1lX3ZfdFtJRUVFODAyMTFfTlVNX0FDU107Cj4+Pj4+ICAJdTY0IGFpcnRpbWVfd2Vp Z2h0X3N1bVtJRUVFODAyMTFfTlVNX0FDU107Cj4+Pj4+IAo+Pj4+PiArCXN0cnVjdCBsaXN0X2hl YWQgcmVtb3ZlX2xpc3RbSUVFRTgwMjExX05VTV9BQ1NdOwo+Pj4+PiArCXN0cnVjdCB0aW1lcl9s aXN0IHJlbW92ZV90aW1lcjsKPj4+Pj4gIAl1MTYgYWlydGltZV9mbGFnczsKPj4+Pj4gCj4+Pj4+ ICAJY29uc3Qgc3RydWN0IGllZWU4MDIxMV9vcHMgKm9wczsKPj4+Pj4gZGlmZiAtLWdpdCBhL25l dC9tYWM4MDIxMS9tYWluLmMgYi9uZXQvbWFjODAyMTEvbWFpbi5jCj4+Pj4+IGluZGV4IGU5ZmZh OGUuLjc4ZmUyNGEgMTAwNjQ0Cj4+Pj4+IC0tLSBhL25ldC9tYWM4MDIxMS9tYWluLmMKPj4+Pj4g KysrIGIvbmV0L21hYzgwMjExL21haW4uYwo+Pj4+PiBAQCAtNjY3LDEwICs2NjcsMTUgQEAgc3Ry dWN0IGllZWU4MDIxMV9odwo+Pj4+PiAqaWVlZTgwMjExX2FsbG9jX2h3X25tKHNpemVfdCBwcml2 X2RhdGFfbGVuLAo+Pj4+PiAKPj4+Pj4gIAlmb3IgKGkgPSAwOyBpIDwgSUVFRTgwMjExX05VTV9B Q1M7IGkrKykgewo+Pj4+PiAgCQlsb2NhbC0+YWN0aXZlX3R4cXNbaV0gPSBSQl9ST09UX0NBQ0hF RDsKPj4+Pj4gKwkJSU5JVF9MSVNUX0hFQUQoJmxvY2FsLT5yZW1vdmVfbGlzdFtpXSk7Cj4+Pj4+ ICAJCXNwaW5fbG9ja19pbml0KCZsb2NhbC0+YWN0aXZlX3R4cV9sb2NrW2ldKTsKPj4+Pj4gIAl9 Cj4+Pj4+ICAJbG9jYWwtPmFpcnRpbWVfZmxhZ3MgPSBBSVJUSU1FX1VTRV9UWCB8IEFJUlRJTUVf VVNFX1JYOwo+Pj4+PiAKPj4+Pj4gKwl0aW1lcl9zZXR1cCgmbG9jYWwtPnJlbW92ZV90aW1lciwg aWVlZTgwMjExX3R4cXNfY2hlY2ssIDApOwo+Pj4+PiArCW1vZF90aW1lcigmbG9jYWwtPnJlbW92 ZV90aW1lciwKPj4+Pj4gKwkJICBqaWZmaWVzICsKPj4+Pj4gbXNlY3NfdG9famlmZmllcyhJRUVF ODAyMTFfQUlSVElNRV9UWFFfUk1fQ0hLX0lOVFZfSU5fTVMpKTsKPj4+Pj4gKwo+Pj4+PiAgCUlO SVRfTElTVF9IRUFEKCZsb2NhbC0+Y2hhbmN0eF9saXN0KTsKPj4+Pj4gIAltdXRleF9pbml0KCZs b2NhbC0+Y2hhbmN0eF9tdHgpOwo+Pj4+PiAKPj4+Pj4gQEAgLTEzMDUsNiArMTMxMCw3IEBAIHZv aWQgaWVlZTgwMjExX3VucmVnaXN0ZXJfaHcoc3RydWN0IAo+Pj4+PiBpZWVlODAyMTFfaHcKPj4+ Pj4gKmh3KQo+Pj4+PiAgCXRhc2tsZXRfa2lsbCgmbG9jYWwtPnR4X3BlbmRpbmdfdGFza2xldCk7 Cj4+Pj4+ICAJdGFza2xldF9raWxsKCZsb2NhbC0+dGFza2xldCk7Cj4+Pj4+IAo+Pj4+PiArCWRl bF90aW1lcl9zeW5jKCZsb2NhbC0+cmVtb3ZlX3RpbWVyKTsKPj4+Pj4gICNpZmRlZiBDT05GSUdf SU5FVAo+Pj4+PiAgCXVucmVnaXN0ZXJfaW5ldGFkZHJfbm90aWZpZXIoJmxvY2FsLT5pZmFfbm90 aWZpZXIpOwo+Pj4+PiAgI2VuZGlmCj4+Pj4+IGRpZmYgLS1naXQgYS9uZXQvbWFjODAyMTEvdHgu YyBiL25ldC9tYWM4MDIxMS90eC5jCj4+Pj4+IGluZGV4IGQwMGJhYWEuLjQyY2EwMTAgMTAwNjQ0 Cj4+Pj4+IC0tLSBhL25ldC9tYWM4MDIxMS90eC5jCj4+Pj4+ICsrKyBiL25ldC9tYWM4MDIxMS90 eC5jCj4+Pj4+IEBAIC0xNDUwLDYgKzE0NTAsNyBAQCB2b2lkIGllZWU4MDIxMV90eHFfaW5pdChz dHJ1Y3QKPj4+Pj4gaWVlZTgwMjExX3N1Yl9pZl9kYXRhICpzZGF0YSwKPj4+Pj4gIAljb2RlbF9z dGF0c19pbml0KCZ0eHFpLT5jc3RhdHMpOwo+Pj4+PiAgCV9fc2tiX3F1ZXVlX2hlYWRfaW5pdCgm dHhxaS0+ZnJhZ3MpOwo+Pj4+PiAgCVJCX0NMRUFSX05PREUoJnR4cWktPnNjaGVkdWxlX29yZGVy KTsKPj4+Pj4gKwlJTklUX0xJU1RfSEVBRCgmdHhxaS0+Y2FuZGlkYXRlKTsKPj4+Pj4gCj4+Pj4+ ICAJdHhxaS0+dHhxLnZpZiA9ICZzZGF0YS0+dmlmOwo+Pj4+PiAKPj4+Pj4gQEAgLTM3MjQsNiAr MzcyNSw5IEBAIHZvaWQgaWVlZTgwMjExX3NjaGVkdWxlX3R4cShzdHJ1Y3QgCj4+Pj4+IGllZWU4 MDIxMV9odwo+Pj4+PiAqaHcsCj4+Pj4+IAo+Pj4+PiAgCXNwaW5fbG9ja19iaCgmbG9jYWwtPmFj dGl2ZV90eHFfbG9ja1thY10pOwo+Pj4+PiAKPj4+Pj4gKwlpZiAoIWxpc3RfZW1wdHkoJnR4cWkt PmNhbmRpZGF0ZSkpCj4+Pj4+ICsJCWxpc3RfZGVsX2luaXQoJnR4cWktPmNhbmRpZGF0ZSk7Cj4+ Pj4+ICsKPj4+Pj4gIAlpZiAoIVJCX0VNUFRZX05PREUoJnR4cWktPnNjaGVkdWxlX29yZGVyKSkK Pj4+Pj4gIAkJZ290byBvdXQ7Cj4+Pj4+IAo+Pj4+PiBAQCAtMzc4Myw2ICszNzg3LDIwIEBAIHN0 YXRpYyB2b2lkIF9faWVlZTgwMjExX3Vuc2NoZWR1bGVfdHhxKHN0cnVjdAo+Pj4+PiBpZWVlODAy MTFfaHcgKmh3LAo+Pj4+PiAgCVJCX0NMRUFSX05PREUoJnR4cWktPnNjaGVkdWxlX29yZGVyKTsK Pj4+Pj4gIH0KPj4+Pj4gCj4+Pj4+ICt2b2lkIGllZWU4MDIxMV9yZW1vdmVfdHhxKHN0cnVjdCBp ZWVlODAyMTFfaHcgKmh3LAo+Pj4+PiArCQkJICBzdHJ1Y3QgaWVlZTgwMjExX3R4cSAqdHhxKQo+ Pj4+PiArewo+Pj4+PiArCXN0cnVjdCBpZWVlODAyMTFfbG9jYWwgKmxvY2FsID0gaHdfdG9fbG9j YWwoaHcpOwo+Pj4+PiArCXN0cnVjdCB0eHFfaW5mbyAqdHhxaSA9IHRvX3R4cV9pbmZvKHR4cSk7 Cj4+Pj4+ICsKPj4+Pj4gKwlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+YWN0aXZlX3R4cV9s b2NrW3R4cS0+YWNdKTsKPj4+Pj4gKwo+Pj4+PiArCWlmICghUkJfRU1QVFlfTk9ERSgmdHhxaS0+ c2NoZWR1bGVfb3JkZXIpKSB7Cj4+Pj4+ICsJCV9faWVlZTgwMjExX3Vuc2NoZWR1bGVfdHhxKGh3 LCB0eHEpOwo+Pj4+PiArCQlsaXN0X2RlbF9pbml0KCZ0eHFpLT5jYW5kaWRhdGUpOwo+Pj4+PiAr CX0KPj4+Pj4gK30KPj4+Pj4gKwo+Pj4+PiAgdm9pZCBpZWVlODAyMTFfdW5zY2hlZHVsZV90eHEo c3RydWN0IGllZWU4MDIxMV9odyAqaHcsCj4+Pj4+ICAJCQkgICAgICBzdHJ1Y3QgaWVlZTgwMjEx X3R4cSAqdHhxKQo+Pj4+PiAgCV9fYWNxdWlyZXModHhxX2xvY2spIF9fcmVsZWFzZXModHhxX2xv Y2spCj4+Pj4+IEBAIC0zNzkwLDcgKzM4MDgsNyBAQCB2b2lkIGllZWU4MDIxMV91bnNjaGVkdWxl X3R4cShzdHJ1Y3QKPj4+Pj4gaWVlZTgwMjExX2h3ICpodywKPj4+Pj4gIAlzdHJ1Y3QgaWVlZTgw MjExX2xvY2FsICpsb2NhbCA9IGh3X3RvX2xvY2FsKGh3KTsKPj4+Pj4gCj4+Pj4+ICAJc3Bpbl9s b2NrX2JoKCZsb2NhbC0+YWN0aXZlX3R4cV9sb2NrW3R4cS0+YWNdKTsKPj4+Pj4gLQlfX2llZWU4 MDIxMV91bnNjaGVkdWxlX3R4cShodywgdHhxKTsKPj4+Pj4gKwlpZWVlODAyMTFfcmVtb3ZlX3R4 cShodywgdHhxKTsKPj4+Pj4gIAlzcGluX3VubG9ja19iaCgmbG9jYWwtPmFjdGl2ZV90eHFfbG9j a1t0eHEtPmFjXSk7Cj4+Pj4+ICB9Cj4+Pj4+IAo+Pj4+PiBAQCAtMzgwMywxMSArMzgyMSw0OCBA QCB2b2lkIGllZWU4MDIxMV9yZXR1cm5fdHhxKHN0cnVjdCAKPj4+Pj4gaWVlZTgwMjExX2h3Cj4+ Pj4+ICpodywKPj4+Pj4gIAlsb2NrZGVwX2Fzc2VydF9oZWxkKCZsb2NhbC0+YWN0aXZlX3R4cV9s b2NrW3R4cS0+YWNdKTsKPj4+Pj4gCj4+Pj4+ICAJaWYgKCFSQl9FTVBUWV9OT0RFKCZ0eHFpLT5z Y2hlZHVsZV9vcmRlcikgJiYKPj4+Pj4gLQkgICAgKHNrYl9xdWV1ZV9lbXB0eSgmdHhxaS0+ZnJh Z3MpICYmICF0eHFpLT50aW4uYmFja2xvZ19wYWNrZXRzKSkKPj4+Pj4gLQkJX19pZWVlODAyMTFf dW5zY2hlZHVsZV90eHEoaHcsIHR4cSk7Cj4+Pj4+ICsJCSF0eHFfaGFzX3F1ZXVlKCZ0eHFpLT50 eHEpICYmCj4+Pj4+ICsJCWxpc3RfZW1wdHkoJnR4cWktPmNhbmRpZGF0ZSkpCj4+Pj4+ICsJCWxp c3RfYWRkX3RhaWwoJnR4cWktPmNhbmRpZGF0ZSwgJmxvY2FsLT5yZW1vdmVfbGlzdFt0eHEtPmFj XSk7Cj4+Pj4+ICsKPj4+Pj4gIH0KPj4+Pj4gIEVYUE9SVF9TWU1CT0woaWVlZTgwMjExX3JldHVy bl90eHEpOwo+Pj4+PiAKPj4+Pj4gK3ZvaWQgX19pZWVlODAyMTFfY2hlY2tfdHhxcyhzdHJ1Y3Qg aWVlZTgwMjExX2xvY2FsICpsb2NhbCwgaW50IGFjKQo+Pj4+PiArewo+Pj4+PiArCXN0cnVjdCB0 eHFfaW5mbyAqaXRlciwgKnRtcDsKPj4+Pj4gKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0YTsKPj4+Pj4g Kwo+Pj4+PiArCWxvY2tkZXBfYXNzZXJ0X2hlbGQoJmxvY2FsLT5hY3RpdmVfdHhxX2xvY2tbYWNd KTsKPj4+Pj4gKwo+Pj4+PiArCWxpc3RfZm9yX2VhY2hfZW50cnlfc2FmZShpdGVyLCB0bXAsICZs b2NhbC0+cmVtb3ZlX2xpc3RbYWNdLAo+Pj4+PiArCQkJCSBjYW5kaWRhdGUpIHsKPj4+Pj4gKwkJ c3RhID0gY29udGFpbmVyX29mKGl0ZXItPnR4cS5zdGEsIHN0cnVjdCBzdGFfaW5mbywgc3RhKTsK Pj4+Pj4gKwo+Pj4+PiArCQlpZiAodHhxX2hhc19xdWV1ZSgmaXRlci0+dHhxKSkKPj4+Pj4gKwkJ CWxpc3RfZGVsX2luaXQoJml0ZXItPmNhbmRpZGF0ZSk7Cj4+Pj4+ICsJCWVsc2UKPj4+Pj4gKwkJ CWllZWU4MDIxMV9yZW1vdmVfdHhxKCZsb2NhbC0+aHcsICZpdGVyLT50eHEpOwo+Pj4+PiArCX0K Pj4+Pj4gK30KPj4+Pj4gKwo+Pj4+PiArdm9pZCBpZWVlODAyMTFfdHhxc19jaGVjayhzdHJ1Y3Qg dGltZXJfbGlzdCAqdCkKPj4+Pj4gK3sKPj4+Pj4gKwlzdHJ1Y3QgaWVlZTgwMjExX2xvY2FsICps b2NhbCA9IGZyb21fdGltZXIobG9jYWwsIHQsIAo+Pj4+PiByZW1vdmVfdGltZXIpOwo+Pj4+PiAr CXN0cnVjdCB0eHFfaW5mbyAqaXRlciwgKnRtcDsKPj4+Pj4gKwlzdHJ1Y3Qgc3RhX2luZm8gKnN0 YTsKPj4+Pj4gKwlpbnQgYWM7Cj4+Pj4+ICsKPj4+Pj4gKwlmb3IgKGFjID0gMDsgYWMgPCBJRUVF ODAyMTFfTlVNX0FDUzsgYWMrKykgewo+Pj4+PiArCQlzcGluX2xvY2tfYmgoJmxvY2FsLT5hY3Rp dmVfdHhxX2xvY2tbYWNdKTsKPj4+Pj4gKwkJX19pZWVlODAyMTFfY2hlY2tfdHhxcyhsb2NhbCwg YWMpOwo+Pj4+PiArCQlzcGluX3VubG9ja19iaCgmbG9jYWwtPmFjdGl2ZV90eHFfbG9ja1thY10p Owo+Pj4+PiArCX0KPj4+Pj4gKwo+Pj4+PiArCW1vZF90aW1lcigmbG9jYWwtPnJlbW92ZV90aW1l ciwKPj4+Pj4gKwkJICBqaWZmaWVzICsKPj4+Pj4gbXNlY3NfdG9famlmZmllcyhJRUVFODAyMTFf QUlSVElNRV9UWFFfUk1fQ0hLX0lOVFZfSU5fTVMpKTsKPj4+Pj4gK30KPj4+PiAKPj4+PiBJJ2xs IGFzayB0aGUgc2FtZSBhcyBJIGRpZCBsYXN0IHRpbWUgKHdoZXJlIHlvdSB0b2xkIG1lIHRvIGhv bGQgb2ZmCj4+Pj4gdW50aWwgdGhpcyByb3VuZCk6Cj4+Pj4gCj4+Pj4gV2h5IGRvIHlvdSBuZWVk IHRoZSB0aW1lciBhbmQgdGhlIHBlcmlvZGljIGNoZWNrPyBJZiBUWFFzIGFyZSBhZGRlZCAKPj4+ PiB0bwo+Pj4+IHRoZSByZW1vdmUgbGlzdCBkdXJpbmcgdGhlIHNjaGVkdWxpbmcgcnVuLCBhbmQg Cj4+Pj4gX19pZWVlODAyMTFfY2hlY2tfdHhxcygpCj4+Pj4gaXMgcnVuIGZyb20gc2NoZWR1bGVf ZW5kKCksIGlzbid0IHRoYXQgc3VmZmljaWVudCB0byBjbGVhciB0aGUgbGlzdD8KPj4+IElzIGl0 IHBvc3NpYmxlIHRoYXQgYSB0eHEgaXMgbm90IGFkZGVkIHRvIHRoZSByZW1vdmUgbGlzdCBidXQg dGhlbgo+Pj4gcGFja2V0cyBpbiBpdCBhcmUgZHJvcHBlZCBieSBmcV9jb2RlbCBhbGdvPyBMaWtl IHRoZSBzdGF0aW9uIAo+Pj4gZGlzY29ubmVjdHMKPj4+IHdpdGhvdXQgYW55IG5vdGlmaWNhdGlv bi4KPj4gCj4+IFdlbGwgYXMgbG9uZyBhcyBhbGwgdGhlIG90aGVyIGNsZWFudXAgcGF0aHMgY2Fs bCBkaXJlY3RseSBpbnRvCj4+IF9fdW5zY2hlZHVsZV90eHEoKSwgdGhhdCBzaG91bGQgcmVtb3Zl IHN0YXRpb25zIGZyb20gdGhlIHNjaGVkdWxlciB3aGVuCj4+IHRoZXkgZGlzY29ubmVjdCBldGMu Cj4gWWVzLCB0aGUgZGlzY29ubmVjdCBzY2VuYXJpbyBpcyBhIGJhZCBleGFtcGxlLiBNeSBjb25j ZXJuIGlzLCBzYXksIHdlIAo+IGhhdmUgMTAgc3RhdGlvbnMgYW5kIG9ubHkgb25lIG9mIHRoZW0g aXMgYXNzaWduZWQgYSB2ZXJ5IHNtYWxsIHdlaWdodCAKPiBjb21wYXJlZCB3aXRoIHRoYXQgb2Yg b3RoZXJzLiBTdXBwb3NlLCBhZnRlciBpdHMgY2hhbmNlIG9mIFR4LCBpdCBpcyAKPiBtb3N0IGxp a2VseSB0byBiZSBwbGFjZWQgaW4gdGhlIHJpZ2h0bW9zdChzdGlsbCBoYXMgc29tZSBwYWNrZXRz IGluIHRoZSAKPiB0eHEpIGFuZCBubyBtb3JlIGluY29taW5nIGRhdGEgZm9yIGl0LiBUaGUgcmVt YWluaW5nIHBhY2tldHMgaW4gdHhxIHdpbGwgCj4gYmUgZHJvcHBlZCBkdWUgdG8gdGltZW91dCBh bGdvIGluIGNvZGVsKGNvcnJlY3QgbWUgaWYgSSBhbSB3cm9uZykgYnV0IAo+IHRoaXMgZW1wdHkg dHhxIHdpbGwgc3RheSBvbiB0aGUgcmJ0cmVlIHVudGlsIG90aGVyIHR4cXMgZ2V0IGRyYWluZWQg b3IgCj4gZ2xvYmFsIHZ0IGNhdGNoIHVwIHdpdGggaXRzIHZ0LiBUaGUgc3RheWluZyB0aW1lIGNv dWxkIGJlIGxvbmcgaWYgd2VpZ2h0IAo+IGlzIGV4dHJlbWVseSBzbWFsbC4gVGhlbiBkbyB3ZSBu ZWVkIHRpbWVyIHRvIGNoZWNrIG9yIGFueSBvdGhlciBiZXR0ZXIgCj4gc29sdXRpb24/CgpBaCwg SSBzZWUgd2hhdCB5b3UgbWVhbi4gTm8sIEkgZG9uJ3QgdGhpbmsgdGhpcyB3aWxsIGJlIGEgcHJv YmxlbTsgdGhlCnNjZW5hcmlvIHlvdSdyZSBkZXNjcmliaW5nIHdvdWxkIHBsYXkgb3V0IGxpa2Ug dGhpczoKCjEuIFN0YXRpb24gZW5kcyB0cmFuc21pdHRpbmcsIHN0aWxsIGhhcyBhIHNpbmdsZSBw YWNrZXQgcXVldWVkLCBnZXRzCiAgIG1vdmVkIHRvIHRoZSBlbmQgb2YgdGhlIHJidHJlZSAoYW5k IHN0YXlzIHRoZXJlIGZvciBhIHdoaWxlKS4KCjIuIFdoZW4gd2UgZmluYWxseSBnZXQgdG8gdGhl IHBvaW50IHdoZXJlIHRoaXMgc3RhdGlvbiBnZXRzIGFub3RoZXIKICAgY2hhbmNlIHRvIHRyYW5z bWl0LCB0aGUgQ29EZWwgZHJvcCB0aW1lciB0cmlnZ2VycyBhbmQgdGhlIGxhc3QgcGFja2V0CiAg IGlzIGRyb3BwZWRbMF0uIFRoaXMgbWVhbnMgdGhhdCB0aGUgcXVldWUgd2lsbCBqdXN0IGJlIGVt cHR5CiAgIChhbmQgaWVlZTgwMjExX3R4X2RlcXVldWUoKSB3aWxsIHJldHVybiBOVUxMKS4KCjMu IEJlY2F1c2UgdGhlIHF1ZXVlIGlzIGVtcHR5LCBpZWVlODAyMTFfcmV0dXJuX3R4cSgpIHdpbGwg bm90IHB1dCBpdAogICBiYWNrIG9uIHRoZSByYnRyZWUuCgpDcnVjaWFsbHksIGluIDIuIHRoZSBD b0RlbCBhbGdvcml0aG0gZG9lc24ndCBraWNrIGluIHVudGlsIHRoZSBwb2ludCBvZgpwYWNrZXQg ZGVxdWV1ZS4gQnV0IGV2ZW4gaWYgYW4gZW1wdHkgcXVldWUgc3RheXMgb24gdGhlIHJidHJlZSBm b3IgYQp3aGlsZSwgdGhlcmUgaXMgbm8gaGFybSBpbiB0aGF0OiBldmVudHVhbGx5IGl0IHdpbGwg Z2V0IGl0cyB0dXJuLCBpdAp3aWxsIHR1cm4gb3V0IHRvIGJlIGVtcHR5LCBhbmQganVzdCBiZSBz a2lwcGVkIG92ZXIuCgpUaGUgaXNzdWUgd2UgbmVlZCB0byBiZSBjb25jZXJuZWQgYWJvdXQgaXMg dGhlIG9wcG9zaXRlOiBJZiB3ZSBoYXZlIGEKcXVldWUgdGhhdCAqZG9lcyogaGF2ZSBwYWNrZXRz IHF1ZXVlZCwgYnV0IHdoaWNoIGlzICpub3QqIHNjaGVkdWxlZCBmb3IKdHJhbnNtaXNzaW9uLCB0 aGF0IHdpbGwgc3RhbGwgVFguCgpbMF0gQ29EZWwgaW4gbW9zdCBjYXNlcyBvbmx5IGRyb3BzIGEg c2luZ2xlIHBhY2tldCBhdCBhIHRpbWUsIHNvIGl0IHdpbGwKbm90IGNsZWFyIG91dCBhbiBlbnRp cmUgcXVldWUgd2l0aCBtdWx0aXBsZSBwYWNrZXRzIGluIG9uZSBnby4gQnV0IHlvdQphcmUgcmln aHQgdGhhdCBpdCBjb3VsZCBjb25jZWl2YWJseSBkcm9wIHRoZSBsYXN0IHBhY2tldCBpbiBhIHF1 ZXVlLgoKPj4gV2Ugb25seSBuZWVkIHRvIGRlZmVyIHJlbW92YWwgaW5zaWRlIGEgc2luZ2xlICJz Y2hlZHVsaW5nIHJvdW5kIiAoaS5lLiwKPj4gYmV0d2VlbiBhIHBhaXIgb2YgaWVlZTgwMjExX3R4 cV9zY2hlZHVsZV9zdGFydC9lbmQuIFNvIGlmIHdlIGp1c3Qgd2Fsawo+PiB0aGUgcmVtb3ZlIGxp c3QgaW4gc2NoZWR1bGVfZW5kKCkgd2Ugc2hvdWxkIGJlIGVub3VnaCwgbm8/Cj4+IAo+PiBIbW0s IG9yIG1heWJlIGEgc2ltcGxlciB3YXkgdG8gZml4IHRoZSBvcmlnaW5hbCBpc3N1ZSBpcyBqdXN0 IHRvIGhhdmUKPj4gdW5zY2hlZHVsZV90eHEoKSB1cGRhdGUgdGhlIHNjaGVkdWxlX3BvcygpIHBv aW50ZXI/Cj4+IAo+PiBJLmUuLCB1bnNjaGVkdWxlX3R4cSBjaGVja3MgaWYgdGhlIHR4cSBiZWlu ZyByZW1vdmVkIGlzIGN1cnJlbnRseSBiZWluZwo+PiBwb2ludGVkIHRvIGJ5IHNjaGVkdWxlX3Bv c1thY10sIGFuZCBpZiBpdCBpcywgaXQgdXBkYXRlcyBzY2hlZHVsZV9wb3MgCj4+IHRvCj4+IGJl IHRoZSByYl9uZXh0IG9mIHRoZSBjdXJyZW50IHZhbHVlPwo+IEFjdHVhbGx5LCBpZiBzY2hlZHVs ZV9wb3MgaXMgdXBkYXRlZCB0byByYl9uZXh0IG9mIHRoZSBjdXJyZW50IHZhbHVlLCAKPiB0aGVu IGluIHRoZSBuZXh0X3R4cSgpIHdoZXJlIHdlIGFyZSBnb2luZyB0byB1c2UgcmJfbmV4dCBhZ2Fp biBhbmQgCj4gZmluYWxseSBwaWNrIHRoZSBuZXh0IG5vZGUgb2YgdGhlIG5vZGUgd2UgcmVhbGx5 IHdhbnQuIElzIGl0IGZpbmUgdG8gCj4gdXBkYXRlIHNjaGVkdWxlX3BvcyB0byBOVUxMPwoKSG1t LCB5ZWFoLCBnb29kIHBvaW50LgoKSWYgd2UgZG8gZW5kIHVwIHNldHRpbmcgc2NoZWR1bGVfcG9z IHRvIE5VTEwgaW4gdGhlIG1pZGRsZSBvZiBhCnNjaGVkdWxpbmcgcm91bmQsIHRoYXQgd2lsbCBt YWtlIG5leHRfdHhxKCkgInN0YXJ0IG92ZXIiLCBhbmQgZG8gYW5vdGhlcgpsb29wIHRocm91Z2gg dGhlIHdob2xlIHRoaW5nLiBJIGd1ZXNzIHdlIG1heSBiZSBhYmxlIGhpdCBhIGNhc2Ugd2hlcmUK dGhpbmdzIGNhbiBvc2NpbGxhdGUgYmFjayBhbmQgZm9ydGggYmV0d2VlbiBhZGRpdGlvbiBhbmQg cmVtb3ZhbApyZXN1bHRpbmcgaW4gYW4gaW5maW5pdGUgbG9vcD8gTm90IHN1cmUsIGJ1dCBhdCBs ZWFzdCBJIGNhbid0IHNlZW0gdG8KY29udmluY2UgbXlzZWxmIHRoYXQgdGhpcyBjYW4ndCBoYXBw ZW4uCgpCdXQgaW4gdGhhdCBjYXNlLCB3ZSBjb3VsZCBmaXggaXQgYnkganVzdCBjb25kaXRpb25h bGx5IGFzc2lnbmluZyBlaXRoZXIKcmJfbmV4dCBvciByYl9wcmV2IHRvIHRoZSBzY2hlZHVsZV9w b3MgaW4gdW5zY2hlZHVsZV90eHEoKT8gSS5lLiwKc29tZXRoaW5nIGxpa2U6Cgpsb2NhbC0+c2No ZWR1bGVfcG9zW2FjXSA9IHJiX25leHQobm9kZSkgPzogcmJfcHJldihub2RlKTsKCi1Ub2tlCgoK X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KYXRoMTBrIG1h aWxpbmcgbGlzdAphdGgxMGtAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFk ZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2F0aDEwawo= 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.9 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS 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 8E772C3A5A6 for ; Thu, 19 Sep 2019 10:37:52 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 41F03207FC for ; Thu, 19 Sep 2019 10:37:52 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=redhat.com header.i=@redhat.com header.b="aKKcfeo7" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S2388007AbfISKhv (ORCPT ); Thu, 19 Sep 2019 06:37:51 -0400 Received: from us-smtp-1.mimecast.com ([205.139.110.61]:60649 "EHLO us-smtp-delivery-1.mimecast.com" rhost-flags-OK-OK-OK-FAIL) by vger.kernel.org with ESMTP id S2387753AbfISKhv (ORCPT ); Thu, 19 Sep 2019 06:37:51 -0400 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1568889469; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=sqmmGICoS2C5jauA8gwEt5cGIkP7PwblE+rEIsOEo6k=; b=aKKcfeo71i0tmWMOWsENjEPjq0sALFNs3UFXcZs5xtHaY4XuLDN9FvG6I1AjrpCPR2aes1 HKuQ2OCY5LKeqmVgNtapTC6Sd7B1qOOw28JwXWTJ4mJw06ahx8r/sbzy4vUi9g42YILnUX 4TaaM15wijTDRkk6QRvCeR87YVXE9K8= Received: from mail-ed1-f72.google.com (mail-ed1-f72.google.com [209.85.208.72]) (Using TLS) by relay.mimecast.com with ESMTP id us-mta-300-gL9li2KSOU-OZbQzaXM2Hg-1; Thu, 19 Sep 2019 06:37:46 -0400 Received: by mail-ed1-f72.google.com with SMTP id y66so1666969ede.16 for ; Thu, 19 Sep 2019 03:37:42 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:in-reply-to:references:date :message-id:mime-version:content-transfer-encoding; bh=gs4t8Pb7kXUsab25YdbpU0BuRIE0V+4xnR4r55AOZU8=; b=Ta1qBlkW75jmpcMUlyYZM+KP8a0SPk8VDJOmlarf/M0yzY5U1SPH2fnrfxYKwKO3hD /eeA20KzG3v6ufJ/iRKlI2cu79D8r+RM58FGKfM0JWdSAxfctIpkk7bc/9Z5rZ4cVxEO gXYEtTOybz67C7ERAWLT0GMbmtnWU0KK0YuxEI30HtseW3sJIE7L++hNR/o1my+v0V+P 6xQ+5bFIOgznvzyg1U/Ehpm0Cj311iIxmrOzCnS8S0v/zz8CsE381TwNn82NJ6iiHImD idpMg0tbhRhWk4RVHhJnU7U4ZVa/PO8o42q8bhxiKILMSOsGAOhTyMcT4QItbiXm2FFV EnZg== X-Gm-Message-State: APjAAAWuGNFAGGWBJh02y6C9e+O8hImGGO7Y04cyvaBjaXy6ek9+nDYl lJ5YGIeKR+nyRQNDFIjbyVotuVqe6qnvrt/Gl79F2azXioZDbVMO74Sp3SNSx12w1uwt8LGBtd+ kEbpEYVnbWOi9wBZZZGlbYFhKSR8= X-Received: by 2002:a50:ef12:: with SMTP id m18mr15085717eds.18.1568889460985; Thu, 19 Sep 2019 03:37:40 -0700 (PDT) X-Google-Smtp-Source: APXvYqyVS7af4L5Zn+j1qldS+RDfAIkcWLTNbalZ4jJd9zzCsVqtMZWG2Z2/q1RR13LL2nmpftvLOw== X-Received: by 2002:a50:ef12:: with SMTP id m18mr15085690eds.18.1568889460706; Thu, 19 Sep 2019 03:37:40 -0700 (PDT) Received: from alrua-x1.borgediget.toke.dk ([2a00:7660:6da:443::2]) by smtp.gmail.com with ESMTPSA id m1sm1467008edq.83.2019.09.19.03.37.39 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 19 Sep 2019 03:37:39 -0700 (PDT) Received: by alrua-x1.borgediget.toke.dk (Postfix, from userid 1000) id 06EC218063E; Thu, 19 Sep 2019 12:37:39 +0200 (CEST) From: Toke =?utf-8?Q?H=C3=B8iland-J=C3=B8rgensen?= To: Yibo Zhao 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: <8cdece5c030fd95817fb099021c38613@codeaurora.org> 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> X-Clacks-Overhead: GNU Terry Pratchett Date: Thu, 19 Sep 2019 12:37:38 +0200 Message-ID: <87tv98fu6l.fsf@toke.dk> MIME-Version: 1.0 X-MC-Unique: gL9li2KSOU-OZbQzaXM2Hg-1 X-Mimecast-Spam-Score: 0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: quoted-printable Sender: linux-wireless-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-wireless@vger.kernel.org Yibo Zhao writes: > On 2019-09-18 19:23, Toke H=C3=B8iland-J=C3=B8rgensen wrote: >> Yibo Zhao writes: >>=20 >>> On 2019-09-18 05:10, Toke H=C3=B8iland-J=C3=B8rgensen wrote: >>>> Yibo Zhao writes: >>>>=20 >>>>> 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. >>>>>=20 >>>>> Co-developed-by: Yibo Zhao >>>>> Signed-off-by: Yibo Zhao >>>>> Signed-off-by: Toke H=C3=B8iland-J=C3=B8rgensen >>>>=20 >>>> 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: >>>>=20 >>>>> --- >>>>> 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(-) >>>>>=20 >>>>> 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 { >>>>>=20 >>>>> #define IEEE80211_MAX_TX_RETRY=09=0931 >>>>>=20 >>>>> +#define IEEE80211_AIRTIME_TXQ_RM_CHK_INTV_IN_MS 100 >>>>> + >>>>> static inline void ieee80211_rate_set_vht(struct ieee80211_tx_rate >>>>> *rate, >>>>> =09=09=09=09=09 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=20 >>>>> be >>>>> added >>>>> + * to a remove list and get removed later. >>>>> * Returns the next txq if successful, %NULL if no queue is=20 >>>>> 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=20 >>>>> ieee80211_txq_schedule_end(). >>>>> + * Release locks previously acquired by=20 >>>>> ieee80211_txq_schedule_end(). >>>>> Check >>>>> + * and remove the empty txq from rb-tree. >>>>> */ >>>>> void ieee80211_txq_schedule_end(struct ieee80211_hw *hw, u8 ac) >>>>> =09__releases(txq_lock); >>>>> @@ -6287,6 +6291,14 @@ void ieee80211_schedule_txq(struct=20 >>>>> ieee80211_hw >>>>> *hw, struct ieee80211_txq *txq) >>>>> =09__acquires(txq_lock) __releases(txq_lock); >>>>>=20 >>>>> /** >>>>> + * 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 { >>>>> =09struct codel_stats cstats; >>>>> =09struct sk_buff_head frags; >>>>> =09struct rb_node schedule_order; >>>>> +=09struct list_head candidate; >>>>> =09unsigned long flags; >>>>>=20 >>>>> =09/* keep last! */ >>>>> @@ -1145,6 +1146,8 @@ struct ieee80211_local { >>>>> =09u64 airtime_v_t[IEEE80211_NUM_ACS]; >>>>> =09u64 airtime_weight_sum[IEEE80211_NUM_ACS]; >>>>>=20 >>>>> +=09struct list_head remove_list[IEEE80211_NUM_ACS]; >>>>> +=09struct timer_list remove_timer; >>>>> =09u16 airtime_flags; >>>>>=20 >>>>> =09const 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, >>>>>=20 >>>>> =09for (i =3D 0; i < IEEE80211_NUM_ACS; i++) { >>>>> =09=09local->active_txqs[i] =3D RB_ROOT_CACHED; >>>>> +=09=09INIT_LIST_HEAD(&local->remove_list[i]); >>>>> =09=09spin_lock_init(&local->active_txq_lock[i]); >>>>> =09} >>>>> =09local->airtime_flags =3D AIRTIME_USE_TX | AIRTIME_USE_RX; >>>>>=20 >>>>> +=09timer_setup(&local->remove_timer, ieee80211_txqs_check, 0); >>>>> +=09mod_timer(&local->remove_timer, >>>>> +=09=09 jiffies + >>>>> msecs_to_jiffies(IEEE80211_AIRTIME_TXQ_RM_CHK_INTV_IN_MS)); >>>>> + >>>>> =09INIT_LIST_HEAD(&local->chanctx_list); >>>>> =09mutex_init(&local->chanctx_mtx); >>>>>=20 >>>>> @@ -1305,6 +1310,7 @@ void ieee80211_unregister_hw(struct=20 >>>>> ieee80211_hw >>>>> *hw) >>>>> =09tasklet_kill(&local->tx_pending_tasklet); >>>>> =09tasklet_kill(&local->tasklet); >>>>>=20 >>>>> +=09del_timer_sync(&local->remove_timer); >>>>> #ifdef CONFIG_INET >>>>> =09unregister_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, >>>>> =09codel_stats_init(&txqi->cstats); >>>>> =09__skb_queue_head_init(&txqi->frags); >>>>> =09RB_CLEAR_NODE(&txqi->schedule_order); >>>>> +=09INIT_LIST_HEAD(&txqi->candidate); >>>>>=20 >>>>> =09txqi->txq.vif =3D &sdata->vif; >>>>>=20 >>>>> @@ -3724,6 +3725,9 @@ void ieee80211_schedule_txq(struct=20 >>>>> ieee80211_hw >>>>> *hw, >>>>>=20 >>>>> =09spin_lock_bh(&local->active_txq_lock[ac]); >>>>>=20 >>>>> +=09if (!list_empty(&txqi->candidate)) >>>>> +=09=09list_del_init(&txqi->candidate); >>>>> + >>>>> =09if (!RB_EMPTY_NODE(&txqi->schedule_order)) >>>>> =09=09goto out; >>>>>=20 >>>>> @@ -3783,6 +3787,20 @@ static void __ieee80211_unschedule_txq(struct >>>>> ieee80211_hw *hw, >>>>> =09RB_CLEAR_NODE(&txqi->schedule_order); >>>>> } >>>>>=20 >>>>> +void ieee80211_remove_txq(struct ieee80211_hw *hw, >>>>> +=09=09=09 struct ieee80211_txq *txq) >>>>> +{ >>>>> +=09struct ieee80211_local *local =3D hw_to_local(hw); >>>>> +=09struct txq_info *txqi =3D to_txq_info(txq); >>>>> + >>>>> +=09lockdep_assert_held(&local->active_txq_lock[txq->ac]); >>>>> + >>>>> +=09if (!RB_EMPTY_NODE(&txqi->schedule_order)) { >>>>> +=09=09__ieee80211_unschedule_txq(hw, txq); >>>>> +=09=09list_del_init(&txqi->candidate); >>>>> +=09} >>>>> +} >>>>> + >>>>> void ieee80211_unschedule_txq(struct ieee80211_hw *hw, >>>>> =09=09=09 struct ieee80211_txq *txq) >>>>> =09__acquires(txq_lock) __releases(txq_lock) >>>>> @@ -3790,7 +3808,7 @@ void ieee80211_unschedule_txq(struct >>>>> ieee80211_hw *hw, >>>>> =09struct ieee80211_local *local =3D hw_to_local(hw); >>>>>=20 >>>>> =09spin_lock_bh(&local->active_txq_lock[txq->ac]); >>>>> -=09__ieee80211_unschedule_txq(hw, txq); >>>>> +=09ieee80211_remove_txq(hw, txq); >>>>> =09spin_unlock_bh(&local->active_txq_lock[txq->ac]); >>>>> } >>>>>=20 >>>>> @@ -3803,11 +3821,48 @@ void ieee80211_return_txq(struct=20 >>>>> ieee80211_hw >>>>> *hw, >>>>> =09lockdep_assert_held(&local->active_txq_lock[txq->ac]); >>>>>=20 >>>>> =09if (!RB_EMPTY_NODE(&txqi->schedule_order) && >>>>> -=09 (skb_queue_empty(&txqi->frags) && !txqi->tin.backlog_packets)= ) >>>>> -=09=09__ieee80211_unschedule_txq(hw, txq); >>>>> +=09=09!txq_has_queue(&txqi->txq) && >>>>> +=09=09list_empty(&txqi->candidate)) >>>>> +=09=09list_add_tail(&txqi->candidate, &local->remove_list[txq->ac]); >>>>> + >>>>> } >>>>> EXPORT_SYMBOL(ieee80211_return_txq); >>>>>=20 >>>>> +void __ieee80211_check_txqs(struct ieee80211_local *local, int ac) >>>>> +{ >>>>> +=09struct txq_info *iter, *tmp; >>>>> +=09struct sta_info *sta; >>>>> + >>>>> +=09lockdep_assert_held(&local->active_txq_lock[ac]); >>>>> + >>>>> +=09list_for_each_entry_safe(iter, tmp, &local->remove_list[ac], >>>>> +=09=09=09=09 candidate) { >>>>> +=09=09sta =3D container_of(iter->txq.sta, struct sta_info, sta); >>>>> + >>>>> +=09=09if (txq_has_queue(&iter->txq)) >>>>> +=09=09=09list_del_init(&iter->candidate); >>>>> +=09=09else >>>>> +=09=09=09ieee80211_remove_txq(&local->hw, &iter->txq); >>>>> +=09} >>>>> +} >>>>> + >>>>> +void ieee80211_txqs_check(struct timer_list *t) >>>>> +{ >>>>> +=09struct ieee80211_local *local =3D from_timer(local, t,=20 >>>>> remove_timer); >>>>> +=09struct txq_info *iter, *tmp; >>>>> +=09struct sta_info *sta; >>>>> +=09int ac; >>>>> + >>>>> +=09for (ac =3D 0; ac < IEEE80211_NUM_ACS; ac++) { >>>>> +=09=09spin_lock_bh(&local->active_txq_lock[ac]); >>>>> +=09=09__ieee80211_check_txqs(local, ac); >>>>> +=09=09spin_unlock_bh(&local->active_txq_lock[ac]); >>>>> +=09} >>>>> + >>>>> +=09mod_timer(&local->remove_timer, >>>>> +=09=09 jiffies + >>>>> msecs_to_jiffies(IEEE80211_AIRTIME_TXQ_RM_CHK_INTV_IN_MS)); >>>>> +} >>>>=20 >>>> I'll ask the same as I did last time (where you told me to hold off >>>> until this round): >>>>=20 >>>> Why do you need the timer and the periodic check? If TXQs are added=20 >>>> to >>>> the remove list during the scheduling run, and=20 >>>> __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=20 >>> disconnects >>> without any notification. >>=20 >> 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=20 > have 10 stations and only one of them is assigned a very small weight=20 > compared with that of others. Suppose, after its chance of Tx, it is=20 > most likely to be placed in the rightmost(still has some packets in the= =20 > txq) and no more incoming data for it. The remaining packets in txq will= =20 > be dropped due to timeout algo in codel(correct me if I am wrong) but=20 > this empty txq will stay on the rbtree until other txqs get drained or=20 > global vt catch up with its vt. The staying time could be long if weight= =20 > is extremely small. Then do we need timer to check or any other better=20 > 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. 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. [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? >>=20 >> Hmm, or maybe a simpler way to fix the original issue is just to have >> unschedule_txq() update the schedule_pos() pointer? >>=20 >> 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=20 >> to >> be the rb_next of the current value? > Actually, if schedule_pos is updated to rb_next of the current value,=20 > then in the next_txq() where we are going to use rb_next again and=20 > finally pick the next node of the node we really want. Is it fine to=20 > 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. 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] =3D rb_next(node) ?: rb_prev(node); -Toke