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=-8.3 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,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 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 13E00C83003 for ; Wed, 29 Apr 2020 08:32:29 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A87E92076B for ; Wed, 29 Apr 2020 08:32:28 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="Sy8IBUdI" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726571AbgD2Ic1 (ORCPT ); Wed, 29 Apr 2020 04:32:27 -0400 Received: from mailgw02.mediatek.com ([210.61.82.184]:29023 "EHLO mailgw02.mediatek.com" rhost-flags-OK-FAIL-OK-FAIL) by vger.kernel.org with ESMTP id S1726345AbgD2Ic0 (ORCPT ); Wed, 29 Apr 2020 04:32:26 -0400 X-UUID: 7bd81211549d4ad6bda80469a11c9f7b-20200429 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=qJ1jy0qwf8Wq7qUy2up8n3de2D1QB6639h3RiG9ughQ=; b=Sy8IBUdI8omBmaONAabU7sghSCSECupNW49LapwlqWbG8yG+QUJGhV5H7/DVh2ndYfJnd3Z1tAP2QUTE8QrPbafYEJBeLkkUIBfNToass6y+dxDlVotTinG/tKQJ3asI9HvvUUCGYgGD7TKeX4TrZ9FFNLOmGD7tx69cNee6XXU=; X-UUID: 7bd81211549d4ad6bda80469a11c9f7b-20200429 Received: from mtkcas06.mediatek.inc [(172.21.101.30)] by mailgw02.mediatek.com (envelope-from ) (Cellopoint E-mail Firewall v4.1.10 Build 0809 with TLS) with ESMTP id 706939796; Wed, 29 Apr 2020 16:32:12 +0800 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs01n2.mediatek.inc (172.21.101.79) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 29 Apr 2020 16:32:08 +0800 Received: from [172.21.77.33] (172.21.77.33) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 29 Apr 2020 16:32:08 +0800 Message-ID: <1588149130.25566.7.camel@mtkswgap22> Subject: Re: [PATCH v2 1/1] binder: transaction latency tracking for user build From: Frankie Chang To: Todd Kjos CC: Joel Fernandes , Greg Kroah-Hartman , Todd Kjos , Martijn Coenen , Arve =?ISO-8859-1?Q?Hj=F8nnev=E5g?= , Christian Brauner , LKML , , wsd_upstream , Jian-Min Liu Date: Wed, 29 Apr 2020 16:32:10 +0800 In-Reply-To: References: <1586759071.9539.15.camel@mtkswgap22> <1586929044-12708-1-git-send-email-Frankie.Chang@mediatek.com> <1586929044-12708-2-git-send-email-Frankie.Chang@mediatek.com> Content-Type: text/plain; charset="UTF-8" X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-TM-SNTS-SMTP: 830316AF110234D77DF04E692EDA7246F6C3B3D407834B4A1439CFE005E961772000:8 X-MTK: N Content-Transfer-Encoding: base64 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org T24gV2VkLCAyMDIwLTA0LTE1IGF0IDE1OjI1IC0wNzAwLCBUb2RkIEtqb3Mgd3JvdGU6DQo+IE9u IFR1ZSwgQXByIDE0LCAyMDIwIGF0IDEwOjM4IFBNIEZyYW5raWUgQ2hhbmcNCj4gPEZyYW5raWUu Q2hhbmdAbWVkaWF0ZWsuY29tPiB3cm90ZToNCj4gPg0KPiA+IFJlY29yZCBzdGFydC9lbmQgdGlt ZXN0YW1wIHRvIGJpbmRlciB0cmFuc2FjdGlvbi4NCj4gDQo+IHMvdGltZXN0YW1wIHRvL3RpbWVz dGFtcHMgZm9yLw0KPiANCj4gPiBXaGVuIHRyYW5zYWN0aW9uIGlzIGNvbXBsZXRlZCBvciB0cmFu c2FjdGlvbiBpcyBmcmVlLA0KPiA+IGl0IHdvdWxkIGJlIGNoZWNrZWQgaWYgdHJhbnNhY3Rpb24g bGF0ZW5jeSBvdmVyIHRocmVzaG9sZCAoMiBzZWMpLA0KPiANCj4gSXMgdGhlIDIgc2VjIGNvbmZp Z3VyYWJsZT8gV2h5IHdhcyAyIHNlYyBjaG9zZW4/DQoNClNvbWUgb2YgbW9kdWxlcyB3b3VsZCB0 cmlnZ2VyIHRpbWVvdXQgTkUgaWYgdGhlaXIgYmluZGVyIHRyYW5zYWN0aW9uDQpkb24ndCBmaW5p c2ggaW4gdGltZSwgc3VjaCBhcyBhdWRpbyB0aW1lb3V0ICg1IHNlYyksIGV2ZW4gQlQgY29tbWFu ZA0KdGltZW91dCAoMiBzZWMpLCBldGMuDQoNClRoZXJlZm9yZSwgd2Ugd2FudCB0byByZWNvcmQg dGhlc2UgdHJhbnNhY3Rpb25zIHdoaWNoIGV4Y2VlZCAyIHNlYy4gSXQNCmNvdWxkIGJlIGhlbHBm dWwgdG8gZGVidWcuDQoNCj4gPiBpZiB5ZXMsIHByaW50aW5nIHJlbGF0ZWQgaW5mb3JtYXRpb24g Zm9yIHRyYWNpbmcuDQo+ID4NCj4gPiAvKiBJbXBsZW1lbnQgZGV0YWlscyAqLw0KPiA+IC0gQWRk IHRyYWNlcG9pbnQvdHJhY2UgYXQgZnJlZSB0cmFuc2FjdGlvbi4NCj4gPiAgIFNpbmNlIHRoZSBv cmlnaW5hbCB0cmFjZV9iaW5kZXJfdHJhbnNhY3Rpb25fcmV2ZWl2ZWQgY2Fubm90DQo+IA0KPiBz L3JldmVpdmVkL3JlY2VpdmVkLw0KPiANCj4gPiAgIHByZWNpc2VseSBwcmVzZW50IHRoZSByZWFs IGZpbmlzaGVkIHRpbWUgb2YgdHJhbnNhY3Rpb24sIGFkZGluZyBhDQo+ID4gICB0cmFjZV9iaW5k ZXJfZnJlZV90cmFuc2FjdGlvbiBhdCB0aGUgcG9pbnQgb2YgZnJlZSB0cmFuc2FjdGlvbg0KPiA+ ICAgbWF5IGJlIG1vcmUgY2xvc2UgdG8gaXQuDQo+IA0KPiBDYW4gd2UganVzdCBhZGQgdGhhdCB0 cmFjZSBpbnN0ZWFkPw0KDQpUaW1lIGxpbWl0YXRpb24gb2YgcmVjb3JkaW5nIGlzIHRoZSByZWFz b24gd2h5IHdlIGRvbid0IGp1c3QgdXNlIHRyYWNlDQpoZXJlLg0KDQpJbiBzb21lIGxvbmcgdGlt ZSBzdGFiaWxpdHkgdGVzdCwgc3VjaCBhcyBNVEJGLA0KdGhlIGV4Y2VwdGlvbiBpcyBjYXVzZWQg YnkgYSBzZXJpZXMgb2YgdHJhbnNhY3Rpb25zIGludGVyYWN0aW9uLg0KU29tZSBhYm5vcm1hbCB0 cmFuc2FjdGlvbnMgbWF5IGJlIHBlbmRpbmcgZm9yIGEgbG9uZyB0aW1lIGFnbywgdGhleSANCmNv dWxkIG5vdCBiZSByZWNvcmRlZCBkdWUgdG8gYnVmZmVyIGxpbWl0ZWQuIA0KDQo+ID4NCj4gPiAt IEFkZCBsYXRlbmN5IHRyYWNlciBtb2R1bGUgdG8gbW9uaXRvciBzbG93IHRyYW5zYWN0aW9uLg0K PiA+ICAgVGhlIHRyYWNlX2JpbmRlcl9mcmVlX3RyYW5zYWN0aW9uIHdvdWxkIG5vdCBiZSBlbmFi bGVkDQo+ID4gICBieSBkZWZhdWx0LiBNb25pdG9yaW5nIHdoaWNoIHRyYW5zYWN0aW9uIGlzIHRv byBzbG93IHRvDQo+ID4gICBjYXVzZSBzb21lIG9mIGV4Y2VwdGlvbnMgaXMgaW1wb3J0YW50LiBT byB3ZSBob29rIHRoZQ0KPiA+ICAgdHJhY2Vwb2ludCB0byBjYWxsIHRoZSBtb25pdG9yIGZ1bmN0 aW9uLg0KPiA+DQo+ID4gLSBNb3ZlIHNvbWUgc3RydWN0IGZyb20gY29yZSBmaWxlIHRvIGhlYWRl ciBmaWxlLg0KPiA+ICAgTmVlZCBzb21lIHN0cnVjdCBkZWZpbmVkIGluIGNvcmUgZmlsZSBpbiBs YXRlbmN5IHRyYWNlIG1vZHVsZQ0KPiA+ICAgSW4gYWRkaXRpb24sIG1vdmluZyBzdHJ1Y3RzIHRv IGhlYWRlciBmaWxlIG1ha2VzIG1vZHVsZSBtb3JlDQo+ID4gICBleHRlbmRhYmxlLg0KPiA+DQo+ ID4gU2lnbmVkLW9mZi1ieTogRnJhbmtpZSBDaGFuZyA8RnJhbmtpZS5DaGFuZ0BtZWRpYXRlay5j b20+DQo+ID4gLS0tDQo+ID4gIGRyaXZlcnMvYW5kcm9pZC9LY29uZmlnICAgICAgICAgICAgICAg ICB8ICAgIDggKysNCj4gPiAgZHJpdmVycy9hbmRyb2lkL01ha2VmaWxlICAgICAgICAgICAgICAg IHwgICAgMSArDQo+ID4gIGRyaXZlcnMvYW5kcm9pZC9iaW5kZXIuYyAgICAgICAgICAgICAgICB8 ICAyMzcgKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQ0KPiA+ICBkcml2ZXJzL2FuZHJv aWQvYmluZGVyX2ludGVybmFsLmggICAgICAgfCAgMjI3ICsrKysrKysrKysrKysrKysrKysrKysr KysrKysrDQo+ID4gIGRyaXZlcnMvYW5kcm9pZC9iaW5kZXJfbGF0ZW5jeV90cmFjZXIuYyB8ICAx MDAgKysrKysrKysrKysrKw0KPiA+ICBkcml2ZXJzL2FuZHJvaWQvYmluZGVyX3RyYWNlLmggICAg ICAgICAgfCAgIDM2ICsrKysrDQo+ID4gIDYgZmlsZXMgY2hhbmdlZCwgNDAwIGluc2VydGlvbnMo KyksIDIwOSBkZWxldGlvbnMoLSkNCj4gPiAgY3JlYXRlIG1vZGUgMTAwNjQ0IGRyaXZlcnMvYW5k cm9pZC9iaW5kZXJfbGF0ZW5jeV90cmFjZXIuYw0KPiA+DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZl cnMvYW5kcm9pZC9LY29uZmlnIGIvZHJpdmVycy9hbmRyb2lkL0tjb25maWcNCj4gPiBpbmRleCA2 ZmRmMmFiLi43YmE4MGViIDEwMDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvYW5kcm9pZC9LY29uZmln DQo+ID4gKysrIGIvZHJpdmVycy9hbmRyb2lkL0tjb25maWcNCj4gPiBAQCAtNTQsNiArNTQsMTQg QEAgY29uZmlnIEFORFJPSURfQklOREVSX0lQQ19TRUxGVEVTVA0KPiA+ICAgICAgICAgICBleGhh dXN0aXZlbHkgd2l0aCBjb21iaW5hdGlvbnMgb2YgdmFyaW91cyBidWZmZXIgc2l6ZXMgYW5kDQo+ ID4gICAgICAgICAgIGFsaWdubWVudHMuDQo+ID4NCj4gPiArY29uZmlnIEJJTkRFUl9VU0VSX1RS QUNLSU5HDQo+ID4gKyAgICAgICBib29sICJBbmRyb2lkIEJpbmRlciB0cmFuc2FjdGlvbiB0cmFj a2luZyINCj4gPiArICAgICAgIGhlbHANCj4gPiArICAgICAgICAgVXNlZCBmb3IgdHJhY2sgYWJu b3JtYWwgYmluZGVyIHRyYW5zYWN0aW9uIHdoaWNoIGlzIG92ZXIgMiBzZWNvbmRzLA0KPiA+ICsg ICAgICAgICB3aGVuIHRoZSB0cmFuc2FjdGlvbiBpcyBkb25lIG9yIGJlIGZyZWUsIHRoaXMgdHJh bnNhY3Rpb24gd291bGQgYmUNCj4gPiArICAgICAgICAgY2hlY2tlZCB3aGV0aGVyIGl0IGV4ZWN1 dGVkIG92ZXJ0aW1lLg0KPiA+ICsgICAgICAgICBJZiB5ZXMsIHByaW50aW5nIG91dCB0aGUgZGV0 YWlsIGluZm8gYWJvdXQgaXQuDQo+ID4gKw0KPiA+ICBlbmRpZiAjIGlmIEFORFJPSUQNCj4gPg0K PiA+ICBlbmRtZW51DQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW5kcm9pZC9NYWtlZmlsZSBi L2RyaXZlcnMvYW5kcm9pZC9NYWtlZmlsZQ0KPiA+IGluZGV4IGM5ZDNkMGM5Li41NTJlOGFjIDEw MDY0NA0KPiA+IC0tLSBhL2RyaXZlcnMvYW5kcm9pZC9NYWtlZmlsZQ0KPiA+ICsrKyBiL2RyaXZl cnMvYW5kcm9pZC9NYWtlZmlsZQ0KPiA+IEBAIC00LDMgKzQsNCBAQCBjY2ZsYWdzLXkgKz0gLUkk KHNyYykgICAgICAgICAgICAgICAgICAgIyBuZWVkZWQgZm9yIHRyYWNlIGV2ZW50cw0KPiA+ICBv YmotJChDT05GSUdfQU5EUk9JRF9CSU5ERVJGUykgICAgICAgICArPSBiaW5kZXJmcy5vDQo+ID4g IG9iai0kKENPTkZJR19BTkRST0lEX0JJTkRFUl9JUEMpICAgICAgICs9IGJpbmRlci5vIGJpbmRl cl9hbGxvYy5vDQo+ID4gIG9iai0kKENPTkZJR19BTkRST0lEX0JJTkRFUl9JUENfU0VMRlRFU1Qp ICs9IGJpbmRlcl9hbGxvY19zZWxmdGVzdC5vDQo+ID4gK29iai0kKENPTkZJR19CSU5ERVJfVVNF Ul9UUkFDS0lORykgICAgICs9IGJpbmRlcl9sYXRlbmN5X3RyYWNlci5vDQo+ID4gZGlmZiAtLWdp dCBhL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXIuYyBiL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXIuYw0K PiA+IGluZGV4IGE2YjIwODIuLjM4MGE2OGIgMTAwNjQ0DQo+ID4gLS0tIGEvZHJpdmVycy9hbmRy b2lkL2JpbmRlci5jDQo+ID4gKysrIGIvZHJpdmVycy9hbmRyb2lkL2JpbmRlci5jDQo+ID4gQEAg LTE2MCwyNCArMTYwLDYgQEAgc3RhdGljIGludCBiaW5kZXJfc2V0X3N0b3Bfb25fdXNlcl9lcnJv cihjb25zdCBjaGFyICp2YWwsDQo+ID4gICNkZWZpbmUgdG9fYmluZGVyX2ZkX2FycmF5X29iamVj dChoZHIpIFwNCj4gPiAgICAgICAgIGNvbnRhaW5lcl9vZihoZHIsIHN0cnVjdCBiaW5kZXJfZmRf YXJyYXlfb2JqZWN0LCBoZHIpDQo+ID4NCj4gPiAtZW51bSBiaW5kZXJfc3RhdF90eXBlcyB7DQo+ ID4gLSAgICAgICBCSU5ERVJfU1RBVF9QUk9DLA0KPiA+IC0gICAgICAgQklOREVSX1NUQVRfVEhS RUFELA0KPiA+IC0gICAgICAgQklOREVSX1NUQVRfTk9ERSwNCj4gPiAtICAgICAgIEJJTkRFUl9T VEFUX1JFRiwNCj4gPiAtICAgICAgIEJJTkRFUl9TVEFUX0RFQVRILA0KPiA+IC0gICAgICAgQklO REVSX1NUQVRfVFJBTlNBQ1RJT04sDQo+ID4gLSAgICAgICBCSU5ERVJfU1RBVF9UUkFOU0FDVElP Tl9DT01QTEVURSwNCj4gPiAtICAgICAgIEJJTkRFUl9TVEFUX0NPVU5UDQo+ID4gLX07DQo+ID4g LQ0KPiA+IC1zdHJ1Y3QgYmluZGVyX3N0YXRzIHsNCj4gPiAtICAgICAgIGF0b21pY190IGJyW19J T0NfTlIoQlJfRkFJTEVEX1JFUExZKSArIDFdOw0KPiA+IC0gICAgICAgYXRvbWljX3QgYmNbX0lP Q19OUihCQ19SRVBMWV9TRykgKyAxXTsNCj4gPiAtICAgICAgIGF0b21pY190IG9ial9jcmVhdGVk W0JJTkRFUl9TVEFUX0NPVU5UXTsNCj4gPiAtICAgICAgIGF0b21pY190IG9ial9kZWxldGVkW0JJ TkRFUl9TVEFUX0NPVU5UXTsNCj4gPiAtfTsNCj4gPiAtDQo+ID4gIHN0YXRpYyBzdHJ1Y3QgYmlu ZGVyX3N0YXRzIGJpbmRlcl9zdGF0czsNCj4gPg0KPiA+ICBzdGF0aWMgaW5saW5lIHZvaWQgYmlu ZGVyX3N0YXRzX2RlbGV0ZWQoZW51bSBiaW5kZXJfc3RhdF90eXBlcyB0eXBlKQ0KPiA+IEBAIC0y MTQsMzIgKzE5Niw2IEBAIHN0YXRpYyBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRy eSAqYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19hZGQoDQo+ID4gIH0NCj4gPg0KPiA+ICAvKioNCj4g PiAtICogc3RydWN0IGJpbmRlcl93b3JrIC0gd29yayBlbnF1ZXVlZCBvbiBhIHdvcmtsaXN0DQo+ ID4gLSAqIEBlbnRyeTogICAgICAgICAgICAgbm9kZSBlbnF1ZXVlZCBvbiBsaXN0DQo+ID4gLSAq IEB0eXBlOiAgICAgICAgICAgICAgdHlwZSBvZiB3b3JrIHRvIGJlIHBlcmZvcm1lZA0KPiA+IC0g Kg0KPiA+IC0gKiBUaGVyZSBhcmUgc2VwYXJhdGUgd29yayBsaXN0cyBmb3IgcHJvYywgdGhyZWFk LCBhbmQgbm9kZSAoYXN5bmMpLg0KPiA+IC0gKi8NCj4gPiAtc3RydWN0IGJpbmRlcl93b3JrIHsN Cj4gPiAtICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZW50cnk7DQo+ID4gLQ0KPiA+IC0gICAgICAg ZW51bSB7DQo+ID4gLSAgICAgICAgICAgICAgIEJJTkRFUl9XT1JLX1RSQU5TQUNUSU9OID0gMSwN Cj4gPiAtICAgICAgICAgICAgICAgQklOREVSX1dPUktfVFJBTlNBQ1RJT05fQ09NUExFVEUsDQo+ ID4gLSAgICAgICAgICAgICAgIEJJTkRFUl9XT1JLX1JFVFVSTl9FUlJPUiwNCj4gPiAtICAgICAg ICAgICAgICAgQklOREVSX1dPUktfTk9ERSwNCj4gPiAtICAgICAgICAgICAgICAgQklOREVSX1dP UktfREVBRF9CSU5ERVIsDQo+ID4gLSAgICAgICAgICAgICAgIEJJTkRFUl9XT1JLX0RFQURfQklO REVSX0FORF9DTEVBUiwNCj4gPiAtICAgICAgICAgICAgICAgQklOREVSX1dPUktfQ0xFQVJfREVB VEhfTk9USUZJQ0FUSU9OLA0KPiA+IC0gICAgICAgfSB0eXBlOw0KPiA+IC19Ow0KPiA+IC0NCj4g PiAtc3RydWN0IGJpbmRlcl9lcnJvciB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgYmluZGVyX3dvcmsg d29yazsNCj4gPiAtICAgICAgIHVpbnQzMl90IGNtZDsNCj4gPiAtfTsNCj4gPiAtDQo+ID4gLS8q Kg0KPiA+ICAgKiBzdHJ1Y3QgYmluZGVyX25vZGUgLSBiaW5kZXIgbm9kZSBib29ra2VlcGluZw0K PiA+ICAgKiBAZGVidWdfaWQ6ICAgICAgICAgICAgIHVuaXF1ZSBJRCBmb3IgZGVidWdnaW5nDQo+ ID4gICAqICAgICAgICAgICAgICAgICAgICAgICAgKGludmFyaWFudCBhZnRlciBpbml0aWFsaXpl ZCkNCj4gDQo+IFBsZWFzZSwgaWYgd2UgbXVzdCBoYXZlIGEgYmluZGVyX2ludGVybmFsLmggZm9y IHRoZSBrZXkgZGF0YQ0KPiBzdHJ1Y3R1cmVzLCB0aGVuIG1vdmUgdGhlbSBhbGwuDQo+IFRoZSB1 c2Ugb2Ygc3RydWN0cyBieSB0cmFuc2FjdGlvbiBsYXRlbmN5IHN0dWZmIHNob3VsZG4ndCBiZSB0 aGUNCj4gcmF0aW9uYWxlIGZvciB3aGF0IG1vdmVzIGFuZA0KPiB3aGF0IHN0YXlzLiBiaW5kZXJf cHJvYywgYmluZGVyX25vZGUsIGJpbmRlcl90aHJlYWQgZXRjIHNob3VsZCBiZSBkZWZpbmVkDQo+ IGluIHRoZSBzYW1lIGZpbGUuDQoNCk9rYXksIHdlIHdpbGwgbW92ZSBhbGwgc3RydWN0cyB0byBi aW5kZXJfaW50ZXJuYWwuaCB0byBtYWtlIHRoZW0gZGVmaW5lZCBpbiBzYW1lIGZpbGUsIHRoYW5r cy4NCg0KPiA+IEBAIC00MDIsODkgKzM1OCw2IEBAIGVudW0gYmluZGVyX2RlZmVycmVkX3N0YXRl IHsNCj4gPiAgICAgICAgIEJJTkRFUl9ERUZFUlJFRF9SRUxFQVNFICAgICAgPSAweDAyLA0KPiA+ ICB9Ow0KPiA+DQo+ID4gLS8qKg0KPiA+IC0gKiBzdHJ1Y3QgYmluZGVyX3Byb2MgLSBiaW5kZXIg cHJvY2VzcyBib29ra2VlcGluZw0KPiA+IC0gKiBAcHJvY19ub2RlOiAgICAgICAgICAgIGVsZW1l bnQgZm9yIGJpbmRlcl9wcm9jcyBsaXN0DQo+ID4gLSAqIEB0aHJlYWRzOiAgICAgICAgICAgICAg cmJ0cmVlIG9mIGJpbmRlcl90aHJlYWRzIGluIHRoaXMgcHJvYw0KPiA+IC0gKiAgICAgICAgICAg ICAgICAgICAgICAgIChwcm90ZWN0ZWQgYnkgQGlubmVyX2xvY2spDQo+ID4gLSAqIEBub2Rlczog ICAgICAgICAgICAgICAgcmJ0cmVlIG9mIGJpbmRlciBub2RlcyBhc3NvY2lhdGVkIHdpdGgNCj4g PiAtICogICAgICAgICAgICAgICAgICAgICAgICB0aGlzIHByb2Mgb3JkZXJlZCBieSBub2RlLT5w dHINCj4gPiAtICogICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBpbm5lcl9s b2NrKQ0KPiA+IC0gKiBAcmVmc19ieV9kZXNjOiAgICAgICAgIHJidHJlZSBvZiByZWZzIG9yZGVy ZWQgYnkgcmVmLT5kZXNjDQo+ID4gLSAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3Rl ZCBieSBAb3V0ZXJfbG9jaykNCj4gPiAtICogQHJlZnNfYnlfbm9kZTogICAgICAgICByYnRyZWUg b2YgcmVmcyBvcmRlcmVkIGJ5IHJlZi0+bm9kZQ0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAg ICAgIChwcm90ZWN0ZWQgYnkgQG91dGVyX2xvY2spDQo+ID4gLSAqIEB3YWl0aW5nX3RocmVhZHM6 ICAgICAgdGhyZWFkcyBjdXJyZW50bHkgd2FpdGluZyBmb3IgcHJvYyB3b3JrDQo+ID4gLSAqICAg ICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAaW5uZXJfbG9jaykNCj4gPiAtICog QHBpZCAgICAgICAgICAgICAgICAgICBQSUQgb2YgZ3JvdXBfbGVhZGVyIG9mIHByb2Nlc3MNCj4g PiAtICogICAgICAgICAgICAgICAgICAgICAgICAoaW52YXJpYW50IGFmdGVyIGluaXRpYWxpemVk KQ0KPiA+IC0gKiBAdHNrICAgICAgICAgICAgICAgICAgIHRhc2tfc3RydWN0IGZvciBncm91cF9s ZWFkZXIgb2YgcHJvY2Vzcw0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAgICAgIChpbnZhcmlh bnQgYWZ0ZXIgaW5pdGlhbGl6ZWQpDQo+ID4gLSAqIEBkZWZlcnJlZF93b3JrX25vZGU6ICAgZWxl bWVudCBmb3IgYmluZGVyX2RlZmVycmVkX2xpc3QNCj4gPiAtICogICAgICAgICAgICAgICAgICAg ICAgICAocHJvdGVjdGVkIGJ5IGJpbmRlcl9kZWZlcnJlZF9sb2NrKQ0KPiA+IC0gKiBAZGVmZXJy ZWRfd29yazogICAgICAgIGJpdG1hcCBvZiBkZWZlcnJlZCB3b3JrIHRvIHBlcmZvcm0NCj4gPiAt ICogICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IGJpbmRlcl9kZWZlcnJlZF9s b2NrKQ0KPiA+IC0gKiBAaXNfZGVhZDogICAgICAgICAgICAgIHByb2Nlc3MgaXMgZGVhZCBhbmQg YXdhaXRpbmcgZnJlZQ0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAgICAgIHdoZW4gb3V0c3Rh bmRpbmcgdHJhbnNhY3Rpb25zIGFyZSBjbGVhbmVkIHVwDQo+ID4gLSAqICAgICAgICAgICAgICAg ICAgICAgICAgKHByb3RlY3RlZCBieSBAaW5uZXJfbG9jaykNCj4gPiAtICogQHRvZG86ICAgICAg ICAgICAgICAgICBsaXN0IG9mIHdvcmsgZm9yIHRoaXMgcHJvY2Vzcw0KPiA+IC0gKiAgICAgICAg ICAgICAgICAgICAgICAgIChwcm90ZWN0ZWQgYnkgQGlubmVyX2xvY2spDQo+ID4gLSAqIEBzdGF0 czogICAgICAgICAgICAgICAgcGVyLXByb2Nlc3MgYmluZGVyIHN0YXRpc3RpY3MNCj4gPiAtICog ICAgICAgICAgICAgICAgICAgICAgICAoYXRvbWljcywgbm8gbG9jayBuZWVkZWQpDQo+ID4gLSAq IEBkZWxpdmVyZWRfZGVhdGg6ICAgICAgbGlzdCBvZiBkZWxpdmVyZWQgZGVhdGggbm90aWZpY2F0 aW9uDQo+ID4gLSAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAaW5uZXJf bG9jaykNCj4gPiAtICogQG1heF90aHJlYWRzOiAgICAgICAgICBjYXAgb24gbnVtYmVyIG9mIGJp bmRlciB0aHJlYWRzDQo+ID4gLSAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBi eSBAaW5uZXJfbG9jaykNCj4gPiAtICogQHJlcXVlc3RlZF90aHJlYWRzOiAgICBudW1iZXIgb2Yg YmluZGVyIHRocmVhZHMgcmVxdWVzdGVkIGJ1dCBub3QNCj4gPiAtICogICAgICAgICAgICAgICAg ICAgICAgICB5ZXQgc3RhcnRlZC4gSW4gY3VycmVudCBpbXBsZW1lbnRhdGlvbiwgY2FuDQo+ID4g LSAqICAgICAgICAgICAgICAgICAgICAgICAgb25seSBiZSAwIG9yIDEuDQo+ID4gLSAqICAgICAg ICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAaW5uZXJfbG9jaykNCj4gPiAtICogQHJl cXVlc3RlZF90aHJlYWRzX3N0YXJ0ZWQ6IG51bWJlciBiaW5kZXIgdGhyZWFkcyBzdGFydGVkDQo+ ID4gLSAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAaW5uZXJfbG9jaykN Cj4gPiAtICogQHRtcF9yZWY6ICAgICAgICAgICAgICB0ZW1wb3JhcnkgcmVmZXJlbmNlIHRvIGlu ZGljYXRlIHByb2MgaXMgaW4gdXNlDQo+ID4gLSAqICAgICAgICAgICAgICAgICAgICAgICAgKHBy b3RlY3RlZCBieSBAaW5uZXJfbG9jaykNCj4gPiAtICogQGRlZmF1bHRfcHJpb3JpdHk6ICAgICBk ZWZhdWx0IHNjaGVkdWxlciBwcmlvcml0eQ0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAgICAg IChpbnZhcmlhbnQgYWZ0ZXIgaW5pdGlhbGl6ZWQpDQo+ID4gLSAqIEBkZWJ1Z2ZzX2VudHJ5OiAg ICAgICAgZGVidWdmcyBub2RlDQo+ID4gLSAqIEBhbGxvYzogICAgICAgICAgICAgICAgYmluZGVy IGFsbG9jYXRvciBib29ra2VlcGluZw0KPiA+IC0gKiBAY29udGV4dDogICAgICAgICAgICAgIGJp bmRlcl9jb250ZXh0IGZvciB0aGlzIHByb2MNCj4gPiAtICogICAgICAgICAgICAgICAgICAgICAg ICAoaW52YXJpYW50IGFmdGVyIGluaXRpYWxpemVkKQ0KPiA+IC0gKiBAaW5uZXJfbG9jazogICAg ICAgICAgIGNhbiBuZXN0IHVuZGVyIG91dGVyX2xvY2sgYW5kL29yIG5vZGUgbG9jaw0KPiA+IC0g KiBAb3V0ZXJfbG9jazogICAgICAgICAgIG5vIG5lc3RpbmcgdW5kZXIgaW5ub3Igb3Igbm9kZSBs b2NrDQo+ID4gLSAqICAgICAgICAgICAgICAgICAgICAgICAgTG9jayBvcmRlcjogMSkgb3V0ZXIs IDIpIG5vZGUsIDMpIGlubmVyDQo+ID4gLSAqIEBiaW5kZXJmc19lbnRyeTogICAgICAgcHJvY2Vz cy1zcGVjaWZpYyBiaW5kZXJmcyBsb2cgZmlsZQ0KPiA+IC0gKg0KPiA+IC0gKiBCb29ra2VlcGlu ZyBzdHJ1Y3R1cmUgZm9yIGJpbmRlciBwcm9jZXNzZXMNCj4gPiAtICovDQo+ID4gLXN0cnVjdCBi aW5kZXJfcHJvYyB7DQo+ID4gLSAgICAgICBzdHJ1Y3QgaGxpc3Rfbm9kZSBwcm9jX25vZGU7DQo+ ID4gLSAgICAgICBzdHJ1Y3QgcmJfcm9vdCB0aHJlYWRzOw0KPiA+IC0gICAgICAgc3RydWN0IHJi X3Jvb3Qgbm9kZXM7DQo+ID4gLSAgICAgICBzdHJ1Y3QgcmJfcm9vdCByZWZzX2J5X2Rlc2M7DQo+ ID4gLSAgICAgICBzdHJ1Y3QgcmJfcm9vdCByZWZzX2J5X25vZGU7DQo+ID4gLSAgICAgICBzdHJ1 Y3QgbGlzdF9oZWFkIHdhaXRpbmdfdGhyZWFkczsNCj4gPiAtICAgICAgIGludCBwaWQ7DQo+ID4g LSAgICAgICBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnRzazsNCj4gPiAtICAgICAgIHN0cnVjdCBobGlz dF9ub2RlIGRlZmVycmVkX3dvcmtfbm9kZTsNCj4gPiAtICAgICAgIGludCBkZWZlcnJlZF93b3Jr Ow0KPiA+IC0gICAgICAgYm9vbCBpc19kZWFkOw0KPiA+IC0NCj4gPiAtICAgICAgIHN0cnVjdCBs aXN0X2hlYWQgdG9kbzsNCj4gPiAtICAgICAgIHN0cnVjdCBiaW5kZXJfc3RhdHMgc3RhdHM7DQo+ ID4gLSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIGRlbGl2ZXJlZF9kZWF0aDsNCj4gPiAtICAgICAg IGludCBtYXhfdGhyZWFkczsNCj4gPiAtICAgICAgIGludCByZXF1ZXN0ZWRfdGhyZWFkczsNCj4g PiAtICAgICAgIGludCByZXF1ZXN0ZWRfdGhyZWFkc19zdGFydGVkOw0KPiA+IC0gICAgICAgaW50 IHRtcF9yZWY7DQo+ID4gLSAgICAgICBsb25nIGRlZmF1bHRfcHJpb3JpdHk7DQo+ID4gLSAgICAg ICBzdHJ1Y3QgZGVudHJ5ICpkZWJ1Z2ZzX2VudHJ5Ow0KPiA+IC0gICAgICAgc3RydWN0IGJpbmRl cl9hbGxvYyBhbGxvYzsNCj4gPiAtICAgICAgIHN0cnVjdCBiaW5kZXJfY29udGV4dCAqY29udGV4 dDsNCj4gPiAtICAgICAgIHNwaW5sb2NrX3QgaW5uZXJfbG9jazsNCj4gPiAtICAgICAgIHNwaW5s b2NrX3Qgb3V0ZXJfbG9jazsNCj4gPiAtICAgICAgIHN0cnVjdCBkZW50cnkgKmJpbmRlcmZzX2Vu dHJ5Ow0KPiA+IC19Ow0KPiA+IC0NCj4gPiAgZW51bSB7DQo+ID4gICAgICAgICBCSU5ERVJfTE9P UEVSX1NUQVRFX1JFR0lTVEVSRUQgID0gMHgwMSwNCj4gPiAgICAgICAgIEJJTkRFUl9MT09QRVJf U1RBVEVfRU5URVJFRCAgICAgPSAweDAyLA0KPiA+IEBAIC00OTUsNjAgKzM2OCw2IEBAIGVudW0g ew0KPiA+ICB9Ow0KPiA+DQo+ID4gIC8qKg0KPiA+IC0gKiBzdHJ1Y3QgYmluZGVyX3RocmVhZCAt IGJpbmRlciB0aHJlYWQgYm9va2tlZXBpbmcNCj4gPiAtICogQHByb2M6ICAgICAgICAgICAgICAg ICBiaW5kZXIgcHJvY2VzcyBmb3IgdGhpcyB0aHJlYWQNCj4gPiAtICogICAgICAgICAgICAgICAg ICAgICAgICAoaW52YXJpYW50IGFmdGVyIGluaXRpYWxpemF0aW9uKQ0KPiA+IC0gKiBAcmJfbm9k ZTogICAgICAgICAgICAgIGVsZW1lbnQgZm9yIHByb2MtPnRocmVhZHMgcmJ0cmVlDQo+ID4gLSAq ICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAcHJvYy0+aW5uZXJfbG9jaykN Cj4gPiAtICogQHdhaXRpbmdfdGhyZWFkX25vZGU6ICBlbGVtZW50IGZvciBAcHJvYy0+d2FpdGlu Z190aHJlYWRzIGxpc3QNCj4gPiAtICogICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVk IGJ5IEBwcm9jLT5pbm5lcl9sb2NrKQ0KPiA+IC0gKiBAcGlkOiAgICAgICAgICAgICAgICAgIFBJ RCBmb3IgdGhpcyB0aHJlYWQNCj4gPiAtICogICAgICAgICAgICAgICAgICAgICAgICAoaW52YXJp YW50IGFmdGVyIGluaXRpYWxpemF0aW9uKQ0KPiA+IC0gKiBAbG9vcGVyOiAgICAgICAgICAgICAg IGJpdG1hcCBvZiBsb29waW5nIHN0YXRlDQo+ID4gLSAqICAgICAgICAgICAgICAgICAgICAgICAg KG9ubHkgYWNjZXNzZWQgYnkgdGhpcyB0aHJlYWQpDQo+ID4gLSAqIEBsb29wZXJfbmVlZHNfcmV0 dXJuOiAgbG9vcGluZyB0aHJlYWQgbmVlZHMgdG8gZXhpdCBkcml2ZXINCj4gPiAtICogICAgICAg ICAgICAgICAgICAgICAgICAobm8gbG9jayBuZWVkZWQpDQo+ID4gLSAqIEB0cmFuc2FjdGlvbl9z dGFjazogICAgc3RhY2sgb2YgaW4tcHJvZ3Jlc3MgdHJhbnNhY3Rpb25zIGZvciB0aGlzIHRocmVh ZA0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAgICAgIChwcm90ZWN0ZWQgYnkgQHByb2MtPmlu bmVyX2xvY2spDQo+ID4gLSAqIEB0b2RvOiAgICAgICAgICAgICAgICAgbGlzdCBvZiB3b3JrIHRv IGRvIGZvciB0aGlzIHRocmVhZA0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAgICAgIChwcm90 ZWN0ZWQgYnkgQHByb2MtPmlubmVyX2xvY2spDQo+ID4gLSAqIEBwcm9jZXNzX3RvZG86ICAgICAg ICAgd2hldGhlciB3b3JrIGluIEB0b2RvIHNob3VsZCBiZSBwcm9jZXNzZWQNCj4gPiAtICogICAg ICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBwcm9jLT5pbm5lcl9sb2NrKQ0KPiA+ IC0gKiBAcmV0dXJuX2Vycm9yOiAgICAgICAgIHRyYW5zYWN0aW9uIGVycm9ycyByZXBvcnRlZCBi eSB0aGlzIHRocmVhZA0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IGFjY2Vz c2VkIGJ5IHRoaXMgdGhyZWFkKQ0KPiA+IC0gKiBAcmVwbHlfZXJyb3I6ICAgICAgICAgIHRyYW5z YWN0aW9uIGVycm9ycyByZXBvcnRlZCBieSB0YXJnZXQgdGhyZWFkDQo+ID4gLSAqICAgICAgICAg ICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAcHJvYy0+aW5uZXJfbG9jaykNCj4gPiAtICog QHdhaXQ6ICAgICAgICAgICAgICAgICB3YWl0IHF1ZXVlIGZvciB0aHJlYWQgd29yaw0KPiA+IC0g KiBAc3RhdHM6ICAgICAgICAgICAgICAgIHBlci10aHJlYWQgc3RhdGlzdGljcw0KPiA+IC0gKiAg ICAgICAgICAgICAgICAgICAgICAgIChhdG9taWNzLCBubyBsb2NrIG5lZWRlZCkNCj4gPiAtICog QHRtcF9yZWY6ICAgICAgICAgICAgICB0ZW1wb3JhcnkgcmVmZXJlbmNlIHRvIGluZGljYXRlIHRo cmVhZCBpcyBpbiB1c2UNCj4gPiAtICogICAgICAgICAgICAgICAgICAgICAgICAoYXRvbWljIHNp bmNlIEBwcm9jLT5pbm5lcl9sb2NrIGNhbm5vdA0KPiA+IC0gKiAgICAgICAgICAgICAgICAgICAg ICAgIGFsd2F5cyBiZSBhY3F1aXJlZCkNCj4gPiAtICogQGlzX2RlYWQ6ICAgICAgICAgICAgICB0 aHJlYWQgaXMgZGVhZCBhbmQgYXdhaXRpbmcgZnJlZQ0KPiA+IC0gKiAgICAgICAgICAgICAgICAg ICAgICAgIHdoZW4gb3V0c3RhbmRpbmcgdHJhbnNhY3Rpb25zIGFyZSBjbGVhbmVkIHVwDQo+ID4g LSAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAcHJvYy0+aW5uZXJfbG9j aykNCj4gPiAtICoNCj4gPiAtICogQm9va2tlZXBpbmcgc3RydWN0dXJlIGZvciBiaW5kZXIgdGhy ZWFkcy4NCj4gPiAtICovDQo+ID4gLXN0cnVjdCBiaW5kZXJfdGhyZWFkIHsNCj4gPiAtICAgICAg IHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYzsNCj4gPiAtICAgICAgIHN0cnVjdCByYl9ub2RlIHJi X25vZGU7DQo+ID4gLSAgICAgICBzdHJ1Y3QgbGlzdF9oZWFkIHdhaXRpbmdfdGhyZWFkX25vZGU7 DQo+ID4gLSAgICAgICBpbnQgcGlkOw0KPiA+IC0gICAgICAgaW50IGxvb3BlcjsgICAgICAgICAg ICAgIC8qIG9ubHkgbW9kaWZpZWQgYnkgdGhpcyB0aHJlYWQgKi8NCj4gPiAtICAgICAgIGJvb2wg bG9vcGVyX25lZWRfcmV0dXJuOyAvKiBjYW4gYmUgd3JpdHRlbiBieSBvdGhlciB0aHJlYWQgKi8N Cj4gPiAtICAgICAgIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRyYW5zYWN0aW9uX3N0YWNr Ow0KPiA+IC0gICAgICAgc3RydWN0IGxpc3RfaGVhZCB0b2RvOw0KPiA+IC0gICAgICAgYm9vbCBw cm9jZXNzX3RvZG87DQo+ID4gLSAgICAgICBzdHJ1Y3QgYmluZGVyX2Vycm9yIHJldHVybl9lcnJv cjsNCj4gPiAtICAgICAgIHN0cnVjdCBiaW5kZXJfZXJyb3IgcmVwbHlfZXJyb3I7DQo+ID4gLSAg ICAgICB3YWl0X3F1ZXVlX2hlYWRfdCB3YWl0Ow0KPiA+IC0gICAgICAgc3RydWN0IGJpbmRlcl9z dGF0cyBzdGF0czsNCj4gPiAtICAgICAgIGF0b21pY190IHRtcF9yZWY7DQo+ID4gLSAgICAgICBi b29sIGlzX2RlYWQ7DQo+ID4gLX07DQo+ID4gLQ0KPiA+IC0vKioNCj4gPiAgICogc3RydWN0IGJp bmRlcl90eG5fZmRfZml4dXAgLSB0cmFuc2FjdGlvbiBmZCBmaXh1cCBsaXN0IGVsZW1lbnQNCj4g PiAgICogQGZpeHVwX2VudHJ5OiAgICAgICAgICBsaXN0IGVudHJ5DQo+ID4gICAqIEBmaWxlOiAg ICAgICAgICAgICAgICAgc3RydWN0IGZpbGUgdG8gYmUgYXNzb2NpYXRlZCB3aXRoIG5ldyBmZA0K PiA+IEBAIC01NjUsMzQgKzM4NCw2IEBAIHN0cnVjdCBiaW5kZXJfdHhuX2ZkX2ZpeHVwIHsNCj4g PiAgICAgICAgIHNpemVfdCBvZmZzZXQ7DQo+ID4gIH07DQo+ID4NCj4gPg0KPiANCj4gZXh0cmEg ZW1wdHkgbGluZT8NCj4gDQo+ID4gLXN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gew0KPiA+IC0g ICAgICAgaW50IGRlYnVnX2lkOw0KPiA+IC0gICAgICAgc3RydWN0IGJpbmRlcl93b3JrIHdvcms7 DQo+ID4gLSAgICAgICBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqZnJvbTsNCj4gPiAtICAgICAgIHN0 cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKmZyb21fcGFyZW50Ow0KPiA+IC0gICAgICAgc3RydWN0 IGJpbmRlcl9wcm9jICp0b19wcm9jOw0KPiA+IC0gICAgICAgc3RydWN0IGJpbmRlcl90aHJlYWQg KnRvX3RocmVhZDsNCj4gPiAtICAgICAgIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnRvX3Bh cmVudDsNCj4gPiAtICAgICAgIHVuc2lnbmVkIG5lZWRfcmVwbHk6MTsNCj4gPiAtICAgICAgIC8q IHVuc2lnbmVkIGlzX2RlYWQ6MTsgKi8gICAgICAgLyogbm90IHVzZWQgYXQgdGhlIG1vbWVudCAq Lw0KPiA+IC0NCj4gPiAtICAgICAgIHN0cnVjdCBiaW5kZXJfYnVmZmVyICpidWZmZXI7DQo+ID4g LSAgICAgICB1bnNpZ25lZCBpbnQgICAgY29kZTsNCj4gPiAtICAgICAgIHVuc2lnbmVkIGludCAg ICBmbGFnczsNCj4gPiAtICAgICAgIGxvbmcgICAgcHJpb3JpdHk7DQo+ID4gLSAgICAgICBsb25n ICAgIHNhdmVkX3ByaW9yaXR5Ow0KPiA+IC0gICAgICAga3VpZF90ICBzZW5kZXJfZXVpZDsNCj4g PiAtICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgZmRfZml4dXBzOw0KPiA+IC0gICAgICAgYmluZGVy X3VpbnRwdHJfdCBzZWN1cml0eV9jdHg7DQo+ID4gLSAgICAgICAvKioNCj4gPiAtICAgICAgICAq IEBsb2NrOiAgcHJvdGVjdHMgQGZyb20sIEB0b19wcm9jLCBhbmQgQHRvX3RocmVhZA0KPiA+IC0g ICAgICAgICoNCj4gPiAtICAgICAgICAqIEBmcm9tLCBAdG9fcHJvYywgYW5kIEB0b190aHJlYWQg Y2FuIGJlIHNldCB0byBOVUxMDQo+ID4gLSAgICAgICAgKiBkdXJpbmcgdGhyZWFkIHRlYXJkb3du DQo+ID4gLSAgICAgICAgKi8NCj4gPiAtICAgICAgIHNwaW5sb2NrX3QgbG9jazsNCj4gPiAtfTsN Cj4gPiAtDQo+ID4gIC8qKg0KPiA+ICAgKiBzdHJ1Y3QgYmluZGVyX29iamVjdCAtIHVuaW9uIG9m IGZsYXQgYmluZGVyIG9iamVjdCB0eXBlcw0KPiA+ICAgKiBAaGRyOiAgIGdlbmVyaWMgb2JqZWN0 IGhlYWRlcg0KPiA+IEBAIC02MTMsNiArNDA0LDI2IEBAIHN0cnVjdCBiaW5kZXJfb2JqZWN0IHsN Cj4gPiAgICAgICAgIH07DQo+ID4gIH07DQo+ID4NCj4gPiArc3RhdGljIHZvaWQgKCpfX2JpbmRl cl91cGRhdGVfaW5mb19jYikoc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCwNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJpbmRlcl90cmFuc2Fj dGlvbl9sb2dfZW50cnkgKmUpOw0KPiA+ICsNCj4gPiArdm9pZCBzZXRfYmluZGVyX3VwZGF0ZV9p bmZvX2NiKHZvaWQgKCpmbikoc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCwNCj4gPiArICAg ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJpbmRlcl90cmFuc2Fj dGlvbl9sb2dfZW50cnkgKmUpKQ0KPiA+ICt7DQo+ID4gKyAgICAgICBfX2JpbmRlcl91cGRhdGVf aW5mb19jYiA9IGZuOw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0xfR1BMKHNldF9iaW5kZXJf dXBkYXRlX2luZm9fY2IpOw0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgKCpfX3ByaW50X3RyYW5z YWN0aW9uX2V4dF9jYikoc3RydWN0IHNlcV9maWxlICptLA0KPiA+ICsgICAgICAgICAgICAgICAg ICAgICAgICAgICAgICAgICAgICAgICBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KTsNCj4g PiArDQo+ID4gK3ZvaWQgc2V0X3ByaW50X3RyYW5zYWN0aW9uX2V4dF9jYih2b2lkICgqZm4pKHN0 cnVjdCBzZXFfZmlsZSAqbSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkpDQo+ID4gK3sNCj4gPiArICAgICAg IF9fcHJpbnRfdHJhbnNhY3Rpb25fZXh0X2NiID0gZm47DQo+ID4gK30NCj4gPiArRVhQT1JUX1NZ TUJPTF9HUEwoc2V0X3ByaW50X3RyYW5zYWN0aW9uX2V4dF9jYik7DQo+IA0KPiBXaHkgY2FuJ3Qg d2UgdXNlIHRyYWNlcG9pbnRzIChub3QgdHJhY2UgZXZlbnRzKSBmb3IgdGhpcyBpbnN0ZWFkIG9m DQo+IGN1c3RvbSByZWdpc3RyYXRpb24gZnVuY3Rpb25zPyBZb3UgY2FuIGF0dGFjaCB0byB0aGUg dHJhY2Vwb2ludCB3aXRoDQo+IHJlZ2lzdGVyX3RyYWNlXyogbGV0cyBhIG1vZHVsZSByZWdpc3Rl ciB0byBiZSBjYWxsZWQgdG8gaGFuZGxlIHRoZQ0KPiB0cmFjZXBvaW50IGFzIEpvZWwgcG9pbnRl ZCBvdXQuDQoNClllcywgd2Ugd2lsbCB1c2UgdHJhY2Vwb2ludHMgaW5zdGVhZCBvZiBjdXN0b20g cmVnaXN0cmF0aW9uIGZ1bmN0aW9ucyBpbg0KbmV4dCB2ZXJzaW9uIHBhdGNoLCB0aGFua3MuDQoN Cj4gPiArDQo+ID4gIC8qKg0KPiA+ICAgKiBiaW5kZXJfcHJvY19sb2NrKCkgLSBBY3F1aXJlIG91 dGVyIGxvY2sgZm9yIGdpdmVuIGJpbmRlcl9wcm9jDQo+ID4gICAqIEBwcm9jOiAgICAgICAgIHN0 cnVjdCBiaW5kZXJfcHJvYyB0byBhY3F1aXJlDQo+ID4gQEAgLTE5MjcsNiArMTczOCw3IEBAIHN0 YXRpYyB2b2lkIGJpbmRlcl9mcmVlX3RyYW5zYWN0aW9uKHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rp b24gKnQpDQo+ID4gICAgICAgICAgKiBJZiB0aGUgdHJhbnNhY3Rpb24gaGFzIG5vIHRhcmdldF9w cm9jLCB0aGVuDQo+ID4gICAgICAgICAgKiB0LT5idWZmZXItPnRyYW5zYWN0aW9uIGhhcyBhbHJl YWR5IGJlZW4gY2xlYXJlZC4NCj4gPiAgICAgICAgICAqLw0KPiA+ICsgICAgICAgdHJhY2VfYmlu ZGVyX2ZyZWVfdHJhbnNhY3Rpb24odCk7DQo+ID4gICAgICAgICBiaW5kZXJfZnJlZV90eG5fZml4 dXBzKHQpOw0KPiA+ICAgICAgICAga2ZyZWUodCk7DQo+ID4gICAgICAgICBiaW5kZXJfc3RhdHNf ZGVsZXRlZChCSU5ERVJfU1RBVF9UUkFOU0FDVElPTik7DQo+ID4gQEAgLTI4NzQsNiArMjY4Niw3 IEBAIHN0YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbihzdHJ1Y3QgYmluZGVyX3Byb2MgKnBy b2MsDQo+ID4gICAgICAgICBlLT5vZmZzZXRzX3NpemUgPSB0ci0+b2Zmc2V0c19zaXplOw0KPiA+ ICAgICAgICAgc3Ryc2NweShlLT5jb250ZXh0X25hbWUsIHByb2MtPmNvbnRleHQtPm5hbWUsIEJJ TkRFUkZTX01BWF9OQU1FKTsNCj4gPg0KPiA+ICsNCj4gDQo+IHdoeSAyIGVtcHR5IGxpbmVzPw0K PiANCj4gPiAgICAgICAgIGlmIChyZXBseSkgew0KPiA+ICAgICAgICAgICAgICAgICBiaW5kZXJf aW5uZXJfcHJvY19sb2NrKHByb2MpOw0KPiA+ICAgICAgICAgICAgICAgICBpbl9yZXBseV90byA9 IHRocmVhZC0+dHJhbnNhY3Rpb25fc3RhY2s7DQo+ID4gQEAgLTMwNjAsNiArMjg3Myw5IEBAIHN0 YXRpYyB2b2lkIGJpbmRlcl90cmFuc2FjdGlvbihzdHJ1Y3QgYmluZGVyX3Byb2MgKnByb2MsDQo+ ID4gICAgICAgICAgICAgICAgIHJldHVybl9lcnJvcl9saW5lID0gX19MSU5FX187DQo+ID4gICAg ICAgICAgICAgICAgIGdvdG8gZXJyX2FsbG9jX3RfZmFpbGVkOw0KPiA+ICAgICAgICAgfQ0KPiA+ ICsNCj4gPiArICAgICAgIGlmIChfX2JpbmRlcl91cGRhdGVfaW5mb19jYikNCj4gPiArICAgICAg ICAgICAgICAgX19iaW5kZXJfdXBkYXRlX2luZm9fY2IodCwgZSk7DQo+IA0KPiBUaGlzIHNob3Vs ZCBiZSBhIHRyYWNlcG9pbnQgdGhhdCB5b3VyIG1vZHVsZSBjYW4gYXR0YWNoIHRvIHdpdGgNCj4g cmVnaXN0ZXJfdHJhY2VfYmluZGVyX3VwZGF0ZV9pbmZvKC4uLikNCj4gDQo+ID4gICAgICAgICBJ TklUX0xJU1RfSEVBRCgmdC0+ZmRfZml4dXBzKTsNCj4gPiAgICAgICAgIGJpbmRlcl9zdGF0c19j cmVhdGVkKEJJTkRFUl9TVEFUX1RSQU5TQUNUSU9OKTsNCj4gPiAgICAgICAgIHNwaW5fbG9ja19p bml0KCZ0LT5sb2NrKTsNCj4gPiBAQCAtMzQ5OCw2ICszMzE0LDcgQEAgc3RhdGljIHZvaWQgYmlu ZGVyX3RyYW5zYWN0aW9uKHN0cnVjdCBiaW5kZXJfcHJvYyAqcHJvYywNCj4gPiAgICAgICAgIGtm cmVlKHRjb21wbGV0ZSk7DQo+ID4gICAgICAgICBiaW5kZXJfc3RhdHNfZGVsZXRlZChCSU5ERVJf U1RBVF9UUkFOU0FDVElPTl9DT01QTEVURSk7DQo+ID4gIGVycl9hbGxvY190Y29tcGxldGVfZmFp bGVkOg0KPiA+ICsgICAgICAgdHJhY2VfYmluZGVyX2ZyZWVfdHJhbnNhY3Rpb24odCk7DQo+ID4g ICAgICAgICBrZnJlZSh0KTsNCj4gPiAgICAgICAgIGJpbmRlcl9zdGF0c19kZWxldGVkKEJJTkRF Ul9TVEFUX1RSQU5TQUNUSU9OKTsNCj4gPiAgZXJyX2FsbG9jX3RfZmFpbGVkOg0KPiA+IEBAIC01 NTQ3LDYgKzUzNjQsOCBAQCBzdGF0aWMgdm9pZCBwcmludF9iaW5kZXJfdHJhbnNhY3Rpb25faWxv Y2tlZChzdHJ1Y3Qgc2VxX2ZpbGUgKm0sDQo+ID4gICAgICAgICAgICAgICAgICAgIHQtPnRvX3Ro cmVhZCA/IHQtPnRvX3RocmVhZC0+cGlkIDogMCwNCj4gPiAgICAgICAgICAgICAgICAgICAgdC0+ Y29kZSwgdC0+ZmxhZ3MsIHQtPnByaW9yaXR5LCB0LT5uZWVkX3JlcGx5KTsNCj4gPiAgICAgICAg IHNwaW5fdW5sb2NrKCZ0LT5sb2NrKTsNCj4gPiArICAgICAgIGlmIChfX3ByaW50X3RyYW5zYWN0 aW9uX2V4dF9jYikNCj4gPiArICAgICAgICAgICAgICAgX19wcmludF90cmFuc2FjdGlvbl9leHRf Y2IobSwgdCk7DQo+IA0KPiBzYW1lIGhlcmUuDQo+IA0KPiA+DQo+ID4gICAgICAgICBpZiAocHJv YyAhPSB0b19wcm9jKSB7DQo+ID4gICAgICAgICAgICAgICAgIC8qDQo+ID4gZGlmZiAtLWdpdCBh L2RyaXZlcnMvYW5kcm9pZC9iaW5kZXJfaW50ZXJuYWwuaCBiL2RyaXZlcnMvYW5kcm9pZC9iaW5k ZXJfaW50ZXJuYWwuaA0KPiA+IGluZGV4IGFlOTkxMDkuLjg2YjQ5NjAgMTAwNjQ0DQo+ID4gLS0t IGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl9pbnRlcm5hbC5oDQo+ID4gKysrIGIvZHJpdmVycy9h bmRyb2lkL2JpbmRlcl9pbnRlcm5hbC5oDQo+ID4gQEAgLTEyLDYgKzEyLDExIEBADQo+ID4gICNp bmNsdWRlIDxsaW51eC90eXBlcy5oPg0KPiA+ICAjaW5jbHVkZSA8bGludXgvdWlkZ2lkLmg+DQo+ ID4NCj4gPiArI2lmZGVmIENPTkZJR19CSU5ERVJfVVNFUl9UUkFDS0lORw0KPiA+ICsjaW5jbHVk ZSA8bGludXgvcnRjLmg+DQo+ID4gKyNpbmNsdWRlIDxsaW51eC90aW1lLmg+DQo+ID4gKyNlbmRp Zg0KPiA+ICsNCj4gPiAgc3RydWN0IGJpbmRlcl9jb250ZXh0IHsNCj4gPiAgICAgICAgIHN0cnVj dCBiaW5kZXJfbm9kZSAqYmluZGVyX2NvbnRleHRfbWdyX25vZGU7DQo+ID4gICAgICAgICBzdHJ1 Y3QgbXV0ZXggY29udGV4dF9tZ3Jfbm9kZV9sb2NrOw0KPiA+IEBAIC0xMzEsNiArMTM2LDEwIEBA IHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2VudHJ5IHsNCj4gPiAgICAgICAgIHVpbnQz Ml90IHJldHVybl9lcnJvcjsNCj4gPiAgICAgICAgIHVpbnQzMl90IHJldHVybl9lcnJvcl9wYXJh bTsNCj4gPiAgICAgICAgIGNoYXIgY29udGV4dF9uYW1lW0JJTkRFUkZTX01BWF9OQU1FICsgMV07 DQo+ID4gKyNpZmRlZiBDT05GSUdfQklOREVSX1VTRVJfVFJBQ0tJTkcNCj4gPiArICAgICAgIHN0 cnVjdCB0aW1lc3BlYyB0aW1lc3RhbXA7DQo+ID4gKyAgICAgICBzdHJ1Y3QgdGltZXZhbCB0djsN Cj4gPiArI2VuZGlmDQo+ID4gIH07DQo+ID4NCj4gPiAgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlv bl9sb2cgew0KPiA+IEBAIC0xMzksNiArMTQ4LDIyNCBAQCBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0 aW9uX2xvZyB7DQo+ID4gICAgICAgICBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uX2xvZ19lbnRy eSBlbnRyeVszMl07DQo+ID4gIH07DQo+ID4NCj4gPiArZW51bSBiaW5kZXJfc3RhdF90eXBlcyB7 DQo+ID4gKyAgICAgICBCSU5ERVJfU1RBVF9QUk9DLA0KPiA+ICsgICAgICAgQklOREVSX1NUQVRf VEhSRUFELA0KPiA+ICsgICAgICAgQklOREVSX1NUQVRfTk9ERSwNCj4gPiArICAgICAgIEJJTkRF Ul9TVEFUX1JFRiwNCj4gPiArICAgICAgIEJJTkRFUl9TVEFUX0RFQVRILA0KPiA+ICsgICAgICAg QklOREVSX1NUQVRfVFJBTlNBQ1RJT04sDQo+ID4gKyAgICAgICBCSU5ERVJfU1RBVF9UUkFOU0FD VElPTl9DT01QTEVURSwNCj4gPiArICAgICAgIEJJTkRFUl9TVEFUX0NPVU5UDQo+ID4gK307DQo+ ID4gKw0KPiA+ICtzdHJ1Y3QgYmluZGVyX3N0YXRzIHsNCj4gPiArICAgICAgIGF0b21pY190IGJy W19JT0NfTlIoQlJfRkFJTEVEX1JFUExZKSArIDFdOw0KPiA+ICsgICAgICAgYXRvbWljX3QgYmNb X0lPQ19OUihCQ19SRVBMWV9TRykgKyAxXTsNCj4gPiArICAgICAgIGF0b21pY190IG9ial9jcmVh dGVkW0JJTkRFUl9TVEFUX0NPVU5UXTsNCj4gPiArICAgICAgIGF0b21pY190IG9ial9kZWxldGVk W0JJTkRFUl9TVEFUX0NPVU5UXTsNCj4gPiArfTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiBz dHJ1Y3QgYmluZGVyX3dvcmsgLSB3b3JrIGVucXVldWVkIG9uIGEgd29ya2xpc3QNCj4gPiArICog QGVudHJ5OiAgICAgICAgICAgICBub2RlIGVucXVldWVkIG9uIGxpc3QNCj4gPiArICogQHR5cGU6 ICAgICAgICAgICAgICB0eXBlIG9mIHdvcmsgdG8gYmUgcGVyZm9ybWVkDQo+ID4gKyAqDQo+ID4g KyAqIFRoZXJlIGFyZSBzZXBhcmF0ZSB3b3JrIGxpc3RzIGZvciBwcm9jLCB0aHJlYWQsIGFuZCBu b2RlIChhc3luYykuDQo+ID4gKyAqLw0KPiA+ICtzdHJ1Y3QgYmluZGVyX3dvcmsgew0KPiA+ICsg ICAgICAgc3RydWN0IGxpc3RfaGVhZCBlbnRyeTsNCj4gPiArDQo+ID4gKyAgICAgICBlbnVtIHsN Cj4gPiArICAgICAgICAgICAgICAgQklOREVSX1dPUktfVFJBTlNBQ1RJT04gPSAxLA0KPiA+ICsg ICAgICAgICAgICAgICBCSU5ERVJfV09SS19UUkFOU0FDVElPTl9DT01QTEVURSwNCj4gPiArICAg ICAgICAgICAgICAgQklOREVSX1dPUktfUkVUVVJOX0VSUk9SLA0KPiA+ICsgICAgICAgICAgICAg ICBCSU5ERVJfV09SS19OT0RFLA0KPiA+ICsgICAgICAgICAgICAgICBCSU5ERVJfV09SS19ERUFE X0JJTkRFUiwNCj4gPiArICAgICAgICAgICAgICAgQklOREVSX1dPUktfREVBRF9CSU5ERVJfQU5E X0NMRUFSLA0KPiA+ICsgICAgICAgICAgICAgICBCSU5ERVJfV09SS19DTEVBUl9ERUFUSF9OT1RJ RklDQVRJT04sDQo+ID4gKyAgICAgICB9IHR5cGU7DQo+ID4gK307DQo+ID4gKw0KPiA+ICtzdHJ1 Y3QgYmluZGVyX2Vycm9yIHsNCj4gPiArICAgICAgIHN0cnVjdCBiaW5kZXJfd29yayB3b3JrOw0K PiA+ICsgICAgICAgdWludDMyX3QgY21kOw0KPiA+ICt9Ow0KPiA+ICsNCj4gPiArLyoqDQo+ID4g KyAqIHN0cnVjdCBiaW5kZXJfcHJvYyAtIGJpbmRlciBwcm9jZXNzIGJvb2trZWVwaW5nDQo+ID4g KyAqIEBwcm9jX25vZGU6ICAgICAgICAgICAgZWxlbWVudCBmb3IgYmluZGVyX3Byb2NzIGxpc3QN Cj4gPiArICogQHRocmVhZHM6ICAgICAgICAgICAgICByYnRyZWUgb2YgYmluZGVyX3RocmVhZHMg aW4gdGhpcyBwcm9jDQo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBi eSBAaW5uZXJfbG9jaykNCj4gPiArICogQG5vZGVzOiAgICAgICAgICAgICAgICByYnRyZWUgb2Yg YmluZGVyIG5vZGVzIGFzc29jaWF0ZWQgd2l0aA0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAg ICAgIHRoaXMgcHJvYyBvcmRlcmVkIGJ5IG5vZGUtPnB0cg0KPiA+ICsgKiAgICAgICAgICAgICAg ICAgICAgICAgIChwcm90ZWN0ZWQgYnkgQGlubmVyX2xvY2spDQo+ID4gKyAqIEByZWZzX2J5X2Rl c2M6ICAgICAgICAgcmJ0cmVlIG9mIHJlZnMgb3JkZXJlZCBieSByZWYtPmRlc2MNCj4gPiArICog ICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBvdXRlcl9sb2NrKQ0KPiA+ICsg KiBAcmVmc19ieV9ub2RlOiAgICAgICAgIHJidHJlZSBvZiByZWZzIG9yZGVyZWQgYnkgcmVmLT5u b2RlDQo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAb3V0ZXJf bG9jaykNCj4gPiArICogQHdhaXRpbmdfdGhyZWFkczogICAgICB0aHJlYWRzIGN1cnJlbnRseSB3 YWl0aW5nIGZvciBwcm9jIHdvcmsNCj4gPiArICogICAgICAgICAgICAgICAgICAgICAgICAocHJv dGVjdGVkIGJ5IEBpbm5lcl9sb2NrKQ0KPiA+ICsgKiBAcGlkICAgICAgICAgICAgICAgICAgIFBJ RCBvZiBncm91cF9sZWFkZXIgb2YgcHJvY2Vzcw0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAg ICAgIChpbnZhcmlhbnQgYWZ0ZXIgaW5pdGlhbGl6ZWQpDQo+ID4gKyAqIEB0c2sgICAgICAgICAg ICAgICAgICAgdGFza19zdHJ1Y3QgZm9yIGdyb3VwX2xlYWRlciBvZiBwcm9jZXNzDQo+ID4gKyAq ICAgICAgICAgICAgICAgICAgICAgICAgKGludmFyaWFudCBhZnRlciBpbml0aWFsaXplZCkNCj4g PiArICogQGRlZmVycmVkX3dvcmtfbm9kZTogICBlbGVtZW50IGZvciBiaW5kZXJfZGVmZXJyZWRf bGlzdA0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIChwcm90ZWN0ZWQgYnkgYmluZGVy X2RlZmVycmVkX2xvY2spDQo+ID4gKyAqIEBkZWZlcnJlZF93b3JrOiAgICAgICAgYml0bWFwIG9m IGRlZmVycmVkIHdvcmsgdG8gcGVyZm9ybQ0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAgICAg IChwcm90ZWN0ZWQgYnkgYmluZGVyX2RlZmVycmVkX2xvY2spDQo+ID4gKyAqIEBpc19kZWFkOiAg ICAgICAgICAgICAgcHJvY2VzcyBpcyBkZWFkIGFuZCBhd2FpdGluZyBmcmVlDQo+ID4gKyAqICAg ICAgICAgICAgICAgICAgICAgICAgd2hlbiBvdXRzdGFuZGluZyB0cmFuc2FjdGlvbnMgYXJlIGNs ZWFuZWQgdXANCj4gPiArICogICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBp bm5lcl9sb2NrKQ0KPiA+ICsgKiBAdG9kbzogICAgICAgICAgICAgICAgIGxpc3Qgb2Ygd29yayBm b3IgdGhpcyBwcm9jZXNzDQo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3Rl ZCBieSBAaW5uZXJfbG9jaykNCj4gPiArICogQHN0YXRzOiAgICAgICAgICAgICAgICBwZXItcHJv Y2VzcyBiaW5kZXIgc3RhdGlzdGljcw0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIChh dG9taWNzLCBubyBsb2NrIG5lZWRlZCkNCj4gPiArICogQGRlbGl2ZXJlZF9kZWF0aDogICAgICBs aXN0IG9mIGRlbGl2ZXJlZCBkZWF0aCBub3RpZmljYXRpb24NCj4gPiArICogICAgICAgICAgICAg ICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBpbm5lcl9sb2NrKQ0KPiA+ICsgKiBAbWF4X3RocmVh ZHM6ICAgICAgICAgIGNhcCBvbiBudW1iZXIgb2YgYmluZGVyIHRocmVhZHMNCj4gPiArICogICAg ICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBpbm5lcl9sb2NrKQ0KPiA+ICsgKiBA cmVxdWVzdGVkX3RocmVhZHM6ICAgIG51bWJlciBvZiBiaW5kZXIgdGhyZWFkcyByZXF1ZXN0ZWQg YnV0IG5vdA0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIHlldCBzdGFydGVkLiBJbiBj dXJyZW50IGltcGxlbWVudGF0aW9uLCBjYW4NCj4gPiArICogICAgICAgICAgICAgICAgICAgICAg ICBvbmx5IGJlIDAgb3IgMS4NCj4gPiArICogICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVj dGVkIGJ5IEBpbm5lcl9sb2NrKQ0KPiA+ICsgKiBAcmVxdWVzdGVkX3RocmVhZHNfc3RhcnRlZDog bnVtYmVyIGJpbmRlciB0aHJlYWRzIHN0YXJ0ZWQNCj4gPiArICogICAgICAgICAgICAgICAgICAg ICAgICAocHJvdGVjdGVkIGJ5IEBpbm5lcl9sb2NrKQ0KPiA+ICsgKiBAdG1wX3JlZjogICAgICAg ICAgICAgIHRlbXBvcmFyeSByZWZlcmVuY2UgdG8gaW5kaWNhdGUgcHJvYyBpcyBpbiB1c2UNCj4g PiArICogICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBpbm5lcl9sb2NrKQ0K PiA+ICsgKiBAZGVmYXVsdF9wcmlvcml0eTogICAgIGRlZmF1bHQgc2NoZWR1bGVyIHByaW9yaXR5 DQo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGludmFyaWFudCBhZnRlciBpbml0aWFs aXplZCkNCj4gPiArICogQGRlYnVnZnNfZW50cnk6ICAgICAgICBkZWJ1Z2ZzIG5vZGUNCj4gPiAr ICogQGFsbG9jOiAgICAgICAgICAgICAgICBiaW5kZXIgYWxsb2NhdG9yIGJvb2trZWVwaW5nDQo+ ID4gKyAqIEBjb250ZXh0OiAgICAgICAgICAgICAgYmluZGVyX2NvbnRleHQgZm9yIHRoaXMgcHJv Yw0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIChpbnZhcmlhbnQgYWZ0ZXIgaW5pdGlh bGl6ZWQpDQo+ID4gKyAqIEBpbm5lcl9sb2NrOiAgICAgICAgICAgY2FuIG5lc3QgdW5kZXIgb3V0 ZXJfbG9jayBhbmQvb3Igbm9kZSBsb2NrDQo+ID4gKyAqIEBvdXRlcl9sb2NrOiAgICAgICAgICAg bm8gbmVzdGluZyB1bmRlciBpbm5vciBvciBub2RlIGxvY2sNCj4gPiArICogICAgICAgICAgICAg ICAgICAgICAgICBMb2NrIG9yZGVyOiAxKSBvdXRlciwgMikgbm9kZSwgMykgaW5uZXINCj4gPiAr ICogQGJpbmRlcmZzX2VudHJ5OiAgICAgICBwcm9jZXNzLXNwZWNpZmljIGJpbmRlcmZzIGxvZyBm aWxlDQo+ID4gKyAqDQo+ID4gKyAqIEJvb2trZWVwaW5nIHN0cnVjdHVyZSBmb3IgYmluZGVyIHBy b2Nlc3Nlcw0KPiA+ICsgKi8NCj4gPiArc3RydWN0IGJpbmRlcl9wcm9jIHsNCj4gPiArICAgICAg IHN0cnVjdCBobGlzdF9ub2RlIHByb2Nfbm9kZTsNCj4gPiArICAgICAgIHN0cnVjdCByYl9yb290 IHRocmVhZHM7DQo+ID4gKyAgICAgICBzdHJ1Y3QgcmJfcm9vdCBub2RlczsNCj4gPiArICAgICAg IHN0cnVjdCByYl9yb290IHJlZnNfYnlfZGVzYzsNCj4gPiArICAgICAgIHN0cnVjdCByYl9yb290 IHJlZnNfYnlfbm9kZTsNCj4gPiArICAgICAgIHN0cnVjdCBsaXN0X2hlYWQgd2FpdGluZ190aHJl YWRzOw0KPiA+ICsgICAgICAgaW50IHBpZDsNCj4gPiArICAgICAgIHN0cnVjdCB0YXNrX3N0cnVj dCAqdHNrOw0KPiA+ICsgICAgICAgc3RydWN0IGhsaXN0X25vZGUgZGVmZXJyZWRfd29ya19ub2Rl Ow0KPiA+ICsgICAgICAgaW50IGRlZmVycmVkX3dvcms7DQo+ID4gKyAgICAgICBib29sIGlzX2Rl YWQ7DQo+ID4gKw0KPiA+ICsgICAgICAgc3RydWN0IGxpc3RfaGVhZCB0b2RvOw0KPiA+ICsgICAg ICAgc3RydWN0IGJpbmRlcl9zdGF0cyBzdGF0czsNCj4gPiArICAgICAgIHN0cnVjdCBsaXN0X2hl YWQgZGVsaXZlcmVkX2RlYXRoOw0KPiA+ICsgICAgICAgaW50IG1heF90aHJlYWRzOw0KPiA+ICsg ICAgICAgaW50IHJlcXVlc3RlZF90aHJlYWRzOw0KPiA+ICsgICAgICAgaW50IHJlcXVlc3RlZF90 aHJlYWRzX3N0YXJ0ZWQ7DQo+ID4gKyAgICAgICBpbnQgdG1wX3JlZjsNCj4gPiArICAgICAgIGxv bmcgZGVmYXVsdF9wcmlvcml0eTsNCj4gPiArICAgICAgIHN0cnVjdCBkZW50cnkgKmRlYnVnZnNf ZW50cnk7DQo+ID4gKyAgICAgICBzdHJ1Y3QgYmluZGVyX2FsbG9jIGFsbG9jOw0KPiA+ICsgICAg ICAgc3RydWN0IGJpbmRlcl9jb250ZXh0ICpjb250ZXh0Ow0KPiA+ICsgICAgICAgc3BpbmxvY2tf dCBpbm5lcl9sb2NrOw0KPiA+ICsgICAgICAgc3BpbmxvY2tfdCBvdXRlcl9sb2NrOw0KPiA+ICsg ICAgICAgc3RydWN0IGRlbnRyeSAqYmluZGVyZnNfZW50cnk7DQo+ID4gK307DQo+ID4gKw0KPiA+ ICsvKioNCj4gPiArICogc3RydWN0IGJpbmRlcl90aHJlYWQgLSBiaW5kZXIgdGhyZWFkIGJvb2tr ZWVwaW5nDQo+ID4gKyAqIEBwcm9jOiAgICAgICAgICAgICAgICAgYmluZGVyIHByb2Nlc3MgZm9y IHRoaXMgdGhyZWFkDQo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGludmFyaWFudCBh ZnRlciBpbml0aWFsaXphdGlvbikNCj4gPiArICogQHJiX25vZGU6ICAgICAgICAgICAgICBlbGVt ZW50IGZvciBwcm9jLT50aHJlYWRzIHJidHJlZQ0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAg ICAgIChwcm90ZWN0ZWQgYnkgQHByb2MtPmlubmVyX2xvY2spDQo+ID4gKyAqIEB3YWl0aW5nX3Ro cmVhZF9ub2RlOiAgZWxlbWVudCBmb3IgQHByb2MtPndhaXRpbmdfdGhyZWFkcyBsaXN0DQo+ID4g KyAqICAgICAgICAgICAgICAgICAgICAgICAgKHByb3RlY3RlZCBieSBAcHJvYy0+aW5uZXJfbG9j aykNCj4gPiArICogQHBpZDogICAgICAgICAgICAgICAgICBQSUQgZm9yIHRoaXMgdGhyZWFkDQo+ ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgKGludmFyaWFudCBhZnRlciBpbml0aWFsaXph dGlvbikNCj4gPiArICogQGxvb3BlcjogICAgICAgICAgICAgICBiaXRtYXAgb2YgbG9vcGluZyBz dGF0ZQ0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIChvbmx5IGFjY2Vzc2VkIGJ5IHRo aXMgdGhyZWFkKQ0KPiA+ICsgKiBAbG9vcGVyX25lZWRzX3JldHVybjogIGxvb3BpbmcgdGhyZWFk IG5lZWRzIHRvIGV4aXQgZHJpdmVyDQo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAgKG5v IGxvY2sgbmVlZGVkKQ0KPiA+ICsgKiBAdHJhbnNhY3Rpb25fc3RhY2s6ICAgIHN0YWNrIG9mIGlu LXByb2dyZXNzIHRyYW5zYWN0aW9ucyBmb3IgdGhpcyB0aHJlYWQNCj4gPiArICogICAgICAgICAg ICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBwcm9jLT5pbm5lcl9sb2NrKQ0KPiA+ICsgKiBA dG9kbzogICAgICAgICAgICAgICAgIGxpc3Qgb2Ygd29yayB0byBkbyBmb3IgdGhpcyB0aHJlYWQN Cj4gPiArICogICAgICAgICAgICAgICAgICAgICAgICAocHJvdGVjdGVkIGJ5IEBwcm9jLT5pbm5l cl9sb2NrKQ0KPiA+ICsgKiBAcHJvY2Vzc190b2RvOiAgICAgICAgIHdoZXRoZXIgd29yayBpbiBA dG9kbyBzaG91bGQgYmUgcHJvY2Vzc2VkDQo+ID4gKyAqICAgICAgICAgICAgICAgICAgICAgICAg KHByb3RlY3RlZCBieSBAcHJvYy0+aW5uZXJfbG9jaykNCj4gPiArICogQHJldHVybl9lcnJvcjog ICAgICAgICB0cmFuc2FjdGlvbiBlcnJvcnMgcmVwb3J0ZWQgYnkgdGhpcyB0aHJlYWQNCj4gPiAr ICogICAgICAgICAgICAgICAgICAgICAgICAob25seSBhY2Nlc3NlZCBieSB0aGlzIHRocmVhZCkN Cj4gPiArICogQHJlcGx5X2Vycm9yOiAgICAgICAgICB0cmFuc2FjdGlvbiBlcnJvcnMgcmVwb3J0 ZWQgYnkgdGFyZ2V0IHRocmVhZA0KPiA+ICsgKiAgICAgICAgICAgICAgICAgICAgICAgIChwcm90 ZWN0ZWQgYnkgQHByb2MtPmlubmVyX2xvY2spDQo+ID4gKyAqIEB3YWl0OiAgICAgICAgICAgICAg ICAgd2FpdCBxdWV1ZSBmb3IgdGhyZWFkIHdvcmsNCj4gPiArICogQHN0YXRzOiAgICAgICAgICAg ICAgICBwZXItdGhyZWFkIHN0YXRpc3RpY3MNCj4gPiArICogICAgICAgICAgICAgICAgICAgICAg ICAoYXRvbWljcywgbm8gbG9jayBuZWVkZWQpDQo+ID4gKyAqIEB0bXBfcmVmOiAgICAgICAgICAg ICAgdGVtcG9yYXJ5IHJlZmVyZW5jZSB0byBpbmRpY2F0ZSB0aHJlYWQgaXMgaW4gdXNlDQo+ID4g KyAqICAgICAgICAgICAgICAgICAgICAgICAgKGF0b21pYyBzaW5jZSBAcHJvYy0+aW5uZXJfbG9j ayBjYW5ub3QNCj4gPiArICogICAgICAgICAgICAgICAgICAgICAgICBhbHdheXMgYmUgYWNxdWly ZWQpDQo+ID4gKyAqIEBpc19kZWFkOiAgICAgICAgICAgICAgdGhyZWFkIGlzIGRlYWQgYW5kIGF3 YWl0aW5nIGZyZWUNCj4gPiArICogICAgICAgICAgICAgICAgICAgICAgICB3aGVuIG91dHN0YW5k aW5nIHRyYW5zYWN0aW9ucyBhcmUgY2xlYW5lZCB1cA0KPiA+ICsgKiAgICAgICAgICAgICAgICAg ICAgICAgIChwcm90ZWN0ZWQgYnkgQHByb2MtPmlubmVyX2xvY2spDQo+ID4gKyAqDQo+ID4gKyAq IEJvb2trZWVwaW5nIHN0cnVjdHVyZSBmb3IgYmluZGVyIHRocmVhZHMuDQo+ID4gKyAqLw0KPiA+ ICtzdHJ1Y3QgYmluZGVyX3RocmVhZCB7DQo+ID4gKyAgICAgICBzdHJ1Y3QgYmluZGVyX3Byb2Mg KnByb2M7DQo+ID4gKyAgICAgICBzdHJ1Y3QgcmJfbm9kZSByYl9ub2RlOw0KPiA+ICsgICAgICAg c3RydWN0IGxpc3RfaGVhZCB3YWl0aW5nX3RocmVhZF9ub2RlOw0KPiA+ICsgICAgICAgaW50IHBp ZDsNCj4gPiArICAgICAgIGludCBsb29wZXI7ICAgICAgICAgICAgICAvKiBvbmx5IG1vZGlmaWVk IGJ5IHRoaXMgdGhyZWFkICovDQo+ID4gKyAgICAgICBib29sIGxvb3Blcl9uZWVkX3JldHVybjsg LyogY2FuIGJlIHdyaXR0ZW4gYnkgb3RoZXIgdGhyZWFkICovDQo+ID4gKyAgICAgICBzdHJ1Y3Qg YmluZGVyX3RyYW5zYWN0aW9uICp0cmFuc2FjdGlvbl9zdGFjazsNCj4gPiArICAgICAgIHN0cnVj dCBsaXN0X2hlYWQgdG9kbzsNCj4gPiArICAgICAgIGJvb2wgcHJvY2Vzc190b2RvOw0KPiA+ICsg ICAgICAgc3RydWN0IGJpbmRlcl9lcnJvciByZXR1cm5fZXJyb3I7DQo+ID4gKyAgICAgICBzdHJ1 Y3QgYmluZGVyX2Vycm9yIHJlcGx5X2Vycm9yOw0KPiA+ICsgICAgICAgd2FpdF9xdWV1ZV9oZWFk X3Qgd2FpdDsNCj4gPiArICAgICAgIHN0cnVjdCBiaW5kZXJfc3RhdHMgc3RhdHM7DQo+ID4gKyAg ICAgICBhdG9taWNfdCB0bXBfcmVmOw0KPiA+ICsgICAgICAgYm9vbCBpc19kZWFkOw0KPiA+ICt9 Ow0KPiA+ICsNCj4gPiArc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiB7DQo+ID4gKyAgICAgICBp bnQgZGVidWdfaWQ7DQo+ID4gKyAgICAgICBzdHJ1Y3QgYmluZGVyX3dvcmsgd29yazsNCj4gPiAr ICAgICAgIHN0cnVjdCBiaW5kZXJfdGhyZWFkICpmcm9tOw0KPiA+ICsgICAgICAgc3RydWN0IGJp bmRlcl90cmFuc2FjdGlvbiAqZnJvbV9wYXJlbnQ7DQo+ID4gKyAgICAgICBzdHJ1Y3QgYmluZGVy X3Byb2MgKnRvX3Byb2M7DQo+ID4gKyAgICAgICBzdHJ1Y3QgYmluZGVyX3RocmVhZCAqdG9fdGhy ZWFkOw0KPiA+ICsgICAgICAgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdG9fcGFyZW50Ow0K PiA+ICsgICAgICAgdW5zaWduZWQgbmVlZF9yZXBseToxOw0KPiA+ICsgICAgICAgLyogdW5zaWdu ZWQgaXNfZGVhZDoxOyAqLyAgICAgICAvKiBub3QgdXNlZCBhdCB0aGUgbW9tZW50ICovDQo+ID4g Kw0KPiA+ICsgICAgICAgc3RydWN0IGJpbmRlcl9idWZmZXIgKmJ1ZmZlcjsNCj4gPiArICAgICAg IHVuc2lnbmVkIGludCAgICBjb2RlOw0KPiA+ICsgICAgICAgdW5zaWduZWQgaW50ICAgIGZsYWdz Ow0KPiA+ICsgICAgICAgbG9uZyAgICBwcmlvcml0eTsNCj4gPiArICAgICAgIGxvbmcgICAgc2F2 ZWRfcHJpb3JpdHk7DQo+ID4gKyAgICAgICBrdWlkX3QgIHNlbmRlcl9ldWlkOw0KPiA+ICsgICAg ICAgc3RydWN0IGxpc3RfaGVhZCBmZF9maXh1cHM7DQo+ID4gKyAgICAgICBiaW5kZXJfdWludHB0 cl90IHNlY3VyaXR5X2N0eDsNCj4gPiArICAgICAgIC8qKg0KPiA+ICsgICAgICAgICogQGxvY2s6 ICBwcm90ZWN0cyBAZnJvbSwgQHRvX3Byb2MsIGFuZCBAdG9fdGhyZWFkDQo+ID4gKyAgICAgICAg Kg0KPiA+ICsgICAgICAgICogQGZyb20sIEB0b19wcm9jLCBhbmQgQHRvX3RocmVhZCBjYW4gYmUg c2V0IHRvIE5VTEwNCj4gPiArICAgICAgICAqIGR1cmluZyB0aHJlYWQgdGVhcmRvd24NCj4gPiAr ICAgICAgICAqLw0KPiA+ICsgICAgICAgc3BpbmxvY2tfdCBsb2NrOw0KPiA+ICsjaWZkZWYgQ09O RklHX0JJTkRFUl9VU0VSX1RSQUNLSU5HDQo+ID4gKyAgICAgICBzdHJ1Y3QgdGltZXNwZWMgdGlt ZXN0YW1wOw0KPiA+ICsgICAgICAgc3RydWN0IHRpbWV2YWwgdHY7DQo+ID4gKyNlbmRpZg0KPiA+ ICt9Ow0KPiA+ICsNCj4gPiAgZXh0ZXJuIHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nIGJp bmRlcl90cmFuc2FjdGlvbl9sb2c7DQo+ID4gIGV4dGVybiBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0 aW9uX2xvZyBiaW5kZXJfdHJhbnNhY3Rpb25fbG9nX2ZhaWxlZDsNCj4gPiArDQo+ID4gK2V4dGVy biB2b2lkIHNldF9iaW5kZXJfdXBkYXRlX2luZm9fY2Iodm9pZCAoKmZuKShzdHJ1Y3QgYmluZGVy X3RyYW5zYWN0aW9uICp0LA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3Ry dWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmUpKTsNCj4gPiArZXh0ZXJuIHZvaWQg c2V0X3ByaW50X3RyYW5zYWN0aW9uX2V4dF9jYih2b2lkICgqZm4pKHN0cnVjdCBzZXFfZmlsZSAq bSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgc3RydWN0IGJp bmRlcl90cmFuc2FjdGlvbiAqdCkpOw0KPiA+ICAjZW5kaWYgLyogX0xJTlVYX0JJTkRFUl9JTlRF Uk5BTF9IICovDQo+ID4gZGlmZiAtLWdpdCBhL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXJfbGF0ZW5j eV90cmFjZXIuYyBiL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXJfbGF0ZW5jeV90cmFjZXIuYw0KPiA+ IG5ldyBmaWxlIG1vZGUgMTAwNjQ0DQo+ID4gaW5kZXggMDAwMDAwMC4uYzk2MjZmNQ0KPiA+IC0t LSAvZGV2L251bGwNCj4gPiArKysgYi9kcml2ZXJzL2FuZHJvaWQvYmluZGVyX2xhdGVuY3lfdHJh Y2VyLmMNCj4gPiBAQCAtMCwwICsxLDEwMCBAQA0KPiA+ICsvLyBTUERYLUxpY2Vuc2UtSWRlbnRp ZmllcjogR1BMLTIuMA0KPiA+ICsvKg0KPiA+ICsgKiBDb3B5cmlnaHQgKEMpIDIwMTkgTWVkaWFU ZWsgSW5jLg0KPiA+ICsgKi8NCj4gPiArDQo+ID4gKyNpbmNsdWRlIDxsaW51eC9tb2R1bGUuaD4N Cj4gPiArI2luY2x1ZGUgPHVhcGkvbGludXgvYW5kcm9pZC9iaW5kZXIuaD4NCj4gPiArI2luY2x1 ZGUgImJpbmRlcl9hbGxvYy5oIg0KPiA+ICsjaW5jbHVkZSAiYmluZGVyX2ludGVybmFsLmgiDQo+ ID4gKyNpbmNsdWRlICJiaW5kZXJfdHJhY2UuaCINCj4gPiArDQo+ID4gKy8qDQo+ID4gKyAqIHBy b2JlX2JpbmRlcl9mcmVlX3RyYW5zYWN0aW9uIC0gT3V0cHV0IGluZm8gb2YgYSBkZWxheSB0cmFu c2FjdGlvbg0KPiA+ICsgKiBAdDogICAgICAgICAgcG9pbnRlciB0byB0aGUgb3Zlci10aW1lIHRy YW5zYWN0aW9uDQo+ID4gKyAqLw0KPiA+ICt2b2lkIHByb2JlX2JpbmRlcl9mcmVlX3RyYW5zYWN0 aW9uKHZvaWQgKmlnbm9yZSwgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbiAqdCkNCj4gPiArew0K PiA+ICsgICAgICAgc3RydWN0IHJ0Y190aW1lIHRtOw0KPiA+ICsgICAgICAgc3RydWN0IHRpbWVz cGVjICpzdGFydGltZTsNCj4gPiArICAgICAgIHN0cnVjdCB0aW1lc3BlYyBjdXIsIHN1Yl90Ow0K PiA+ICsNCj4gPiArICAgICAgIGt0aW1lX2dldF90cygmY3VyKTsNCj4gPiArICAgICAgIHN0YXJ0 aW1lID0gJnQtPnRpbWVzdGFtcDsNCj4gPiArICAgICAgIHN1Yl90ID0gdGltZXNwZWNfc3ViKGN1 ciwgKnN0YXJ0aW1lKTsNCj4gPiArDQo+ID4gKyAgICAgICAvKiBpZiB0cmFuc2FjdGlvbiB0aW1l IGlzIG92ZXIgdGhhbiAyIHNlYywNCj4gPiArICAgICAgICAqIHNob3cgdGltZW91dCB3YXJuaW5n IGxvZy4NCj4gPiArICAgICAgICAqLw0KPiA+ICsgICAgICAgaWYgKHN1Yl90LnR2X3NlYyA8IDIp DQo+ID4gKyAgICAgICAgICAgICAgIHJldHVybjsNCj4gPiArDQo+ID4gKyAgICAgICBydGNfdGlt ZV90b190bSh0LT50di50dl9zZWMsICZ0bSk7DQo+ID4gKw0KPiA+ICsgICAgICAgc3Bpbl9sb2Nr KCZ0LT5sb2NrKTsNCj4gPiArICAgICAgIHByX2luZm9fcmF0ZWxpbWl0ZWQoIiVkOiBmcm9tICVk OiVkIHRvICVkOiVkIiwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0LT5kZWJ1Z19pZCwN Cj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0LT5mcm9tID8gdC0+ZnJvbS0+cHJvYy0+cGlk IDogMCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0LT5mcm9tID8gdC0+ZnJvbS0+cGlk IDogMCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0LT50b19wcm9jID8gdC0+dG9fcHJv Yy0+cGlkIDogMCwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICB0LT50b190aHJlYWQgPyB0 LT50b190aHJlYWQtPnBpZCA6IDApOw0KPiA+ICsgICAgICAgc3Bpbl91bmxvY2soJnQtPmxvY2sp Ow0KPiA+ICsNCj4gPiArICAgICAgIHByX2luZm9fcmF0ZWxpbWl0ZWQoIiB0b3RhbCAldS4lMDNs ZCBzIGNvZGUgJXUgc3RhcnQgJWx1LiUwM2xkIGFuZHJvaWQgJWQtJTAyZC0lMDJkICUwMmQ6JTAy ZDolMDJkLiUwM2x1XG4iLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBp bnQpc3ViX3QudHZfc2VjLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIChzdWJfdC50dl9u c2VjIC8gTlNFQ19QRVJfTVNFQyksDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgdC0+Y29k ZSwNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZylzdGFydGltZS0+ dHZfc2VjLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgIChzdGFydGltZS0+dHZfbnNlYyAv IE5TRUNfUEVSX01TRUMpLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICh0bS50bV95ZWFy ICsgMTkwMCksICh0bS50bV9tb24gKyAxKSwgdG0udG1fbWRheSwNCj4gPiArICAgICAgICAgICAg ICAgICAgICAgICB0bS50bV9ob3VyLCB0bS50bV9taW4sIHRtLnRtX3NlYywNCj4gPiArICAgICAg ICAgICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodC0+dHYudHZfdXNlYyAvIFVTRUNfUEVS X01TRUMpKTsNCj4gPiArfQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgYmluZGVyX3VwZGF0ZV9p bmZvX2NiKHN0cnVjdCBiaW5kZXJfdHJhbnNhY3Rpb24gKnQsDQo+ID4gKyAgICAgICAgICAgICAg ICAgICAgICAgICAgc3RydWN0IGJpbmRlcl90cmFuc2FjdGlvbl9sb2dfZW50cnkgKmUpDQo+ID4g K3sNCj4gPiArICAgICAgIGt0aW1lX2dldF90cygmZS0+dGltZXN0YW1wKTsNCj4gPiArICAgICAg IGRvX2dldHRpbWVvZmRheSgmZS0+dHYpOw0KPiA+ICsgICAgICAgZS0+dHYudHZfc2VjIC09IChz eXNfdHoudHpfbWludXRlc3dlc3QgKiA2MCk7DQo+ID4gKyAgICAgICBtZW1jcHkoJnQtPnRpbWVz dGFtcCwgJmUtPnRpbWVzdGFtcCwgc2l6ZW9mKHN0cnVjdCB0aW1lc3BlYykpOw0KPiA+ICsgICAg ICAgbWVtY3B5KCZ0LT50diwgJmUtPnR2LCBzaXplb2Yoc3RydWN0IHRpbWV2YWwpKTsNCj4gPiAr fQ0KPiA+ICsNCj4gPiArc3RhdGljIHZvaWQgcHJpbnRfYmluZGVyX3RyYW5zYWN0aW9uX2V4dChz dHJ1Y3Qgc2VxX2ZpbGUgKm0sDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAg ICAgICAgICBzdHJ1Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KQ0KPiA+ICt7DQo+ID4gKyAgICAg ICBzdHJ1Y3QgcnRjX3RpbWUgdG07DQo+ID4gKw0KPiA+ICsgICAgICAgcnRjX3RpbWVfdG9fdG0o dC0+dHYudHZfc2VjLCAmdG0pOw0KPiA+ICsgICAgICAgc2VxX3ByaW50ZihtLA0KPiA+ICsgICAg ICAgICAgICAgICAgICAiIHN0YXJ0ICVsdS4lMDZsdSBhbmRyb2lkICVkLSUwMmQtJTAyZCAlMDJk OiUwMmQ6JTAyZC4lMDNsdSIsDQo+ID4gKyAgICAgICAgICAgICAgICAgICh1bnNpZ25lZCBsb25n KXQtPnRpbWVzdGFtcC50dl9zZWMsDQo+ID4gKyAgICAgICAgICAgICAgICAgICh0LT50aW1lc3Rh bXAudHZfbnNlYyAvIE5TRUNfUEVSX1VTRUMpLA0KPiA+ICsgICAgICAgICAgICAgICAgICAodG0u dG1feWVhciArIDE5MDApLCAodG0udG1fbW9uICsgMSksIHRtLnRtX21kYXksDQo+ID4gKyAgICAg ICAgICAgICAgICAgIHRtLnRtX2hvdXIsIHRtLnRtX21pbiwgdG0udG1fc2VjLA0KPiA+ICsgICAg ICAgICAgICAgICAgICAodW5zaWduZWQgbG9uZykodC0+dHYudHZfdXNlYyAvIFVTRUNfUEVSX01T RUMpKTsNCj4gPiArDQo+ID4gK30NCj4gPiArDQo+ID4gK3N0YXRpYyBpbnQgX19pbml0IGluaXRf YmluZGVyX2xhdGVuY3lfdHJhY2VyKHZvaWQpDQo+ID4gK3sNCj4gPiArICAgICAgIHJlZ2lzdGVy X3RyYWNlX2JpbmRlcl9mcmVlX3RyYW5zYWN0aW9uKA0KPiA+ICsgICAgICAgICAgICAgICAgICAg ICAgIHByb2JlX2JpbmRlcl9mcmVlX3RyYW5zYWN0aW9uLCBOVUxMKTsNCj4gPiArDQo+ID4gKyAg ICAgICBzZXRfYmluZGVyX3VwZGF0ZV9pbmZvX2NiKGJpbmRlcl91cGRhdGVfaW5mb19jYik7DQo+ ID4gKyAgICAgICBzZXRfcHJpbnRfdHJhbnNhY3Rpb25fZXh0X2NiKHByaW50X2JpbmRlcl90cmFu c2FjdGlvbl9leHQpOw0KPiA+ICsgICAgICAgcmV0dXJuIDA7DQo+ID4gK30NCj4gPiArDQo+ID4g K3N0YXRpYyB2b2lkIGV4aXRfYmluZGVyX2xhdGVuY3lfdHJhY2VyKHZvaWQpDQo+ID4gK3sNCj4g PiArICAgICAgIHVucmVnaXN0ZXJfdHJhY2VfYmluZGVyX2ZyZWVfdHJhbnNhY3Rpb24oDQo+ID4g KyAgICAgICAgICAgICAgICAgICAgICAgcHJvYmVfYmluZGVyX2ZyZWVfdHJhbnNhY3Rpb24sIE5V TEwpOw0KPiA+ICt9DQo+ID4gKw0KPiA+ICttb2R1bGVfaW5pdChpbml0X2JpbmRlcl9sYXRlbmN5 X3RyYWNlcik7DQo+ID4gK21vZHVsZV9leGl0KGV4aXRfYmluZGVyX2xhdGVuY3lfdHJhY2VyKTsN Cj4gPiArDQo+ID4gK01PRFVMRV9MSUNFTlNFKCJHUEwgdjIiKTsNCj4gPiArDQo+ID4gZGlmZiAt LWdpdCBhL2RyaXZlcnMvYW5kcm9pZC9iaW5kZXJfdHJhY2UuaCBiL2RyaXZlcnMvYW5kcm9pZC9i aW5kZXJfdHJhY2UuaA0KPiA+IGluZGV4IDY3MzFjM2MuLmM3Yzc2YzEgMTAwNjQ0DQo+ID4gLS0t IGEvZHJpdmVycy9hbmRyb2lkL2JpbmRlcl90cmFjZS5oDQo+ID4gKysrIGIvZHJpdmVycy9hbmRy b2lkL2JpbmRlcl90cmFjZS5oDQo+ID4gQEAgLTk1LDYgKzk1LDQyIEBADQo+ID4gICAgICAgICAg ICAgICAgICAgX19lbnRyeS0+dGhyZWFkX3RvZG8pDQo+ID4gICk7DQo+ID4NCj4gPiArVFJBQ0Vf RVZFTlQoYmluZGVyX2ZyZWVfdHJhbnNhY3Rpb24sDQo+ID4gKyAgICAgICBUUF9QUk9UTyhzdHJ1 Y3QgYmluZGVyX3RyYW5zYWN0aW9uICp0KSwNCj4gPiArICAgICAgIFRQX0FSR1ModCksDQo+ID4g KyAgICAgICBUUF9TVFJVQ1RfX2VudHJ5KA0KPiA+ICsgICAgICAgICAgICAgICBfX2ZpZWxkKGlu dCwgZGVidWdfaWQpDQo+ID4gKyAgICAgICAgICAgICAgIF9fZmllbGQoaW50LCBmcm9tX3Byb2Mp DQo+ID4gKyAgICAgICAgICAgICAgIF9fZmllbGQoaW50LCBmcm9tX3RocmVhZCkNCj4gPiArICAg ICAgICAgICAgICAgX19maWVsZChpbnQsIHRvX3Byb2MpDQo+ID4gKyAgICAgICAgICAgICAgIF9f ZmllbGQoaW50LCB0b190aHJlYWQpDQo+ID4gKyAgICAgICAgICAgICAgIF9fZmllbGQodW5zaWdu ZWQgaW50LCBjb2RlKQ0KPiA+ICsgICAgICAgICAgICAgICBfX2ZpZWxkKHVuc2lnbmVkIGludCwg ZmxhZ3MpDQo+ID4gKyAgICAgICAgICAgICAgIF9fZmllbGQodW5zaWduZWQgbG9uZywgc3RhcnRf c2VjKQ0KPiA+ICsgICAgICAgICAgICAgICBfX2ZpZWxkKHVuc2lnbmVkIGxvbmcsIHN0YXJ0X25z ZWMpDQo+ID4gKyAgICAgICApLA0KPiA+ICsgICAgICAgVFBfZmFzdF9hc3NpZ24oDQo+ID4gKyAg ICAgICAgICAgICAgIF9fZW50cnktPmRlYnVnX2lkID0gdC0+ZGVidWdfaWQ7DQo+ID4gKyAgICAg ICAgICAgICAgIF9fZW50cnktPmZyb21fcHJvYyA9IHQtPmZyb20gPyB0LT5mcm9tLT5wcm9jLT5w aWQgOiAwOw0KPiA+ICsgICAgICAgICAgICAgICBfX2VudHJ5LT5mcm9tX3RocmVhZCA9IHQtPmZy b20gPyB0LT5mcm9tLT5waWQgOiAwOw0KPiA+ICsgICAgICAgICAgICAgICBfX2VudHJ5LT50b19w cm9jID0gdC0+dG9fcHJvYyA/IHQtPnRvX3Byb2MtPnBpZCA6IDA7DQo+ID4gKyAgICAgICAgICAg ICAgIF9fZW50cnktPnRvX3RocmVhZCA9IHQtPnRvX3RocmVhZCA/IHQtPnRvX3RocmVhZC0+cGlk IDogMDsNCj4gPiArICAgICAgICAgICAgICAgX19lbnRyeS0+Y29kZSA9IHQtPmNvZGU7DQo+ID4g KyAgICAgICAgICAgICAgIF9fZW50cnktPmZsYWdzID0gdC0+ZmxhZ3M7DQo+ID4gKyNpZmRlZiBD T05GSUdfQklOREVSX1VTRVJfVFJBQ0tJTkcNCj4gPiArICAgICAgICAgICAgICAgX19lbnRyeS0+ c3RhcnRfc2VjID0gdC0+dGltZXN0YW1wLnR2X3NlYzsNCj4gPiArICAgICAgICAgICAgICAgX19l bnRyeS0+c3RhcnRfbnNlYyA9IHQtPnRpbWVzdGFtcC50dl9uc2VjIC8gTlNFQ19QRVJfTVNFQzsN Cj4gPiArI2Vsc2UNCj4gPiArICAgICAgICAgICAgICAgX19lbnRyeS0+c3RhcnRfc2VjID0gMDsN Cj4gPiArICAgICAgICAgICAgICAgX19lbnRyeS0+c3RhcnRfbnNlYyA9IDA7DQo+ID4gKyNlbmRp Zg0KPiA+ICsgICAgICAgKSwNCj4gPiArICAgICAgIFRQX3ByaW50aygidHJhbnNhY3Rpb249JWQg ZnJvbSAlZDolZCB0byAlZDolZCBmbGFncz0weCV4IGNvZGU9MHgleCBzdGFydCAlbHUuJTAzbGQi LA0KPiA+ICsgICAgICAgICAgICAgICAgIF9fZW50cnktPmRlYnVnX2lkLCBfX2VudHJ5LT5mcm9t X3Byb2MsIF9fZW50cnktPmZyb21fdGhyZWFkLA0KPiA+ICsgICAgICAgICAgICAgICAgIF9fZW50 cnktPnRvX3Byb2MsIF9fZW50cnktPnRvX3RocmVhZCwgX19lbnRyeS0+Y29kZSwNCj4gPiArICAg ICAgICAgICAgICAgICBfX2VudHJ5LT5mbGFncywgX19lbnRyeS0+c3RhcnRfc2VjLCBfX2VudHJ5 LT5zdGFydF9uc2VjKQ0KPiA+ICspOw0KPiA+ICsNCj4gPiAgVFJBQ0VfRVZFTlQoYmluZGVyX3Ry YW5zYWN0aW9uLA0KPiA+ICAgICAgICAgVFBfUFJPVE8oYm9vbCByZXBseSwgc3RydWN0IGJpbmRl cl90cmFuc2FjdGlvbiAqdCwNCj4gPiAgICAgICAgICAgICAgICAgIHN0cnVjdCBiaW5kZXJfbm9k ZSAqdGFyZ2V0X25vZGUpLA0KPiA+IC0tDQo+ID4gMS43LjkuNQ0KDQo= 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=-8.2 required=3.0 tests=DKIMWL_WL_HIGH,DKIM_SIGNED, DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI, SIGNED_OFF_BY,SPF_HELO_NONE,SPF_PASS,UNPARSEABLE_RELAY,URIBL_BLOCKED, USER_AGENT_SANE_2 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 94D40C83004 for ; Wed, 29 Apr 2020 08:32:37 +0000 (UTC) Received: from bombadil.infradead.org (bombadil.infradead.org [198.137.202.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 66D3A20731 for ; Wed, 29 Apr 2020 08:32:37 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=lists.infradead.org header.i=@lists.infradead.org header.b="qPc0+m8f"; dkim=fail reason="signature verification failed" (1024-bit key) header.d=mediatek.com header.i=@mediatek.com header.b="Sy8IBUdI" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 66D3A20731 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=mediatek.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20170209; h=Sender: Content-Transfer-Encoding:Content-Type:Cc:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:MIME-Version:References:In-Reply-To: Date:To:From:Subject:Message-ID:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=ZIugr3WDfTOVL4Mo5mYXpzBZigRoQz+mOkcjn39T/4w=; b=qPc0+m8fPrhZRW ZO8H9is9Wtm16cPX5RTDeQke0RR+VhmOKINB7ruDG0f6vg50VymhWYkvmllag4F4WaEv3cCd341my 6Z+WF3Pz2JoLERWp+Y0GFs/2j6D8D1SvzmHyGQHbVTyJdnul9In70ZOpMkYmkX0AP6doPdvMEIHn3 iAfH2f0IlBjsTWI0mTlruDLCDwbqFLiFWH2IFW9zw6aQvZQKCsMciAjfu+NFEnLBtVhGjISGn36Hs hYcmYCk63jmVF1+rr1VRxSKz0p5xb731dwq1wTs+eSxLxKVLeXJi17JXxYnCPBESNQbEPQRk+Th+n DHxTdCr0pA/PwD+ea4GA==; Received: from localhost ([127.0.0.1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.92.3 #3 (Red Hat Linux)) id 1jTi8t-00006a-CJ; Wed, 29 Apr 2020 08:32:31 +0000 Received: from mailgw02.mediatek.com ([216.200.240.185]) by bombadil.infradead.org with esmtps (Exim 4.92.3 #3 (Red Hat Linux)) id 1jTi8o-00004z-H6 for linux-mediatek@lists.infradead.org; Wed, 29 Apr 2020 08:32:29 +0000 X-UUID: b4e7bfdf4650424b880fde440a2ebab1-20200429 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=mediatek.com; s=dk; h=Content-Transfer-Encoding:MIME-Version:Content-Type:References:In-Reply-To:Date:CC:To:From:Subject:Message-ID; bh=qJ1jy0qwf8Wq7qUy2up8n3de2D1QB6639h3RiG9ughQ=; b=Sy8IBUdI8omBmaONAabU7sghSCSECupNW49LapwlqWbG8yG+QUJGhV5H7/DVh2ndYfJnd3Z1tAP2QUTE8QrPbafYEJBeLkkUIBfNToass6y+dxDlVotTinG/tKQJ3asI9HvvUUCGYgGD7TKeX4TrZ9FFNLOmGD7tx69cNee6XXU=; X-UUID: b4e7bfdf4650424b880fde440a2ebab1-20200429 Received: from mtkcas67.mediatek.inc [(172.29.193.45)] by mailgw02.mediatek.com (envelope-from ) (musrelay.mediatek.com ESMTP with TLS) with ESMTP id 372206153; Wed, 29 Apr 2020 00:32:47 -0800 Received: from MTKMBS01N2.mediatek.inc (172.21.101.79) by MTKMBS62DR.mediatek.inc (172.29.94.18) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 29 Apr 2020 01:32:17 -0700 Received: from mtkcas07.mediatek.inc (172.21.101.84) by mtkmbs01n2.mediatek.inc (172.21.101.79) with Microsoft SMTP Server (TLS) id 15.0.1497.2; Wed, 29 Apr 2020 16:32:08 +0800 Received: from [172.21.77.33] (172.21.77.33) by mtkcas07.mediatek.inc (172.21.101.73) with Microsoft SMTP Server id 15.0.1497.2 via Frontend Transport; Wed, 29 Apr 2020 16:32:08 +0800 Message-ID: <1588149130.25566.7.camel@mtkswgap22> Subject: Re: [PATCH v2 1/1] binder: transaction latency tracking for user build From: Frankie Chang To: Todd Kjos Date: Wed, 29 Apr 2020 16:32:10 +0800 In-Reply-To: References: <1586759071.9539.15.camel@mtkswgap22> <1586929044-12708-1-git-send-email-Frankie.Chang@mediatek.com> <1586929044-12708-2-git-send-email-Frankie.Chang@mediatek.com> X-Mailer: Evolution 3.2.3-0ubuntu6 MIME-Version: 1.0 X-TM-SNTS-SMTP: 830316AF110234D77DF04E692EDA7246F6C3B3D407834B4A1439CFE005E961772000:8 X-MTK: N X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20200429_013226_586252_56A58C63 X-CRM114-Status: GOOD ( 29.93 ) X-BeenThere: linux-mediatek@lists.infradead.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Todd Kjos , wsd_upstream , Greg Kroah-Hartman , LKML , Arve =?ISO-8859-1?Q?Hj=F8nnev=E5g?= , Jian-Min Liu , linux-mediatek@lists.infradead.org, Joel Fernandes , Martijn Coenen , Christian Brauner Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Sender: "Linux-mediatek" Errors-To: linux-mediatek-bounces+linux-mediatek=archiver.kernel.org@lists.infradead.org On Wed, 2020-04-15 at 15:25 -0700, Todd Kjos wrote: > On Tue, Apr 14, 2020 at 10:38 PM Frankie Chang > wrote: > > > > Record start/end timestamp to binder transaction. > > s/timestamp to/timestamps for/ > > > When transaction is completed or transaction is free, > > it would be checked if transaction latency over threshold (2 sec), > > Is the 2 sec configurable? Why was 2 sec chosen? Some of modules would trigger timeout NE if their binder transaction don't finish in time, such as audio timeout (5 sec), even BT command timeout (2 sec), etc. Therefore, we want to record these transactions which exceed 2 sec. It could be helpful to debug. > > if yes, printing related information for tracing. > > > > /* Implement details */ > > - Add tracepoint/trace at free transaction. > > Since the original trace_binder_transaction_reveived cannot > > s/reveived/received/ > > > precisely present the real finished time of transaction, adding a > > trace_binder_free_transaction at the point of free transaction > > may be more close to it. > > Can we just add that trace instead? Time limitation of recording is the reason why we don't just use trace here. In some long time stability test, such as MTBF, the exception is caused by a series of transactions interaction. Some abnormal transactions may be pending for a long time ago, they could not be recorded due to buffer limited. > > > > - Add latency tracer module to monitor slow transaction. > > The trace_binder_free_transaction would not be enabled > > by default. Monitoring which transaction is too slow to > > cause some of exceptions is important. So we hook the > > tracepoint to call the monitor function. > > > > - Move some struct from core file to header file. > > Need some struct defined in core file in latency trace module > > In addition, moving structs to header file makes module more > > extendable. > > > > Signed-off-by: Frankie Chang > > --- > > drivers/android/Kconfig | 8 ++ > > drivers/android/Makefile | 1 + > > drivers/android/binder.c | 237 ++++--------------------------- > > drivers/android/binder_internal.h | 227 +++++++++++++++++++++++++++++ > > drivers/android/binder_latency_tracer.c | 100 +++++++++++++ > > drivers/android/binder_trace.h | 36 +++++ > > 6 files changed, 400 insertions(+), 209 deletions(-) > > create mode 100644 drivers/android/binder_latency_tracer.c > > > > diff --git a/drivers/android/Kconfig b/drivers/android/Kconfig > > index 6fdf2ab..7ba80eb 100644 > > --- a/drivers/android/Kconfig > > +++ b/drivers/android/Kconfig > > @@ -54,6 +54,14 @@ config ANDROID_BINDER_IPC_SELFTEST > > exhaustively with combinations of various buffer sizes and > > alignments. > > > > +config BINDER_USER_TRACKING > > + bool "Android Binder transaction tracking" > > + help > > + Used for track abnormal binder transaction which is over 2 seconds, > > + when the transaction is done or be free, this transaction would be > > + checked whether it executed overtime. > > + If yes, printing out the detail info about it. > > + > > endif # if ANDROID > > > > endmenu > > diff --git a/drivers/android/Makefile b/drivers/android/Makefile > > index c9d3d0c9..552e8ac 100644 > > --- a/drivers/android/Makefile > > +++ b/drivers/android/Makefile > > @@ -4,3 +4,4 @@ ccflags-y += -I$(src) # needed for trace events > > obj-$(CONFIG_ANDROID_BINDERFS) += binderfs.o > > obj-$(CONFIG_ANDROID_BINDER_IPC) += binder.o binder_alloc.o > > obj-$(CONFIG_ANDROID_BINDER_IPC_SELFTEST) += binder_alloc_selftest.o > > +obj-$(CONFIG_BINDER_USER_TRACKING) += binder_latency_tracer.o > > diff --git a/drivers/android/binder.c b/drivers/android/binder.c > > index a6b2082..380a68b 100644 > > --- a/drivers/android/binder.c > > +++ b/drivers/android/binder.c > > @@ -160,24 +160,6 @@ static int binder_set_stop_on_user_error(const char *val, > > #define to_binder_fd_array_object(hdr) \ > > container_of(hdr, struct binder_fd_array_object, hdr) > > > > -enum binder_stat_types { > > - BINDER_STAT_PROC, > > - BINDER_STAT_THREAD, > > - BINDER_STAT_NODE, > > - BINDER_STAT_REF, > > - BINDER_STAT_DEATH, > > - BINDER_STAT_TRANSACTION, > > - BINDER_STAT_TRANSACTION_COMPLETE, > > - BINDER_STAT_COUNT > > -}; > > - > > -struct binder_stats { > > - atomic_t br[_IOC_NR(BR_FAILED_REPLY) + 1]; > > - atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1]; > > - atomic_t obj_created[BINDER_STAT_COUNT]; > > - atomic_t obj_deleted[BINDER_STAT_COUNT]; > > -}; > > - > > static struct binder_stats binder_stats; > > > > static inline void binder_stats_deleted(enum binder_stat_types type) > > @@ -214,32 +196,6 @@ static struct binder_transaction_log_entry *binder_transaction_log_add( > > } > > > > /** > > - * struct binder_work - work enqueued on a worklist > > - * @entry: node enqueued on list > > - * @type: type of work to be performed > > - * > > - * There are separate work lists for proc, thread, and node (async). > > - */ > > -struct binder_work { > > - struct list_head entry; > > - > > - enum { > > - BINDER_WORK_TRANSACTION = 1, > > - BINDER_WORK_TRANSACTION_COMPLETE, > > - BINDER_WORK_RETURN_ERROR, > > - BINDER_WORK_NODE, > > - BINDER_WORK_DEAD_BINDER, > > - BINDER_WORK_DEAD_BINDER_AND_CLEAR, > > - BINDER_WORK_CLEAR_DEATH_NOTIFICATION, > > - } type; > > -}; > > - > > -struct binder_error { > > - struct binder_work work; > > - uint32_t cmd; > > -}; > > - > > -/** > > * struct binder_node - binder node bookkeeping > > * @debug_id: unique ID for debugging > > * (invariant after initialized) > > Please, if we must have a binder_internal.h for the key data > structures, then move them all. > The use of structs by transaction latency stuff shouldn't be the > rationale for what moves and > what stays. binder_proc, binder_node, binder_thread etc should be defined > in the same file. Okay, we will move all structs to binder_internal.h to make them defined in same file, thanks. > > @@ -402,89 +358,6 @@ enum binder_deferred_state { > > BINDER_DEFERRED_RELEASE = 0x02, > > }; > > > > -/** > > - * struct binder_proc - binder process bookkeeping > > - * @proc_node: element for binder_procs list > > - * @threads: rbtree of binder_threads in this proc > > - * (protected by @inner_lock) > > - * @nodes: rbtree of binder nodes associated with > > - * this proc ordered by node->ptr > > - * (protected by @inner_lock) > > - * @refs_by_desc: rbtree of refs ordered by ref->desc > > - * (protected by @outer_lock) > > - * @refs_by_node: rbtree of refs ordered by ref->node > > - * (protected by @outer_lock) > > - * @waiting_threads: threads currently waiting for proc work > > - * (protected by @inner_lock) > > - * @pid PID of group_leader of process > > - * (invariant after initialized) > > - * @tsk task_struct for group_leader of process > > - * (invariant after initialized) > > - * @deferred_work_node: element for binder_deferred_list > > - * (protected by binder_deferred_lock) > > - * @deferred_work: bitmap of deferred work to perform > > - * (protected by binder_deferred_lock) > > - * @is_dead: process is dead and awaiting free > > - * when outstanding transactions are cleaned up > > - * (protected by @inner_lock) > > - * @todo: list of work for this process > > - * (protected by @inner_lock) > > - * @stats: per-process binder statistics > > - * (atomics, no lock needed) > > - * @delivered_death: list of delivered death notification > > - * (protected by @inner_lock) > > - * @max_threads: cap on number of binder threads > > - * (protected by @inner_lock) > > - * @requested_threads: number of binder threads requested but not > > - * yet started. In current implementation, can > > - * only be 0 or 1. > > - * (protected by @inner_lock) > > - * @requested_threads_started: number binder threads started > > - * (protected by @inner_lock) > > - * @tmp_ref: temporary reference to indicate proc is in use > > - * (protected by @inner_lock) > > - * @default_priority: default scheduler priority > > - * (invariant after initialized) > > - * @debugfs_entry: debugfs node > > - * @alloc: binder allocator bookkeeping > > - * @context: binder_context for this proc > > - * (invariant after initialized) > > - * @inner_lock: can nest under outer_lock and/or node lock > > - * @outer_lock: no nesting under innor or node lock > > - * Lock order: 1) outer, 2) node, 3) inner > > - * @binderfs_entry: process-specific binderfs log file > > - * > > - * Bookkeeping structure for binder processes > > - */ > > -struct binder_proc { > > - struct hlist_node proc_node; > > - struct rb_root threads; > > - struct rb_root nodes; > > - struct rb_root refs_by_desc; > > - struct rb_root refs_by_node; > > - struct list_head waiting_threads; > > - int pid; > > - struct task_struct *tsk; > > - struct hlist_node deferred_work_node; > > - int deferred_work; > > - bool is_dead; > > - > > - struct list_head todo; > > - struct binder_stats stats; > > - struct list_head delivered_death; > > - int max_threads; > > - int requested_threads; > > - int requested_threads_started; > > - int tmp_ref; > > - long default_priority; > > - struct dentry *debugfs_entry; > > - struct binder_alloc alloc; > > - struct binder_context *context; > > - spinlock_t inner_lock; > > - spinlock_t outer_lock; > > - struct dentry *binderfs_entry; > > -}; > > - > > enum { > > BINDER_LOOPER_STATE_REGISTERED = 0x01, > > BINDER_LOOPER_STATE_ENTERED = 0x02, > > @@ -495,60 +368,6 @@ enum { > > }; > > > > /** > > - * struct binder_thread - binder thread bookkeeping > > - * @proc: binder process for this thread > > - * (invariant after initialization) > > - * @rb_node: element for proc->threads rbtree > > - * (protected by @proc->inner_lock) > > - * @waiting_thread_node: element for @proc->waiting_threads list > > - * (protected by @proc->inner_lock) > > - * @pid: PID for this thread > > - * (invariant after initialization) > > - * @looper: bitmap of looping state > > - * (only accessed by this thread) > > - * @looper_needs_return: looping thread needs to exit driver > > - * (no lock needed) > > - * @transaction_stack: stack of in-progress transactions for this thread > > - * (protected by @proc->inner_lock) > > - * @todo: list of work to do for this thread > > - * (protected by @proc->inner_lock) > > - * @process_todo: whether work in @todo should be processed > > - * (protected by @proc->inner_lock) > > - * @return_error: transaction errors reported by this thread > > - * (only accessed by this thread) > > - * @reply_error: transaction errors reported by target thread > > - * (protected by @proc->inner_lock) > > - * @wait: wait queue for thread work > > - * @stats: per-thread statistics > > - * (atomics, no lock needed) > > - * @tmp_ref: temporary reference to indicate thread is in use > > - * (atomic since @proc->inner_lock cannot > > - * always be acquired) > > - * @is_dead: thread is dead and awaiting free > > - * when outstanding transactions are cleaned up > > - * (protected by @proc->inner_lock) > > - * > > - * Bookkeeping structure for binder threads. > > - */ > > -struct binder_thread { > > - struct binder_proc *proc; > > - struct rb_node rb_node; > > - struct list_head waiting_thread_node; > > - int pid; > > - int looper; /* only modified by this thread */ > > - bool looper_need_return; /* can be written by other thread */ > > - struct binder_transaction *transaction_stack; > > - struct list_head todo; > > - bool process_todo; > > - struct binder_error return_error; > > - struct binder_error reply_error; > > - wait_queue_head_t wait; > > - struct binder_stats stats; > > - atomic_t tmp_ref; > > - bool is_dead; > > -}; > > - > > -/** > > * struct binder_txn_fd_fixup - transaction fd fixup list element > > * @fixup_entry: list entry > > * @file: struct file to be associated with new fd > > @@ -565,34 +384,6 @@ struct binder_txn_fd_fixup { > > size_t offset; > > }; > > > > > > extra empty line? > > > -struct binder_transaction { > > - int debug_id; > > - struct binder_work work; > > - struct binder_thread *from; > > - struct binder_transaction *from_parent; > > - struct binder_proc *to_proc; > > - struct binder_thread *to_thread; > > - struct binder_transaction *to_parent; > > - unsigned need_reply:1; > > - /* unsigned is_dead:1; */ /* not used at the moment */ > > - > > - struct binder_buffer *buffer; > > - unsigned int code; > > - unsigned int flags; > > - long priority; > > - long saved_priority; > > - kuid_t sender_euid; > > - struct list_head fd_fixups; > > - binder_uintptr_t security_ctx; > > - /** > > - * @lock: protects @from, @to_proc, and @to_thread > > - * > > - * @from, @to_proc, and @to_thread can be set to NULL > > - * during thread teardown > > - */ > > - spinlock_t lock; > > -}; > > - > > /** > > * struct binder_object - union of flat binder object types > > * @hdr: generic object header > > @@ -613,6 +404,26 @@ struct binder_object { > > }; > > }; > > > > +static void (*__binder_update_info_cb)(struct binder_transaction *t, > > + struct binder_transaction_log_entry *e); > > + > > +void set_binder_update_info_cb(void (*fn)(struct binder_transaction *t, > > + struct binder_transaction_log_entry *e)) > > +{ > > + __binder_update_info_cb = fn; > > +} > > +EXPORT_SYMBOL_GPL(set_binder_update_info_cb); > > + > > +static void (*__print_transaction_ext_cb)(struct seq_file *m, > > + struct binder_transaction *t); > > + > > +void set_print_transaction_ext_cb(void (*fn)(struct seq_file *m, > > + struct binder_transaction *t)) > > +{ > > + __print_transaction_ext_cb = fn; > > +} > > +EXPORT_SYMBOL_GPL(set_print_transaction_ext_cb); > > Why can't we use tracepoints (not trace events) for this instead of > custom registration functions? You can attach to the tracepoint with > register_trace_* lets a module register to be called to handle the > tracepoint as Joel pointed out. Yes, we will use tracepoints instead of custom registration functions in next version patch, thanks. > > + > > /** > > * binder_proc_lock() - Acquire outer lock for given binder_proc > > * @proc: struct binder_proc to acquire > > @@ -1927,6 +1738,7 @@ static void binder_free_transaction(struct binder_transaction *t) > > * If the transaction has no target_proc, then > > * t->buffer->transaction has already been cleared. > > */ > > + trace_binder_free_transaction(t); > > binder_free_txn_fixups(t); > > kfree(t); > > binder_stats_deleted(BINDER_STAT_TRANSACTION); > > @@ -2874,6 +2686,7 @@ static void binder_transaction(struct binder_proc *proc, > > e->offsets_size = tr->offsets_size; > > strscpy(e->context_name, proc->context->name, BINDERFS_MAX_NAME); > > > > + > > why 2 empty lines? > > > if (reply) { > > binder_inner_proc_lock(proc); > > in_reply_to = thread->transaction_stack; > > @@ -3060,6 +2873,9 @@ static void binder_transaction(struct binder_proc *proc, > > return_error_line = __LINE__; > > goto err_alloc_t_failed; > > } > > + > > + if (__binder_update_info_cb) > > + __binder_update_info_cb(t, e); > > This should be a tracepoint that your module can attach to with > register_trace_binder_update_info(...) > > > INIT_LIST_HEAD(&t->fd_fixups); > > binder_stats_created(BINDER_STAT_TRANSACTION); > > spin_lock_init(&t->lock); > > @@ -3498,6 +3314,7 @@ static void binder_transaction(struct binder_proc *proc, > > kfree(tcomplete); > > binder_stats_deleted(BINDER_STAT_TRANSACTION_COMPLETE); > > err_alloc_tcomplete_failed: > > + trace_binder_free_transaction(t); > > kfree(t); > > binder_stats_deleted(BINDER_STAT_TRANSACTION); > > err_alloc_t_failed: > > @@ -5547,6 +5364,8 @@ static void print_binder_transaction_ilocked(struct seq_file *m, > > t->to_thread ? t->to_thread->pid : 0, > > t->code, t->flags, t->priority, t->need_reply); > > spin_unlock(&t->lock); > > + if (__print_transaction_ext_cb) > > + __print_transaction_ext_cb(m, t); > > same here. > > > > > if (proc != to_proc) { > > /* > > diff --git a/drivers/android/binder_internal.h b/drivers/android/binder_internal.h > > index ae99109..86b4960 100644 > > --- a/drivers/android/binder_internal.h > > +++ b/drivers/android/binder_internal.h > > @@ -12,6 +12,11 @@ > > #include > > #include > > > > +#ifdef CONFIG_BINDER_USER_TRACKING > > +#include > > +#include > > +#endif > > + > > struct binder_context { > > struct binder_node *binder_context_mgr_node; > > struct mutex context_mgr_node_lock; > > @@ -131,6 +136,10 @@ struct binder_transaction_log_entry { > > uint32_t return_error; > > uint32_t return_error_param; > > char context_name[BINDERFS_MAX_NAME + 1]; > > +#ifdef CONFIG_BINDER_USER_TRACKING > > + struct timespec timestamp; > > + struct timeval tv; > > +#endif > > }; > > > > struct binder_transaction_log { > > @@ -139,6 +148,224 @@ struct binder_transaction_log { > > struct binder_transaction_log_entry entry[32]; > > }; > > > > +enum binder_stat_types { > > + BINDER_STAT_PROC, > > + BINDER_STAT_THREAD, > > + BINDER_STAT_NODE, > > + BINDER_STAT_REF, > > + BINDER_STAT_DEATH, > > + BINDER_STAT_TRANSACTION, > > + BINDER_STAT_TRANSACTION_COMPLETE, > > + BINDER_STAT_COUNT > > +}; > > + > > +struct binder_stats { > > + atomic_t br[_IOC_NR(BR_FAILED_REPLY) + 1]; > > + atomic_t bc[_IOC_NR(BC_REPLY_SG) + 1]; > > + atomic_t obj_created[BINDER_STAT_COUNT]; > > + atomic_t obj_deleted[BINDER_STAT_COUNT]; > > +}; > > + > > +/** > > + * struct binder_work - work enqueued on a worklist > > + * @entry: node enqueued on list > > + * @type: type of work to be performed > > + * > > + * There are separate work lists for proc, thread, and node (async). > > + */ > > +struct binder_work { > > + struct list_head entry; > > + > > + enum { > > + BINDER_WORK_TRANSACTION = 1, > > + BINDER_WORK_TRANSACTION_COMPLETE, > > + BINDER_WORK_RETURN_ERROR, > > + BINDER_WORK_NODE, > > + BINDER_WORK_DEAD_BINDER, > > + BINDER_WORK_DEAD_BINDER_AND_CLEAR, > > + BINDER_WORK_CLEAR_DEATH_NOTIFICATION, > > + } type; > > +}; > > + > > +struct binder_error { > > + struct binder_work work; > > + uint32_t cmd; > > +}; > > + > > +/** > > + * struct binder_proc - binder process bookkeeping > > + * @proc_node: element for binder_procs list > > + * @threads: rbtree of binder_threads in this proc > > + * (protected by @inner_lock) > > + * @nodes: rbtree of binder nodes associated with > > + * this proc ordered by node->ptr > > + * (protected by @inner_lock) > > + * @refs_by_desc: rbtree of refs ordered by ref->desc > > + * (protected by @outer_lock) > > + * @refs_by_node: rbtree of refs ordered by ref->node > > + * (protected by @outer_lock) > > + * @waiting_threads: threads currently waiting for proc work > > + * (protected by @inner_lock) > > + * @pid PID of group_leader of process > > + * (invariant after initialized) > > + * @tsk task_struct for group_leader of process > > + * (invariant after initialized) > > + * @deferred_work_node: element for binder_deferred_list > > + * (protected by binder_deferred_lock) > > + * @deferred_work: bitmap of deferred work to perform > > + * (protected by binder_deferred_lock) > > + * @is_dead: process is dead and awaiting free > > + * when outstanding transactions are cleaned up > > + * (protected by @inner_lock) > > + * @todo: list of work for this process > > + * (protected by @inner_lock) > > + * @stats: per-process binder statistics > > + * (atomics, no lock needed) > > + * @delivered_death: list of delivered death notification > > + * (protected by @inner_lock) > > + * @max_threads: cap on number of binder threads > > + * (protected by @inner_lock) > > + * @requested_threads: number of binder threads requested but not > > + * yet started. In current implementation, can > > + * only be 0 or 1. > > + * (protected by @inner_lock) > > + * @requested_threads_started: number binder threads started > > + * (protected by @inner_lock) > > + * @tmp_ref: temporary reference to indicate proc is in use > > + * (protected by @inner_lock) > > + * @default_priority: default scheduler priority > > + * (invariant after initialized) > > + * @debugfs_entry: debugfs node > > + * @alloc: binder allocator bookkeeping > > + * @context: binder_context for this proc > > + * (invariant after initialized) > > + * @inner_lock: can nest under outer_lock and/or node lock > > + * @outer_lock: no nesting under innor or node lock > > + * Lock order: 1) outer, 2) node, 3) inner > > + * @binderfs_entry: process-specific binderfs log file > > + * > > + * Bookkeeping structure for binder processes > > + */ > > +struct binder_proc { > > + struct hlist_node proc_node; > > + struct rb_root threads; > > + struct rb_root nodes; > > + struct rb_root refs_by_desc; > > + struct rb_root refs_by_node; > > + struct list_head waiting_threads; > > + int pid; > > + struct task_struct *tsk; > > + struct hlist_node deferred_work_node; > > + int deferred_work; > > + bool is_dead; > > + > > + struct list_head todo; > > + struct binder_stats stats; > > + struct list_head delivered_death; > > + int max_threads; > > + int requested_threads; > > + int requested_threads_started; > > + int tmp_ref; > > + long default_priority; > > + struct dentry *debugfs_entry; > > + struct binder_alloc alloc; > > + struct binder_context *context; > > + spinlock_t inner_lock; > > + spinlock_t outer_lock; > > + struct dentry *binderfs_entry; > > +}; > > + > > +/** > > + * struct binder_thread - binder thread bookkeeping > > + * @proc: binder process for this thread > > + * (invariant after initialization) > > + * @rb_node: element for proc->threads rbtree > > + * (protected by @proc->inner_lock) > > + * @waiting_thread_node: element for @proc->waiting_threads list > > + * (protected by @proc->inner_lock) > > + * @pid: PID for this thread > > + * (invariant after initialization) > > + * @looper: bitmap of looping state > > + * (only accessed by this thread) > > + * @looper_needs_return: looping thread needs to exit driver > > + * (no lock needed) > > + * @transaction_stack: stack of in-progress transactions for this thread > > + * (protected by @proc->inner_lock) > > + * @todo: list of work to do for this thread > > + * (protected by @proc->inner_lock) > > + * @process_todo: whether work in @todo should be processed > > + * (protected by @proc->inner_lock) > > + * @return_error: transaction errors reported by this thread > > + * (only accessed by this thread) > > + * @reply_error: transaction errors reported by target thread > > + * (protected by @proc->inner_lock) > > + * @wait: wait queue for thread work > > + * @stats: per-thread statistics > > + * (atomics, no lock needed) > > + * @tmp_ref: temporary reference to indicate thread is in use > > + * (atomic since @proc->inner_lock cannot > > + * always be acquired) > > + * @is_dead: thread is dead and awaiting free > > + * when outstanding transactions are cleaned up > > + * (protected by @proc->inner_lock) > > + * > > + * Bookkeeping structure for binder threads. > > + */ > > +struct binder_thread { > > + struct binder_proc *proc; > > + struct rb_node rb_node; > > + struct list_head waiting_thread_node; > > + int pid; > > + int looper; /* only modified by this thread */ > > + bool looper_need_return; /* can be written by other thread */ > > + struct binder_transaction *transaction_stack; > > + struct list_head todo; > > + bool process_todo; > > + struct binder_error return_error; > > + struct binder_error reply_error; > > + wait_queue_head_t wait; > > + struct binder_stats stats; > > + atomic_t tmp_ref; > > + bool is_dead; > > +}; > > + > > +struct binder_transaction { > > + int debug_id; > > + struct binder_work work; > > + struct binder_thread *from; > > + struct binder_transaction *from_parent; > > + struct binder_proc *to_proc; > > + struct binder_thread *to_thread; > > + struct binder_transaction *to_parent; > > + unsigned need_reply:1; > > + /* unsigned is_dead:1; */ /* not used at the moment */ > > + > > + struct binder_buffer *buffer; > > + unsigned int code; > > + unsigned int flags; > > + long priority; > > + long saved_priority; > > + kuid_t sender_euid; > > + struct list_head fd_fixups; > > + binder_uintptr_t security_ctx; > > + /** > > + * @lock: protects @from, @to_proc, and @to_thread > > + * > > + * @from, @to_proc, and @to_thread can be set to NULL > > + * during thread teardown > > + */ > > + spinlock_t lock; > > +#ifdef CONFIG_BINDER_USER_TRACKING > > + struct timespec timestamp; > > + struct timeval tv; > > +#endif > > +}; > > + > > extern struct binder_transaction_log binder_transaction_log; > > extern struct binder_transaction_log binder_transaction_log_failed; > > + > > +extern void set_binder_update_info_cb(void (*fn)(struct binder_transaction *t, > > + struct binder_transaction_log_entry *e)); > > +extern void set_print_transaction_ext_cb(void (*fn)(struct seq_file *m, > > + struct binder_transaction *t)); > > #endif /* _LINUX_BINDER_INTERNAL_H */ > > diff --git a/drivers/android/binder_latency_tracer.c b/drivers/android/binder_latency_tracer.c > > new file mode 100644 > > index 0000000..c9626f5 > > --- /dev/null > > +++ b/drivers/android/binder_latency_tracer.c > > @@ -0,0 +1,100 @@ > > +// SPDX-License-Identifier: GPL-2.0 > > +/* > > + * Copyright (C) 2019 MediaTek Inc. > > + */ > > + > > +#include > > +#include > > +#include "binder_alloc.h" > > +#include "binder_internal.h" > > +#include "binder_trace.h" > > + > > +/* > > + * probe_binder_free_transaction - Output info of a delay transaction > > + * @t: pointer to the over-time transaction > > + */ > > +void probe_binder_free_transaction(void *ignore, struct binder_transaction *t) > > +{ > > + struct rtc_time tm; > > + struct timespec *startime; > > + struct timespec cur, sub_t; > > + > > + ktime_get_ts(&cur); > > + startime = &t->timestamp; > > + sub_t = timespec_sub(cur, *startime); > > + > > + /* if transaction time is over than 2 sec, > > + * show timeout warning log. > > + */ > > + if (sub_t.tv_sec < 2) > > + return; > > + > > + rtc_time_to_tm(t->tv.tv_sec, &tm); > > + > > + spin_lock(&t->lock); > > + pr_info_ratelimited("%d: from %d:%d to %d:%d", > > + t->debug_id, > > + t->from ? t->from->proc->pid : 0, > > + t->from ? t->from->pid : 0, > > + t->to_proc ? t->to_proc->pid : 0, > > + t->to_thread ? t->to_thread->pid : 0); > > + spin_unlock(&t->lock); > > + > > + pr_info_ratelimited(" total %u.%03ld s code %u start %lu.%03ld android %d-%02d-%02d %02d:%02d:%02d.%03lu\n", > > + (unsigned int)sub_t.tv_sec, > > + (sub_t.tv_nsec / NSEC_PER_MSEC), > > + t->code, > > + (unsigned long)startime->tv_sec, > > + (startime->tv_nsec / NSEC_PER_MSEC), > > + (tm.tm_year + 1900), (tm.tm_mon + 1), tm.tm_mday, > > + tm.tm_hour, tm.tm_min, tm.tm_sec, > > + (unsigned long)(t->tv.tv_usec / USEC_PER_MSEC)); > > +} > > + > > +static void binder_update_info_cb(struct binder_transaction *t, > > + struct binder_transaction_log_entry *e) > > +{ > > + ktime_get_ts(&e->timestamp); > > + do_gettimeofday(&e->tv); > > + e->tv.tv_sec -= (sys_tz.tz_minuteswest * 60); > > + memcpy(&t->timestamp, &e->timestamp, sizeof(struct timespec)); > > + memcpy(&t->tv, &e->tv, sizeof(struct timeval)); > > +} > > + > > +static void print_binder_transaction_ext(struct seq_file *m, > > + struct binder_transaction *t) > > +{ > > + struct rtc_time tm; > > + > > + rtc_time_to_tm(t->tv.tv_sec, &tm); > > + seq_printf(m, > > + " start %lu.%06lu android %d-%02d-%02d %02d:%02d:%02d.%03lu", > > + (unsigned long)t->timestamp.tv_sec, > > + (t->timestamp.tv_nsec / NSEC_PER_USEC), > > + (tm.tm_year + 1900), (tm.tm_mon + 1), tm.tm_mday, > > + tm.tm_hour, tm.tm_min, tm.tm_sec, > > + (unsigned long)(t->tv.tv_usec / USEC_PER_MSEC)); > > + > > +} > > + > > +static int __init init_binder_latency_tracer(void) > > +{ > > + register_trace_binder_free_transaction( > > + probe_binder_free_transaction, NULL); > > + > > + set_binder_update_info_cb(binder_update_info_cb); > > + set_print_transaction_ext_cb(print_binder_transaction_ext); > > + return 0; > > +} > > + > > +static void exit_binder_latency_tracer(void) > > +{ > > + unregister_trace_binder_free_transaction( > > + probe_binder_free_transaction, NULL); > > +} > > + > > +module_init(init_binder_latency_tracer); > > +module_exit(exit_binder_latency_tracer); > > + > > +MODULE_LICENSE("GPL v2"); > > + > > diff --git a/drivers/android/binder_trace.h b/drivers/android/binder_trace.h > > index 6731c3c..c7c76c1 100644 > > --- a/drivers/android/binder_trace.h > > +++ b/drivers/android/binder_trace.h > > @@ -95,6 +95,42 @@ > > __entry->thread_todo) > > ); > > > > +TRACE_EVENT(binder_free_transaction, > > + TP_PROTO(struct binder_transaction *t), > > + TP_ARGS(t), > > + TP_STRUCT__entry( > > + __field(int, debug_id) > > + __field(int, from_proc) > > + __field(int, from_thread) > > + __field(int, to_proc) > > + __field(int, to_thread) > > + __field(unsigned int, code) > > + __field(unsigned int, flags) > > + __field(unsigned long, start_sec) > > + __field(unsigned long, start_nsec) > > + ), > > + TP_fast_assign( > > + __entry->debug_id = t->debug_id; > > + __entry->from_proc = t->from ? t->from->proc->pid : 0; > > + __entry->from_thread = t->from ? t->from->pid : 0; > > + __entry->to_proc = t->to_proc ? t->to_proc->pid : 0; > > + __entry->to_thread = t->to_thread ? t->to_thread->pid : 0; > > + __entry->code = t->code; > > + __entry->flags = t->flags; > > +#ifdef CONFIG_BINDER_USER_TRACKING > > + __entry->start_sec = t->timestamp.tv_sec; > > + __entry->start_nsec = t->timestamp.tv_nsec / NSEC_PER_MSEC; > > +#else > > + __entry->start_sec = 0; > > + __entry->start_nsec = 0; > > +#endif > > + ), > > + TP_printk("transaction=%d from %d:%d to %d:%d flags=0x%x code=0x%x start %lu.%03ld", > > + __entry->debug_id, __entry->from_proc, __entry->from_thread, > > + __entry->to_proc, __entry->to_thread, __entry->code, > > + __entry->flags, __entry->start_sec, __entry->start_nsec) > > +); > > + > > TRACE_EVENT(binder_transaction, > > TP_PROTO(bool reply, struct binder_transaction *t, > > struct binder_node *target_node), > > -- > > 1.7.9.5 _______________________________________________ Linux-mediatek mailing list Linux-mediatek@lists.infradead.org http://lists.infradead.org/mailman/listinfo/linux-mediatek