From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from bombadil.infradead.org (bombadil.infradead.org [IPv6:2607:7c80:54:e::133]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by ml01.01.org (Postfix) with ESMTPS id 5A67A212AAFEE for ; Wed, 26 Jun 2019 05:28:16 -0700 (PDT) From: Christoph Hellwig Subject: [PATCH 17/25] PCI/P2PDMA: use the dev_pagemap internal refcount Date: Wed, 26 Jun 2019 14:27:16 +0200 Message-Id: <20190626122724.13313-18-hch@lst.de> In-Reply-To: <20190626122724.13313-1-hch@lst.de> References: <20190626122724.13313-1-hch@lst.de> MIME-Version: 1.0 List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="us-ascii" Content-Transfer-Encoding: 7bit Errors-To: linux-nvdimm-bounces@lists.01.org Sender: "Linux-nvdimm" To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-nvdimm@lists.01.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org, dri-devel@lists.freedesktop.org, linux-mm@kvack.org, nouveau@lists.freedesktop.org List-ID: The functionality is identical to the one currently open coded in p2pdma.c. Signed-off-by: Christoph Hellwig --- drivers/pci/p2pdma.c | 57 ++++---------------------------------------- 1 file changed, 4 insertions(+), 53 deletions(-) diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index ebd8ce3bba2e..608f84df604a 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -24,12 +24,6 @@ struct pci_p2pdma { bool p2pmem_published; }; -struct p2pdma_pagemap { - struct dev_pagemap pgmap; - struct percpu_ref ref; - struct completion ref_done; -}; - static ssize_t size_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -78,32 +72,6 @@ static const struct attribute_group p2pmem_group = { .name = "p2pmem", }; -static struct p2pdma_pagemap *to_p2p_pgmap(struct percpu_ref *ref) -{ - return container_of(ref, struct p2pdma_pagemap, ref); -} - -static void pci_p2pdma_percpu_release(struct percpu_ref *ref) -{ - struct p2pdma_pagemap *p2p_pgmap = to_p2p_pgmap(ref); - - complete(&p2p_pgmap->ref_done); -} - -static void pci_p2pdma_percpu_kill(struct dev_pagemap *pgmap) -{ - percpu_ref_kill(pgmap->ref); -} - -static void pci_p2pdma_percpu_cleanup(struct dev_pagemap *pgmap) -{ - struct p2pdma_pagemap *p2p_pgmap = - container_of(pgmap, struct p2pdma_pagemap, pgmap); - - wait_for_completion(&p2p_pgmap->ref_done); - percpu_ref_exit(&p2p_pgmap->ref); -} - static void pci_p2pdma_release(void *data) { struct pci_dev *pdev = data; @@ -153,11 +121,6 @@ static int pci_p2pdma_setup(struct pci_dev *pdev) return error; } -static const struct dev_pagemap_ops pci_p2pdma_pagemap_ops = { - .kill = pci_p2pdma_percpu_kill, - .cleanup = pci_p2pdma_percpu_cleanup, -}; - /** * pci_p2pdma_add_resource - add memory for use as p2p memory * @pdev: the device to add the memory to @@ -171,7 +134,6 @@ static const struct dev_pagemap_ops pci_p2pdma_pagemap_ops = { int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, u64 offset) { - struct p2pdma_pagemap *p2p_pgmap; struct dev_pagemap *pgmap; void *addr; int error; @@ -194,26 +156,15 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, return error; } - p2p_pgmap = devm_kzalloc(&pdev->dev, sizeof(*p2p_pgmap), GFP_KERNEL); - if (!p2p_pgmap) + pgmap = devm_kzalloc(&pdev->dev, sizeof(*pgmap), GFP_KERNEL); + if (!pgmap) return -ENOMEM; - - init_completion(&p2p_pgmap->ref_done); - error = percpu_ref_init(&p2p_pgmap->ref, - pci_p2pdma_percpu_release, 0, GFP_KERNEL); - if (error) - goto pgmap_free; - - pgmap = &p2p_pgmap->pgmap; - pgmap->res.start = pci_resource_start(pdev, bar) + offset; pgmap->res.end = pgmap->res.start + size - 1; pgmap->res.flags = pci_resource_flags(pdev, bar); - pgmap->ref = &p2p_pgmap->ref; pgmap->type = MEMORY_DEVICE_PCI_P2PDMA; pgmap->pci_p2pdma_bus_offset = pci_bus_address(pdev, bar) - pci_resource_start(pdev, bar); - pgmap->ops = &pci_p2pdma_pagemap_ops; addr = devm_memremap_pages(&pdev->dev, pgmap); if (IS_ERR(addr)) { @@ -224,7 +175,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, error = gen_pool_add_owner(pdev->p2pdma->pool, (unsigned long)addr, pci_bus_address(pdev, bar) + offset, resource_size(&pgmap->res), dev_to_node(&pdev->dev), - &p2p_pgmap->ref); + pgmap->ref); if (error) goto pages_free; @@ -236,7 +187,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, pages_free: devm_memunmap_pages(&pdev->dev, pgmap); pgmap_free: - devm_kfree(&pdev->dev, p2p_pgmap); + devm_kfree(&pdev->dev, pgmap); return error; } EXPORT_SYMBOL_GPL(pci_p2pdma_add_resource); -- 2.20.1 _______________________________________________ Linux-nvdimm mailing list Linux-nvdimm@lists.01.org https://lists.01.org/mailman/listinfo/linux-nvdimm From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: X-Spam-Checker-Version: SpamAssassin 3.4.0 (2014-02-07) on aws-us-west-2-korg-lkml-1.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-8.5 required=3.0 tests=DKIM_INVALID,DKIM_SIGNED, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,URIBL_BLOCKED,USER_AGENT_GIT 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 EE7C0C48BD8 for ; Wed, 26 Jun 2019 12:28:53 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id C89EF2063F for ; Wed, 26 Jun 2019 12:28:53 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=infradead.org header.i=@infradead.org header.b="uYRez3iz" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727667AbfFZM2U (ORCPT ); Wed, 26 Jun 2019 08:28:20 -0400 Received: from bombadil.infradead.org ([198.137.202.133]:42984 "EHLO bombadil.infradead.org" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727641AbfFZM2Q (ORCPT ); Wed, 26 Jun 2019 08:28:16 -0400 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=bombadil.20170209; h=Content-Transfer-Encoding: MIME-Version:References:In-Reply-To:Message-Id:Date:Subject:Cc:To:From:Sender :Reply-To:Content-Type:Content-ID:Content-Description:Resent-Date:Resent-From :Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID:List-Id:List-Help: List-Unsubscribe:List-Subscribe:List-Post:List-Owner:List-Archive; bh=O8xTiSY5VJngyKM6+yEPSiv/sNrzxm4spoPZD5fr/FE=; b=uYRez3izVT1tTJ2inEjlr+sqzJ mQ/FCU73nGQFwZr8hbyBONC+pRy4Y5zWmPKwE4e+/VnM1Wd54RXoko27P7OJdwYWEVZyOfhCpakZS NceKKQi8BIED/6Zf1boEQOc2fhm7lXJtPKrQRbyudvIk9ok/2lsM7oKgHQmN0A0NUt1wauMOTrnNb YztM4+JK3tURRAcVPdB2QDw04eLlKqyMRUZblAnCS+8D4s/P8NuKrPuYvEzOGKhpFIyCfq1gDkpSy T+Z7xfSW0MFySDPpzpi2T3kL1+k8AT2+W9JX8ZK8GzydNUFd8VyzyqZ163oz2EZ+8MZT6vIfA9Trk 2ljmFk6A==; Received: from clnet-p19-102.ikbnet.co.at ([83.175.77.102] helo=localhost) by bombadil.infradead.org with esmtpsa (Exim 4.92 #3 (Red Hat Linux)) id 1hg724-0001YD-CI; Wed, 26 Jun 2019 12:28:12 +0000 From: Christoph Hellwig To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-mm@kvack.org, nouveau@lists.freedesktop.org, dri-devel@lists.freedesktop.org, linux-nvdimm@lists.01.org, linux-pci@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH 17/25] PCI/P2PDMA: use the dev_pagemap internal refcount Date: Wed, 26 Jun 2019 14:27:16 +0200 Message-Id: <20190626122724.13313-18-hch@lst.de> X-Mailer: git-send-email 2.20.1 In-Reply-To: <20190626122724.13313-1-hch@lst.de> References: <20190626122724.13313-1-hch@lst.de> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-SRS-Rewrite: SMTP reverse-path rewritten from by bombadil.infradead.org. See http://www.infradead.org/rpr.html Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org The functionality is identical to the one currently open coded in p2pdma.c. Signed-off-by: Christoph Hellwig --- drivers/pci/p2pdma.c | 57 ++++---------------------------------------- 1 file changed, 4 insertions(+), 53 deletions(-) diff --git a/drivers/pci/p2pdma.c b/drivers/pci/p2pdma.c index ebd8ce3bba2e..608f84df604a 100644 --- a/drivers/pci/p2pdma.c +++ b/drivers/pci/p2pdma.c @@ -24,12 +24,6 @@ struct pci_p2pdma { bool p2pmem_published; }; -struct p2pdma_pagemap { - struct dev_pagemap pgmap; - struct percpu_ref ref; - struct completion ref_done; -}; - static ssize_t size_show(struct device *dev, struct device_attribute *attr, char *buf) { @@ -78,32 +72,6 @@ static const struct attribute_group p2pmem_group = { .name = "p2pmem", }; -static struct p2pdma_pagemap *to_p2p_pgmap(struct percpu_ref *ref) -{ - return container_of(ref, struct p2pdma_pagemap, ref); -} - -static void pci_p2pdma_percpu_release(struct percpu_ref *ref) -{ - struct p2pdma_pagemap *p2p_pgmap = to_p2p_pgmap(ref); - - complete(&p2p_pgmap->ref_done); -} - -static void pci_p2pdma_percpu_kill(struct dev_pagemap *pgmap) -{ - percpu_ref_kill(pgmap->ref); -} - -static void pci_p2pdma_percpu_cleanup(struct dev_pagemap *pgmap) -{ - struct p2pdma_pagemap *p2p_pgmap = - container_of(pgmap, struct p2pdma_pagemap, pgmap); - - wait_for_completion(&p2p_pgmap->ref_done); - percpu_ref_exit(&p2p_pgmap->ref); -} - static void pci_p2pdma_release(void *data) { struct pci_dev *pdev = data; @@ -153,11 +121,6 @@ static int pci_p2pdma_setup(struct pci_dev *pdev) return error; } -static const struct dev_pagemap_ops pci_p2pdma_pagemap_ops = { - .kill = pci_p2pdma_percpu_kill, - .cleanup = pci_p2pdma_percpu_cleanup, -}; - /** * pci_p2pdma_add_resource - add memory for use as p2p memory * @pdev: the device to add the memory to @@ -171,7 +134,6 @@ static const struct dev_pagemap_ops pci_p2pdma_pagemap_ops = { int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, u64 offset) { - struct p2pdma_pagemap *p2p_pgmap; struct dev_pagemap *pgmap; void *addr; int error; @@ -194,26 +156,15 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, return error; } - p2p_pgmap = devm_kzalloc(&pdev->dev, sizeof(*p2p_pgmap), GFP_KERNEL); - if (!p2p_pgmap) + pgmap = devm_kzalloc(&pdev->dev, sizeof(*pgmap), GFP_KERNEL); + if (!pgmap) return -ENOMEM; - - init_completion(&p2p_pgmap->ref_done); - error = percpu_ref_init(&p2p_pgmap->ref, - pci_p2pdma_percpu_release, 0, GFP_KERNEL); - if (error) - goto pgmap_free; - - pgmap = &p2p_pgmap->pgmap; - pgmap->res.start = pci_resource_start(pdev, bar) + offset; pgmap->res.end = pgmap->res.start + size - 1; pgmap->res.flags = pci_resource_flags(pdev, bar); - pgmap->ref = &p2p_pgmap->ref; pgmap->type = MEMORY_DEVICE_PCI_P2PDMA; pgmap->pci_p2pdma_bus_offset = pci_bus_address(pdev, bar) - pci_resource_start(pdev, bar); - pgmap->ops = &pci_p2pdma_pagemap_ops; addr = devm_memremap_pages(&pdev->dev, pgmap); if (IS_ERR(addr)) { @@ -224,7 +175,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, error = gen_pool_add_owner(pdev->p2pdma->pool, (unsigned long)addr, pci_bus_address(pdev, bar) + offset, resource_size(&pgmap->res), dev_to_node(&pdev->dev), - &p2p_pgmap->ref); + pgmap->ref); if (error) goto pages_free; @@ -236,7 +187,7 @@ int pci_p2pdma_add_resource(struct pci_dev *pdev, int bar, size_t size, pages_free: devm_memunmap_pages(&pdev->dev, pgmap); pgmap_free: - devm_kfree(&pdev->dev, p2p_pgmap); + devm_kfree(&pdev->dev, pgmap); return error; } EXPORT_SYMBOL_GPL(pci_p2pdma_add_resource); -- 2.20.1 From mboxrd@z Thu Jan 1 00:00:00 1970 From: Christoph Hellwig Subject: [PATCH 17/25] PCI/P2PDMA: use the dev_pagemap internal refcount Date: Wed, 26 Jun 2019 14:27:16 +0200 Message-ID: <20190626122724.13313-18-hch@lst.de> References: <20190626122724.13313-1-hch@lst.de> Mime-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Return-path: In-Reply-To: <20190626122724.13313-1-hch-jcswGhMUV9g@public.gmane.org> List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: nouveau-bounces-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org Sender: "Nouveau" To: Dan Williams , =?UTF-8?q?J=C3=A9r=C3=B4me=20Glisse?= , Jason Gunthorpe , Ben Skeggs Cc: linux-nvdimm-hn68Rpc1hR1g9hUCZPvPmw@public.gmane.org, linux-pci-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, linux-kernel-u79uwXL29TY76Z2rM5mHXA@public.gmane.org, dri-devel-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org, linux-mm-Bw31MaZKKs3YtjvyW6yDsg@public.gmane.org, nouveau-PD4FTy7X32lNgt0PjOBp9y5qC8QIuHrW@public.gmane.org List-Id: nouveau.vger.kernel.org VGhlIGZ1bmN0aW9uYWxpdHkgaXMgaWRlbnRpY2FsIHRvIHRoZSBvbmUgY3VycmVudGx5IG9wZW4g Y29kZWQgaW4KcDJwZG1hLmMuCgpTaWduZWQtb2ZmLWJ5OiBDaHJpc3RvcGggSGVsbHdpZyA8aGNo QGxzdC5kZT4KLS0tCiBkcml2ZXJzL3BjaS9wMnBkbWEuYyB8IDU3ICsrKystLS0tLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tCiAxIGZpbGUgY2hhbmdlZCwgNCBpbnNlcnRpb25z KCspLCA1MyBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9kcml2ZXJzL3BjaS9wMnBkbWEuYyBi L2RyaXZlcnMvcGNpL3AycGRtYS5jCmluZGV4IGViZDhjZTNiYmEyZS4uNjA4Zjg0ZGY2MDRhIDEw MDY0NAotLS0gYS9kcml2ZXJzL3BjaS9wMnBkbWEuYworKysgYi9kcml2ZXJzL3BjaS9wMnBkbWEu YwpAQCAtMjQsMTIgKzI0LDYgQEAgc3RydWN0IHBjaV9wMnBkbWEgewogCWJvb2wgcDJwbWVtX3B1 Ymxpc2hlZDsKIH07CiAKLXN0cnVjdCBwMnBkbWFfcGFnZW1hcCB7Ci0Jc3RydWN0IGRldl9wYWdl bWFwIHBnbWFwOwotCXN0cnVjdCBwZXJjcHVfcmVmIHJlZjsKLQlzdHJ1Y3QgY29tcGxldGlvbiBy ZWZfZG9uZTsKLX07Ci0KIHN0YXRpYyBzc2l6ZV90IHNpemVfc2hvdyhzdHJ1Y3QgZGV2aWNlICpk ZXYsIHN0cnVjdCBkZXZpY2VfYXR0cmlidXRlICphdHRyLAogCQkJIGNoYXIgKmJ1ZikKIHsKQEAg LTc4LDMyICs3Miw2IEBAIHN0YXRpYyBjb25zdCBzdHJ1Y3QgYXR0cmlidXRlX2dyb3VwIHAycG1l bV9ncm91cCA9IHsKIAkubmFtZSA9ICJwMnBtZW0iLAogfTsKIAotc3RhdGljIHN0cnVjdCBwMnBk bWFfcGFnZW1hcCAqdG9fcDJwX3BnbWFwKHN0cnVjdCBwZXJjcHVfcmVmICpyZWYpCi17Ci0JcmV0 dXJuIGNvbnRhaW5lcl9vZihyZWYsIHN0cnVjdCBwMnBkbWFfcGFnZW1hcCwgcmVmKTsKLX0KLQot c3RhdGljIHZvaWQgcGNpX3AycGRtYV9wZXJjcHVfcmVsZWFzZShzdHJ1Y3QgcGVyY3B1X3JlZiAq cmVmKQotewotCXN0cnVjdCBwMnBkbWFfcGFnZW1hcCAqcDJwX3BnbWFwID0gdG9fcDJwX3BnbWFw KHJlZik7Ci0KLQljb21wbGV0ZSgmcDJwX3BnbWFwLT5yZWZfZG9uZSk7Ci19Ci0KLXN0YXRpYyB2 b2lkIHBjaV9wMnBkbWFfcGVyY3B1X2tpbGwoc3RydWN0IGRldl9wYWdlbWFwICpwZ21hcCkKLXsK LQlwZXJjcHVfcmVmX2tpbGwocGdtYXAtPnJlZik7Ci19Ci0KLXN0YXRpYyB2b2lkIHBjaV9wMnBk bWFfcGVyY3B1X2NsZWFudXAoc3RydWN0IGRldl9wYWdlbWFwICpwZ21hcCkKLXsKLQlzdHJ1Y3Qg cDJwZG1hX3BhZ2VtYXAgKnAycF9wZ21hcCA9Ci0JCWNvbnRhaW5lcl9vZihwZ21hcCwgc3RydWN0 IHAycGRtYV9wYWdlbWFwLCBwZ21hcCk7Ci0KLQl3YWl0X2Zvcl9jb21wbGV0aW9uKCZwMnBfcGdt YXAtPnJlZl9kb25lKTsKLQlwZXJjcHVfcmVmX2V4aXQoJnAycF9wZ21hcC0+cmVmKTsKLX0KLQog c3RhdGljIHZvaWQgcGNpX3AycGRtYV9yZWxlYXNlKHZvaWQgKmRhdGEpCiB7CiAJc3RydWN0IHBj aV9kZXYgKnBkZXYgPSBkYXRhOwpAQCAtMTUzLDExICsxMjEsNiBAQCBzdGF0aWMgaW50IHBjaV9w MnBkbWFfc2V0dXAoc3RydWN0IHBjaV9kZXYgKnBkZXYpCiAJcmV0dXJuIGVycm9yOwogfQogCi1z dGF0aWMgY29uc3Qgc3RydWN0IGRldl9wYWdlbWFwX29wcyBwY2lfcDJwZG1hX3BhZ2VtYXBfb3Bz ID0gewotCS5raWxsCQk9IHBjaV9wMnBkbWFfcGVyY3B1X2tpbGwsCi0JLmNsZWFudXAJPSBwY2lf cDJwZG1hX3BlcmNwdV9jbGVhbnVwLAotfTsKLQogLyoqCiAgKiBwY2lfcDJwZG1hX2FkZF9yZXNv dXJjZSAtIGFkZCBtZW1vcnkgZm9yIHVzZSBhcyBwMnAgbWVtb3J5CiAgKiBAcGRldjogdGhlIGRl dmljZSB0byBhZGQgdGhlIG1lbW9yeSB0bwpAQCAtMTcxLDcgKzEzNCw2IEBAIHN0YXRpYyBjb25z dCBzdHJ1Y3QgZGV2X3BhZ2VtYXBfb3BzIHBjaV9wMnBkbWFfcGFnZW1hcF9vcHMgPSB7CiBpbnQg cGNpX3AycGRtYV9hZGRfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKnBkZXYsIGludCBiYXIsIHNp emVfdCBzaXplLAogCQkJICAgIHU2NCBvZmZzZXQpCiB7Ci0Jc3RydWN0IHAycGRtYV9wYWdlbWFw ICpwMnBfcGdtYXA7CiAJc3RydWN0IGRldl9wYWdlbWFwICpwZ21hcDsKIAl2b2lkICphZGRyOwog CWludCBlcnJvcjsKQEAgLTE5NCwyNiArMTU2LDE1IEBAIGludCBwY2lfcDJwZG1hX2FkZF9yZXNv dXJjZShzdHJ1Y3QgcGNpX2RldiAqcGRldiwgaW50IGJhciwgc2l6ZV90IHNpemUsCiAJCQlyZXR1 cm4gZXJyb3I7CiAJfQogCi0JcDJwX3BnbWFwID0gZGV2bV9remFsbG9jKCZwZGV2LT5kZXYsIHNp emVvZigqcDJwX3BnbWFwKSwgR0ZQX0tFUk5FTCk7Ci0JaWYgKCFwMnBfcGdtYXApCisJcGdtYXAg PSBkZXZtX2t6YWxsb2MoJnBkZXYtPmRldiwgc2l6ZW9mKCpwZ21hcCksIEdGUF9LRVJORUwpOwor CWlmICghcGdtYXApCiAJCXJldHVybiAtRU5PTUVNOwotCi0JaW5pdF9jb21wbGV0aW9uKCZwMnBf cGdtYXAtPnJlZl9kb25lKTsKLQllcnJvciA9IHBlcmNwdV9yZWZfaW5pdCgmcDJwX3BnbWFwLT5y ZWYsCi0JCQlwY2lfcDJwZG1hX3BlcmNwdV9yZWxlYXNlLCAwLCBHRlBfS0VSTkVMKTsKLQlpZiAo ZXJyb3IpCi0JCWdvdG8gcGdtYXBfZnJlZTsKLQotCXBnbWFwID0gJnAycF9wZ21hcC0+cGdtYXA7 Ci0KIAlwZ21hcC0+cmVzLnN0YXJ0ID0gcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhcikgKyBv ZmZzZXQ7CiAJcGdtYXAtPnJlcy5lbmQgPSBwZ21hcC0+cmVzLnN0YXJ0ICsgc2l6ZSAtIDE7CiAJ cGdtYXAtPnJlcy5mbGFncyA9IHBjaV9yZXNvdXJjZV9mbGFncyhwZGV2LCBiYXIpOwotCXBnbWFw LT5yZWYgPSAmcDJwX3BnbWFwLT5yZWY7CiAJcGdtYXAtPnR5cGUgPSBNRU1PUllfREVWSUNFX1BD SV9QMlBETUE7CiAJcGdtYXAtPnBjaV9wMnBkbWFfYnVzX29mZnNldCA9IHBjaV9idXNfYWRkcmVz cyhwZGV2LCBiYXIpIC0KIAkJcGNpX3Jlc291cmNlX3N0YXJ0KHBkZXYsIGJhcik7Ci0JcGdtYXAt Pm9wcyA9ICZwY2lfcDJwZG1hX3BhZ2VtYXBfb3BzOwogCiAJYWRkciA9IGRldm1fbWVtcmVtYXBf cGFnZXMoJnBkZXYtPmRldiwgcGdtYXApOwogCWlmIChJU19FUlIoYWRkcikpIHsKQEAgLTIyNCw3 ICsxNzUsNyBAQCBpbnQgcGNpX3AycGRtYV9hZGRfcmVzb3VyY2Uoc3RydWN0IHBjaV9kZXYgKnBk ZXYsIGludCBiYXIsIHNpemVfdCBzaXplLAogCWVycm9yID0gZ2VuX3Bvb2xfYWRkX293bmVyKHBk ZXYtPnAycGRtYS0+cG9vbCwgKHVuc2lnbmVkIGxvbmcpYWRkciwKIAkJCXBjaV9idXNfYWRkcmVz cyhwZGV2LCBiYXIpICsgb2Zmc2V0LAogCQkJcmVzb3VyY2Vfc2l6ZSgmcGdtYXAtPnJlcyksIGRl dl90b19ub2RlKCZwZGV2LT5kZXYpLAotCQkJJnAycF9wZ21hcC0+cmVmKTsKKwkJCXBnbWFwLT5y ZWYpOwogCWlmIChlcnJvcikKIAkJZ290byBwYWdlc19mcmVlOwogCkBAIC0yMzYsNyArMTg3LDcg QEAgaW50IHBjaV9wMnBkbWFfYWRkX3Jlc291cmNlKHN0cnVjdCBwY2lfZGV2ICpwZGV2LCBpbnQg YmFyLCBzaXplX3Qgc2l6ZSwKIHBhZ2VzX2ZyZWU6CiAJZGV2bV9tZW11bm1hcF9wYWdlcygmcGRl di0+ZGV2LCBwZ21hcCk7CiBwZ21hcF9mcmVlOgotCWRldm1fa2ZyZWUoJnBkZXYtPmRldiwgcDJw X3BnbWFwKTsKKwlkZXZtX2tmcmVlKCZwZGV2LT5kZXYsIHBnbWFwKTsKIAlyZXR1cm4gZXJyb3I7 CiB9CiBFWFBPUlRfU1lNQk9MX0dQTChwY2lfcDJwZG1hX2FkZF9yZXNvdXJjZSk7Ci0tIAoyLjIw LjEKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCk5vdXZl YXUgbWFpbGluZyBsaXN0Ck5vdXZlYXVAbGlzdHMuZnJlZWRlc2t0b3Aub3JnCmh0dHBzOi8vbGlz dHMuZnJlZWRlc2t0b3Aub3JnL21haWxtYW4vbGlzdGluZm8vbm91dmVhdQ==