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 Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.lore.kernel.org (Postfix) with ESMTPS id 25CEAC433F5 for ; Tue, 12 Apr 2022 12:52:39 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id B14CD40469; Tue, 12 Apr 2022 12:52:38 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id 98oqR6_NjA-J; Tue, 12 Apr 2022 12:52:37 +0000 (UTC) Received: from lists.linuxfoundation.org (lf-lists.osuosl.org [140.211.9.56]) by smtp2.osuosl.org (Postfix) with ESMTPS id 1108F40189; Tue, 12 Apr 2022 12:52:36 +0000 (UTC) Received: from lf-lists.osuosl.org (localhost [127.0.0.1]) by lists.linuxfoundation.org (Postfix) with ESMTP id D6FE3C0033; Tue, 12 Apr 2022 12:52:36 +0000 (UTC) Received: from smtp2.osuosl.org (smtp2.osuosl.org [140.211.166.133]) by lists.linuxfoundation.org (Postfix) with ESMTP id B396FC002C for ; Tue, 12 Apr 2022 12:52:35 +0000 (UTC) Received: from localhost (localhost [127.0.0.1]) by smtp2.osuosl.org (Postfix) with ESMTP id 8EBBE40189 for ; Tue, 12 Apr 2022 12:52:35 +0000 (UTC) X-Virus-Scanned: amavisd-new at osuosl.org Received: from smtp2.osuosl.org ([127.0.0.1]) by localhost (smtp2.osuosl.org [127.0.0.1]) (amavisd-new, port 10024) with ESMTP id lvUFYrMUIWF7 for ; Tue, 12 Apr 2022 12:52:33 +0000 (UTC) X-Greylist: domain auto-whitelisted by SQLgrey-1.8.0 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by smtp2.osuosl.org (Postfix) with ESMTPS id 5AF554036A for ; Tue, 12 Apr 2022 12:52:33 +0000 (UTC) Received: from canpemm500009.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Kd5Dc3LfTzgYWT; Tue, 12 Apr 2022 20:50:40 +0800 (CST) Received: from [10.67.102.169] (10.67.102.169) by canpemm500009.china.huawei.com (7.192.105.203) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Tue, 12 Apr 2022 20:52:28 +0800 Subject: Re: [PATCH v7 2/7] hwtracing: Add trace function support for HiSilicon PCIe Tune and Trace device To: John Garry , Yicong Yang , , , , , , , , , , , , , , , , , , , , , , , , References: <20220407125841.3678-1-yangyicong@hisilicon.com> <20220407125841.3678-3-yangyicong@hisilicon.com> <36eea2f6-3461-72ad-05c4-953484197911@huawei.com> <60159327-7b6c-38cc-97a9-bb4c594b494f@huawei.com> <49b24812-dafc-4ff9-a79b-07d1e2c6364b@huawei.com> Message-ID: Date: Tue, 12 Apr 2022 20:52:28 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: <49b24812-dafc-4ff9-a79b-07d1e2c6364b@huawei.com> X-Originating-IP: [10.67.102.169] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To canpemm500009.china.huawei.com (7.192.105.203) X-CFilter-Loop: Reflected Cc: zhangshaokun@hisilicon.com, liuqi115@huawei.com, linuxarm@huawei.com, prime.zeng@huawei.com X-BeenThere: iommu@lists.linux-foundation.org X-Mailman-Version: 2.1.15 Precedence: list List-Id: Development issues for Linux IOMMU support List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , From: Yicong Yang via iommu Reply-To: Yicong Yang Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: iommu-bounces@lists.linux-foundation.org Sender: "iommu" T24gMjAyMi80LzEyIDE2OjM5LCBKb2huIEdhcnJ5IHdyb3RlOgo+Pj4+ICtzdGF0aWMgaW50IGhp c2lfcHR0X2FsbG9jX3RyYWNlX2J1ZihzdHJ1Y3QgaGlzaV9wdHQgKmhpc2lfcHR0KQo+Pj4+ICt7 Cj4+Pj4gK8KgwqDCoCBzdHJ1Y3QgaGlzaV9wdHRfdHJhY2VfY3RybCAqY3RybCA9ICZoaXNpX3B0 dC0+dHJhY2VfY3RybDsKPj4+PiArwqDCoMKgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICZoaXNpX3B0 dC0+cGRldi0+ZGV2Owo+Pj4+ICvCoMKgwqAgaW50IGk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaGlz aV9wdHQtPnRyYWNlX2N0cmwuYnVmX2luZGV4ID0gMDsKPj4+PiArCj4+Pj4gK8KgwqDCoCAvKiBJ ZiB0aGUgdHJhY2UgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCB6ZXJvIGl0LiAq Lwo+Pj4KPj4+IEkgYW0gbm90IHN1cmUgd2h5IHRoaXMgaXMgbm90IGNhbGxlZCBmcm9tIHRoZSBw cm9iZQo+Pj4KPj4KPj4gVGhlIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgd2hlbiBuZWNlc3Nh cnkgYXMgZHJpdmVyIHdpbGwgcHJvYmUgdGhlIGRldmljZSBvbiBib290aW5nIGJ1dAo+PiB0aGUg dXNlciBtYXkgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNvbmRpdGlvbiBpdCdzIGEgd2FzdGUgb2Yg bWVtb3J5IGlmIHdlIGFsbG9jYXRlIHRoZSBidWZmZXJzCj4+IGluIHByb2JlLiBDdXJyZW50bHkg d2UnbGwgYWxsb2NhdGUgMTZNIG1lbW9yeSBmb3IgNCBidWZmZXJzLgo+Pgo+IAo+IEJ1dCB0aGF0 J3MganVzdCBub3QgaG93IHdlIGRvIHRoaW5ncy4gV2Ugc2V0dXAgdGhlIGRyaXZlciBmdWxseSB0 byBiZSB1c2VkIGluIHRoZSBwcm9iZS4gSWYgdGhlIHVzZXIgY2Fubm90IHJlYWxseSBhZmZvcmQg dGhlIG1lbW9yeSB0aGVuIGhlL3NoZSBzaG91bGQgbm90IGxvYWQgdGhlIGRyaXZlci4KPiAKCkkg dGhpbmsgaW4gbW9zdCB0aW1lIHVzZXIgZG9uJ3QgbmVlZCB0byBtYW51YWxseSBsb2FkIHRoZSBk cml2ZXIgYmVjYXVzZSBvZiB1ZGV2LgoKPiBJbiBhZGRpdGlvbiwgdGhpcyBkcml2ZXIgd291bGQg YmUgdXNlZCBpbiBhIG1hY2hpbmUgd2hpY2ggd2lsbCBoYXZlIGdpZ2J5dGVzIG9mIG1lbW9yeSwg c28gSSB0aGluayB0aGF0IHRoZSBtZW1vcnkgbWVudGlvbmVkIGhlcmUgaXMgcmVsYXRpdmVseSBp bnNpZ25pZmljYW50Lgo+IAoKb2ssIHllcyBpdCdsbCBiZSB1c2VkIGluIHRoZSBzZXJ2ZXIgc28g dGhlIG1lbW9yeSB3aWxsIGJlIGVub3VnaCBpbiBtb3N0IHRpbWUuIGNvbnNpZGVyaW5nIHRoaXMg bWF5YmUgaXQncyBwcm9wZXIgdG8gbW92ZSB0aGUgYnVmZmVyIGFsbG9jYXRpb24gYW5kIHRoZSBj b25maWd1cmF0aW9uIHRvIHRoZSBkcml2ZXIgcHJvYmUgdGhlbi4KCj4+IFNvIHRoaXMgZnVuY3Rp b24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYmVmb3JlIHdlIHN0YXJ0IHRyYWNlLiBJbiB0aGUgZmly c3QgdGltZSBpdCB3aWxsIGFsbG9jYXRlCj4+IHRoZSBETUEgYnVmZmVycyBhbmQgaXQgdGhlIG90 aGVyIHRpbWVzIGl0IGp1c3QgemVybyB0aGUgYnVmZmVycyB0byBjbGVhciB0aGUgZGF0YSBvZiBs YXN0IHRpbWUuCj4+Cj4+Pj4gK8KgwqDCoCBpZiAoY3RybC0+dHJhY2VfYnVmKSB7Cj4+Pj4gK8Kg wqDCoMKgwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBISVNJX1BUVF9UUkFDRV9CVUZfQ05UOyBpKysp Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWVtc2V0KGN0cmwtPnRyYWNlX2J1ZltpXS5h ZGRyLCAwLCBISVNJX1BUVF9UUkFDRV9CVUZfU0laRSk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJl dHVybiAwOwo+Pj4+ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIGN0cmwtPnRyYWNlX2J1 ZiA9IGRldm1fa2NhbGxvYyhkZXYsIEhJU0lfUFRUX1RSQUNFX0JVRl9DTlQsCj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZihzdHJ1Y3QgaGlz aV9wdHRfZG1hX2J1ZmZlciksIEdGUF9LRVJORUwpOwo+Pj4KPj4+IHNpemVvZigqY3RybC0+dHJh Y2VfYnVmKSBtYXkgYmUgYmV0dGVyCj4+Pgo+Pgo+PiBvay4KPj4KPj4+PiArwqDCoMKgIGlmICgh Y3RybC0+dHJhY2VfYnVmKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4+ PiArCj4+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgSElTSV9QVFRfVFJBQ0VfQlVGX0NOVDsg KytpKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGN0cmwtPnRyYWNlX2J1ZltpXS5hZGRyID0gZG1h bV9hbGxvY19jb2hlcmVudChkZXYsIEhJU0lfUFRUX1RSQUNFX0JVRl9TSVpFLAo+Pj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICZjdHJsLT50cmFjZV9idWZbaV0uZG1hLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEdGUF9LRVJORUwpOwo+ Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIWN0cmwtPnRyYWNlX2J1ZltpXS5hZGRyKSB7Cj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaGlzaV9wdHRfZnJlZV90cmFjZV9idWYoaGlzaV9wdHQp Owo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOwo+Pj4+ICvCoMKg wqDCoMKgwqDCoCB9Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgcmV0dXJuIDA7 Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2b2lkIGhpc2lfcHR0X3RyYWNlX2VuZChzdHJ1 Y3QgaGlzaV9wdHQgKmhpc2lfcHR0KQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCB3cml0ZWwoMCwgaGlz aV9wdHQtPmlvYmFzZSArIEhJU0lfUFRUX1RSQUNFX0NUUkwpOwo+Pj4+ICvCoMKgwqAgaGlzaV9w dHQtPnRyYWNlX2N0cmwuc3RhcnRlZCA9IGZhbHNlOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICtzdGF0 aWMgaW50IGhpc2lfcHR0X3RyYWNlX3N0YXJ0KHN0cnVjdCBoaXNpX3B0dCAqaGlzaV9wdHQpCj4+ Pj4gK3sKPj4+PiArwqDCoMKgIHN0cnVjdCBoaXNpX3B0dF90cmFjZV9jdHJsICpjdHJsID0gJmhp c2lfcHR0LT50cmFjZV9jdHJsOwo+Pj4+ICvCoMKgwqAgdTMyIHZhbDsKPj4+PiArwqDCoMKgIGlu dCBpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIC8qIENoZWNrIGRldmljZSBpZGxlIGJlZm9yZSBzdGFy dCB0cmFjZSAqLwo+Pj4+ICvCoMKgwqAgaWYgKCFoaXNpX3B0dF93YWl0X3RyYWNlX2h3X2lkbGUo aGlzaV9wdHQpKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHBjaV9lcnIoaGlzaV9wdHQtPnBkZXYs ICJGYWlsZWQgdG8gc3RhcnQgdHJhY2UsIHRoZSBkZXZpY2UgaXMgc3RpbGwgYnVzeVxuIik7Cj4+ Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUJVU1k7Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqAgY3RybC0+c3RhcnRlZCA9IHRydWU7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgLyog UmVzZXQgdGhlIERNQSBiZWZvcmUgc3RhcnQgdHJhY2luZyAqLwo+Pj4+ICvCoMKgwqAgdmFsID0g cmVhZGwoaGlzaV9wdHQtPmlvYmFzZSArIEhJU0lfUFRUX1RSQUNFX0NUUkwpOwo+Pj4+ICvCoMKg wqAgdmFsIHw9IEhJU0lfUFRUX1RSQUNFX0NUUkxfUlNUOwo+Pj4+ICvCoMKgwqAgd3JpdGVsKHZh bCwgaGlzaV9wdHQtPmlvYmFzZSArIEhJU0lfUFRUX1RSQUNFX0NUUkwpOwo+Pj4+ICsKPj4+PiAr wqDCoMKgIGhpc2lfcHR0X3dhaXRfZG1hX3Jlc2V0X2RvbmUoaGlzaV9wdHQpOwo+Pj4+ICsKPj4+ PiArwqDCoMKgIHZhbCA9IHJlYWRsKGhpc2lfcHR0LT5pb2Jhc2UgKyBISVNJX1BUVF9UUkFDRV9D VFJMKTsKPj4+PiArwqDCoMKgIHZhbCAmPSB+SElTSV9QVFRfVFJBQ0VfQ1RSTF9SU1Q7Cj4+Pj4g K8KgwqDCoCB3cml0ZWwodmFsLCBoaXNpX3B0dC0+aW9iYXNlICsgSElTSV9QVFRfVFJBQ0VfQ1RS TCk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgLyogQ2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgKi8K Pj4+PiArwqDCoMKgIHdyaXRlbChISVNJX1BUVF9UUkFDRV9JTlRfU1RBVF9NQVNLLCBoaXNpX3B0 dC0+aW9iYXNlICsgSElTSV9QVFRfVFJBQ0VfSU5UX1NUQVQpOwo+Pj4+ICvCoMKgwqAgd3JpdGVs KDAsIGhpc2lfcHR0LT5pb2Jhc2UgKyBISVNJX1BUVF9UUkFDRV9JTlRfTUFTSyk7Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqAgLyogQ29uZmlndXJlIHRoZSB0cmFjZSBETUEgYnVmZmVyICovCj4+Pgo+Pj4g SSBhbSBub3Qgc3VyZSB3aHkgdGhpcyBzb3J0IG9mIHRoaW5nIGlzIGRvbmUgb3V0c2lkZSBwcm9i aW5nCj4+Pgo+IAo+IC4uLgo+IAo+Pj4+ICsKPj4+PiArwqDCoMKgIHZhbCA9IEZJRUxEX0dFVChI SVNJX1BUVF9QTVVfRElSRUNUSU9OX01BU0ssIGV2ZW50LT5hdHRyLmNvbmZpZyk7Cj4+Pj4gK8Kg wqDCoCByZXQgPSBoaXNpX3B0dF90cmFjZV92YWxpZF9jb25maWdfb25laG90KHZhbCwgaGlzaV9w dHRfdHJhY2VfYXZhaWxhYmxlX2RpcmVjdGlvbiwKPj4+Cj4+PiBob3cgYWJvdXQgcHV0IGFsbCB0 aG9zZSBhcnJheXMgaW4gaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnX29uZWhvdCgpIGFuZCBw YXNzIHNvbWUgZmxhZyB0byBzYXkgd2hpY2ggYXJyYXkgeW91IHdhbnQgdG8gdXNlPyBPciBzb21l dGhpbmcgbGlrZSB0aGF0LiBQYXNzaW5nIHRoZSBhcnJheXMgaW4gdGhpcyBmYXNoaW9uIGlzIG1l c3N5Cj4+Pgo+Pgo+PiBTaW5jZSB0aGVyZSBhcmUgMyBjb25maWdzICh0eXBlLCBkaXJlY3Rpb24s IGZvcm1hdCkgd2l0aCBkaWZmZXJlbnQgYXZhaWxhYmxlIHJhbmdlIGFuZCBzZXR0aW5nIG1ldGhv ZCAob25laG90LCBub24tb25laG90KSwKPj4gbW92aW5nIHRoZSBhcnJheXMgaW50byB0aGUgdmFs aWQgY2hlY2tpbmcgZnVuY3Rpb24gbWVhbnMgd2UgbmVlZCB0byByZWNvZ25pemUgdGhlIGNvbmZp ZyB0eXBlcyAocGFzc2VkIGJ5IHRoZSBjYWxsZXIgYnV0IG5lZWQKPj4gdG8ga25vdyB0aGUgYXZh aWxhYmxlIHZhbHVlIGFycmF5KSBhbmQgdGhlIGNoZWNraW5nIG1ldGhvZCB0b2dldGhlci4gVGhh dCBtYXkgbWFrZSB0aGUgY29kZSBtb3JlIGNvbXBsZXggdGhhbiBub3c6IDFzdCBwaWNraW5nCj4+ IHVwIHRoZSByaWdodCBhcnJheSBhbmQganVkZ2Ugd2ljaCBjaGVja2luZyBtZXRob2QgdGhpcyBh cnJheSBhcHBsaWVkIGFuZCAybmQgZG8gdGhlIGNoZWNraW5nLgo+Pgo+PiBDdXJyZW50bHkgaXQn cyBkZXNpZ25lZCB0byBkZWNvdXBsZSB0aGUgY2hlY2tpbmcgbWV0aG9kIGFuZCB0aGUgYXZhaWxh YmxlIHZhbHVlIGFycmF5LiBUaGUgaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlne19vbmVob3R9 KCkKPj4gd29uJ3QgY2FyZSBhYm91dCB3aGljaCBhcnJheSB0byB1c2Ugc2luY2UgY2FsbGVyIHRh a2UgcmVzcG9uc2liaWx0eSBmb3IgdGhpcy4gU28gcGVyaGFwcyBjdXJyZW50IGFwcHJvYWNoIGlz IHNpbXBsZSBhbmQgY2xlYXIKPj4gZW5vdWdoLgo+IAo+IAo+IEEgY291cGxlIG9mIHBvaW50czoK PiAtIGhpc2lfcHR0X3RyYWNlX3ZhbGlkX2NvbmZpZ190eXBlKCkgb25seSBoYXMgMXggY2FsbGVy IHNvIGNhbiBtYWtlIGl0IGRlZGljYXRlZCBmb3IgdGhhdCBjYWxsZXIKPiAtIHRoZXJlIGlzIG5v dCBtdWNoIGNvZGUgaW4gaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnX29uc2hvdCgpLCBzbyBv ayB0byBkdXBsaWNhdGUgaWYgbWFrZXMgb3ZlcmFsbCBjb2RlIGxvb2sgYmV0dGVyCj4gCj4gU28g SSB0aGluayBkZWRpY2F0ZWQgZnVuY3Rpb25zIG1ha2UgdGhlIGNvZGUgc2ltcGxlciwgZWFzaWVy IHRvIGZvbGxvdywgYW5kIG1haW50YWluOgo+IAoKb2sgdGhlbiBpdCB3b24ndCBtYWtlIGl0IG1v cmUgY29tcGxleC4gSSB0aG91Z2h0IHlvdSBtZWFuIHNvbWV0aGluZyBsaWtlIGhpc2lfcHR0X3Ry YWNlX2NvbmZpZyh1MzIgdmFsLCBlbnVtIENPTkZJR19UWVBFIHR5cGUsIGJvb2wgb25laG90KQph cyBtZW50aW9uZWQgYXMgInBhc3Mgc29tZSBmbGFnIHRvIHNheSB3aGljaCBhcnJheSB5b3Ugd2Fu dCB0byB1c2UiLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCB3aWxsIGJlIG1vcmUgY29tcGxl eC4gVGhhbmtzIGZvciB0aGUgZ3JlYXQKc25pcHBldCEKCj4gc3RhdGljIGludCBoaXNpX3B0dF90 cmFjZV92YWxpZF9jb25maWdfZGlyKHUzMiB2YWwpCj4gewo+IMKgwqDCoMKgaW50IGk7Cj4gwqDC oMKgwqAvKgo+IMKgwqDCoMKgICogVGhlIHN1cHBvcnRlZCB2YWx1ZSBvZiB0aGUgZGlyZWN0aW9u IHBhcmFtZXRlci4gU2VlIGhpc2lfcHR0LnJzdAo+IMKgwqDCoMKgICogZG9jdW1lbnRhdGlvbiBm b3IgbW9yZSBkZXRhaWxzLgo+IMKgwqDCoMKgICovCj4gwqDCoMKgwqBzdGF0aWMgY29uc3QgdTMy IGhpc2lfcHR0X3RyYWNlX2F2YWlsYWJsZV9kaXJlY3Rpb25bXSA9IHsKPiDCoMKgwqDCoMKgwqDC oCAwLAo+IMKgwqDCoMKgwqDCoMKgIDEsCj4gwqDCoMKgwqDCoMKgwqAgMiwKPiDCoMKgwqDCoMKg wqDCoCAzLAo+IMKgwqDCoMKgfTsKPiAKPiDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKGhpc2lfcHR0X3RyYWNlX2F2YWlsYWJsZV9kaXJlY3Rpb24pOyBpKyspCj4gwqDCoMKgwqDC oMKgwqAgaWYgKHZhbCA9PSBoaXNpX3B0dF90cmFjZV9hdmFpbGFibGVfZGlyZWN0aW9uW2ldKQo+ IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4gCj4gwqDCoMKgwqByZXR1cm4gLUVJ TlZBTDsKPiB9Cj4gCj4gc3RhdGljIGludCBoaXNpX3B0dF90cmFjZV92YWxpZF9jb25maWdfZm9y bWF0KHUzMiB2YWwpCj4gewo+IMKgwqDCoMKgaW50IGk7Cj4gwqDCoMKgwqBzdGF0aWMgY29uc3Qg dTMyIGhpc2lfcHR0X3RyYWNlX2F2YWlsYmxlX2Zvcm1hdFtdID0gewo+IMKgwqDCoMKgwqDCoMKg IDAswqDCoMKgIC8qIDREVyAqLwo+IMKgwqDCoMKgwqDCoMKgIDEswqDCoMKgIC8qIDhEVyAqLwo+ IMKgwqDCoMKgfTsKPiAKPiDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhpc2lf cHR0X3RyYWNlX2F2YWlsYmxlX2Zvcm1hdCk7IGkrKykKPiDCoMKgwqDCoMKgwqDCoCBpZiAodmFs ID09IGhpc2lfcHR0X3RyYWNlX2F2YWlsYmxlX2Zvcm1hdFtpXSkKPiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJldHVybiAwOwo+IAo+IMKgwqDCoMKgcmV0dXJuIC1FSU5WQUw7Cj4gfQo+IAo+IHN0 YXRpYyBpbnQgaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnX3R5cGUodTMyIHZhbCkKPiB7Cj4g wqDCoMKgwqBpbnQgaTsKPiDCoMKgwqDCoC8qIERpZmZlcmVudCB0eXBlcyBjYW4gYmUgc2V0IHNp bXVsdGFuZW91c2x5ICovCj4gwqDCoMKgwqBzdGF0aWMgY29uc3QgdTMyIGhpc2lfcHR0X3RyYWNl X2F2YWlsYWJsZV90eXBlW10gPSB7Cj4gwqDCoMKgwqDCoMKgwqAgMSzCoMKgwqAgLyogcG9zdGVk X3JlcXVlc3QgKi8KPiDCoMKgwqDCoMKgwqDCoCAyLMKgwqDCoCAvKiBub24tcG9zdGVkX3JlcXVl c3QgKi8KPiDCoMKgwqDCoMKgwqDCoCA0LMKgwqDCoCAvKiBjb21wbGV0aW9uICovCj4gwqDCoMKg wqB9Owo+IAo+IMKgwqDCoMKgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGlzaV9wdHRfdHJh Y2VfYXZhaWxhYmxlX3R5cGUpOyBpKyspCj4gwqDCoMKgwqDCoMKgwqAgdmFsICY9IH5oaXNpX3B0 dF90cmFjZV9hdmFpbGFibGVfdHlwZVtpXTsKPiAKPiDCoMKgwqDCoGlmICh2YWwpCj4gwqDCoMKg wqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4gwqDCoMKgwqByZXR1cm4gMDsKPiB9Cj4gCj4gLi4u Cj4gCj4gc3RhdGljIGludCBoaXNpX3B0dF9wbXVfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVu dCAqZXZlbnQpCj4gewo+IAo+IC4uLgo+IAo+IMKgwqDCoMKgdmFsID0gRklFTERfR0VUKEhJU0lf UFRUX1BNVV9ESVJFQ1RJT05fTUFTSywgZXZlbnQtPmF0dHIuY29uZmlnKTsKPiDCoMKgwqDCoHJl dCA9IGhpc2lfcHR0X3RyYWNlX3ZhbGlkX2NvbmZpZ19kaXIodmFsKTsKPiDCoMKgwqDCoGlmIChy ZXQgPCAwKQo+IMKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+IMKgwqDCoMKgY3RybC0+ZGlyZWN0 aW9uID0gdmFsOwo+IAo+IMKgwqDCoMKgdmFsID0gRklFTERfR0VUKEhJU0lfUFRUX1BNVV9UWVBF X01BU0ssIGV2ZW50LT5hdHRyLmNvbmZpZyk7Cj4gwqDCoMKgwqByZXQgPSBoaXNpX3B0dF90cmFj ZV92YWxpZF9jb25maWdfdHlwZSh2YWwpOwo+IMKgwqDCoMKgaWYgKHJldCA8IDApCj4gwqDCoMKg wqDCoMKgwqAgZ290byBvdXQ7Cj4gwqDCoMKgwqBjdHJsLT50eXBlID0gdmFsOwo+IAo+IMKgwqDC oMKgdmFsID0gRklFTERfR0VUKEhJU0lfUFRUX1BNVV9GT1JNQVRfTUFTSywgZXZlbnQtPmF0dHIu Y29uZmlnKTsKPiDCoMKgwqDCoHJldCA9IGhpc2lfcHR0X3RyYWNlX3ZhbGlkX2NvbmZpZ19mb3Jt YXQodmFsKTsKPiDCoMKgwqDCoGlmIChyZXQgPCAwKQo+IMKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0 Owo+IMKgwqDCoMKgY3RybC0+Zm9ybWF0ID0gdmFsOwo+IAo+IMKgwqDCoMKgLi4uCj4gfQo+Pgo+ Pj4KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IEFSUkFZX1NJWkUoaGlzaV9wdHRfdHJhY2VfYXZhaWxhYmxlX2RpcmVjdGlvbikpOwo+Pj4+ICvC oMKgwqAgaWYgKHJldCA8IDApCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+Pj4+ICvC oMKgwqAgY3RybC0+ZGlyZWN0aW9uID0gdmFsOwo+Pj4+ICsKPj4+PiArwqDCoMKgIHZhbCA9IEZJ RUxEX0dFVChISVNJX1BUVF9QTVVfVFlQRV9NQVNLLCBldmVudC0+YXR0ci5jb25maWcpOwo+Pj4+ ICvCoMKgwqAgcmV0ID0gaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnKHZhbCwgaGlzaV9wdHRf dHJhY2VfYXZhaWxhYmxlX3R5cGUsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBBUlJBWV9TSVpFKGhpc2lfcHR0X3RyYWNlX2F2YWlsYWJsZV90eXBlKSk7 Cj4+Pj4gK8KgwqDCoCBpZiAocmV0IDwgMCkKPj4+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7 Cj4+Pj4gK8KgwqDCoCBjdHJsLT50eXBlID0gdmFsOwo+Pj4+ICsKPj4+PiArwqDCoMKgIHZhbCA9 IEZJRUxEX0dFVChISVNJX1BUVF9QTVVfRk9STUFUX01BU0ssIGV2ZW50LT5hdHRyLmNvbmZpZyk7 Cj4+Pj4gK8KgwqDCoCByZXQgPSBoaXNpX3B0dF90cmFjZV92YWxpZF9jb25maWdfb25laG90KHZh bCwgaGlzaV9wdHRfdHJhY2VfYXZhaWxibGVfZm9ybWF0LAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQVJSQVlfU0laRShoaXNpX3B0dF90cmFj ZV9hdmFpbGJsZV9mb3JtYXQpKTsKPj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKQo+Pj4+ICvCoMKg wqDCoMKgwqDCoCBnb3RvIG91dDsKPj4+PiArwqDCoMKgIGN0cmwtPmZvcm1hdCA9IHZhbDsKPj4+ PiArCj4+Pj4gK291dDoKPj4+PiArwqDCoMKgIG11dGV4X3VubG9jaygmaGlzaV9wdHQtPm11dGV4 KTsKPj4+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2 b2lkICpoaXNpX3B0dF9wbXVfc2V0dXBfYXV4KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdm9p ZCAqKnBhZ2VzLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp bnQgbnJfcGFnZXMsIGJvb2wgb3ZlcndyaXRlKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBzdHJ1Y3Qg aGlzaV9wdHRfcG11X2J1ZiAqYnVmOwo+Pj4+ICvCoMKgwqAgc3RydWN0IHBhZ2UgKipwYWdlbGlz dDsKPj4+PiArwqDCoMKgIGludCBpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGlmIChvdmVyd3JpdGUp IHsKPj4+PiArwqDCoMKgwqDCoMKgwqAgZGV2X3dhcm4oZXZlbnQtPnBtdS0+ZGV2LCAiT3Zlcndy aXRlIG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuIik7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biBOVUxMOwo+Pj4+ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIC8qIElmIHRoZSBwYWdl cyBzaXplIGxlc3MgdGhhbiBidWZmZXJzLCB3ZSBjYW5ub3Qgc3RhcnQgdHJhY2UgKi8KPj4+PiAr wqDCoMKgIGlmIChucl9wYWdlcyA8IEhJU0lfUFRUX1RSQUNFX1RPVEFMX0JVRl9TSVpFIC8gUEFH RV9TSVpFKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4+PiArCj4+Pj4gK8Kg wqDCoCBidWYgPSBremFsbG9jKHNpemVvZigqYnVmKSwgR0ZQX0tFUk5FTCk7Cj4+Pj4gK8KgwqDC oCBpZiAoIWJ1ZikKPj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+Pj4gKwo+Pj4+ ICvCoMKgwqAgcGFnZWxpc3QgPSBrY2FsbG9jKG5yX3BhZ2VzLCBzaXplb2YoKnBhZ2VsaXN0KSwg R0ZQX0tFUk5FTCk7Cj4+Pj4gK8KgwqDCoCBpZiAoIXBhZ2VsaXN0KSB7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgIGtmcmVlKGJ1Zik7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+Pj4+ ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsg aSsrKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwYWdlbGlzdFtpXSA9IHZpcnRfdG9fcGFnZShwYWdl c1tpXSk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgYnVmLT5iYXNlID0gdm1hcChwYWdlbGlzdCwgbnJf cGFnZXMsIFZNX01BUCwgUEFHRV9LRVJORUwpOwo+Pj4+ICvCoMKgwqAgaWYgKCFidWYtPmJhc2Up IHsKPj4+PiArwqDCoMKgwqDCoMKgwqAga2ZyZWUocGFnZWxpc3QpOwo+Pj4+ICvCoMKgwqDCoMKg wqDCoCBrZnJlZShidWYpOwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4+PiAr wqDCoMKgIH0KPj4+PiArCj4+Pj4gK8KgwqDCoCBidWYtPm5yX3BhZ2VzID0gbnJfcGFnZXM7Cj4+ Pj4gK8KgwqDCoCBidWYtPmxlbmd0aCA9IG5yX3BhZ2VzICogUEFHRV9TSVpFOwo+Pj4+ICvCoMKg wqAgYnVmLT5wb3MgPSAwOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGtmcmVlKHBhZ2VsaXN0KTsKPj4+ PiArwqDCoMKgIHJldHVybiBidWY7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2b2lkIGhp c2lfcHR0X3BtdV9mcmVlX2F1eCh2b2lkICphdXgpCj4+Pj4gK3sKPj4+PiArwqDCoMKgIHN0cnVj dCBoaXNpX3B0dF9wbXVfYnVmICpidWYgPSBhdXg7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgdnVubWFw KGJ1Zi0+YmFzZSk7Cj4+Pj4gK8KgwqDCoCBrZnJlZShidWYpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ ICtzdGF0aWMgdm9pZCBoaXNpX3B0dF9wbXVfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50 LCBpbnQgZmxhZ3MpCj4+Pj4gK3sKPj4+PiArwqDCoMKgIHN0cnVjdCBoaXNpX3B0dCAqaGlzaV9w dHQgPSB0b19oaXNpX3B0dChldmVudC0+cG11KTsKPj4+PiArwqDCoMKgIHN0cnVjdCBwZXJmX291 dHB1dF9oYW5kbGUgKmhhbmRsZSA9ICZoaXNpX3B0dC0+dHJhY2VfY3RybC5oYW5kbGU7Cj4+Pj4g K8KgwqDCoCBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKPj4+PiArwqDC oMKgIHN0cnVjdCBoaXNpX3B0dF9wbXVfYnVmICpidWY7Cj4+Pj4gK8KgwqDCoCBpbnQgY3B1ID0g ZXZlbnQtPmNwdTsKPj4+PiArwqDCoMKgIGludCByZXQ7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaHdj LT5zdGF0ZSA9IDA7Cj4+Pj4gK8KgwqDCoCBtdXRleF9sb2NrKCZoaXNpX3B0dC0+bXV0ZXgpOwo+ Pj4+ICvCoMKgwqAgaWYgKGhpc2lfcHR0LT50cmFjZV9jdHJsLnN0YXJ0ZWQpIHsKPj4+PiArwqDC oMKgwqDCoMKgwqAgcGNpX2RiZyhoaXNpX3B0dC0+cGRldiwgInRyYWNlIGhhcyBhbHJlYWR5IHN0 YXJ0ZWRcbiIpOwo+Pj4KPj4+IGRvZXNuJ3QgcGVyZiBjb3JlIGd1YXJkIGFnYWluc3QgdGhpcyBz b3J0IG9mIHRoaW5nPwo+Pj4KPj4KPj4gTWF5YmUgbm90IGFzIHRlc3RlZC4gVGhlIHBlcmYgY29y ZSB3aWxsIHN0YXJ0IHRoZSBldmVudHMgMSlvbiB0aGUgY3B1cyB1c2VyIHNwZWNpZmllZCBvcgo+ PiAyKW9uIGFsbCB0aGUgY3B1cywgYnV0IHRoZSBQVFQgdHJhY2UgaXMgaW50ZW5kZWQgdG8gc3Rh cnQgb25jZSBvbiBvbmUgY3B1Lgo+Pgo+PiBGb3IgdGhlIDIpIGNhc2UsIHRoZSBkcml2ZXIgd2ls bCBtYWtlIGRlZmF1bHQgY3B1IHRvIHN0YXJ0IHRoZSB0cmFjZSBhbmQgYmxvY2sgb3RoZXJzCj4+ IGluIHBtdTo6YWRkKCkuIEZvciB0aGUgMSkgY2FzZSB3ZSdsbCBtZXQgdGhlIGNvbmRpdGlvbiBo ZXJlLiBTbyB0aGUgc3RhcnRlZCBzdGF0dXMgaXMKPj4gdGVzdCBoZXJlIHRvIGF2b2lkIGEgc2Vj b25kIHN0YXJ0Lgo+IAo+IGlmIHRoaXMgaXMgYSByZWFsaXN0aWMgYW5kIHNlbnNpYmxlIHVzZWNh c2UgdGhlbiBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBpbiBjb3JlIHBlcmYgY29kZSBhdCBz b21lIHN0YWdlCj4gCgpJIHRoaW5rIGF0IGxlYXN0IFBUVCB0cmFjZSBtZWV0IHRoaXMgY29uZGl0 aW9uIGJ1dCBzZWVtcyB3ZSdyZSB0aGUgb25seSB1bmNvcmUgdHJhY2luZyBQTVUgbm93LCBzbwpt YXliZSBpdCdzIHN0aWxsIG5vdCBjb21tb24uCgo+Pgo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBnb3Rv IHN0b3A7Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaWYgKGNwdSA9PSAtMSkK Pj4+PiArwqDCoMKgwqDCoMKgwqAgY3B1ID0gaGlzaV9wdHQtPnRyYWNlX2N0cmwuZGVmYXVsdF9j cHU7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgLyoKPj4+PiArwqDCoMKgwqAgKiBIYW5kbGUgdGhlIGlu dGVycnVwdCBvbiB0aGUgc2FtZSBjcHUgd2hpY2ggc3RhcnRzIHRoZSB0cmFjZSB0byBhdm9pZAo+ Pj4+ICvCoMKgwqDCoCAqIGNvbnRleHQgbWlzbWF0Y2guIE90aGVyd2lzZSB3ZSdsbCB0cmlnZ2Vy IHRoZSBXQVJOIGZyb20gdGhlIHBlcmYKPj4+PiArwqDCoMKgwqAgKiBjb3JlIGluIGV2ZW50X2Z1 bmN0aW9uX2xvY2FsKCkuCj4+Pj4gK8KgwqDCoMKgICovCj4+Pj4gK8KgwqDCoCBXQVJOX09OKGly cV9zZXRfYWZmaW5pdHkocGNpX2lycV92ZWN0b3IoaGlzaV9wdHQtPnBkZXYsIEhJU0lfUFRUX1RS QUNFX0RNQV9JUlEpLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjcHVt YXNrX29mKGNwdSkpKTsKPj4+PiArCj4+Pj4gK8KgwqDCoCByZXQgPSBoaXNpX3B0dF9hbGxvY190 cmFjZV9idWYoaGlzaV9wdHQpOwo+Pj4+ICvCoMKgwqAgaWYgKHJldCkgewo+Pj4+ICvCoMKgwqDC oMKgwqDCoCBwY2lfZGJnKGhpc2lfcHR0LT5wZGV2LCAiYWxsb2MgdHJhY2UgYnVmIGZhaWxlZCwg cmV0ID0gJWRcbiIsIHJldCk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gc3RvcDsKPj4+PiAr wqDCoMKgIH0KPj4+PiArCj4+Pj4gK8KgwqDCoCBidWYgPSBwZXJmX2F1eF9vdXRwdXRfYmVnaW4o aGFuZGxlLCBldmVudCk7Cj4+Pj4gK8KgwqDCoCBpZiAoIWJ1Zikgewo+Pj4+ICvCoMKgwqDCoMKg wqDCoCBwY2lfZGJnKGhpc2lfcHR0LT5wZGV2LCAiYXV4IG91dHB1dCBiZWdpbiBmYWlsZWRcbiIp Owo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIHN0b3A7Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqAgYnVmLT5wb3MgPSBoYW5kbGUtPmhlYWQgJSBidWYtPmxlbmd0aDsKPj4+PiAr Cj4+Pj4gK8KgwqDCoCByZXQgPSBoaXNpX3B0dF90cmFjZV9zdGFydChoaXNpX3B0dCk7Cj4+Pj4g K8KgwqDCoCBpZiAocmV0KSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHBjaV9kYmcoaGlzaV9wdHQt PnBkZXYsICJ0cmFjZSBzdGFydCBmYWlsZWQsIHJldCA9ICVkXG4iLCByZXQpOwo+Pj4+ICvCoMKg wqDCoMKgwqDCoCBwZXJmX2F1eF9vdXRwdXRfZW5kKGhhbmRsZSwgMCk7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgIGdvdG8gc3RvcDsKPj4+PiArwqDCoMKgIH0KPj4+PiArCj4+Pj4gK8KgwqDCoCBtdXRl eF91bmxvY2soJmhpc2lfcHR0LT5tdXRleCk7Cj4+Pj4gK8KgwqDCoCByZXR1cm47Cj4+Pj4gK3N0 b3A6Cj4+Pj4gK8KgwqDCoCBldmVudC0+aHcuc3RhdGUgfD0gUEVSRl9IRVNfU1RPUFBFRDsKPj4+ PiArwqDCoMKgIG11dGV4X3VubG9jaygmaGlzaV9wdHQtPm11dGV4KTsKPj4+PiArfQpbLi4uXQo+ Pj4+ICsKPj4+PiArc3RhdGljIHZvaWQgaGlzaV9wdHRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpw ZGV2KQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBzdHJ1Y3QgaGlzaV9wdHQgKmhpc2lfcHR0ID0gcGNp X2dldF9kcnZkYXRhKHBkZXYpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIC8qCj4+Pj4gK8KgwqDCoMKg ICogV2UgaGF2ZSB0byBtYW51YWxseSB1bnJlZ2lzdGVyIHRoZSBQTVUgZGV2aWNlIHJhdGhlciB0 aGFuIG1ha2UgaXQKPj4+PiArwqDCoMKgwqAgKiBkZXZyZXMgbWFuYWdlZCB0byBrZWVwIG9yZGVy IHRoYXQgdGhlIFBNVSBkZXZpY2UncyB1bnJlZ2lzdHJhdGlvbgo+Pj4+ICvCoMKgwqDCoCAqIGlz IHByaW9yIHRvIHRoZSByZWxlYXNlIG9mIERNQSBidWZmZXJzLiBBcyB0aGUgRE1BIGJ1ZmZlcnMg YXJlCj4+Pj4gK8KgwqDCoMKgICogZGV2bSBhbGxvY2F0ZWQgd2hlbiBuZWNlc3Nhcnkgd2hpY2gg aXMgYWZ0ZXIgdGhlIHJlZ2lzdHJhdGlvbiBvZgo+Pj4+ICvCoMKgwqDCoCAqIHRoZSBQTVUgZGV2 aWNlLgo+Pj4+ICvCoMKgwqDCoCAqLwo+Pj4KPj4+IGRvIHlvdSByZWFsbHkgbmVlZCB0byBtZW50 aW9uIGFsbCB0aGlzPwo+Pj4KPj4KPj4gSSB0aGluayB5ZXMuIE90aGVyd2lzZSBwZW9wbGUgbWF5 IGFzayB3aHkgbm90IHJlZ2lzdGVyIFBNVSBkZXZpY2UgaW4gbWFuYWdlZAo+PiB3YXkgYXMgd2Vs bC4KPiAKPiBJIGV4cGVjdCBkZXZyZXMgd29yayB0byBiZSBkb25lIGFmdGVyIGhpc2lfcHR0X3Jl bW92ZSgpIHNvIEkgd291bGQga25vdyB0aGlzLi4uCj4gCgp5ZXMsIGJ1dCB0aGUgcHJvYmxlbSBp cyB0aGF0IHRoZSBidWZmZXJzIGFyZSBkZXZtIGFsbG9jYXRlZCBvdXRzaWRlIHByb2JlIHNvIHRo ZQpvcmRlciBpcyBub3Qgb2J2aW91cyBhbmQgbWF5YmUgYSBiaXQgaGFyZCB0byB1bmRlcnN0YW5k LgoKQnV0IGFzIHN1Z2dlc3RlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVycyBpbiB0aGUgcHJvYmUg c3RhZ2Ugd2UgY2FuIGdldCByaWQgb2YgaXQKYW5kIG1ha2UgUE1VIHJlZ2lzdHJhdGlvbiBkZXZy ZXMgbWFuYWdlZCBhcyB3ZWxsLgoKVGhhbmtzLApZaWNvbmcKCgpfX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fXwppb21tdSBtYWlsaW5nIGxpc3QKaW9tbXVAbGlz dHMubGludXgtZm91bmRhdGlvbi5vcmcKaHR0cHM6Ly9saXN0cy5saW51eGZvdW5kYXRpb24ub3Jn L21haWxtYW4vbGlzdGluZm8vaW9tbXU= 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 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 smtp.lore.kernel.org (Postfix) with ESMTPS id 6CD35C433F5 for ; Tue, 12 Apr 2022 13:01:41 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=lists.infradead.org; s=bombadil.20210309; h=Sender: Content-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date: Message-ID:From:References:To:Subject:CC:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=cvQe3BnbY0EZR6dqdmViIcL22TrQX9dwLk4U0QudyGs=; b=nQNipiOrsvzPKKH77c7ys4SOkT nBoqFt8G4aOfEKmsJPrN4zOnWwYMO+dAE+LaAFxf/Gl9GKmz85jB1lSHp3F0jkUYtS1cc8vTG4MYS KZLInQDHS1KiUqal+U0sRrvFF3JegVqhp+IxFkEt2fTOUPrgbSzkG4DqwlbJj06oRfRBe7z7PINSX FpE3izjd1jVXqN8HZYFx03MkJD189qhsc3Ek4VrzKnSEDt662NOPrnKU5MBvf3FeDpsFvuyAlaqEx NQwbt9MsyJb1c1ETSxjEZXMwS3JL7T6YZuruypFHssF/gTRD7jMEHIzfK9aj27D0s8zUImC46epyD r7Pcnw5g==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1neG7x-00ENHr-Um; Tue, 12 Apr 2022 13:00:14 +0000 Received: from szxga01-in.huawei.com ([45.249.212.187]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1neG0c-00EJyM-Am for linux-arm-kernel@lists.infradead.org; Tue, 12 Apr 2022 12:52:41 +0000 Received: from canpemm500009.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Kd5Dc3LfTzgYWT; Tue, 12 Apr 2022 20:50:40 +0800 (CST) Received: from [10.67.102.169] (10.67.102.169) by canpemm500009.china.huawei.com (7.192.105.203) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Tue, 12 Apr 2022 20:52:28 +0800 CC: , , , Subject: Re: [PATCH v7 2/7] hwtracing: Add trace function support for HiSilicon PCIe Tune and Trace device To: John Garry , Yicong Yang , , , , , , , , , , , , , , , , , , , , , , , , References: <20220407125841.3678-1-yangyicong@hisilicon.com> <20220407125841.3678-3-yangyicong@hisilicon.com> <36eea2f6-3461-72ad-05c4-953484197911@huawei.com> <60159327-7b6c-38cc-97a9-bb4c594b494f@huawei.com> <49b24812-dafc-4ff9-a79b-07d1e2c6364b@huawei.com> From: Yicong Yang Message-ID: Date: Tue, 12 Apr 2022 20:52:28 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: <49b24812-dafc-4ff9-a79b-07d1e2c6364b@huawei.com> X-Originating-IP: [10.67.102.169] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To canpemm500009.china.huawei.com (7.192.105.203) X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220412_055238_782012_49C3B7C5 X-CRM114-Status: GOOD ( 44.10 ) X-BeenThere: linux-arm-kernel@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org T24gMjAyMi80LzEyIDE2OjM5LCBKb2huIEdhcnJ5IHdyb3RlOgo+Pj4+ICtzdGF0aWMgaW50IGhp c2lfcHR0X2FsbG9jX3RyYWNlX2J1ZihzdHJ1Y3QgaGlzaV9wdHQgKmhpc2lfcHR0KQo+Pj4+ICt7 Cj4+Pj4gK8KgwqDCoCBzdHJ1Y3QgaGlzaV9wdHRfdHJhY2VfY3RybCAqY3RybCA9ICZoaXNpX3B0 dC0+dHJhY2VfY3RybDsKPj4+PiArwqDCoMKgIHN0cnVjdCBkZXZpY2UgKmRldiA9ICZoaXNpX3B0 dC0+cGRldi0+ZGV2Owo+Pj4+ICvCoMKgwqAgaW50IGk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaGlz aV9wdHQtPnRyYWNlX2N0cmwuYnVmX2luZGV4ID0gMDsKPj4+PiArCj4+Pj4gK8KgwqDCoCAvKiBJ ZiB0aGUgdHJhY2UgYnVmZmVyIGhhcyBhbHJlYWR5IGJlZW4gYWxsb2NhdGVkLCB6ZXJvIGl0LiAq Lwo+Pj4KPj4+IEkgYW0gbm90IHN1cmUgd2h5IHRoaXMgaXMgbm90IGNhbGxlZCBmcm9tIHRoZSBw cm9iZQo+Pj4KPj4KPj4gVGhlIGJ1ZmZlciBhbGxvY2F0aW9uIGlzIGRvbmUgd2hlbiBuZWNlc3Nh cnkgYXMgZHJpdmVyIHdpbGwgcHJvYmUgdGhlIGRldmljZSBvbiBib290aW5nIGJ1dAo+PiB0aGUg dXNlciBtYXkgbmV2ZXIgdXNlIGl0LiBJbiB0aGlzIGNvbmRpdGlvbiBpdCdzIGEgd2FzdGUgb2Yg bWVtb3J5IGlmIHdlIGFsbG9jYXRlIHRoZSBidWZmZXJzCj4+IGluIHByb2JlLiBDdXJyZW50bHkg d2UnbGwgYWxsb2NhdGUgMTZNIG1lbW9yeSBmb3IgNCBidWZmZXJzLgo+Pgo+IAo+IEJ1dCB0aGF0 J3MganVzdCBub3QgaG93IHdlIGRvIHRoaW5ncy4gV2Ugc2V0dXAgdGhlIGRyaXZlciBmdWxseSB0 byBiZSB1c2VkIGluIHRoZSBwcm9iZS4gSWYgdGhlIHVzZXIgY2Fubm90IHJlYWxseSBhZmZvcmQg dGhlIG1lbW9yeSB0aGVuIGhlL3NoZSBzaG91bGQgbm90IGxvYWQgdGhlIGRyaXZlci4KPiAKCkkg dGhpbmsgaW4gbW9zdCB0aW1lIHVzZXIgZG9uJ3QgbmVlZCB0byBtYW51YWxseSBsb2FkIHRoZSBk cml2ZXIgYmVjYXVzZSBvZiB1ZGV2LgoKPiBJbiBhZGRpdGlvbiwgdGhpcyBkcml2ZXIgd291bGQg YmUgdXNlZCBpbiBhIG1hY2hpbmUgd2hpY2ggd2lsbCBoYXZlIGdpZ2J5dGVzIG9mIG1lbW9yeSwg c28gSSB0aGluayB0aGF0IHRoZSBtZW1vcnkgbWVudGlvbmVkIGhlcmUgaXMgcmVsYXRpdmVseSBp bnNpZ25pZmljYW50Lgo+IAoKb2ssIHllcyBpdCdsbCBiZSB1c2VkIGluIHRoZSBzZXJ2ZXIgc28g dGhlIG1lbW9yeSB3aWxsIGJlIGVub3VnaCBpbiBtb3N0IHRpbWUuIGNvbnNpZGVyaW5nIHRoaXMg bWF5YmUgaXQncyBwcm9wZXIgdG8gbW92ZSB0aGUgYnVmZmVyIGFsbG9jYXRpb24gYW5kIHRoZSBj b25maWd1cmF0aW9uIHRvIHRoZSBkcml2ZXIgcHJvYmUgdGhlbi4KCj4+IFNvIHRoaXMgZnVuY3Rp b24gaXMgY2FsbGVkIGV2ZXJ5IHRpbWUgYmVmb3JlIHdlIHN0YXJ0IHRyYWNlLiBJbiB0aGUgZmly c3QgdGltZSBpdCB3aWxsIGFsbG9jYXRlCj4+IHRoZSBETUEgYnVmZmVycyBhbmQgaXQgdGhlIG90 aGVyIHRpbWVzIGl0IGp1c3QgemVybyB0aGUgYnVmZmVycyB0byBjbGVhciB0aGUgZGF0YSBvZiBs YXN0IHRpbWUuCj4+Cj4+Pj4gK8KgwqDCoCBpZiAoY3RybC0+dHJhY2VfYnVmKSB7Cj4+Pj4gK8Kg wqDCoMKgwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBISVNJX1BUVF9UUkFDRV9CVUZfQ05UOyBpKysp Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgbWVtc2V0KGN0cmwtPnRyYWNlX2J1ZltpXS5h ZGRyLCAwLCBISVNJX1BUVF9UUkFDRV9CVUZfU0laRSk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJl dHVybiAwOwo+Pj4+ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIGN0cmwtPnRyYWNlX2J1 ZiA9IGRldm1fa2NhbGxvYyhkZXYsIEhJU0lfUFRUX1RSQUNFX0JVRl9DTlQsCj4+Pj4gK8KgwqDC oMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHNpemVvZihzdHJ1Y3QgaGlz aV9wdHRfZG1hX2J1ZmZlciksIEdGUF9LRVJORUwpOwo+Pj4KPj4+IHNpemVvZigqY3RybC0+dHJh Y2VfYnVmKSBtYXkgYmUgYmV0dGVyCj4+Pgo+Pgo+PiBvay4KPj4KPj4+PiArwqDCoMKgIGlmICgh Y3RybC0+dHJhY2VfYnVmKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gLUVOT01FTTsKPj4+ PiArCj4+Pj4gK8KgwqDCoCBmb3IgKGkgPSAwOyBpIDwgSElTSV9QVFRfVFJBQ0VfQlVGX0NOVDsg KytpKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGN0cmwtPnRyYWNlX2J1ZltpXS5hZGRyID0gZG1h bV9hbGxvY19jb2hlcmVudChkZXYsIEhJU0lfUFRUX1RSQUNFX0JVRl9TSVpFLAo+Pj4+ICvCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgICZjdHJsLT50cmFjZV9idWZbaV0uZG1hLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIEdGUF9LRVJORUwpOwo+ Pj4+ICvCoMKgwqDCoMKgwqDCoCBpZiAoIWN0cmwtPnRyYWNlX2J1ZltpXS5hZGRyKSB7Cj4+Pj4g K8KgwqDCoMKgwqDCoMKgwqDCoMKgwqAgaGlzaV9wdHRfZnJlZV90cmFjZV9idWYoaGlzaV9wdHQp Owo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgIHJldHVybiAtRU5PTUVNOwo+Pj4+ICvCoMKg wqDCoMKgwqDCoCB9Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgcmV0dXJuIDA7 Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2b2lkIGhpc2lfcHR0X3RyYWNlX2VuZChzdHJ1 Y3QgaGlzaV9wdHQgKmhpc2lfcHR0KQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCB3cml0ZWwoMCwgaGlz aV9wdHQtPmlvYmFzZSArIEhJU0lfUFRUX1RSQUNFX0NUUkwpOwo+Pj4+ICvCoMKgwqAgaGlzaV9w dHQtPnRyYWNlX2N0cmwuc3RhcnRlZCA9IGZhbHNlOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ICtzdGF0 aWMgaW50IGhpc2lfcHR0X3RyYWNlX3N0YXJ0KHN0cnVjdCBoaXNpX3B0dCAqaGlzaV9wdHQpCj4+ Pj4gK3sKPj4+PiArwqDCoMKgIHN0cnVjdCBoaXNpX3B0dF90cmFjZV9jdHJsICpjdHJsID0gJmhp c2lfcHR0LT50cmFjZV9jdHJsOwo+Pj4+ICvCoMKgwqAgdTMyIHZhbDsKPj4+PiArwqDCoMKgIGlu dCBpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIC8qIENoZWNrIGRldmljZSBpZGxlIGJlZm9yZSBzdGFy dCB0cmFjZSAqLwo+Pj4+ICvCoMKgwqAgaWYgKCFoaXNpX3B0dF93YWl0X3RyYWNlX2h3X2lkbGUo aGlzaV9wdHQpKSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHBjaV9lcnIoaGlzaV9wdHQtPnBkZXYs ICJGYWlsZWQgdG8gc3RhcnQgdHJhY2UsIHRoZSBkZXZpY2UgaXMgc3RpbGwgYnVzeVxuIik7Cj4+ Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiAtRUJVU1k7Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqAgY3RybC0+c3RhcnRlZCA9IHRydWU7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgLyog UmVzZXQgdGhlIERNQSBiZWZvcmUgc3RhcnQgdHJhY2luZyAqLwo+Pj4+ICvCoMKgwqAgdmFsID0g cmVhZGwoaGlzaV9wdHQtPmlvYmFzZSArIEhJU0lfUFRUX1RSQUNFX0NUUkwpOwo+Pj4+ICvCoMKg wqAgdmFsIHw9IEhJU0lfUFRUX1RSQUNFX0NUUkxfUlNUOwo+Pj4+ICvCoMKgwqAgd3JpdGVsKHZh bCwgaGlzaV9wdHQtPmlvYmFzZSArIEhJU0lfUFRUX1RSQUNFX0NUUkwpOwo+Pj4+ICsKPj4+PiAr wqDCoMKgIGhpc2lfcHR0X3dhaXRfZG1hX3Jlc2V0X2RvbmUoaGlzaV9wdHQpOwo+Pj4+ICsKPj4+ PiArwqDCoMKgIHZhbCA9IHJlYWRsKGhpc2lfcHR0LT5pb2Jhc2UgKyBISVNJX1BUVF9UUkFDRV9D VFJMKTsKPj4+PiArwqDCoMKgIHZhbCAmPSB+SElTSV9QVFRfVFJBQ0VfQ1RSTF9SU1Q7Cj4+Pj4g K8KgwqDCoCB3cml0ZWwodmFsLCBoaXNpX3B0dC0+aW9iYXNlICsgSElTSV9QVFRfVFJBQ0VfQ1RS TCk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgLyogQ2xlYXIgdGhlIGludGVycnVwdCBzdGF0dXMgKi8K Pj4+PiArwqDCoMKgIHdyaXRlbChISVNJX1BUVF9UUkFDRV9JTlRfU1RBVF9NQVNLLCBoaXNpX3B0 dC0+aW9iYXNlICsgSElTSV9QVFRfVFJBQ0VfSU5UX1NUQVQpOwo+Pj4+ICvCoMKgwqAgd3JpdGVs KDAsIGhpc2lfcHR0LT5pb2Jhc2UgKyBISVNJX1BUVF9UUkFDRV9JTlRfTUFTSyk7Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqAgLyogQ29uZmlndXJlIHRoZSB0cmFjZSBETUEgYnVmZmVyICovCj4+Pgo+Pj4g SSBhbSBub3Qgc3VyZSB3aHkgdGhpcyBzb3J0IG9mIHRoaW5nIGlzIGRvbmUgb3V0c2lkZSBwcm9i aW5nCj4+Pgo+IAo+IC4uLgo+IAo+Pj4+ICsKPj4+PiArwqDCoMKgIHZhbCA9IEZJRUxEX0dFVChI SVNJX1BUVF9QTVVfRElSRUNUSU9OX01BU0ssIGV2ZW50LT5hdHRyLmNvbmZpZyk7Cj4+Pj4gK8Kg wqDCoCByZXQgPSBoaXNpX3B0dF90cmFjZV92YWxpZF9jb25maWdfb25laG90KHZhbCwgaGlzaV9w dHRfdHJhY2VfYXZhaWxhYmxlX2RpcmVjdGlvbiwKPj4+Cj4+PiBob3cgYWJvdXQgcHV0IGFsbCB0 aG9zZSBhcnJheXMgaW4gaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnX29uZWhvdCgpIGFuZCBw YXNzIHNvbWUgZmxhZyB0byBzYXkgd2hpY2ggYXJyYXkgeW91IHdhbnQgdG8gdXNlPyBPciBzb21l dGhpbmcgbGlrZSB0aGF0LiBQYXNzaW5nIHRoZSBhcnJheXMgaW4gdGhpcyBmYXNoaW9uIGlzIG1l c3N5Cj4+Pgo+Pgo+PiBTaW5jZSB0aGVyZSBhcmUgMyBjb25maWdzICh0eXBlLCBkaXJlY3Rpb24s IGZvcm1hdCkgd2l0aCBkaWZmZXJlbnQgYXZhaWxhYmxlIHJhbmdlIGFuZCBzZXR0aW5nIG1ldGhv ZCAob25laG90LCBub24tb25laG90KSwKPj4gbW92aW5nIHRoZSBhcnJheXMgaW50byB0aGUgdmFs aWQgY2hlY2tpbmcgZnVuY3Rpb24gbWVhbnMgd2UgbmVlZCB0byByZWNvZ25pemUgdGhlIGNvbmZp ZyB0eXBlcyAocGFzc2VkIGJ5IHRoZSBjYWxsZXIgYnV0IG5lZWQKPj4gdG8ga25vdyB0aGUgYXZh aWxhYmxlIHZhbHVlIGFycmF5KSBhbmQgdGhlIGNoZWNraW5nIG1ldGhvZCB0b2dldGhlci4gVGhh dCBtYXkgbWFrZSB0aGUgY29kZSBtb3JlIGNvbXBsZXggdGhhbiBub3c6IDFzdCBwaWNraW5nCj4+ IHVwIHRoZSByaWdodCBhcnJheSBhbmQganVkZ2Ugd2ljaCBjaGVja2luZyBtZXRob2QgdGhpcyBh cnJheSBhcHBsaWVkIGFuZCAybmQgZG8gdGhlIGNoZWNraW5nLgo+Pgo+PiBDdXJyZW50bHkgaXQn cyBkZXNpZ25lZCB0byBkZWNvdXBsZSB0aGUgY2hlY2tpbmcgbWV0aG9kIGFuZCB0aGUgYXZhaWxh YmxlIHZhbHVlIGFycmF5LiBUaGUgaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlne19vbmVob3R9 KCkKPj4gd29uJ3QgY2FyZSBhYm91dCB3aGljaCBhcnJheSB0byB1c2Ugc2luY2UgY2FsbGVyIHRh a2UgcmVzcG9uc2liaWx0eSBmb3IgdGhpcy4gU28gcGVyaGFwcyBjdXJyZW50IGFwcHJvYWNoIGlz IHNpbXBsZSBhbmQgY2xlYXIKPj4gZW5vdWdoLgo+IAo+IAo+IEEgY291cGxlIG9mIHBvaW50czoK PiAtIGhpc2lfcHR0X3RyYWNlX3ZhbGlkX2NvbmZpZ190eXBlKCkgb25seSBoYXMgMXggY2FsbGVy IHNvIGNhbiBtYWtlIGl0IGRlZGljYXRlZCBmb3IgdGhhdCBjYWxsZXIKPiAtIHRoZXJlIGlzIG5v dCBtdWNoIGNvZGUgaW4gaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnX29uc2hvdCgpLCBzbyBv ayB0byBkdXBsaWNhdGUgaWYgbWFrZXMgb3ZlcmFsbCBjb2RlIGxvb2sgYmV0dGVyCj4gCj4gU28g SSB0aGluayBkZWRpY2F0ZWQgZnVuY3Rpb25zIG1ha2UgdGhlIGNvZGUgc2ltcGxlciwgZWFzaWVy IHRvIGZvbGxvdywgYW5kIG1haW50YWluOgo+IAoKb2sgdGhlbiBpdCB3b24ndCBtYWtlIGl0IG1v cmUgY29tcGxleC4gSSB0aG91Z2h0IHlvdSBtZWFuIHNvbWV0aGluZyBsaWtlIGhpc2lfcHR0X3Ry YWNlX2NvbmZpZyh1MzIgdmFsLCBlbnVtIENPTkZJR19UWVBFIHR5cGUsIGJvb2wgb25laG90KQph cyBtZW50aW9uZWQgYXMgInBhc3Mgc29tZSBmbGFnIHRvIHNheSB3aGljaCBhcnJheSB5b3Ugd2Fu dCB0byB1c2UiLiBUaGUgaW1wbGVtZW50YXRpb24gb2YgdGhhdCB3aWxsIGJlIG1vcmUgY29tcGxl eC4gVGhhbmtzIGZvciB0aGUgZ3JlYXQKc25pcHBldCEKCj4gc3RhdGljIGludCBoaXNpX3B0dF90 cmFjZV92YWxpZF9jb25maWdfZGlyKHUzMiB2YWwpCj4gewo+IMKgwqDCoMKgaW50IGk7Cj4gwqDC oMKgwqAvKgo+IMKgwqDCoMKgICogVGhlIHN1cHBvcnRlZCB2YWx1ZSBvZiB0aGUgZGlyZWN0aW9u IHBhcmFtZXRlci4gU2VlIGhpc2lfcHR0LnJzdAo+IMKgwqDCoMKgICogZG9jdW1lbnRhdGlvbiBm b3IgbW9yZSBkZXRhaWxzLgo+IMKgwqDCoMKgICovCj4gwqDCoMKgwqBzdGF0aWMgY29uc3QgdTMy IGhpc2lfcHR0X3RyYWNlX2F2YWlsYWJsZV9kaXJlY3Rpb25bXSA9IHsKPiDCoMKgwqDCoMKgwqDC oCAwLAo+IMKgwqDCoMKgwqDCoMKgIDEsCj4gwqDCoMKgwqDCoMKgwqAgMiwKPiDCoMKgwqDCoMKg wqDCoCAzLAo+IMKgwqDCoMKgfTsKPiAKPiDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBBUlJBWV9T SVpFKGhpc2lfcHR0X3RyYWNlX2F2YWlsYWJsZV9kaXJlY3Rpb24pOyBpKyspCj4gwqDCoMKgwqDC oMKgwqAgaWYgKHZhbCA9PSBoaXNpX3B0dF90cmFjZV9hdmFpbGFibGVfZGlyZWN0aW9uW2ldKQo+ IMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgcmV0dXJuIDA7Cj4gCj4gwqDCoMKgwqByZXR1cm4gLUVJ TlZBTDsKPiB9Cj4gCj4gc3RhdGljIGludCBoaXNpX3B0dF90cmFjZV92YWxpZF9jb25maWdfZm9y bWF0KHUzMiB2YWwpCj4gewo+IMKgwqDCoMKgaW50IGk7Cj4gwqDCoMKgwqBzdGF0aWMgY29uc3Qg dTMyIGhpc2lfcHR0X3RyYWNlX2F2YWlsYmxlX2Zvcm1hdFtdID0gewo+IMKgwqDCoMKgwqDCoMKg IDAswqDCoMKgIC8qIDREVyAqLwo+IMKgwqDCoMKgwqDCoMKgIDEswqDCoMKgIC8qIDhEVyAqLwo+ IMKgwqDCoMKgfTsKPiAKPiDCoMKgwqDCoGZvciAoaSA9IDA7IGkgPCBBUlJBWV9TSVpFKGhpc2lf cHR0X3RyYWNlX2F2YWlsYmxlX2Zvcm1hdCk7IGkrKykKPiDCoMKgwqDCoMKgwqDCoCBpZiAodmFs ID09IGhpc2lfcHR0X3RyYWNlX2F2YWlsYmxlX2Zvcm1hdFtpXSkKPiDCoMKgwqDCoMKgwqDCoMKg wqDCoMKgIHJldHVybiAwOwo+IAo+IMKgwqDCoMKgcmV0dXJuIC1FSU5WQUw7Cj4gfQo+IAo+IHN0 YXRpYyBpbnQgaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnX3R5cGUodTMyIHZhbCkKPiB7Cj4g wqDCoMKgwqBpbnQgaTsKPiDCoMKgwqDCoC8qIERpZmZlcmVudCB0eXBlcyBjYW4gYmUgc2V0IHNp bXVsdGFuZW91c2x5ICovCj4gwqDCoMKgwqBzdGF0aWMgY29uc3QgdTMyIGhpc2lfcHR0X3RyYWNl X2F2YWlsYWJsZV90eXBlW10gPSB7Cj4gwqDCoMKgwqDCoMKgwqAgMSzCoMKgwqAgLyogcG9zdGVk X3JlcXVlc3QgKi8KPiDCoMKgwqDCoMKgwqDCoCAyLMKgwqDCoCAvKiBub24tcG9zdGVkX3JlcXVl c3QgKi8KPiDCoMKgwqDCoMKgwqDCoCA0LMKgwqDCoCAvKiBjb21wbGV0aW9uICovCj4gwqDCoMKg wqB9Owo+IAo+IMKgwqDCoMKgZm9yIChpID0gMDsgaSA8IEFSUkFZX1NJWkUoaGlzaV9wdHRfdHJh Y2VfYXZhaWxhYmxlX3R5cGUpOyBpKyspCj4gwqDCoMKgwqDCoMKgwqAgdmFsICY9IH5oaXNpX3B0 dF90cmFjZV9hdmFpbGFibGVfdHlwZVtpXTsKPiAKPiDCoMKgwqDCoGlmICh2YWwpCj4gwqDCoMKg wqDCoMKgwqAgcmV0dXJuIC1FSU5WQUw7Cj4gwqDCoMKgwqByZXR1cm4gMDsKPiB9Cj4gCj4gLi4u Cj4gCj4gc3RhdGljIGludCBoaXNpX3B0dF9wbXVfZXZlbnRfaW5pdChzdHJ1Y3QgcGVyZl9ldmVu dCAqZXZlbnQpCj4gewo+IAo+IC4uLgo+IAo+IMKgwqDCoMKgdmFsID0gRklFTERfR0VUKEhJU0lf UFRUX1BNVV9ESVJFQ1RJT05fTUFTSywgZXZlbnQtPmF0dHIuY29uZmlnKTsKPiDCoMKgwqDCoHJl dCA9IGhpc2lfcHR0X3RyYWNlX3ZhbGlkX2NvbmZpZ19kaXIodmFsKTsKPiDCoMKgwqDCoGlmIChy ZXQgPCAwKQo+IMKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+IMKgwqDCoMKgY3RybC0+ZGlyZWN0 aW9uID0gdmFsOwo+IAo+IMKgwqDCoMKgdmFsID0gRklFTERfR0VUKEhJU0lfUFRUX1BNVV9UWVBF X01BU0ssIGV2ZW50LT5hdHRyLmNvbmZpZyk7Cj4gwqDCoMKgwqByZXQgPSBoaXNpX3B0dF90cmFj ZV92YWxpZF9jb25maWdfdHlwZSh2YWwpOwo+IMKgwqDCoMKgaWYgKHJldCA8IDApCj4gwqDCoMKg wqDCoMKgwqAgZ290byBvdXQ7Cj4gwqDCoMKgwqBjdHJsLT50eXBlID0gdmFsOwo+IAo+IMKgwqDC oMKgdmFsID0gRklFTERfR0VUKEhJU0lfUFRUX1BNVV9GT1JNQVRfTUFTSywgZXZlbnQtPmF0dHIu Y29uZmlnKTsKPiDCoMKgwqDCoHJldCA9IGhpc2lfcHR0X3RyYWNlX3ZhbGlkX2NvbmZpZ19mb3Jt YXQodmFsKTsKPiDCoMKgwqDCoGlmIChyZXQgPCAwKQo+IMKgwqDCoMKgwqDCoMKgIGdvdG8gb3V0 Owo+IMKgwqDCoMKgY3RybC0+Zm9ybWF0ID0gdmFsOwo+IAo+IMKgwqDCoMKgLi4uCj4gfQo+Pgo+ Pj4KPj4+PiArwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKg IEFSUkFZX1NJWkUoaGlzaV9wdHRfdHJhY2VfYXZhaWxhYmxlX2RpcmVjdGlvbikpOwo+Pj4+ICvC oMKgwqAgaWYgKHJldCA8IDApCj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gb3V0Owo+Pj4+ICvC oMKgwqAgY3RybC0+ZGlyZWN0aW9uID0gdmFsOwo+Pj4+ICsKPj4+PiArwqDCoMKgIHZhbCA9IEZJ RUxEX0dFVChISVNJX1BUVF9QTVVfVFlQRV9NQVNLLCBldmVudC0+YXR0ci5jb25maWcpOwo+Pj4+ ICvCoMKgwqAgcmV0ID0gaGlzaV9wdHRfdHJhY2VfdmFsaWRfY29uZmlnKHZhbCwgaGlzaV9wdHRf dHJhY2VfYXZhaWxhYmxlX3R5cGUsCj4+Pj4gK8KgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDC oMKgwqDCoMKgwqDCoCBBUlJBWV9TSVpFKGhpc2lfcHR0X3RyYWNlX2F2YWlsYWJsZV90eXBlKSk7 Cj4+Pj4gK8KgwqDCoCBpZiAocmV0IDwgMCkKPj4+PiArwqDCoMKgwqDCoMKgwqAgZ290byBvdXQ7 Cj4+Pj4gK8KgwqDCoCBjdHJsLT50eXBlID0gdmFsOwo+Pj4+ICsKPj4+PiArwqDCoMKgIHZhbCA9 IEZJRUxEX0dFVChISVNJX1BUVF9QTVVfRk9STUFUX01BU0ssIGV2ZW50LT5hdHRyLmNvbmZpZyk7 Cj4+Pj4gK8KgwqDCoCByZXQgPSBoaXNpX3B0dF90cmFjZV92YWxpZF9jb25maWdfb25laG90KHZh bCwgaGlzaV9wdHRfdHJhY2VfYXZhaWxibGVfZm9ybWF0LAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKg wqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqAgQVJSQVlfU0laRShoaXNpX3B0dF90cmFj ZV9hdmFpbGJsZV9mb3JtYXQpKTsKPj4+PiArwqDCoMKgIGlmIChyZXQgPCAwKQo+Pj4+ICvCoMKg wqDCoMKgwqDCoCBnb3RvIG91dDsKPj4+PiArwqDCoMKgIGN0cmwtPmZvcm1hdCA9IHZhbDsKPj4+ PiArCj4+Pj4gK291dDoKPj4+PiArwqDCoMKgIG11dGV4X3VubG9jaygmaGlzaV9wdHQtPm11dGV4 KTsKPj4+PiArwqDCoMKgIHJldHVybiByZXQ7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2 b2lkICpoaXNpX3B0dF9wbXVfc2V0dXBfYXV4KHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdm9p ZCAqKnBhZ2VzLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBp bnQgbnJfcGFnZXMsIGJvb2wgb3ZlcndyaXRlKQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBzdHJ1Y3Qg aGlzaV9wdHRfcG11X2J1ZiAqYnVmOwo+Pj4+ICvCoMKgwqAgc3RydWN0IHBhZ2UgKipwYWdlbGlz dDsKPj4+PiArwqDCoMKgIGludCBpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGlmIChvdmVyd3JpdGUp IHsKPj4+PiArwqDCoMKgwqDCoMKgwqAgZGV2X3dhcm4oZXZlbnQtPnBtdS0+ZGV2LCAiT3Zlcndy aXRlIG1vZGUgaXMgbm90IHN1cHBvcnRlZFxuIik7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVy biBOVUxMOwo+Pj4+ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIC8qIElmIHRoZSBwYWdl cyBzaXplIGxlc3MgdGhhbiBidWZmZXJzLCB3ZSBjYW5ub3Qgc3RhcnQgdHJhY2UgKi8KPj4+PiAr wqDCoMKgIGlmIChucl9wYWdlcyA8IEhJU0lfUFRUX1RSQUNFX1RPVEFMX0JVRl9TSVpFIC8gUEFH RV9TSVpFKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4+PiArCj4+Pj4gK8Kg wqDCoCBidWYgPSBremFsbG9jKHNpemVvZigqYnVmKSwgR0ZQX0tFUk5FTCk7Cj4+Pj4gK8KgwqDC oCBpZiAoIWJ1ZikKPj4+PiArwqDCoMKgwqDCoMKgwqAgcmV0dXJuIE5VTEw7Cj4+Pj4gKwo+Pj4+ ICvCoMKgwqAgcGFnZWxpc3QgPSBrY2FsbG9jKG5yX3BhZ2VzLCBzaXplb2YoKnBhZ2VsaXN0KSwg R0ZQX0tFUk5FTCk7Cj4+Pj4gK8KgwqDCoCBpZiAoIXBhZ2VsaXN0KSB7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgIGtmcmVlKGJ1Zik7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHJldHVybiBOVUxMOwo+Pj4+ ICvCoMKgwqAgfQo+Pj4+ICsKPj4+PiArwqDCoMKgIGZvciAoaSA9IDA7IGkgPCBucl9wYWdlczsg aSsrKQo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBwYWdlbGlzdFtpXSA9IHZpcnRfdG9fcGFnZShwYWdl c1tpXSk7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgYnVmLT5iYXNlID0gdm1hcChwYWdlbGlzdCwgbnJf cGFnZXMsIFZNX01BUCwgUEFHRV9LRVJORUwpOwo+Pj4+ICvCoMKgwqAgaWYgKCFidWYtPmJhc2Up IHsKPj4+PiArwqDCoMKgwqDCoMKgwqAga2ZyZWUocGFnZWxpc3QpOwo+Pj4+ICvCoMKgwqDCoMKg wqDCoCBrZnJlZShidWYpOwo+Pj4+ICvCoMKgwqDCoMKgwqDCoCByZXR1cm4gTlVMTDsKPj4+PiAr wqDCoMKgIH0KPj4+PiArCj4+Pj4gK8KgwqDCoCBidWYtPm5yX3BhZ2VzID0gbnJfcGFnZXM7Cj4+ Pj4gK8KgwqDCoCBidWYtPmxlbmd0aCA9IG5yX3BhZ2VzICogUEFHRV9TSVpFOwo+Pj4+ICvCoMKg wqAgYnVmLT5wb3MgPSAwOwo+Pj4+ICsKPj4+PiArwqDCoMKgIGtmcmVlKHBhZ2VsaXN0KTsKPj4+ PiArwqDCoMKgIHJldHVybiBidWY7Cj4+Pj4gK30KPj4+PiArCj4+Pj4gK3N0YXRpYyB2b2lkIGhp c2lfcHR0X3BtdV9mcmVlX2F1eCh2b2lkICphdXgpCj4+Pj4gK3sKPj4+PiArwqDCoMKgIHN0cnVj dCBoaXNpX3B0dF9wbXVfYnVmICpidWYgPSBhdXg7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgdnVubWFw KGJ1Zi0+YmFzZSk7Cj4+Pj4gK8KgwqDCoCBrZnJlZShidWYpOwo+Pj4+ICt9Cj4+Pj4gKwo+Pj4+ ICtzdGF0aWMgdm9pZCBoaXNpX3B0dF9wbXVfc3RhcnQoc3RydWN0IHBlcmZfZXZlbnQgKmV2ZW50 LCBpbnQgZmxhZ3MpCj4+Pj4gK3sKPj4+PiArwqDCoMKgIHN0cnVjdCBoaXNpX3B0dCAqaGlzaV9w dHQgPSB0b19oaXNpX3B0dChldmVudC0+cG11KTsKPj4+PiArwqDCoMKgIHN0cnVjdCBwZXJmX291 dHB1dF9oYW5kbGUgKmhhbmRsZSA9ICZoaXNpX3B0dC0+dHJhY2VfY3RybC5oYW5kbGU7Cj4+Pj4g K8KgwqDCoCBzdHJ1Y3QgaHdfcGVyZl9ldmVudCAqaHdjID0gJmV2ZW50LT5odzsKPj4+PiArwqDC oMKgIHN0cnVjdCBoaXNpX3B0dF9wbXVfYnVmICpidWY7Cj4+Pj4gK8KgwqDCoCBpbnQgY3B1ID0g ZXZlbnQtPmNwdTsKPj4+PiArwqDCoMKgIGludCByZXQ7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaHdj LT5zdGF0ZSA9IDA7Cj4+Pj4gK8KgwqDCoCBtdXRleF9sb2NrKCZoaXNpX3B0dC0+bXV0ZXgpOwo+ Pj4+ICvCoMKgwqAgaWYgKGhpc2lfcHR0LT50cmFjZV9jdHJsLnN0YXJ0ZWQpIHsKPj4+PiArwqDC oMKgwqDCoMKgwqAgcGNpX2RiZyhoaXNpX3B0dC0+cGRldiwgInRyYWNlIGhhcyBhbHJlYWR5IHN0 YXJ0ZWRcbiIpOwo+Pj4KPj4+IGRvZXNuJ3QgcGVyZiBjb3JlIGd1YXJkIGFnYWluc3QgdGhpcyBz b3J0IG9mIHRoaW5nPwo+Pj4KPj4KPj4gTWF5YmUgbm90IGFzIHRlc3RlZC4gVGhlIHBlcmYgY29y ZSB3aWxsIHN0YXJ0IHRoZSBldmVudHMgMSlvbiB0aGUgY3B1cyB1c2VyIHNwZWNpZmllZCBvcgo+ PiAyKW9uIGFsbCB0aGUgY3B1cywgYnV0IHRoZSBQVFQgdHJhY2UgaXMgaW50ZW5kZWQgdG8gc3Rh cnQgb25jZSBvbiBvbmUgY3B1Lgo+Pgo+PiBGb3IgdGhlIDIpIGNhc2UsIHRoZSBkcml2ZXIgd2ls bCBtYWtlIGRlZmF1bHQgY3B1IHRvIHN0YXJ0IHRoZSB0cmFjZSBhbmQgYmxvY2sgb3RoZXJzCj4+ IGluIHBtdTo6YWRkKCkuIEZvciB0aGUgMSkgY2FzZSB3ZSdsbCBtZXQgdGhlIGNvbmRpdGlvbiBo ZXJlLiBTbyB0aGUgc3RhcnRlZCBzdGF0dXMgaXMKPj4gdGVzdCBoZXJlIHRvIGF2b2lkIGEgc2Vj b25kIHN0YXJ0Lgo+IAo+IGlmIHRoaXMgaXMgYSByZWFsaXN0aWMgYW5kIHNlbnNpYmxlIHVzZWNh c2UgdGhlbiBpdCB3b3VsZCBiZSBuaWNlIHRvIGhhbmRsZSBpbiBjb3JlIHBlcmYgY29kZSBhdCBz b21lIHN0YWdlCj4gCgpJIHRoaW5rIGF0IGxlYXN0IFBUVCB0cmFjZSBtZWV0IHRoaXMgY29uZGl0 aW9uIGJ1dCBzZWVtcyB3ZSdyZSB0aGUgb25seSB1bmNvcmUgdHJhY2luZyBQTVUgbm93LCBzbwpt YXliZSBpdCdzIHN0aWxsIG5vdCBjb21tb24uCgo+Pgo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBnb3Rv IHN0b3A7Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgaWYgKGNwdSA9PSAtMSkK Pj4+PiArwqDCoMKgwqDCoMKgwqAgY3B1ID0gaGlzaV9wdHQtPnRyYWNlX2N0cmwuZGVmYXVsdF9j cHU7Cj4+Pj4gKwo+Pj4+ICvCoMKgwqAgLyoKPj4+PiArwqDCoMKgwqAgKiBIYW5kbGUgdGhlIGlu dGVycnVwdCBvbiB0aGUgc2FtZSBjcHUgd2hpY2ggc3RhcnRzIHRoZSB0cmFjZSB0byBhdm9pZAo+ Pj4+ICvCoMKgwqDCoCAqIGNvbnRleHQgbWlzbWF0Y2guIE90aGVyd2lzZSB3ZSdsbCB0cmlnZ2Vy IHRoZSBXQVJOIGZyb20gdGhlIHBlcmYKPj4+PiArwqDCoMKgwqAgKiBjb3JlIGluIGV2ZW50X2Z1 bmN0aW9uX2xvY2FsKCkuCj4+Pj4gK8KgwqDCoMKgICovCj4+Pj4gK8KgwqDCoCBXQVJOX09OKGly cV9zZXRfYWZmaW5pdHkocGNpX2lycV92ZWN0b3IoaGlzaV9wdHQtPnBkZXYsIEhJU0lfUFRUX1RS QUNFX0RNQV9JUlEpLAo+Pj4+ICvCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoMKgwqDCoCBjcHVt YXNrX29mKGNwdSkpKTsKPj4+PiArCj4+Pj4gK8KgwqDCoCByZXQgPSBoaXNpX3B0dF9hbGxvY190 cmFjZV9idWYoaGlzaV9wdHQpOwo+Pj4+ICvCoMKgwqAgaWYgKHJldCkgewo+Pj4+ICvCoMKgwqDC oMKgwqDCoCBwY2lfZGJnKGhpc2lfcHR0LT5wZGV2LCAiYWxsb2MgdHJhY2UgYnVmIGZhaWxlZCwg cmV0ID0gJWRcbiIsIHJldCk7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIGdvdG8gc3RvcDsKPj4+PiAr wqDCoMKgIH0KPj4+PiArCj4+Pj4gK8KgwqDCoCBidWYgPSBwZXJmX2F1eF9vdXRwdXRfYmVnaW4o aGFuZGxlLCBldmVudCk7Cj4+Pj4gK8KgwqDCoCBpZiAoIWJ1Zikgewo+Pj4+ICvCoMKgwqDCoMKg wqDCoCBwY2lfZGJnKGhpc2lfcHR0LT5wZGV2LCAiYXV4IG91dHB1dCBiZWdpbiBmYWlsZWRcbiIp Owo+Pj4+ICvCoMKgwqDCoMKgwqDCoCBnb3RvIHN0b3A7Cj4+Pj4gK8KgwqDCoCB9Cj4+Pj4gKwo+ Pj4+ICvCoMKgwqAgYnVmLT5wb3MgPSBoYW5kbGUtPmhlYWQgJSBidWYtPmxlbmd0aDsKPj4+PiAr Cj4+Pj4gK8KgwqDCoCByZXQgPSBoaXNpX3B0dF90cmFjZV9zdGFydChoaXNpX3B0dCk7Cj4+Pj4g K8KgwqDCoCBpZiAocmV0KSB7Cj4+Pj4gK8KgwqDCoMKgwqDCoMKgIHBjaV9kYmcoaGlzaV9wdHQt PnBkZXYsICJ0cmFjZSBzdGFydCBmYWlsZWQsIHJldCA9ICVkXG4iLCByZXQpOwo+Pj4+ICvCoMKg wqDCoMKgwqDCoCBwZXJmX2F1eF9vdXRwdXRfZW5kKGhhbmRsZSwgMCk7Cj4+Pj4gK8KgwqDCoMKg wqDCoMKgIGdvdG8gc3RvcDsKPj4+PiArwqDCoMKgIH0KPj4+PiArCj4+Pj4gK8KgwqDCoCBtdXRl eF91bmxvY2soJmhpc2lfcHR0LT5tdXRleCk7Cj4+Pj4gK8KgwqDCoCByZXR1cm47Cj4+Pj4gK3N0 b3A6Cj4+Pj4gK8KgwqDCoCBldmVudC0+aHcuc3RhdGUgfD0gUEVSRl9IRVNfU1RPUFBFRDsKPj4+ PiArwqDCoMKgIG11dGV4X3VubG9jaygmaGlzaV9wdHQtPm11dGV4KTsKPj4+PiArfQpbLi4uXQo+ Pj4+ICsKPj4+PiArc3RhdGljIHZvaWQgaGlzaV9wdHRfcmVtb3ZlKHN0cnVjdCBwY2lfZGV2ICpw ZGV2KQo+Pj4+ICt7Cj4+Pj4gK8KgwqDCoCBzdHJ1Y3QgaGlzaV9wdHQgKmhpc2lfcHR0ID0gcGNp X2dldF9kcnZkYXRhKHBkZXYpOwo+Pj4+ICsKPj4+PiArwqDCoMKgIC8qCj4+Pj4gK8KgwqDCoMKg ICogV2UgaGF2ZSB0byBtYW51YWxseSB1bnJlZ2lzdGVyIHRoZSBQTVUgZGV2aWNlIHJhdGhlciB0 aGFuIG1ha2UgaXQKPj4+PiArwqDCoMKgwqAgKiBkZXZyZXMgbWFuYWdlZCB0byBrZWVwIG9yZGVy IHRoYXQgdGhlIFBNVSBkZXZpY2UncyB1bnJlZ2lzdHJhdGlvbgo+Pj4+ICvCoMKgwqDCoCAqIGlz IHByaW9yIHRvIHRoZSByZWxlYXNlIG9mIERNQSBidWZmZXJzLiBBcyB0aGUgRE1BIGJ1ZmZlcnMg YXJlCj4+Pj4gK8KgwqDCoMKgICogZGV2bSBhbGxvY2F0ZWQgd2hlbiBuZWNlc3Nhcnkgd2hpY2gg aXMgYWZ0ZXIgdGhlIHJlZ2lzdHJhdGlvbiBvZgo+Pj4+ICvCoMKgwqDCoCAqIHRoZSBQTVUgZGV2 aWNlLgo+Pj4+ICvCoMKgwqDCoCAqLwo+Pj4KPj4+IGRvIHlvdSByZWFsbHkgbmVlZCB0byBtZW50 aW9uIGFsbCB0aGlzPwo+Pj4KPj4KPj4gSSB0aGluayB5ZXMuIE90aGVyd2lzZSBwZW9wbGUgbWF5 IGFzayB3aHkgbm90IHJlZ2lzdGVyIFBNVSBkZXZpY2UgaW4gbWFuYWdlZAo+PiB3YXkgYXMgd2Vs bC4KPiAKPiBJIGV4cGVjdCBkZXZyZXMgd29yayB0byBiZSBkb25lIGFmdGVyIGhpc2lfcHR0X3Jl bW92ZSgpIHNvIEkgd291bGQga25vdyB0aGlzLi4uCj4gCgp5ZXMsIGJ1dCB0aGUgcHJvYmxlbSBp cyB0aGF0IHRoZSBidWZmZXJzIGFyZSBkZXZtIGFsbG9jYXRlZCBvdXRzaWRlIHByb2JlIHNvIHRo ZQpvcmRlciBpcyBub3Qgb2J2aW91cyBhbmQgbWF5YmUgYSBiaXQgaGFyZCB0byB1bmRlcnN0YW5k LgoKQnV0IGFzIHN1Z2dlc3RlZCB0byBhbGxvY2F0ZSB0aGUgYnVmZmVycyBpbiB0aGUgcHJvYmUg c3RhZ2Ugd2UgY2FuIGdldCByaWQgb2YgaXQKYW5kIG1ha2UgUE1VIHJlZ2lzdHJhdGlvbiBkZXZy ZXMgbWFuYWdlZCBhcyB3ZWxsLgoKVGhhbmtzLApZaWNvbmcKCgoKX19fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWlsaW5nIGxp c3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZy YWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo= 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 Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 4D016C433EF for ; Tue, 12 Apr 2022 13:08:47 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1355379AbiDLNLB (ORCPT ); Tue, 12 Apr 2022 09:11:01 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:47776 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1355132AbiDLNFp (ORCPT ); Tue, 12 Apr 2022 09:05:45 -0400 Received: from szxga01-in.huawei.com (szxga01-in.huawei.com [45.249.212.187]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 4F178FE6; Tue, 12 Apr 2022 05:52:31 -0700 (PDT) Received: from canpemm500009.china.huawei.com (unknown [172.30.72.54]) by szxga01-in.huawei.com (SkyGuard) with ESMTP id 4Kd5Dc3LfTzgYWT; Tue, 12 Apr 2022 20:50:40 +0800 (CST) Received: from [10.67.102.169] (10.67.102.169) by canpemm500009.china.huawei.com (7.192.105.203) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256) id 15.1.2375.24; Tue, 12 Apr 2022 20:52:28 +0800 CC: , , , Subject: Re: [PATCH v7 2/7] hwtracing: Add trace function support for HiSilicon PCIe Tune and Trace device To: John Garry , Yicong Yang , , , , , , , , , , , , , , , , , , , , , , , , References: <20220407125841.3678-1-yangyicong@hisilicon.com> <20220407125841.3678-3-yangyicong@hisilicon.com> <36eea2f6-3461-72ad-05c4-953484197911@huawei.com> <60159327-7b6c-38cc-97a9-bb4c594b494f@huawei.com> <49b24812-dafc-4ff9-a79b-07d1e2c6364b@huawei.com> From: Yicong Yang Message-ID: Date: Tue, 12 Apr 2022 20:52:28 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:78.0) Gecko/20100101 Thunderbird/78.5.1 MIME-Version: 1.0 In-Reply-To: <49b24812-dafc-4ff9-a79b-07d1e2c6364b@huawei.com> Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 8bit X-Originating-IP: [10.67.102.169] X-ClientProxiedBy: dggems704-chm.china.huawei.com (10.3.19.181) To canpemm500009.china.huawei.com (7.192.105.203) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 2022/4/12 16:39, John Garry wrote: >>>> +static int hisi_ptt_alloc_trace_buf(struct hisi_ptt *hisi_ptt) >>>> +{ >>>> +    struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; >>>> +    struct device *dev = &hisi_ptt->pdev->dev; >>>> +    int i; >>>> + >>>> +    hisi_ptt->trace_ctrl.buf_index = 0; >>>> + >>>> +    /* If the trace buffer has already been allocated, zero it. */ >>> >>> I am not sure why this is not called from the probe >>> >> >> The buffer allocation is done when necessary as driver will probe the device on booting but >> the user may never use it. In this condition it's a waste of memory if we allocate the buffers >> in probe. Currently we'll allocate 16M memory for 4 buffers. >> > > But that's just not how we do things. We setup the driver fully to be used in the probe. If the user cannot really afford the memory then he/she should not load the driver. > I think in most time user don't need to manually load the driver because of udev. > In addition, this driver would be used in a machine which will have gigbytes of memory, so I think that the memory mentioned here is relatively insignificant. > ok, yes it'll be used in the server so the memory will be enough in most time. considering this maybe it's proper to move the buffer allocation and the configuration to the driver probe then. >> So this function is called every time before we start trace. In the first time it will allocate >> the DMA buffers and it the other times it just zero the buffers to clear the data of last time. >> >>>> +    if (ctrl->trace_buf) { >>>> +        for (i = 0; i < HISI_PTT_TRACE_BUF_CNT; i++) >>>> +            memset(ctrl->trace_buf[i].addr, 0, HISI_PTT_TRACE_BUF_SIZE); >>>> +        return 0; >>>> +    } >>>> + >>>> +    ctrl->trace_buf = devm_kcalloc(dev, HISI_PTT_TRACE_BUF_CNT, >>>> +                       sizeof(struct hisi_ptt_dma_buffer), GFP_KERNEL); >>> >>> sizeof(*ctrl->trace_buf) may be better >>> >> >> ok. >> >>>> +    if (!ctrl->trace_buf) >>>> +        return -ENOMEM; >>>> + >>>> +    for (i = 0; i < HISI_PTT_TRACE_BUF_CNT; ++i) { >>>> +        ctrl->trace_buf[i].addr = dmam_alloc_coherent(dev, HISI_PTT_TRACE_BUF_SIZE, >>>> +                                 &ctrl->trace_buf[i].dma, >>>> +                                 GFP_KERNEL); >>>> +        if (!ctrl->trace_buf[i].addr) { >>>> +            hisi_ptt_free_trace_buf(hisi_ptt); >>>> +            return -ENOMEM; >>>> +        } >>>> +    } >>>> + >>>> +    return 0; >>>> +} >>>> + >>>> +static void hisi_ptt_trace_end(struct hisi_ptt *hisi_ptt) >>>> +{ >>>> +    writel(0, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); >>>> +    hisi_ptt->trace_ctrl.started = false; >>>> +} >>>> + >>>> +static int hisi_ptt_trace_start(struct hisi_ptt *hisi_ptt) >>>> +{ >>>> +    struct hisi_ptt_trace_ctrl *ctrl = &hisi_ptt->trace_ctrl; >>>> +    u32 val; >>>> +    int i; >>>> + >>>> +    /* Check device idle before start trace */ >>>> +    if (!hisi_ptt_wait_trace_hw_idle(hisi_ptt)) { >>>> +        pci_err(hisi_ptt->pdev, "Failed to start trace, the device is still busy\n"); >>>> +        return -EBUSY; >>>> +    } >>>> + >>>> +    ctrl->started = true; >>>> + >>>> +    /* Reset the DMA before start tracing */ >>>> +    val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); >>>> +    val |= HISI_PTT_TRACE_CTRL_RST; >>>> +    writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); >>>> + >>>> +    hisi_ptt_wait_dma_reset_done(hisi_ptt); >>>> + >>>> +    val = readl(hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); >>>> +    val &= ~HISI_PTT_TRACE_CTRL_RST; >>>> +    writel(val, hisi_ptt->iobase + HISI_PTT_TRACE_CTRL); >>>> + >>>> +    /* Clear the interrupt status */ >>>> +    writel(HISI_PTT_TRACE_INT_STAT_MASK, hisi_ptt->iobase + HISI_PTT_TRACE_INT_STAT); >>>> +    writel(0, hisi_ptt->iobase + HISI_PTT_TRACE_INT_MASK); >>>> + >>>> +    /* Configure the trace DMA buffer */ >>> >>> I am not sure why this sort of thing is done outside probing >>> > > ... > >>>> + >>>> +    val = FIELD_GET(HISI_PTT_PMU_DIRECTION_MASK, event->attr.config); >>>> +    ret = hisi_ptt_trace_valid_config_onehot(val, hisi_ptt_trace_available_direction, >>> >>> how about put all those arrays in hisi_ptt_trace_valid_config_onehot() and pass some flag to say which array you want to use? Or something like that. Passing the arrays in this fashion is messy >>> >> >> Since there are 3 configs (type, direction, format) with different available range and setting method (onehot, non-onehot), >> moving the arrays into the valid checking function means we need to recognize the config types (passed by the caller but need >> to know the available value array) and the checking method together. That may make the code more complex than now: 1st picking >> up the right array and judge wich checking method this array applied and 2nd do the checking. >> >> Currently it's designed to decouple the checking method and the available value array. The hisi_ptt_trace_valid_config{_onehot}() >> won't care about which array to use since caller take responsibilty for this. So perhaps current approach is simple and clear >> enough. > > > A couple of points: > - hisi_ptt_trace_valid_config_type() only has 1x caller so can make it dedicated for that caller > - there is not much code in hisi_ptt_trace_valid_config_onshot(), so ok to duplicate if makes overall code look better > > So I think dedicated functions make the code simpler, easier to follow, and maintain: > ok then it won't make it more complex. I thought you mean something like hisi_ptt_trace_config(u32 val, enum CONFIG_TYPE type, bool onehot) as mentioned as "pass some flag to say which array you want to use". The implementation of that will be more complex. Thanks for the great snippet! > static int hisi_ptt_trace_valid_config_dir(u32 val) > { >     int i; >     /* >      * The supported value of the direction parameter. See hisi_ptt.rst >      * documentation for more details. >      */ >     static const u32 hisi_ptt_trace_available_direction[] = { >         0, >         1, >         2, >         3, >     }; > >     for (i = 0; i < ARRAY_SIZE(hisi_ptt_trace_available_direction); i++) >         if (val == hisi_ptt_trace_available_direction[i]) >             return 0; > >     return -EINVAL; > } > > static int hisi_ptt_trace_valid_config_format(u32 val) > { >     int i; >     static const u32 hisi_ptt_trace_availble_format[] = { >         0,    /* 4DW */ >         1,    /* 8DW */ >     }; > >     for (i = 0; i < ARRAY_SIZE(hisi_ptt_trace_availble_format); i++) >         if (val == hisi_ptt_trace_availble_format[i]) >             return 0; > >     return -EINVAL; > } > > static int hisi_ptt_trace_valid_config_type(u32 val) > { >     int i; >     /* Different types can be set simultaneously */ >     static const u32 hisi_ptt_trace_available_type[] = { >         1,    /* posted_request */ >         2,    /* non-posted_request */ >         4,    /* completion */ >     }; > >     for (i = 0; i < ARRAY_SIZE(hisi_ptt_trace_available_type); i++) >         val &= ~hisi_ptt_trace_available_type[i]; > >     if (val) >         return -EINVAL; >     return 0; > } > > ... > > static int hisi_ptt_pmu_event_init(struct perf_event *event) > { > > ... > >     val = FIELD_GET(HISI_PTT_PMU_DIRECTION_MASK, event->attr.config); >     ret = hisi_ptt_trace_valid_config_dir(val); >     if (ret < 0) >         goto out; >     ctrl->direction = val; > >     val = FIELD_GET(HISI_PTT_PMU_TYPE_MASK, event->attr.config); >     ret = hisi_ptt_trace_valid_config_type(val); >     if (ret < 0) >         goto out; >     ctrl->type = val; > >     val = FIELD_GET(HISI_PTT_PMU_FORMAT_MASK, event->attr.config); >     ret = hisi_ptt_trace_valid_config_format(val); >     if (ret < 0) >         goto out; >     ctrl->format = val; > >     ... > } >> >>> >>>> +                         ARRAY_SIZE(hisi_ptt_trace_available_direction)); >>>> +    if (ret < 0) >>>> +        goto out; >>>> +    ctrl->direction = val; >>>> + >>>> +    val = FIELD_GET(HISI_PTT_PMU_TYPE_MASK, event->attr.config); >>>> +    ret = hisi_ptt_trace_valid_config(val, hisi_ptt_trace_available_type, >>>> +                      ARRAY_SIZE(hisi_ptt_trace_available_type)); >>>> +    if (ret < 0) >>>> +        goto out; >>>> +    ctrl->type = val; >>>> + >>>> +    val = FIELD_GET(HISI_PTT_PMU_FORMAT_MASK, event->attr.config); >>>> +    ret = hisi_ptt_trace_valid_config_onehot(val, hisi_ptt_trace_availble_format, >>>> +                         ARRAY_SIZE(hisi_ptt_trace_availble_format)); >>>> +    if (ret < 0) >>>> +        goto out; >>>> +    ctrl->format = val; >>>> + >>>> +out: >>>> +    mutex_unlock(&hisi_ptt->mutex); >>>> +    return ret; >>>> +} >>>> + >>>> +static void *hisi_ptt_pmu_setup_aux(struct perf_event *event, void **pages, >>>> +                    int nr_pages, bool overwrite) >>>> +{ >>>> +    struct hisi_ptt_pmu_buf *buf; >>>> +    struct page **pagelist; >>>> +    int i; >>>> + >>>> +    if (overwrite) { >>>> +        dev_warn(event->pmu->dev, "Overwrite mode is not supported\n"); >>>> +        return NULL; >>>> +    } >>>> + >>>> +    /* If the pages size less than buffers, we cannot start trace */ >>>> +    if (nr_pages < HISI_PTT_TRACE_TOTAL_BUF_SIZE / PAGE_SIZE) >>>> +        return NULL; >>>> + >>>> +    buf = kzalloc(sizeof(*buf), GFP_KERNEL); >>>> +    if (!buf) >>>> +        return NULL; >>>> + >>>> +    pagelist = kcalloc(nr_pages, sizeof(*pagelist), GFP_KERNEL); >>>> +    if (!pagelist) { >>>> +        kfree(buf); >>>> +        return NULL; >>>> +    } >>>> + >>>> +    for (i = 0; i < nr_pages; i++) >>>> +        pagelist[i] = virt_to_page(pages[i]); >>>> + >>>> +    buf->base = vmap(pagelist, nr_pages, VM_MAP, PAGE_KERNEL); >>>> +    if (!buf->base) { >>>> +        kfree(pagelist); >>>> +        kfree(buf); >>>> +        return NULL; >>>> +    } >>>> + >>>> +    buf->nr_pages = nr_pages; >>>> +    buf->length = nr_pages * PAGE_SIZE; >>>> +    buf->pos = 0; >>>> + >>>> +    kfree(pagelist); >>>> +    return buf; >>>> +} >>>> + >>>> +static void hisi_ptt_pmu_free_aux(void *aux) >>>> +{ >>>> +    struct hisi_ptt_pmu_buf *buf = aux; >>>> + >>>> +    vunmap(buf->base); >>>> +    kfree(buf); >>>> +} >>>> + >>>> +static void hisi_ptt_pmu_start(struct perf_event *event, int flags) >>>> +{ >>>> +    struct hisi_ptt *hisi_ptt = to_hisi_ptt(event->pmu); >>>> +    struct perf_output_handle *handle = &hisi_ptt->trace_ctrl.handle; >>>> +    struct hw_perf_event *hwc = &event->hw; >>>> +    struct hisi_ptt_pmu_buf *buf; >>>> +    int cpu = event->cpu; >>>> +    int ret; >>>> + >>>> +    hwc->state = 0; >>>> +    mutex_lock(&hisi_ptt->mutex); >>>> +    if (hisi_ptt->trace_ctrl.started) { >>>> +        pci_dbg(hisi_ptt->pdev, "trace has already started\n"); >>> >>> doesn't perf core guard against this sort of thing? >>> >> >> Maybe not as tested. The perf core will start the events 1)on the cpus user specified or >> 2)on all the cpus, but the PTT trace is intended to start once on one cpu. >> >> For the 2) case, the driver will make default cpu to start the trace and block others >> in pmu::add(). For the 1) case we'll met the condition here. So the started status is >> test here to avoid a second start. > > if this is a realistic and sensible usecase then it would be nice to handle in core perf code at some stage > I think at least PTT trace meet this condition but seems we're the only uncore tracing PMU now, so maybe it's still not common. >> >>>> +        goto stop; >>>> +    } >>>> + >>>> +    if (cpu == -1) >>>> +        cpu = hisi_ptt->trace_ctrl.default_cpu; >>>> + >>>> +    /* >>>> +     * Handle the interrupt on the same cpu which starts the trace to avoid >>>> +     * context mismatch. Otherwise we'll trigger the WARN from the perf >>>> +     * core in event_function_local(). >>>> +     */ >>>> +    WARN_ON(irq_set_affinity(pci_irq_vector(hisi_ptt->pdev, HISI_PTT_TRACE_DMA_IRQ), >>>> +                 cpumask_of(cpu))); >>>> + >>>> +    ret = hisi_ptt_alloc_trace_buf(hisi_ptt); >>>> +    if (ret) { >>>> +        pci_dbg(hisi_ptt->pdev, "alloc trace buf failed, ret = %d\n", ret); >>>> +        goto stop; >>>> +    } >>>> + >>>> +    buf = perf_aux_output_begin(handle, event); >>>> +    if (!buf) { >>>> +        pci_dbg(hisi_ptt->pdev, "aux output begin failed\n"); >>>> +        goto stop; >>>> +    } >>>> + >>>> +    buf->pos = handle->head % buf->length; >>>> + >>>> +    ret = hisi_ptt_trace_start(hisi_ptt); >>>> +    if (ret) { >>>> +        pci_dbg(hisi_ptt->pdev, "trace start failed, ret = %d\n", ret); >>>> +        perf_aux_output_end(handle, 0); >>>> +        goto stop; >>>> +    } >>>> + >>>> +    mutex_unlock(&hisi_ptt->mutex); >>>> +    return; >>>> +stop: >>>> +    event->hw.state |= PERF_HES_STOPPED; >>>> +    mutex_unlock(&hisi_ptt->mutex); >>>> +} [...] >>>> + >>>> +static void hisi_ptt_remove(struct pci_dev *pdev) >>>> +{ >>>> +    struct hisi_ptt *hisi_ptt = pci_get_drvdata(pdev); >>>> + >>>> +    /* >>>> +     * We have to manually unregister the PMU device rather than make it >>>> +     * devres managed to keep order that the PMU device's unregistration >>>> +     * is prior to the release of DMA buffers. As the DMA buffers are >>>> +     * devm allocated when necessary which is after the registration of >>>> +     * the PMU device. >>>> +     */ >>> >>> do you really need to mention all this? >>> >> >> I think yes. Otherwise people may ask why not register PMU device in managed >> way as well. > > I expect devres work to be done after hisi_ptt_remove() so I would know this... > yes, but the problem is that the buffers are devm allocated outside probe so the order is not obvious and maybe a bit hard to understand. But as suggested to allocate the buffers in the probe stage we can get rid of it and make PMU registration devres managed as well. Thanks, Yicong