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=-15.3 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER,INCLUDES_PATCH, MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED, USER_AGENT_SANE_1 autolearn=unavailable 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 CABC9C48BE5 for ; Wed, 16 Jun 2021 01:54:38 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id A732F61076 for ; Wed, 16 Jun 2021 01:54:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S231873AbhFPB4m (ORCPT ); Tue, 15 Jun 2021 21:56:42 -0400 Received: from szxga03-in.huawei.com ([45.249.212.189]:6386 "EHLO szxga03-in.huawei.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230454AbhFPB4l (ORCPT ); Tue, 15 Jun 2021 21:56:41 -0400 Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.56]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4G4SnR5K1Vz6y5r; Wed, 16 Jun 2021 09:50:35 +0800 (CST) Received: from dggema757-chm.china.huawei.com (10.1.198.199) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.2176.2; Wed, 16 Jun 2021 09:54:30 +0800 Received: from [127.0.0.1] (10.69.38.203) by dggema757-chm.china.huawei.com (10.1.198.199) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Wed, 16 Jun 2021 09:54:23 +0800 Subject: Re: [PATCH v6 2/2] drivers/perf: hisi: Add driver for HiSilicon PCIe PMU To: Will Deacon , Linuxarm CC: , , , , , References: <1622467951-32114-1-git-send-email-liuqi115@huawei.com> <1622467951-32114-3-git-send-email-liuqi115@huawei.com> <20210611162347.GA16284@willie-the-truck> <20210615093519.GB19878@willie-the-truck> From: "liuqi (BA)" Message-ID: <8e15e8d6-cfe8-0926-0ca1-b162302e52a5@huawei.com> Date: Wed, 16 Jun 2021 09:54:23 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 In-Reply-To: <20210615093519.GB19878@willie-the-truck> Content-Type: text/plain; charset="utf-8"; format=flowed Content-Language: en-GB Content-Transfer-Encoding: 8bit X-Originating-IP: [10.69.38.203] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggema757-chm.china.huawei.com (10.1.198.199) X-CFilter-Loop: Reflected Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Will, On 2021/6/15 17:35, Will Deacon wrote: > On Tue, Jun 15, 2021 at 04:57:09PM +0800, liuqi (BA) wrote: >> On 2021/6/12 0:23, Will Deacon wrote: >>> On Mon, May 31, 2021 at 09:32:31PM +0800, Qi Liu wrote: >>>> PCIe PMU Root Complex Integrated End Point(RCiEP) device is supported >>>> to sample bandwidth, latency, buffer occupation etc. >>>> >>>> Each PMU RCiEP device monitors multiple Root Ports, and each RCiEP is >>>> registered as a PMU in /sys/bus/event_source/devices, so users can >>>> select target PMU, and use filter to do further sets. >>>> >>>> Filtering options contains: >>>> event - select the event. >>>> subevent - select the subevent. >>>> port - select target Root Ports. Information of Root Ports >>>> are shown under sysfs. >>>> bdf - select requester_id of target EP device. >>>> trig_len - set trigger condition for starting event statistics. >>>> trigger_mode - set trigger mode. 0 means starting to statistic when >>>> bigger than trigger condition, and 1 means smaller. >>>> thr_len - set threshold for statistics. >>>> thr_mode - set threshold mode. 0 means count when bigger than >>>> threshold, and 1 means smaller. >>>> >>>> Reviewed-by: John Garry >>>> Signed-off-by: Qi Liu >>>> --- >>>> MAINTAINERS | 6 + >>>> drivers/perf/Kconfig | 2 + >>>> drivers/perf/Makefile | 1 + >>>> drivers/perf/pci/Kconfig | 16 + >>>> drivers/perf/pci/Makefile | 2 + >>>> drivers/perf/pci/hisilicon/Makefile | 3 + >>>> drivers/perf/pci/hisilicon/hisi_pcie_pmu.c | 1019 ++++++++++++++++++++++++++++ >>> >>> Can we keep this under drivers/perf/hisilicon/ please? I don't see the >>> need to create a 'pci' directory here. >>> >> So how about drivers/perf/hisilicon/pci? as hisi_pcie_pmu.c do not use >> hisi_uncore_pmu framework. > > That's up to you. As long as it's _somewhere_ under drivers/perf/hisilicon/, > then I'm not too fussed. > ok, got it, will move the driver to perf/hisilicon in next version. >>>> +static void hisi_pcie_parse_reg_value(struct hisi_pcie_pmu *pcie_pmu, >>>> + u32 reg_off, u16 *arg0, u16 *arg1) >>>> +{ >>>> + u32 val = readl(pcie_pmu->base + reg_off); >>>> + >>>> + *arg0 = val & 0xffff; >>>> + *arg1 = (val & 0xffff0000) >> 16; >>>> +} >>> >>> Define a new type for the pair of values and return that directly? >>> >> Sorry, I'm not sure about how to fix this, do you mean add a union like >> this? >> union reg_val { >> struct { >> u16 arg0; >> u16 arg1; >> } >> u32 val; >> } > > I was just thinking along the lines of: > > struct hisi_pcie_reg_pair { > u16 lo; > u16 hi; > }; > > static struct hisi_pcie_reg_pair > hisi_pcie_parse_reg_value(struct hisi_pcie_pmu *pcie_pmum u32 reg_off) > { > u32 val = readl_relaxed(pcie_pmu->base + reg_off); > struct hisi_pcie_reg_pair regs = { > .lo = val, > .hi = val >> 16, > }; > > return regs; > } > > Does that work? > yes, will fix this, thanks. >>>> +/* >>>> + * The bandwidth, latency, bus utilization and buffer occupancy features are >>>> + * calculated from data in HISI_PCIE_CNT and extended data in HISI_PCIE_EXT_CNT. >>>> + * Other features are obtained only by HISI_PCIE_CNT. >>>> + * So data and data_ext are processed in this function to get performanace >>>> + * value like, bandwidth, latency, etc. >>>> + */ >>>> +static u64 hisi_pcie_pmu_get_performance(struct perf_event *event, u64 data, >>>> + u64 data_ext) >>>> +{ >>>> +#define CONVERT_DW_TO_BYTE(x) (sizeof(u32) * (x)) >>> >>> I don't know what a "DW" is, but this macro adds nothing... >> >> DW means double words, and 1DW = 4Bytes, value in hardware counter means DW >> so I wanna change it into Byte. >> So how about using 4*data here and adding code comment to explain it. > > Just remove the macro and replace it's single user with sizeof(u32) * x > ok, thanks. >>>> + /* Process data to set unit of latency as "us". */ >>>> + if (is_latency_event(idx)) >>>> + return div64_u64(data * us_per_cycle, data_ext); >>>> + >>>> + if (is_bus_util_event(idx)) >>>> + return div64_u64(data * us_per_cycle, data_ext); >>>> + >>>> + if (is_buf_util_event(idx)) >>>> + return div64_u64(data, data_ext * us_per_cycle); >>> >>> Why do we need to do all this division in the kernel? Can't we just expose >>> the underlying values and let userspace figure out what it wants to do with >>> the numbers? >>> >> Our PMU hardware support 8 sets of counters to count bandwidth, latency and >> utilization events. >> >> For example, when users set latency event, common counter will count delay >> cycles, and extern counter count number of PCIe packets automaticly. And we >> do not have a event number for counting number of PCIe packets. >> >> So this division cannot move to userspace tool. > > Why can't you expose the packet counter as an extra event to userspace? > Maybe I didn’t express it clearly. As there is no hardware event number for PCIe packets counting, extern counter count packets *automaticly* when latency events is selected by users. This means users cannot set "config=0xXX" to start packets counting event. So we can only get the value of counter and extern counter in driver and do the division, then pass the result to userspace. > Will > . > 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=-15.5 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_CR_TRAILER, INCLUDES_PATCH,MAILING_LIST_MULTI,NICE_REPLY_A,SPF_HELO_NONE,SPF_PASS, URIBL_BLOCKED,USER_AGENT_SANE_1 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 92CFCC48BE5 for ; Wed, 16 Jun 2021 01:56:18 +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 5FBFD61076 for ; Wed, 16 Jun 2021 01:56:18 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 5FBFD61076 Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=huawei.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-arm-kernel-bounces+linux-arm-kernel=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.20210309; h=Sender:Content-Type: Content-Transfer-Encoding:List-Subscribe:List-Help:List-Post:List-Archive: List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:Date:Message-ID:From: References:CC:To:Subject:Reply-To:Content-ID:Content-Description:Resent-Date: Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Owner; bh=LkMjMNE268Tb2RhY/jYZ7EUo4YZSz6EnWrArQyyxwCE=; b=pIa7z8g8GOJYSCcbqmB12bQfMO cuHeQe666mJPrNSUKFMLz6Rk8tnhq+9HM5NVLvUCGMUTy8pyAhTNCkGcY2+P02Q2g0uAfEJKfFINl RGhYsHpIaW3OYEEAaF5aDD1Q1EYtlkOQvmFCdZwCAzXhEL8zQLP2c7vDLA089jOZxPb99Gz2iOOmw WH7XXJPIHrPEz6q4djNDuLwMonhcMUrDWuIGdF/pufr3y3/6YByzdxVoLglGX7jOMlBD1sUr5/yKf GxEZ6jw+AGhlj5dpQ321WBnRgZSLbXEal3CtHmCCIVSu4trRtHjlkqvdbuYdjF+FOl2/Spo9lnK7P 846ewehg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ltKlP-004PaL-1b; Wed, 16 Jun 2021 01:54:43 +0000 Received: from szxga03-in.huawei.com ([45.249.212.189]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ltKlK-004PZE-GC for linux-arm-kernel@lists.infradead.org; Wed, 16 Jun 2021 01:54:40 +0000 Received: from dggemv704-chm.china.huawei.com (unknown [172.30.72.56]) by szxga03-in.huawei.com (SkyGuard) with ESMTP id 4G4SnR5K1Vz6y5r; Wed, 16 Jun 2021 09:50:35 +0800 (CST) Received: from dggema757-chm.china.huawei.com (10.1.198.199) by dggemv704-chm.china.huawei.com (10.3.19.47) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256) id 15.1.2176.2; Wed, 16 Jun 2021 09:54:30 +0800 Received: from [127.0.0.1] (10.69.38.203) by dggema757-chm.china.huawei.com (10.1.198.199) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256_P256) id 15.1.2176.2; Wed, 16 Jun 2021 09:54:23 +0800 Subject: Re: [PATCH v6 2/2] drivers/perf: hisi: Add driver for HiSilicon PCIe PMU To: Will Deacon , Linuxarm CC: , , , , , References: <1622467951-32114-1-git-send-email-liuqi115@huawei.com> <1622467951-32114-3-git-send-email-liuqi115@huawei.com> <20210611162347.GA16284@willie-the-truck> <20210615093519.GB19878@willie-the-truck> From: "liuqi (BA)" Message-ID: <8e15e8d6-cfe8-0926-0ca1-b162302e52a5@huawei.com> Date: Wed, 16 Jun 2021 09:54:23 +0800 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:68.0) Gecko/20100101 Thunderbird/68.6.0 MIME-Version: 1.0 In-Reply-To: <20210615093519.GB19878@willie-the-truck> Content-Language: en-GB X-Originating-IP: [10.69.38.203] X-ClientProxiedBy: dggems701-chm.china.huawei.com (10.3.19.178) To dggema757-chm.china.huawei.com (10.1.198.199) X-CFilter-Loop: Reflected X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210615_185438_959616_59C5073B X-CRM114-Status: GOOD ( 30.28 ) 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-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-arm-kernel" Errors-To: linux-arm-kernel-bounces+linux-arm-kernel=archiver.kernel.org@lists.infradead.org CkhpIFdpbGwsCk9uIDIwMjEvNi8xNSAxNzozNSwgV2lsbCBEZWFjb24gd3JvdGU6Cj4gT24gVHVl LCBKdW4gMTUsIDIwMjEgYXQgMDQ6NTc6MDlQTSArMDgwMCwgbGl1cWkgKEJBKSB3cm90ZToKPj4g T24gMjAyMS82LzEyIDA6MjMsIFdpbGwgRGVhY29uIHdyb3RlOgo+Pj4gT24gTW9uLCBNYXkgMzEs IDIwMjEgYXQgMDk6MzI6MzFQTSArMDgwMCwgUWkgTGl1IHdyb3RlOgo+Pj4+IFBDSWUgUE1VIFJv b3QgQ29tcGxleCBJbnRlZ3JhdGVkIEVuZCBQb2ludChSQ2lFUCkgZGV2aWNlIGlzIHN1cHBvcnRl ZAo+Pj4+IHRvIHNhbXBsZSBiYW5kd2lkdGgsIGxhdGVuY3ksIGJ1ZmZlciBvY2N1cGF0aW9uIGV0 Yy4KPj4+Pgo+Pj4+IEVhY2ggUE1VIFJDaUVQIGRldmljZSBtb25pdG9ycyBtdWx0aXBsZSBSb290 IFBvcnRzLCBhbmQgZWFjaCBSQ2lFUCBpcwo+Pj4+IHJlZ2lzdGVyZWQgYXMgYSBQTVUgaW4gL3N5 cy9idXMvZXZlbnRfc291cmNlL2RldmljZXMsIHNvIHVzZXJzIGNhbgo+Pj4+IHNlbGVjdCB0YXJn ZXQgUE1VLCBhbmQgdXNlIGZpbHRlciB0byBkbyBmdXJ0aGVyIHNldHMuCj4+Pj4KPj4+PiBGaWx0 ZXJpbmcgb3B0aW9ucyBjb250YWluczoKPj4+PiBldmVudCAgICAgICAgLSBzZWxlY3QgdGhlIGV2 ZW50Lgo+Pj4+IHN1YmV2ZW50ICAgICAtIHNlbGVjdCB0aGUgc3ViZXZlbnQuCj4+Pj4gcG9ydCAg ICAgICAgIC0gc2VsZWN0IHRhcmdldCBSb290IFBvcnRzLiBJbmZvcm1hdGlvbiBvZiBSb290IFBv cnRzCj4+Pj4gICAgICAgICAgICAgICAgICBhcmUgc2hvd24gdW5kZXIgc3lzZnMuCj4+Pj4gYmRm ICAgICAgICAgIC0gc2VsZWN0IHJlcXVlc3Rlcl9pZCBvZiB0YXJnZXQgRVAgZGV2aWNlLgo+Pj4+ IHRyaWdfbGVuICAgICAtIHNldCB0cmlnZ2VyIGNvbmRpdGlvbiBmb3Igc3RhcnRpbmcgZXZlbnQg c3RhdGlzdGljcy4KPj4+PiB0cmlnZ2VyX21vZGUgLSBzZXQgdHJpZ2dlciBtb2RlLiAwIG1lYW5z IHN0YXJ0aW5nIHRvIHN0YXRpc3RpYyB3aGVuCj4+Pj4gICAgICAgICAgICAgICAgICBiaWdnZXIg dGhhbiB0cmlnZ2VyIGNvbmRpdGlvbiwgYW5kIDEgbWVhbnMgc21hbGxlci4KPj4+PiB0aHJfbGVu ICAgICAgLSBzZXQgdGhyZXNob2xkIGZvciBzdGF0aXN0aWNzLgo+Pj4+IHRocl9tb2RlICAgICAt IHNldCB0aHJlc2hvbGQgbW9kZS4gMCBtZWFucyBjb3VudCB3aGVuIGJpZ2dlciB0aGFuCj4+Pj4g ICAgICAgICAgICAgICAgICB0aHJlc2hvbGQsIGFuZCAxIG1lYW5zIHNtYWxsZXIuCj4+Pj4KPj4+ PiBSZXZpZXdlZC1ieTogSm9obiBHYXJyeSA8am9obi5nYXJyeUBodWF3ZWkuY29tPgo+Pj4+IFNp Z25lZC1vZmYtYnk6IFFpIExpdSA8bGl1cWkxMTVAaHVhd2VpLmNvbT4KPj4+PiAtLS0KPj4+PiAg ICBNQUlOVEFJTkVSUyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgICA2ICsKPj4+ PiAgICBkcml2ZXJzL3BlcmYvS2NvbmZpZyAgICAgICAgICAgICAgICAgICAgICAgfCAgICAyICsK Pj4+PiAgICBkcml2ZXJzL3BlcmYvTWFrZWZpbGUgICAgICAgICAgICAgICAgICAgICAgfCAgICAx ICsKPj4+PiAgICBkcml2ZXJzL3BlcmYvcGNpL0tjb25maWcgICAgICAgICAgICAgICAgICAgfCAg IDE2ICsKPj4+PiAgICBkcml2ZXJzL3BlcmYvcGNpL01ha2VmaWxlICAgICAgICAgICAgICAgICAg fCAgICAyICsKPj4+PiAgICBkcml2ZXJzL3BlcmYvcGNpL2hpc2lsaWNvbi9NYWtlZmlsZSAgICAg ICAgfCAgICAzICsKPj4+PiAgICBkcml2ZXJzL3BlcmYvcGNpL2hpc2lsaWNvbi9oaXNpX3BjaWVf cG11LmMgfCAxMDE5ICsrKysrKysrKysrKysrKysrKysrKysrKysrKysKPj4+Cj4+PiBDYW4gd2Ug a2VlcCB0aGlzIHVuZGVyIGRyaXZlcnMvcGVyZi9oaXNpbGljb24vIHBsZWFzZT8gSSBkb24ndCBz ZWUgdGhlCj4+PiBuZWVkIHRvIGNyZWF0ZSBhICdwY2knIGRpcmVjdG9yeSBoZXJlLgo+Pj4KPj4g U28gaG93IGFib3V0IGRyaXZlcnMvcGVyZi9oaXNpbGljb24vcGNpPyBhcyBoaXNpX3BjaWVfcG11 LmMgZG8gbm90IHVzZQo+PiBoaXNpX3VuY29yZV9wbXUgZnJhbWV3b3JrLgo+IAo+IFRoYXQncyB1 cCB0byB5b3UuIEFzIGxvbmcgYXMgaXQncyBfc29tZXdoZXJlXyB1bmRlciBkcml2ZXJzL3BlcmYv aGlzaWxpY29uLywKPiB0aGVuIEknbSBub3QgdG9vIGZ1c3NlZC4KPiAKb2ssIGdvdCBpdCwgd2ls bCBtb3ZlIHRoZSBkcml2ZXIgdG8gcGVyZi9oaXNpbGljb24gaW4gbmV4dCB2ZXJzaW9uLgo+Pj4+ ICtzdGF0aWMgdm9pZCBoaXNpX3BjaWVfcGFyc2VfcmVnX3ZhbHVlKHN0cnVjdCBoaXNpX3BjaWVf cG11ICpwY2llX3BtdSwKPj4+PiArCQkJCSAgICAgIHUzMiByZWdfb2ZmLCB1MTYgKmFyZzAsIHUx NiAqYXJnMSkKPj4+PiArewo+Pj4+ICsJdTMyIHZhbCA9IHJlYWRsKHBjaWVfcG11LT5iYXNlICsg cmVnX29mZik7Cj4+Pj4gKwo+Pj4+ICsJKmFyZzAgPSB2YWwgJiAweGZmZmY7Cj4+Pj4gKwkqYXJn MSA9ICh2YWwgJiAweGZmZmYwMDAwKSA+PiAxNjsKPj4+PiArfQo+Pj4KPj4+IERlZmluZSBhIG5l dyB0eXBlIGZvciB0aGUgcGFpciBvZiB2YWx1ZXMgYW5kIHJldHVybiB0aGF0IGRpcmVjdGx5Pwo+ Pj4KPj4gU29ycnksIEknbSBub3Qgc3VyZSBhYm91dCBob3cgdG8gZml4IHRoaXMsIGRvIHlvdSBt ZWFuIGFkZCBhIHVuaW9uIGxpa2UKPj4gdGhpcz8KPj4gdW5pb24gcmVnX3ZhbCB7Cj4+IAlzdHJ1 Y3Qgewo+PiAJCXUxNiBhcmcwOwo+PiAJCXUxNiBhcmcxOwo+PiAJfQo+PiAJdTMyIHZhbDsKPj4g fQo+IAo+IEkgd2FzIGp1c3QgdGhpbmtpbmcgYWxvbmcgdGhlIGxpbmVzIG9mOgo+IAo+IHN0cnVj dCBoaXNpX3BjaWVfcmVnX3BhaXIgewo+IAl1MTYgbG87Cj4gCXUxNiBoaTsKPiB9Owo+IAo+IHN0 YXRpYyBzdHJ1Y3QgaGlzaV9wY2llX3JlZ19wYWlyCj4gaGlzaV9wY2llX3BhcnNlX3JlZ192YWx1 ZShzdHJ1Y3QgaGlzaV9wY2llX3BtdSAqcGNpZV9wbXVtIHUzMiByZWdfb2ZmKQo+IHsKPiAJdTMy IHZhbCA9IHJlYWRsX3JlbGF4ZWQocGNpZV9wbXUtPmJhc2UgKyByZWdfb2ZmKTsKPiAJc3RydWN0 IGhpc2lfcGNpZV9yZWdfcGFpciByZWdzID0gewo+IAkJLmxvID0gdmFsLAo+IAkJLmhpID0gdmFs ID4+IDE2LAo+IAl9Owo+IAo+IAlyZXR1cm4gcmVnczsKPiB9Cj4gCj4gRG9lcyB0aGF0IHdvcms/ Cj4gCnllcywgd2lsbCBmaXggdGhpcywgdGhhbmtzLgo+Pj4+ICsvKgo+Pj4+ICsgKiBUaGUgYmFu ZHdpZHRoLCBsYXRlbmN5LCBidXMgdXRpbGl6YXRpb24gYW5kIGJ1ZmZlciBvY2N1cGFuY3kgZmVh dHVyZXMgYXJlCj4+Pj4gKyAqIGNhbGN1bGF0ZWQgZnJvbSBkYXRhIGluIEhJU0lfUENJRV9DTlQg YW5kIGV4dGVuZGVkIGRhdGEgaW4gSElTSV9QQ0lFX0VYVF9DTlQuCj4+Pj4gKyAqIE90aGVyIGZl YXR1cmVzIGFyZSBvYnRhaW5lZCBvbmx5IGJ5IEhJU0lfUENJRV9DTlQuCj4+Pj4gKyAqIFNvIGRh dGEgYW5kIGRhdGFfZXh0IGFyZSBwcm9jZXNzZWQgaW4gdGhpcyBmdW5jdGlvbiB0byBnZXQgcGVy Zm9ybWFuYWNlCj4+Pj4gKyAqIHZhbHVlIGxpa2UsIGJhbmR3aWR0aCwgbGF0ZW5jeSwgZXRjLgo+ Pj4+ICsgKi8KPj4+PiArc3RhdGljIHU2NCBoaXNpX3BjaWVfcG11X2dldF9wZXJmb3JtYW5jZShz dHJ1Y3QgcGVyZl9ldmVudCAqZXZlbnQsIHU2NCBkYXRhLAo+Pj4+ICsJCQkJCSB1NjQgZGF0YV9l eHQpCj4+Pj4gK3sKPj4+PiArI2RlZmluZSBDT05WRVJUX0RXX1RPX0JZVEUoeCkJKHNpemVvZih1 MzIpICogKHgpKQo+Pj4KPj4+IEkgZG9uJ3Qga25vdyB3aGF0IGEgIkRXIiBpcywgYnV0IHRoaXMg bWFjcm8gYWRkcyBub3RoaW5nLi4uCj4+Cj4+IERXIG1lYW5zIGRvdWJsZSB3b3JkcywgYW5kIDFE VyA9IDRCeXRlcywgdmFsdWUgaW4gaGFyZHdhcmUgY291bnRlciBtZWFucyBEVwo+PiBzbyBJIHdh bm5hIGNoYW5nZSBpdCBpbnRvIEJ5dGUuCj4+IFNvIGhvdyBhYm91dCB1c2luZyA0KmRhdGEgaGVy ZSBhbmQgYWRkaW5nIGNvZGUgY29tbWVudCB0byBleHBsYWluIGl0Lgo+IAo+IEp1c3QgcmVtb3Zl IHRoZSBtYWNybyBhbmQgcmVwbGFjZSBpdCdzIHNpbmdsZSB1c2VyIHdpdGggc2l6ZW9mKHUzMikg KiB4Cj4gCm9rLCB0aGFua3MuCj4+Pj4gKwkvKiBQcm9jZXNzIGRhdGEgdG8gc2V0IHVuaXQgb2Yg bGF0ZW5jeSBhcyAidXMiLiAqLwo+Pj4+ICsJaWYgKGlzX2xhdGVuY3lfZXZlbnQoaWR4KSkKPj4+ PiArCQlyZXR1cm4gZGl2NjRfdTY0KGRhdGEgKiB1c19wZXJfY3ljbGUsIGRhdGFfZXh0KTsKPj4+ PiArCj4+Pj4gKwlpZiAoaXNfYnVzX3V0aWxfZXZlbnQoaWR4KSkKPj4+PiArCQlyZXR1cm4gZGl2 NjRfdTY0KGRhdGEgKiB1c19wZXJfY3ljbGUsIGRhdGFfZXh0KTsKPj4+PiArCj4+Pj4gKwlpZiAo aXNfYnVmX3V0aWxfZXZlbnQoaWR4KSkKPj4+PiArCQlyZXR1cm4gZGl2NjRfdTY0KGRhdGEsIGRh dGFfZXh0ICogdXNfcGVyX2N5Y2xlKTsKPj4+Cj4+PiBXaHkgZG8gd2UgbmVlZCB0byBkbyBhbGwg dGhpcyBkaXZpc2lvbiBpbiB0aGUga2VybmVsPyBDYW4ndCB3ZSBqdXN0IGV4cG9zZQo+Pj4gdGhl IHVuZGVybHlpbmcgdmFsdWVzIGFuZCBsZXQgdXNlcnNwYWNlIGZpZ3VyZSBvdXQgd2hhdCBpdCB3 YW50cyB0byBkbyB3aXRoCj4+PiB0aGUgbnVtYmVycz8KPj4+Cj4+IE91ciBQTVUgaGFyZHdhcmUg c3VwcG9ydCA4IHNldHMgb2YgY291bnRlcnMgdG8gY291bnQgYmFuZHdpZHRoLCBsYXRlbmN5IGFu ZAo+PiB1dGlsaXphdGlvbiBldmVudHMuCj4+Cj4+IEZvciBleGFtcGxlLCB3aGVuIHVzZXJzIHNl dCBsYXRlbmN5IGV2ZW50LCBjb21tb24gY291bnRlciB3aWxsIGNvdW50IGRlbGF5Cj4+IGN5Y2xl cywgYW5kIGV4dGVybiBjb3VudGVyIGNvdW50IG51bWJlciBvZiBQQ0llIHBhY2tldHMgYXV0b21h dGljbHkuIEFuZCB3ZQo+PiBkbyBub3QgaGF2ZSBhIGV2ZW50IG51bWJlciBmb3IgY291bnRpbmcg bnVtYmVyIG9mIFBDSWUgcGFja2V0cy4KPj4KPj4gU28gdGhpcyBkaXZpc2lvbiBjYW5ub3QgbW92 ZSB0byB1c2Vyc3BhY2UgdG9vbC4KPiAKPiBXaHkgY2FuJ3QgeW91IGV4cG9zZSB0aGUgcGFja2V0 IGNvdW50ZXIgYXMgYW4gZXh0cmEgZXZlbnQgdG8gdXNlcnNwYWNlPwo+IApNYXliZSBJIGRpZG7i gJl0IGV4cHJlc3MgaXQgY2xlYXJseS4KCkFzIHRoZXJlIGlzIG5vIGhhcmR3YXJlIGV2ZW50IG51 bWJlciBmb3IgUENJZSBwYWNrZXRzIGNvdW50aW5nLCBleHRlcm4gCmNvdW50ZXIgY291bnQgcGFj a2V0cyAqYXV0b21hdGljbHkqIHdoZW4gbGF0ZW5jeSBldmVudHMgaXMgc2VsZWN0ZWQgYnkgCnVz ZXJzLgoKVGhpcyBtZWFucyB1c2VycyBjYW5ub3Qgc2V0ICJjb25maWc9MHhYWCIgdG8gc3RhcnQg cGFja2V0cyBjb3VudGluZyAKZXZlbnQuIFNvIHdlIGNhbiBvbmx5IGdldCB0aGUgdmFsdWUgb2Yg Y291bnRlciBhbmQgZXh0ZXJuIGNvdW50ZXIgaW4gCmRyaXZlciBhbmQgZG8gdGhlIGRpdmlzaW9u LCB0aGVuIHBhc3MgdGhlIHJlc3VsdCB0byB1c2Vyc3BhY2UuCj4gV2lsbAo+IC4KPiAKCgpfX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2Vy bmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0 cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVs Cg==