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=-3.8 required=3.0 tests=BAYES_00, HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI,SPF_HELO_NONE,SPF_PASS autolearn=no 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 A1C66C48BE0 for ; Fri, 11 Jun 2021 23:34:00 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 852AD611CA for ; Fri, 11 Jun 2021 23:34:00 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230297AbhFKXf5 (ORCPT ); Fri, 11 Jun 2021 19:35:57 -0400 Received: from mail-wm1-f43.google.com ([209.85.128.43]:35393 "EHLO mail-wm1-f43.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229540AbhFKXf5 (ORCPT ); Fri, 11 Jun 2021 19:35:57 -0400 Received: by mail-wm1-f43.google.com with SMTP id k5-20020a05600c1c85b02901affeec3ef8so9564701wms.0; Fri, 11 Jun 2021 16:33:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=Z2zlmHj+1HcVsICU+2gdJrF/4o7OgOCN/FyHrCzGZ6g=; b=pLLVtIyg5sIEWCzB8C4qKBzG/fFWwcDsAZJm35I8bEEwZqYRN+qXhQSn7Z33mQPf+i q5ARARdwMGdjduzz37ujN3IJE/PGdPsOC+7+OSjVr3Zs8Rrrdhvel1ayWBGH3cpFAgiS jCh+jZtMYlaEgWxBgnJBe9tWWwMs6qEWMmHvGOxspQUznf+eOabjA1dR0c9KHukE9dCU 6LThNkzWDb+hRUB6hspBhNSigWIHtFe1WxO5SOxX8eyrd9FVcyNo4Lgj9yGIji2O0xX2 hi4+ctGtO6izD1dtcOGxVE+OgsQs/VwUCXxidfstL1vnXkGhBrUXYqZFiSwkHuwLhG+u ymGg== X-Gm-Message-State: AOAM531chuivuQIFg2cA9I2HcpX+pAI+GmWzNQTlIavnX2NgD/+86SN8 A6AVn39YIfMP3DN0UjoF4xo= X-Google-Smtp-Source: ABdhPJzZbySWhRyOkrWp6EOaPa7zyUyPkaWhFMgfEwdFMTM6Jbyt9M95x8X/q/432QsPVybj8D6RFw== X-Received: by 2002:a7b:c192:: with SMTP id y18mr22530884wmi.65.1623454437589; Fri, 11 Jun 2021 16:33:57 -0700 (PDT) Received: from rocinante ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id x7sm8838753wre.8.2021.06.11.16.33.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Jun 2021 16:33:56 -0700 (PDT) Date: Sat, 12 Jun 2021 01:33:55 +0200 From: Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= To: Qi Liu Cc: will@kernel.org, mark.rutland@arm.com, bhelgaas@google.com, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linuxarm@huawei.com, zhangshaokun@hisilicon.com Subject: Re: [PATCH v6 2/2] drivers/perf: hisi: Add driver for HiSilicon PCIe PMU Message-ID: <20210611233355.GA183580@rocinante> References: <1622467951-32114-1-git-send-email-liuqi115@huawei.com> <1622467951-32114-3-git-send-email-liuqi115@huawei.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: <1622467951-32114-3-git-send-email-liuqi115@huawei.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Hi Qi, Thank you for sending the patch over! [...] > +/* > + * This driver adds support for PCIe PMU RCiEP device. Related > + * perf events are bandwidth, bandwidth utilization, latency > + * etc. > + * > + * Copyright (C) 2021 HiSilicon Limited > + * Author: Qi Liu > + */ A small nitpick: missing space between your name and the e-mail address. [...] > +static ssize_t hisi_pcie_event_sysfs_show(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct dev_ext_attribute *eattr; > + > + eattr = container_of(attr, struct dev_ext_attribute, attr); > + > + return sysfs_emit(buf, "config=0x%lx\n", (unsigned long)eattr->var); > +} I am not that familiar with the perf drivers, thus I might be completely wrong here, but usually for sysfs objects a single value is preferred, so that this "config=" technically would not be needed, unless this is somewhat essential to the consumers of this attribute to know what the value is?  What do you think? [...] > +static ssize_t hisi_pcie_identifier_show(struct device *dev, > + struct device_attribute *attr, > + char *buf) > +{ > + struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); > + > + return sysfs_emit(buf, "0x%x\n", pcie_pmu->identifier); > +} What about using the "%#x" formatting flag? It would automatically added the "0x" prefix, etc. > +static ssize_t hisi_pcie_bus_show(struct device *dev, > + struct device_attribute *attr, char *buf) > +{ > + struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(dev_get_drvdata(dev)); > + > + return sysfs_emit(buf, "0x%02x\n", PCI_BUS_NUM(pcie_pmu->bdf_min)); > +} Same as above, what about "%#02x"? [...] > +static bool hisi_pcie_pmu_valid_filter(struct perf_event *event, > + struct hisi_pcie_pmu *pcie_pmu) > +{ > + u32 subev_idx = hisi_pcie_get_subevent(event); > + u32 event_idx = hisi_pcie_get_event(event); > + u32 requester_id = hisi_pcie_get_bdf(event); > + > + if (subev_idx > HISI_PCIE_SUBEVENT_MAX || > + event_idx > HISI_PCIE_EVENT_MAX) { > + pci_err(pcie_pmu->pdev, > + "Max event index and max subevent index is: %d, %d.\n", > + HISI_PCIE_EVENT_MAX, HISI_PCIE_SUBEVENT_MAX); > + return false; > + } Was this error message above intended to be a debug message? It's a bit opaque in terms what the error actually is here. We might need to clear it up a little. [...] > +static bool hisi_pcie_pmu_validate_event_group(struct perf_event *event) > +{ > + struct perf_event *sibling, *leader = event->group_leader; > + int counters = 1; How big this counter could become? Would it ever be greater than HISI_PCIE_MAX_COUNTERS? I am asking, as if it would be ever greater, then perhaps unsigned int would be better to use, and if not, then perhaps something smaller than int? What do you think, does this even make sense to change? [...] > +static int hisi_pcie_pmu_event_init(struct perf_event *event) > +{ > + struct hisi_pcie_pmu *pcie_pmu = to_pcie_pmu(event->pmu); > + > + event->cpu = pcie_pmu->on_cpu; > + > + if (event->attr.type != event->pmu->type) > + return -ENOENT; > + > + /* Sampling is not supported. */ > + if (is_sampling_event(event) || event->attach_state & PERF_ATTACH_TASK) > + return -EOPNOTSUPP; > + > + if (!hisi_pcie_pmu_valid_filter(event, pcie_pmu)) { > + pci_err(pcie_pmu->pdev, "Invalid filter!\n"); > + return -EINVAL; > + } [...] > +/* > + * 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. > + */ A small typo in the world "performance" above. [...] > +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 would move this macro at the top alongside other constants and macros, as here it makes the code harder to read. What do you think? [...] > +static int hisi_pcie_pmu_irq_register(struct pci_dev *pdev, > + struct hisi_pcie_pmu *pcie_pmu) > +{ > + int irq, ret; > + > + ret = pci_alloc_irq_vectors(pdev, 1, 1, PCI_IRQ_MSI); > + if (ret < 0) { > + pci_err(pdev, "Failed to enable MSI vectors, ret = %d!\n", ret); > + return ret; > + } This is a nitpick, so feel free to ignore it, but what do you think of changing this (and also other messages alike) message to be, for example: pci_err(pdev, "Failed to enable MSI vectors: %d\n", ret); Why? I personally don't find displaying a return code/value followed by a punctuation easy to read, especially when looking through a lot of lines and other messages in the kernel ring buffer. [...] > + > + irq = pci_irq_vector(pdev, 0); > + ret = request_irq(irq, hisi_pcie_pmu_irq, > + IRQF_NOBALANCING | IRQF_NO_THREAD, "hisi_pcie_pmu", > + pcie_pmu); > + if (ret) { > + pci_err(pdev, "Failed to register irq, ret = %d!\n", ret); > + pci_free_irq_vectors(pdev); > + return ret; > + } It would be "IRQ" in the error message above. [...] > +static int hisi_pcie_pmu_offline_cpu(unsigned int cpu, struct hlist_node *node) > +{ > + struct hisi_pcie_pmu *pcie_pmu = hlist_entry_safe(node, > + struct hisi_pcie_pmu, node); > + unsigned int target; > + > + /* Nothing to do if this CPU doesn't own the PMU */ > + if (pcie_pmu->on_cpu != cpu) > + return 0; > + > + /* Choose a new CPU from all online cpus. */ > + target = cpumask_first(cpu_online_mask); > + if (target >= nr_cpu_ids) { > + pci_err(pcie_pmu->pdev, "There is no cpu to set!\n"); > + return 0; > + } To be consistent, it would be "CPUs" and "CPU" in the above. [...] > +static struct device_attribute hisi_pcie_pmu_bus_attr = > + __ATTR(bus, 0444, hisi_pcie_bus_show, NULL); [...] > +static struct device_attribute hisi_pcie_pmu_cpumask_attr = > + __ATTR(cpumask, 0444, hisi_pcie_cpumask_show, NULL); [...] > +static struct device_attribute hisi_pcie_pmu_identifier_attr = > + __ATTR(identifier, 0444, hisi_pcie_identifier_show, NULL); Would it be at possible for any of the above __ATTR() macros to be replaced with the DEVICE_ATTR_RO() macro? Or perhaps with __ATTR_RO() if the other one would be a good fit? [...] > +static int hisi_pcie_init_dev(struct pci_dev *pdev) > +{ > + int ret; > + > + ret = pci_enable_device(pdev); > + if (ret) { > + pci_err(pdev, "Failed to enable pci device, ret = %d.\n", ret); > + return ret; > + } > + > + ret = pci_request_mem_regions(pdev, "hisi_pcie_pmu"); > + if (ret < 0) { > + pci_err(pdev, "Failed to request pci mem regions, ret = %d.\n", > + ret); > + pci_disable_device(pdev); > + return ret; > + } It would be "PCI" in both error messages above. [...] > +static int __init hisi_pcie_module_init(void) > +{ > + int ret; > + > + ret = cpuhp_setup_state_multi(CPUHP_AP_PERF_ARM_HISI_PCIE_PMU_ONLINE, > + "AP_PERF_ARM_HISI_PCIE_PMU_ONLINE", > + hisi_pcie_pmu_online_cpu, > + hisi_pcie_pmu_offline_cpu); > + if (ret) { > + pr_err("Failed to setup PCIE PMU hotplug, ret = %d.\n", ret); > + return ret; > + } It would be "PCIe" in the error message above. Krzysztof 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=-4.0 required=3.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,HEADER_FROM_DIFFERENT_DOMAINS,MAILING_LIST_MULTI, SPF_HELO_NONE,SPF_PASS autolearn=no 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 40C34C48BE0 for ; Fri, 11 Jun 2021 23:35:56 +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 E53C361374 for ; Fri, 11 Jun 2021 23:35:55 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org E53C361374 Authentication-Results: mail.kernel.org; dmarc=none (p=none dis=none) header.from=linux.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-Transfer-Encoding:Content-Type:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:MIME-Version:References: Message-ID:Subject:Cc:To:From:Date:Reply-To:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=EfanzMcsMIy+POIRYgLgMTnAZMK/zPptJ34KvLF2jtU=; b=wwuD/1y6TaAyTR XQyZEYD9fIehxLj+i11w3Ejk27fzwuAY9WJpXCUNLCOhsHVG4NsHn+9ixB9tIKjEikwlPPAQ51c5i RaZcCbdIsYlffMzmqC0tSLUrrW9imnT5stf5mpqoQnfEymEcDtb3vACEPtwIgPWrRGRS5TTGAqoGx NrLvsIqRrO/FqMQQayQLD8OOfJ2UTjbCbBiAeR5hjTbl8pkPKWJKDnzlNLmEk5MhK04TDfqL/lF0y OAVh0C4XkXdNnOkgg6p7IEQZ8UwhGTm3Wu3FAB1kjWz6Fbl1U6l9nDF/H0+3wQ9FORJgbSeg1FhGy yMHNRa+vwXyhhCySMl+w==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1lrqf6-007O7C-Vb; Fri, 11 Jun 2021 23:34:05 +0000 Received: from mail-wm1-f45.google.com ([209.85.128.45]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1lrqf2-007O6H-Pc for linux-arm-kernel@lists.infradead.org; Fri, 11 Jun 2021 23:34:02 +0000 Received: by mail-wm1-f45.google.com with SMTP id t4-20020a1c77040000b029019d22d84ebdso9510326wmi.3 for ; Fri, 11 Jun 2021 16:33:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:date:from:to:cc:subject:message-id:references :mime-version:content-disposition:content-transfer-encoding :in-reply-to; bh=Z2zlmHj+1HcVsICU+2gdJrF/4o7OgOCN/FyHrCzGZ6g=; b=Ycmy61KzvhOIZ98unkW6eYnKPnPkakxJV5MB/28JTLgLHhdwuzTe35sJlT4yPl1cQz uOrE3rqRORc9S1+9ujoAg6bn7OazKwdE7uwWXYcKiQIn+RTS7xAbatYP7LrAG0SeCcb1 WSN2kd5IGGrRodqR4nr6CZ5LyLeU2R2L/YDcEf3S1OaMpY+W2k6ELsVFjZwDiXPkBsGs NFXRcYOCH45qs19Axklf/tvLa2A7vREhL7MzP2A3q2Ps3w+DJD4B399m0Gyo9r3C7RKb DQAocYRTlsUQNtHbz+cl99ELT7/c9MUxsQA0unFhgdGUrC3xTHPgt5WBWRi+Y8cDK4+L sm/w== X-Gm-Message-State: AOAM530eMCIXKdmij5OpS06QGvibECn873JKMt4/rDhBEoepTPUwIWc1 R7v5L2c8hp8WtxKmWnO8dOo= X-Google-Smtp-Source: ABdhPJzZbySWhRyOkrWp6EOaPa7zyUyPkaWhFMgfEwdFMTM6Jbyt9M95x8X/q/432QsPVybj8D6RFw== X-Received: by 2002:a7b:c192:: with SMTP id y18mr22530884wmi.65.1623454437589; Fri, 11 Jun 2021 16:33:57 -0700 (PDT) Received: from rocinante ([95.155.85.46]) by smtp.gmail.com with ESMTPSA id x7sm8838753wre.8.2021.06.11.16.33.56 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Fri, 11 Jun 2021 16:33:56 -0700 (PDT) Date: Sat, 12 Jun 2021 01:33:55 +0200 From: Krzysztof =?utf-8?Q?Wilczy=C5=84ski?= To: Qi Liu Cc: will@kernel.org, mark.rutland@arm.com, bhelgaas@google.com, linux-pci@vger.kernel.org, linux-arm-kernel@lists.infradead.org, linux-kernel@vger.kernel.org, linuxarm@huawei.com, zhangshaokun@hisilicon.com Subject: Re: [PATCH v6 2/2] drivers/perf: hisi: Add driver for HiSilicon PCIe PMU Message-ID: <20210611233355.GA183580@rocinante> References: <1622467951-32114-1-git-send-email-liuqi115@huawei.com> <1622467951-32114-3-git-send-email-liuqi115@huawei.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: <1622467951-32114-3-git-send-email-liuqi115@huawei.com> X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20210611_163400_867350_491BD17B X-CRM114-Status: GOOD ( 34.12 ) 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 SGkgUWksCgpUaGFuayB5b3UgZm9yIHNlbmRpbmcgdGhlIHBhdGNoIG92ZXIhCgpbLi4uXQo+ICsv Kgo+ICsgKiBUaGlzIGRyaXZlciBhZGRzIHN1cHBvcnQgZm9yIFBDSWUgUE1VIFJDaUVQIGRldmlj ZS4gUmVsYXRlZAo+ICsgKiBwZXJmIGV2ZW50cyBhcmUgYmFuZHdpZHRoLCBiYW5kd2lkdGggdXRp bGl6YXRpb24sIGxhdGVuY3kKPiArICogZXRjLgo+ICsgKgo+ICsgKiBDb3B5cmlnaHQgKEMpIDIw MjEgSGlTaWxpY29uIExpbWl0ZWQKPiArICogQXV0aG9yOiBRaSBMaXU8bGl1cWkxMTVAaHVhd2Vp LmNvbT4KPiArICovCgpBIHNtYWxsIG5pdHBpY2s6IG1pc3Npbmcgc3BhY2UgYmV0d2VlbiB5b3Vy IG5hbWUgYW5kIHRoZSBlLW1haWwgYWRkcmVzcy4KClsuLi5dCj4gK3N0YXRpYyBzc2l6ZV90IGhp c2lfcGNpZV9ldmVudF9zeXNmc19zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJCSAgIHN0 cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFyICpidWYpCj4gK3sKPiArCXN0cnVjdCBk ZXZfZXh0X2F0dHJpYnV0ZSAqZWF0dHI7Cj4gKwo+ICsJZWF0dHIgPSBjb250YWluZXJfb2YoYXR0 ciwgc3RydWN0IGRldl9leHRfYXR0cmlidXRlLCBhdHRyKTsKPiArCj4gKwlyZXR1cm4gc3lzZnNf ZW1pdChidWYsICJjb25maWc9MHglbHhcbiIsICh1bnNpZ25lZCBsb25nKWVhdHRyLT52YXIpOwo+ ICt9CgpJIGFtIG5vdCB0aGF0IGZhbWlsaWFyIHdpdGggdGhlIHBlcmYgZHJpdmVycywgdGh1cyBJ IG1pZ2h0IGJlIGNvbXBsZXRlbHkKd3JvbmcgaGVyZSwgYnV0IHVzdWFsbHkgZm9yIHN5c2ZzIG9i amVjdHMgYSBzaW5nbGUgdmFsdWUgaXMgcHJlZmVycmVkLApzbyB0aGF0IHRoaXMgImNvbmZpZz0i IHRlY2huaWNhbGx5IHdvdWxkIG5vdCBiZSBuZWVkZWQsIHVubGVzcyB0aGlzIGlzCnNvbWV3aGF0 IGVzc2VudGlhbCB0byB0aGUgY29uc3VtZXJzIG9mIHRoaXMgYXR0cmlidXRlIHRvIGtub3cgd2hh dCB0aGUKdmFsdWUgaXM/IMKgV2hhdCBkbyB5b3UgdGhpbms/CgpbLi4uXQo+ICtzdGF0aWMgc3Np emVfdCBoaXNpX3BjaWVfaWRlbnRpZmllcl9zaG93KHN0cnVjdCBkZXZpY2UgKmRldiwKPiArCQkJ CQkgc3RydWN0IGRldmljZV9hdHRyaWJ1dGUgKmF0dHIsCj4gKwkJCQkJIGNoYXIgKmJ1ZikKPiAr ewo+ICsJc3RydWN0IGhpc2lfcGNpZV9wbXUgKnBjaWVfcG11ID0gdG9fcGNpZV9wbXUoZGV2X2dl dF9kcnZkYXRhKGRldikpOwo+ICsKPiArCXJldHVybiBzeXNmc19lbWl0KGJ1ZiwgIjB4JXhcbiIs IHBjaWVfcG11LT5pZGVudGlmaWVyKTsKPiArfQoKV2hhdCBhYm91dCB1c2luZyB0aGUgIiUjeCIg Zm9ybWF0dGluZyBmbGFnPyAgSXQgd291bGQgYXV0b21hdGljYWxseQphZGRlZCB0aGUgIjB4IiBw cmVmaXgsIGV0Yy4KCj4gK3N0YXRpYyBzc2l6ZV90IGhpc2lfcGNpZV9idXNfc2hvdyhzdHJ1Y3Qg ZGV2aWNlICpkZXYsCj4gKwkJCQkgIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLCBjaGFy ICpidWYpCj4gK3sKPiArCXN0cnVjdCBoaXNpX3BjaWVfcG11ICpwY2llX3BtdSA9IHRvX3BjaWVf cG11KGRldl9nZXRfZHJ2ZGF0YShkZXYpKTsKPiArCj4gKwlyZXR1cm4gc3lzZnNfZW1pdChidWYs ICIweCUwMnhcbiIsIFBDSV9CVVNfTlVNKHBjaWVfcG11LT5iZGZfbWluKSk7Cj4gK30KClNhbWUg YXMgYWJvdmUsIHdoYXQgYWJvdXQgIiUjMDJ4Ij8KClsuLi5dCj4gK3N0YXRpYyBib29sIGhpc2lf cGNpZV9wbXVfdmFsaWRfZmlsdGVyKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwKPiArCQkJCSAg ICAgICBzdHJ1Y3QgaGlzaV9wY2llX3BtdSAqcGNpZV9wbXUpCj4gK3sKPiArCXUzMiBzdWJldl9p ZHggPSBoaXNpX3BjaWVfZ2V0X3N1YmV2ZW50KGV2ZW50KTsKPiArCXUzMiBldmVudF9pZHggPSBo aXNpX3BjaWVfZ2V0X2V2ZW50KGV2ZW50KTsKPiArCXUzMiByZXF1ZXN0ZXJfaWQgPSBoaXNpX3Bj aWVfZ2V0X2JkZihldmVudCk7Cj4gKwo+ICsJaWYgKHN1YmV2X2lkeCA+IEhJU0lfUENJRV9TVUJF VkVOVF9NQVggfHwKPiArCSAgICBldmVudF9pZHggPiBISVNJX1BDSUVfRVZFTlRfTUFYKSB7Cj4g KwkJcGNpX2VycihwY2llX3BtdS0+cGRldiwKPiArCQkJIk1heCBldmVudCBpbmRleCBhbmQgbWF4 IHN1YmV2ZW50IGluZGV4IGlzOiAlZCwgJWQuXG4iLAo+ICsJCQlISVNJX1BDSUVfRVZFTlRfTUFY LCBISVNJX1BDSUVfU1VCRVZFTlRfTUFYKTsKPiArCQlyZXR1cm4gZmFsc2U7Cj4gKwl9CgpXYXMg dGhpcyBlcnJvciBtZXNzYWdlIGFib3ZlIGludGVuZGVkIHRvIGJlIGEgZGVidWcgbWVzc2FnZT8g IEl0J3MgYSBiaXQKb3BhcXVlIGluIHRlcm1zIHdoYXQgdGhlIGVycm9yIGFjdHVhbGx5IGlzIGhl cmUuICBXZSBtaWdodCBuZWVkIHRvIGNsZWFyCml0IHVwIGEgbGl0dGxlLgoKWy4uLl0KPiArc3Rh dGljIGJvb2wgaGlzaV9wY2llX3BtdV92YWxpZGF0ZV9ldmVudF9ncm91cChzdHJ1Y3QgcGVyZl9l dmVudCAqZXZlbnQpCj4gK3sKPiArCXN0cnVjdCBwZXJmX2V2ZW50ICpzaWJsaW5nLCAqbGVhZGVy ID0gZXZlbnQtPmdyb3VwX2xlYWRlcjsKPiArCWludCBjb3VudGVycyA9IDE7CgpIb3cgYmlnIHRo aXMgY291bnRlciBjb3VsZCBiZWNvbWU/CgpXb3VsZCBpdCBldmVyIGJlIGdyZWF0ZXIgdGhhbiBI SVNJX1BDSUVfTUFYX0NPVU5URVJTPyAgSSBhbSBhc2tpbmcsIGFzCmlmIGl0IHdvdWxkIGJlIGV2 ZXIgZ3JlYXRlciwgdGhlbiBwZXJoYXBzIHVuc2lnbmVkIGludCB3b3VsZCBiZSBiZXR0ZXIKdG8g dXNlLCBhbmQgaWYgbm90LCB0aGVuIHBlcmhhcHMgc29tZXRoaW5nIHNtYWxsZXIgdGhhbiBpbnQ/ ICBXaGF0IGRvCnlvdSB0aGluaywgZG9lcyB0aGlzIGV2ZW4gbWFrZSBzZW5zZSB0byBjaGFuZ2U/ CgpbLi4uXQo+ICtzdGF0aWMgaW50IGhpc2lfcGNpZV9wbXVfZXZlbnRfaW5pdChzdHJ1Y3QgcGVy Zl9ldmVudCAqZXZlbnQpCj4gK3sKPiArCXN0cnVjdCBoaXNpX3BjaWVfcG11ICpwY2llX3BtdSA9 IHRvX3BjaWVfcG11KGV2ZW50LT5wbXUpOwo+ICsKPiArCWV2ZW50LT5jcHUgPSBwY2llX3BtdS0+ b25fY3B1Owo+ICsKPiArCWlmIChldmVudC0+YXR0ci50eXBlICE9IGV2ZW50LT5wbXUtPnR5cGUp Cj4gKwkJcmV0dXJuIC1FTk9FTlQ7Cj4gKwo+ICsJLyogU2FtcGxpbmcgaXMgbm90IHN1cHBvcnRl ZC4gKi8KPiArCWlmIChpc19zYW1wbGluZ19ldmVudChldmVudCkgfHwgZXZlbnQtPmF0dGFjaF9z dGF0ZSAmIFBFUkZfQVRUQUNIX1RBU0spCj4gKwkJcmV0dXJuIC1FT1BOT1RTVVBQOwo+ICsKPiAr CWlmICghaGlzaV9wY2llX3BtdV92YWxpZF9maWx0ZXIoZXZlbnQsIHBjaWVfcG11KSkgewo+ICsJ CXBjaV9lcnIocGNpZV9wbXUtPnBkZXYsICJJbnZhbGlkIGZpbHRlciFcbiIpOwo+ICsJCXJldHVy biAtRUlOVkFMOwo+ICsJfQoKWy4uLl0KPiArLyoKPiArICogVGhlIGJhbmR3aWR0aCwgbGF0ZW5j eSwgYnVzIHV0aWxpemF0aW9uIGFuZCBidWZmZXIgb2NjdXBhbmN5IGZlYXR1cmVzIGFyZQo+ICsg KiBjYWxjdWxhdGVkIGZyb20gZGF0YSBpbiBISVNJX1BDSUVfQ05UIGFuZCBleHRlbmRlZCBkYXRh IGluIEhJU0lfUENJRV9FWFRfQ05ULgo+ICsgKiBPdGhlciBmZWF0dXJlcyBhcmUgb2J0YWluZWQg b25seSBieSBISVNJX1BDSUVfQ05ULgo+ICsgKiBTbyBkYXRhIGFuZCBkYXRhX2V4dCBhcmUgcHJv Y2Vzc2VkIGluIHRoaXMgZnVuY3Rpb24gdG8gZ2V0IHBlcmZvcm1hbmFjZQo+ICsgKiB2YWx1ZSBs aWtlLCBiYW5kd2lkdGgsIGxhdGVuY3ksIGV0Yy4KPiArICovCgpBIHNtYWxsIHR5cG8gaW4gdGhl IHdvcmxkICJwZXJmb3JtYW5jZSIgYWJvdmUuCgpbLi4uXQo+ICtzdGF0aWMgdTY0IGhpc2lfcGNp ZV9wbXVfZ2V0X3BlcmZvcm1hbmNlKHN0cnVjdCBwZXJmX2V2ZW50ICpldmVudCwgdTY0IGRhdGEs Cj4gKwkJCQkJIHU2NCBkYXRhX2V4dCkKPiArewo+ICsjZGVmaW5lIENPTlZFUlRfRFdfVE9fQllU RSh4KQkoc2l6ZW9mKHUzMikgKiAoeCkpCgpJIHdvdWxkIG1vdmUgdGhpcyBtYWNybyBhdCB0aGUg dG9wIGFsb25nc2lkZSBvdGhlciBjb25zdGFudHMgYW5kIG1hY3JvcywKYXMgaGVyZSBpdCBtYWtl cyB0aGUgY29kZSBoYXJkZXIgdG8gcmVhZC4gIFdoYXQgZG8geW91IHRoaW5rPwoKWy4uLl0KPiAr c3RhdGljIGludCBoaXNpX3BjaWVfcG11X2lycV9yZWdpc3RlcihzdHJ1Y3QgcGNpX2RldiAqcGRl diwKPiArCQkJCSAgICAgIHN0cnVjdCBoaXNpX3BjaWVfcG11ICpwY2llX3BtdSkKPiArewo+ICsJ aW50IGlycSwgcmV0Owo+ICsKPiArCXJldCA9IHBjaV9hbGxvY19pcnFfdmVjdG9ycyhwZGV2LCAx LCAxLCBQQ0lfSVJRX01TSSk7Cj4gKwlpZiAocmV0IDwgMCkgewo+ICsJCXBjaV9lcnIocGRldiwg IkZhaWxlZCB0byBlbmFibGUgTVNJIHZlY3RvcnMsIHJldCA9ICVkIVxuIiwgcmV0KTsKPiArCQly ZXR1cm4gcmV0Owo+ICsJfQoKVGhpcyBpcyBhIG5pdHBpY2ssIHNvIGZlZWwgZnJlZSB0byBpZ25v cmUgaXQsIGJ1dCB3aGF0IGRvIHlvdSB0aGluayBvZgpjaGFuZ2luZyB0aGlzIChhbmQgYWxzbyBv dGhlciBtZXNzYWdlcyBhbGlrZSkgbWVzc2FnZSB0byBiZSwgZm9yCmV4YW1wbGU6CgogIHBjaV9l cnIocGRldiwgIkZhaWxlZCB0byBlbmFibGUgTVNJIHZlY3RvcnM6ICVkXG4iLCByZXQpOwoKV2h5 PyAgSSBwZXJzb25hbGx5IGRvbid0IGZpbmQgZGlzcGxheWluZyBhIHJldHVybiBjb2RlL3ZhbHVl IGZvbGxvd2VkIGJ5CmEgcHVuY3R1YXRpb24gZWFzeSB0byByZWFkLCBlc3BlY2lhbGx5IHdoZW4g bG9va2luZyB0aHJvdWdoIGEgbG90IG9mCmxpbmVzIGFuZCBvdGhlciBtZXNzYWdlcyBpbiB0aGUg a2VybmVsIHJpbmcgYnVmZmVyLgoKWy4uLl0KPiArCj4gKwlpcnEgPSBwY2lfaXJxX3ZlY3Rvcihw ZGV2LCAwKTsKPiArCXJldCA9IHJlcXVlc3RfaXJxKGlycSwgaGlzaV9wY2llX3BtdV9pcnEsCj4g KwkJCSAgSVJRRl9OT0JBTEFOQ0lORyB8IElSUUZfTk9fVEhSRUFELCAiaGlzaV9wY2llX3BtdSIs Cj4gKwkJCSAgcGNpZV9wbXUpOwo+ICsJaWYgKHJldCkgewo+ICsJCXBjaV9lcnIocGRldiwgIkZh aWxlZCB0byByZWdpc3RlciBpcnEsIHJldCA9ICVkIVxuIiwgcmV0KTsKPiArCQlwY2lfZnJlZV9p cnFfdmVjdG9ycyhwZGV2KTsKPiArCQlyZXR1cm4gcmV0Owo+ICsJfQoKSXQgd291bGQgYmUgIklS USIgaW4gdGhlIGVycm9yIG1lc3NhZ2UgYWJvdmUuCgpbLi4uXQo+ICtzdGF0aWMgaW50IGhpc2lf cGNpZV9wbXVfb2ZmbGluZV9jcHUodW5zaWduZWQgaW50IGNwdSwgc3RydWN0IGhsaXN0X25vZGUg Km5vZGUpCj4gK3sKPiArCXN0cnVjdCBoaXNpX3BjaWVfcG11ICpwY2llX3BtdSA9IGhsaXN0X2Vu dHJ5X3NhZmUobm9kZSwKPiArCQkJCQkgc3RydWN0IGhpc2lfcGNpZV9wbXUsIG5vZGUpOwo+ICsJ dW5zaWduZWQgaW50IHRhcmdldDsKPiArCj4gKwkvKiBOb3RoaW5nIHRvIGRvIGlmIHRoaXMgQ1BV IGRvZXNuJ3Qgb3duIHRoZSBQTVUgKi8KPiArCWlmIChwY2llX3BtdS0+b25fY3B1ICE9IGNwdSkK PiArCQlyZXR1cm4gMDsKPiArCj4gKwkvKiBDaG9vc2UgYSBuZXcgQ1BVIGZyb20gYWxsIG9ubGlu ZSBjcHVzLiAqLwo+ICsJdGFyZ2V0ID0gY3B1bWFza19maXJzdChjcHVfb25saW5lX21hc2spOwo+ ICsJaWYgKHRhcmdldCA+PSBucl9jcHVfaWRzKSB7Cj4gKwkJcGNpX2VycihwY2llX3BtdS0+cGRl diwgIlRoZXJlIGlzIG5vIGNwdSB0byBzZXQhXG4iKTsKPiArCQlyZXR1cm4gMDsKPiArCX0KClRv IGJlIGNvbnNpc3RlbnQsIGl0IHdvdWxkIGJlICJDUFVzIiBhbmQgIkNQVSIgaW4gdGhlIGFib3Zl LgoKWy4uLl0KPiArc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGhpc2lfcGNpZV9wbXVf YnVzX2F0dHIgPQo+ICsJX19BVFRSKGJ1cywgMDQ0NCwgaGlzaV9wY2llX2J1c19zaG93LCBOVUxM KTsKWy4uLl0KPiArc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGhpc2lfcGNpZV9wbXVf Y3B1bWFza19hdHRyID0KPiArCV9fQVRUUihjcHVtYXNrLCAwNDQ0LCBoaXNpX3BjaWVfY3B1bWFz a19zaG93LCBOVUxMKTsKWy4uLl0KPiArc3RhdGljIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlIGhp c2lfcGNpZV9wbXVfaWRlbnRpZmllcl9hdHRyID0KPiArCV9fQVRUUihpZGVudGlmaWVyLCAwNDQ0 LCBoaXNpX3BjaWVfaWRlbnRpZmllcl9zaG93LCBOVUxMKTsKCldvdWxkIGl0IGJlIGF0IHBvc3Np YmxlIGZvciBhbnkgb2YgdGhlIGFib3ZlIF9fQVRUUigpIG1hY3JvcyB0byBiZQpyZXBsYWNlZCB3 aXRoIHRoZSBERVZJQ0VfQVRUUl9STygpIG1hY3JvPyAgT3IgcGVyaGFwcyB3aXRoIF9fQVRUUl9S TygpCmlmIHRoZSBvdGhlciBvbmUgd291bGQgYmUgYSBnb29kIGZpdD8KClsuLi5dCj4gK3N0YXRp YyBpbnQgaGlzaV9wY2llX2luaXRfZGV2KHN0cnVjdCBwY2lfZGV2ICpwZGV2KQo+ICt7Cj4gKwlp bnQgcmV0Owo+ICsKPiArCXJldCA9IHBjaV9lbmFibGVfZGV2aWNlKHBkZXYpOwo+ICsJaWYgKHJl dCkgewo+ICsJCXBjaV9lcnIocGRldiwgIkZhaWxlZCB0byBlbmFibGUgcGNpIGRldmljZSwgcmV0 ID0gJWQuXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9Cj4gKwo+ICsJcmV0ID0gcGNp X3JlcXVlc3RfbWVtX3JlZ2lvbnMocGRldiwgImhpc2lfcGNpZV9wbXUiKTsKPiArCWlmIChyZXQg PCAwKSB7Cj4gKwkJcGNpX2VycihwZGV2LCAiRmFpbGVkIHRvIHJlcXVlc3QgcGNpIG1lbSByZWdp b25zLCByZXQgPSAlZC5cbiIsCj4gKwkJCXJldCk7Cj4gKwkJcGNpX2Rpc2FibGVfZGV2aWNlKHBk ZXYpOwo+ICsJCXJldHVybiByZXQ7Cj4gKwl9CgpJdCB3b3VsZCBiZSAiUENJIiBpbiBib3RoIGVy cm9yIG1lc3NhZ2VzIGFib3ZlLgoKWy4uLl0KPiArc3RhdGljIGludCBfX2luaXQgaGlzaV9wY2ll X21vZHVsZV9pbml0KHZvaWQpCj4gK3sKPiArCWludCByZXQ7Cj4gKwo+ICsJcmV0ID0gY3B1aHBf c2V0dXBfc3RhdGVfbXVsdGkoQ1BVSFBfQVBfUEVSRl9BUk1fSElTSV9QQ0lFX1BNVV9PTkxJTkUs Cj4gKwkJCQkgICAgICAiQVBfUEVSRl9BUk1fSElTSV9QQ0lFX1BNVV9PTkxJTkUiLAo+ICsJCQkJ ICAgICAgaGlzaV9wY2llX3BtdV9vbmxpbmVfY3B1LAo+ICsJCQkJICAgICAgaGlzaV9wY2llX3Bt dV9vZmZsaW5lX2NwdSk7Cj4gKwlpZiAocmV0KSB7Cj4gKwkJcHJfZXJyKCJGYWlsZWQgdG8gc2V0 dXAgUENJRSBQTVUgaG90cGx1ZywgcmV0ID0gJWQuXG4iLCByZXQpOwo+ICsJCXJldHVybiByZXQ7 Cj4gKwl9CgpJdCB3b3VsZCBiZSAiUENJZSIgaW4gdGhlIGVycm9yIG1lc3NhZ2UgYWJvdmUuCgoJ S3J6eXN6dG9mCgpfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f XwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcgbGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmlu ZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9s aW51eC1hcm0ta2VybmVsCg==