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=-6.8 required=3.0 tests=HEADER_FROM_DIFFERENT_DOMAINS, INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY,SPF_PASS,URIBL_BLOCKED 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 AB11AC43382 for ; Thu, 27 Sep 2018 05:28:03 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 4B02F2156D for ; Thu, 27 Sep 2018 05:28:03 +0000 (UTC) DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 4B02F2156D Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=redhat.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727015AbeI0Lo1 (ORCPT ); Thu, 27 Sep 2018 07:44:27 -0400 Received: from mx1.redhat.com ([209.132.183.28]:41418 "EHLO mx1.redhat.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726599AbeI0Lo0 (ORCPT ); Thu, 27 Sep 2018 07:44:26 -0400 Received: from smtp.corp.redhat.com (int-mx07.intmail.prod.int.phx2.redhat.com [10.5.11.22]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id AF36E3082B64; Thu, 27 Sep 2018 05:28:00 +0000 (UTC) Received: from localhost.localdomain (ovpn-12-101.pek2.redhat.com [10.72.12.101]) by smtp.corp.redhat.com (Postfix) with ESMTPS id 1B607100195E; Thu, 27 Sep 2018 05:27:45 +0000 (UTC) Subject: Re: [PATCH 3/3] resource: Fix find_next_iomem_res() iteration issue To: Bjorn Helgaas Cc: dan.j.williams@intel.com, brijesh.singh@amd.com, bhe@redhat.com, thomas.lendacky@amd.com, tiwai@suse.de, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, mingo@redhat.com, baiyaowei@cmss.chinamobile.com, hpa@zytor.com, tglx@linutronix.de, bp@suse.de, dyoung@redhat.com, akpm@linux-foundation.org, Vivek Goyal References: <153782698067.130337.12079523922130875402.stgit@bhelgaas-glaptop.roam.corp.google.com> <153782730364.130337.17794279728329113665.stgit@bhelgaas-glaptop.roam.corp.google.com> From: lijiang Message-ID: <13084ce6-e29a-c244-3f9c-cf0725646d9f@redhat.com> Date: Thu, 27 Sep 2018 13:27:41 +0800 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.9.1 MIME-Version: 1.0 In-Reply-To: <153782730364.130337.17794279728329113665.stgit@bhelgaas-glaptop.roam.corp.google.com> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.84 on 10.5.11.22 X-Greylist: Sender IP whitelisted, not delayed by milter-greylist-4.5.16 (mx1.redhat.com [10.5.110.45]); Thu, 27 Sep 2018 05:28:00 +0000 (UTC) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 在 2018年09月25日 06:15, Bjorn Helgaas 写道: > From: Bjorn Helgaas > > Previously find_next_iomem_res() used "*res" as both an input parameter for > the range to search and the type of resource to search for, and an output > parameter for the resource we found, which makes the interface confusing > and hard to use correctly. > > All callers allocate a single struct resource and use it for repeated calls > to find_next_iomem_res(). When find_next_iomem_res() returns a resource, > it overwrites the start, end, flags, and desc members of the struct. If we > call find_next_iomem_res() again, we must update or restore these fields. > > The callers (__walk_iomem_res_desc() and walk_system_ram_range()) do not > restore res->flags, so if the caller is searching for flags of > IORESOURCE_MEM | IORESOURCE_BUSY and finds a resource with flags of > IORESOURCE_MEM | IORESOURCE_BUSY | IORESOURCE_SYSRAM, the next search will > find only resources marked as IORESOURCE_SYSRAM. > > Fix this by restructuring the interface so it takes explicit "start, end, > flags" parameters and uses "*res" only as an output parameter. > Hi, Bjorn I personally suggest that some comments might be added in the code, make it clear and easy to understand, then which could avoid the old confusion and more code changes. Thanks Lianbo > Original-patch: http://lore.kernel.org/lkml/20180921073211.20097-2-lijiang@redhat.com > Based-on-patch-by: Lianbo Jiang > Signed-off-by: Bjorn Helgaas > --- > kernel/resource.c | 94 +++++++++++++++++++++++------------------------------ > 1 file changed, 41 insertions(+), 53 deletions(-) > > diff --git a/kernel/resource.c b/kernel/resource.c > index 155ec873ea4d..9891ea90cc8f 100644 > --- a/kernel/resource.c > +++ b/kernel/resource.c > @@ -319,23 +319,26 @@ int release_resource(struct resource *old) > EXPORT_SYMBOL(release_resource); > > /* > - * Finds the lowest iomem resource existing within [res->start..res->end]. > - * The caller must specify res->start, res->end, res->flags, and optionally > - * desc. If found, returns 0, res is overwritten, if not found, returns -1. > - * This function walks the whole tree and not just first level children until > - * and unless first_level_children_only is true. > + * Finds the lowest iomem resource that covers part of [start..end]. The > + * caller must specify start, end, flags, and desc (which may be > + * IORES_DESC_NONE). > + * > + * If a resource is found, returns 0 and *res is overwritten with the part > + * of the resource that's within [start..end]; if none is found, returns > + * -1. > + * > + * This function walks the whole tree and not just first level children > + * unless first_level_children_only is true. > */ > -static int find_next_iomem_res(struct resource *res, unsigned long desc, > - bool first_level_children_only) > +static int find_next_iomem_res(resource_size_t start, resource_size_t end, > + unsigned long flags, unsigned long desc, > + bool first_level_children_only, > + struct resource *res) > { > - resource_size_t start, end; > struct resource *p; > bool sibling_only = false; > > BUG_ON(!res); > - > - start = res->start; > - end = res->end; > BUG_ON(start >= end); > > if (first_level_children_only) > @@ -344,7 +347,7 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, > read_lock(&resource_lock); > > for (p = iomem_resource.child; p; p = next_resource(p, sibling_only)) { > - if ((p->flags & res->flags) != res->flags) > + if ((p->flags & flags) != flags) > continue; > if ((desc != IORES_DESC_NONE) && (desc != p->desc)) > continue; > @@ -359,32 +362,31 @@ static int find_next_iomem_res(struct resource *res, unsigned long desc, > read_unlock(&resource_lock); > if (!p) > return -1; > + > /* copy data */ > - if (res->start < p->start) > - res->start = p->start; > - if (res->end > p->end) > - res->end = p->end; > + res->start = max(start, p->start); > + res->end = min(end, p->end); > res->flags = p->flags; > res->desc = p->desc; > return 0; > } > > -static int __walk_iomem_res_desc(struct resource *res, unsigned long desc, > - bool first_level_children_only, > - void *arg, > +static int __walk_iomem_res_desc(resource_size_t start, resource_size_t end, > + unsigned long flags, unsigned long desc, > + bool first_level_children_only, void *arg, > int (*func)(struct resource *, void *)) > { > - u64 orig_end = res->end; > + struct resource res; > int ret = -1; > > - while ((res->start < res->end) && > - !find_next_iomem_res(res, desc, first_level_children_only)) { > - ret = (*func)(res, arg); > + while (start < end && > + !find_next_iomem_res(start, end, flags, desc, > + first_level_children_only, &res)) { > + ret = (*func)(&res, arg); > if (ret) > break; > > - res->start = res->end + 1; > - res->end = orig_end; > + start = res.end + 1; > } > > return ret; > @@ -407,13 +409,7 @@ static int __walk_iomem_res_desc(struct resource *res, unsigned long desc, > int walk_iomem_res_desc(unsigned long desc, unsigned long flags, u64 start, > u64 end, void *arg, int (*func)(struct resource *, void *)) > { > - struct resource res; > - > - res.start = start; > - res.end = end; > - res.flags = flags; > - > - return __walk_iomem_res_desc(&res, desc, false, arg, func); > + return __walk_iomem_res_desc(start, end, flags, desc, false, arg, func); > } > EXPORT_SYMBOL_GPL(walk_iomem_res_desc); > > @@ -427,13 +423,9 @@ EXPORT_SYMBOL_GPL(walk_iomem_res_desc); > int walk_system_ram_res(u64 start, u64 end, void *arg, > int (*func)(struct resource *, void *)) > { > - struct resource res; > - > - res.start = start; > - res.end = end; > - res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; > + unsigned long flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; > > - return __walk_iomem_res_desc(&res, IORES_DESC_NONE, true, > + return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, true, > arg, func); > } > > @@ -444,13 +436,9 @@ int walk_system_ram_res(u64 start, u64 end, void *arg, > int walk_mem_res(u64 start, u64 end, void *arg, > int (*func)(struct resource *, void *)) > { > - struct resource res; > - > - res.start = start; > - res.end = end; > - res.flags = IORESOURCE_MEM | IORESOURCE_BUSY; > + unsigned long flags = IORESOURCE_MEM | IORESOURCE_BUSY; > > - return __walk_iomem_res_desc(&res, IORES_DESC_NONE, true, > + return __walk_iomem_res_desc(start, end, flags, IORES_DESC_NONE, true, > arg, func); > } > > @@ -464,25 +452,25 @@ int walk_mem_res(u64 start, u64 end, void *arg, > int walk_system_ram_range(unsigned long start_pfn, unsigned long nr_pages, > void *arg, int (*func)(unsigned long, unsigned long, void *)) > { > + resource_size_t start, end; > + unsigned long flags; > struct resource res; > unsigned long pfn, end_pfn; > - u64 orig_end; > int ret = -1; > > - res.start = (u64) start_pfn << PAGE_SHIFT; > - res.end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1; > - res.flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; > - orig_end = res.end; > - while ((res.start < res.end) && > - (find_next_iomem_res(&res, IORES_DESC_NONE, true) >= 0)) { > + start = (u64) start_pfn << PAGE_SHIFT; > + end = ((u64)(start_pfn + nr_pages) << PAGE_SHIFT) - 1; > + flags = IORESOURCE_SYSTEM_RAM | IORESOURCE_BUSY; > + while (start < end && > + !find_next_iomem_res(start, end, flags, IORES_DESC_NONE, > + true, &res)) { > pfn = (res.start + PAGE_SIZE - 1) >> PAGE_SHIFT; > end_pfn = (res.end + 1) >> PAGE_SHIFT; > if (end_pfn > pfn) > ret = (*func)(pfn, end_pfn - pfn, arg); > if (ret) > break; > - res.start = res.end + 1; > - res.end = orig_end; > + start = res.end + 1; > } > return ret; > } > > > _______________________________________________ > kexec mailing list > kexec@lists.infradead.org > http://lists.infradead.org/mailman/listinfo/kexec > From mboxrd@z Thu Jan 1 00:00:00 1970 Return-path: Received: from mx1.redhat.com ([209.132.183.28]) by bombadil.infradead.org with esmtps (Exim 4.90_1 #2 (Red Hat Linux)) id 1g5Oql-0002Tp-8O for kexec@lists.infradead.org; Thu, 27 Sep 2018 05:28:35 +0000 Subject: Re: [PATCH 3/3] resource: Fix find_next_iomem_res() iteration issue References: <153782698067.130337.12079523922130875402.stgit@bhelgaas-glaptop.roam.corp.google.com> <153782730364.130337.17794279728329113665.stgit@bhelgaas-glaptop.roam.corp.google.com> From: lijiang Message-ID: <13084ce6-e29a-c244-3f9c-cf0725646d9f@redhat.com> Date: Thu, 27 Sep 2018 13:27:41 +0800 MIME-Version: 1.0 In-Reply-To: <153782730364.130337.17794279728329113665.stgit@bhelgaas-glaptop.roam.corp.google.com> Content-Language: en-US List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Sender: "kexec" Errors-To: kexec-bounces+dwmw2=infradead.org@lists.infradead.org To: Bjorn Helgaas Cc: thomas.lendacky@amd.com, brijesh.singh@amd.com, akpm@linux-foundation.org, bhe@redhat.com, tiwai@suse.de, x86@kernel.org, kexec@lists.infradead.org, linux-kernel@vger.kernel.org, mingo@redhat.com, baiyaowei@cmss.chinamobile.com, hpa@zytor.com, dan.j.williams@intel.com, bp@suse.de, dyoung@redhat.com, tglx@linutronix.de, Vivek Goyal 5ZyoIDIwMTjlubQwOeaciDI15pelIDA2OjE1LCBCam9ybiBIZWxnYWFzIOWGmemBkzoKPiBGcm9t OiBCam9ybiBIZWxnYWFzIDxiaGVsZ2Fhc0Bnb29nbGUuY29tPgo+IAo+IFByZXZpb3VzbHkgZmlu ZF9uZXh0X2lvbWVtX3JlcygpIHVzZWQgIipyZXMiIGFzIGJvdGggYW4gaW5wdXQgcGFyYW1ldGVy IGZvcgo+IHRoZSByYW5nZSB0byBzZWFyY2ggYW5kIHRoZSB0eXBlIG9mIHJlc291cmNlIHRvIHNl YXJjaCBmb3IsIGFuZCBhbiBvdXRwdXQKPiBwYXJhbWV0ZXIgZm9yIHRoZSByZXNvdXJjZSB3ZSBm b3VuZCwgd2hpY2ggbWFrZXMgdGhlIGludGVyZmFjZSBjb25mdXNpbmcKPiBhbmQgaGFyZCB0byB1 c2UgY29ycmVjdGx5Lgo+IAo+IEFsbCBjYWxsZXJzIGFsbG9jYXRlIGEgc2luZ2xlIHN0cnVjdCBy ZXNvdXJjZSBhbmQgdXNlIGl0IGZvciByZXBlYXRlZCBjYWxscwo+IHRvIGZpbmRfbmV4dF9pb21l bV9yZXMoKS4gIFdoZW4gZmluZF9uZXh0X2lvbWVtX3JlcygpIHJldHVybnMgYSByZXNvdXJjZSwK PiBpdCBvdmVyd3JpdGVzIHRoZSBzdGFydCwgZW5kLCBmbGFncywgYW5kIGRlc2MgbWVtYmVycyBv ZiB0aGUgc3RydWN0LiAgSWYgd2UKPiBjYWxsIGZpbmRfbmV4dF9pb21lbV9yZXMoKSBhZ2Fpbiwg d2UgbXVzdCB1cGRhdGUgb3IgcmVzdG9yZSB0aGVzZSBmaWVsZHMuCj4gCj4gVGhlIGNhbGxlcnMg KF9fd2Fsa19pb21lbV9yZXNfZGVzYygpIGFuZCB3YWxrX3N5c3RlbV9yYW1fcmFuZ2UoKSkgZG8g bm90Cj4gcmVzdG9yZSByZXMtPmZsYWdzLCBzbyBpZiB0aGUgY2FsbGVyIGlzIHNlYXJjaGluZyBm b3IgZmxhZ3Mgb2YKPiBJT1JFU09VUkNFX01FTSB8IElPUkVTT1VSQ0VfQlVTWSBhbmQgZmluZHMg YSByZXNvdXJjZSB3aXRoIGZsYWdzIG9mCj4gSU9SRVNPVVJDRV9NRU0gfCBJT1JFU09VUkNFX0JV U1kgfCBJT1JFU09VUkNFX1NZU1JBTSwgdGhlIG5leHQgc2VhcmNoIHdpbGwKPiBmaW5kIG9ubHkg cmVzb3VyY2VzIG1hcmtlZCBhcyBJT1JFU09VUkNFX1NZU1JBTS4KPiAKPiBGaXggdGhpcyBieSBy ZXN0cnVjdHVyaW5nIHRoZSBpbnRlcmZhY2Ugc28gaXQgdGFrZXMgZXhwbGljaXQgInN0YXJ0LCBl bmQsCj4gZmxhZ3MiIHBhcmFtZXRlcnMgYW5kIHVzZXMgIipyZXMiIG9ubHkgYXMgYW4gb3V0cHV0 IHBhcmFtZXRlci4KPiAKCkhpLCBCam9ybgpJIHBlcnNvbmFsbHkgc3VnZ2VzdCB0aGF0IHNvbWUg Y29tbWVudHMgbWlnaHQgYmUgYWRkZWQgaW4gdGhlIGNvZGUsIG1ha2UgaXQgY2xlYXIKYW5kIGVh c3kgdG8gdW5kZXJzdGFuZCwgdGhlbiB3aGljaCBjb3VsZCBhdm9pZCB0aGUgb2xkIGNvbmZ1c2lv biBhbmQgbW9yZSBjb2RlIGNoYW5nZXMuCgpUaGFua3MKTGlhbmJvCj4gT3JpZ2luYWwtcGF0Y2g6 IGh0dHA6Ly9sb3JlLmtlcm5lbC5vcmcvbGttbC8yMDE4MDkyMTA3MzIxMS4yMDA5Ny0yLWxpamlh bmdAcmVkaGF0LmNvbQo+IEJhc2VkLW9uLXBhdGNoLWJ5OiBMaWFuYm8gSmlhbmcgPGxpamlhbmdA cmVkaGF0LmNvbT4KPiBTaWduZWQtb2ZmLWJ5OiBCam9ybiBIZWxnYWFzIDxiaGVsZ2Fhc0Bnb29n bGUuY29tPgo+IC0tLQo+ICBrZXJuZWwvcmVzb3VyY2UuYyB8ICAgOTQgKysrKysrKysrKysrKysr KysrKysrKystLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KPiAgMSBmaWxlIGNoYW5nZWQs IDQxIGluc2VydGlvbnMoKyksIDUzIGRlbGV0aW9ucygtKQo+IAo+IGRpZmYgLS1naXQgYS9rZXJu ZWwvcmVzb3VyY2UuYyBiL2tlcm5lbC9yZXNvdXJjZS5jCj4gaW5kZXggMTU1ZWM4NzNlYTRkLi45 ODkxZWE5MGNjOGYgMTAwNjQ0Cj4gLS0tIGEva2VybmVsL3Jlc291cmNlLmMKPiArKysgYi9rZXJu ZWwvcmVzb3VyY2UuYwo+IEBAIC0zMTksMjMgKzMxOSwyNiBAQCBpbnQgcmVsZWFzZV9yZXNvdXJj ZShzdHJ1Y3QgcmVzb3VyY2UgKm9sZCkKPiAgRVhQT1JUX1NZTUJPTChyZWxlYXNlX3Jlc291cmNl KTsKPiAgCj4gIC8qCj4gLSAqIEZpbmRzIHRoZSBsb3dlc3QgaW9tZW0gcmVzb3VyY2UgZXhpc3Rp bmcgd2l0aGluIFtyZXMtPnN0YXJ0Li5yZXMtPmVuZF0uCj4gLSAqIFRoZSBjYWxsZXIgbXVzdCBz cGVjaWZ5IHJlcy0+c3RhcnQsIHJlcy0+ZW5kLCByZXMtPmZsYWdzLCBhbmQgb3B0aW9uYWxseQo+ IC0gKiBkZXNjLiAgSWYgZm91bmQsIHJldHVybnMgMCwgcmVzIGlzIG92ZXJ3cml0dGVuLCBpZiBu b3QgZm91bmQsIHJldHVybnMgLTEuCj4gLSAqIFRoaXMgZnVuY3Rpb24gd2Fsa3MgdGhlIHdob2xl IHRyZWUgYW5kIG5vdCBqdXN0IGZpcnN0IGxldmVsIGNoaWxkcmVuIHVudGlsCj4gLSAqIGFuZCB1 bmxlc3MgZmlyc3RfbGV2ZWxfY2hpbGRyZW5fb25seSBpcyB0cnVlLgo+ICsgKiBGaW5kcyB0aGUg bG93ZXN0IGlvbWVtIHJlc291cmNlIHRoYXQgY292ZXJzIHBhcnQgb2YgW3N0YXJ0Li5lbmRdLiAg VGhlCj4gKyAqIGNhbGxlciBtdXN0IHNwZWNpZnkgc3RhcnQsIGVuZCwgZmxhZ3MsIGFuZCBkZXNj ICh3aGljaCBtYXkgYmUKPiArICogSU9SRVNfREVTQ19OT05FKS4KPiArICoKPiArICogSWYgYSBy ZXNvdXJjZSBpcyBmb3VuZCwgcmV0dXJucyAwIGFuZCAqcmVzIGlzIG92ZXJ3cml0dGVuIHdpdGgg dGhlIHBhcnQKPiArICogb2YgdGhlIHJlc291cmNlIHRoYXQncyB3aXRoaW4gW3N0YXJ0Li5lbmRd OyBpZiBub25lIGlzIGZvdW5kLCByZXR1cm5zCj4gKyAqIC0xLgo+ICsgKgo+ICsgKiBUaGlzIGZ1 bmN0aW9uIHdhbGtzIHRoZSB3aG9sZSB0cmVlIGFuZCBub3QganVzdCBmaXJzdCBsZXZlbCBjaGls ZHJlbgo+ICsgKiB1bmxlc3MgZmlyc3RfbGV2ZWxfY2hpbGRyZW5fb25seSBpcyB0cnVlLgo+ICAg Ki8KPiAtc3RhdGljIGludCBmaW5kX25leHRfaW9tZW1fcmVzKHN0cnVjdCByZXNvdXJjZSAqcmVz LCB1bnNpZ25lZCBsb25nIGRlc2MsCj4gLQkJCSAgICAgICBib29sIGZpcnN0X2xldmVsX2NoaWxk cmVuX29ubHkpCj4gK3N0YXRpYyBpbnQgZmluZF9uZXh0X2lvbWVtX3JlcyhyZXNvdXJjZV9zaXpl X3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBlbmQsCj4gKwkJCSAgICAgICB1bnNpZ25lZCBsb25n IGZsYWdzLCB1bnNpZ25lZCBsb25nIGRlc2MsCj4gKwkJCSAgICAgICBib29sIGZpcnN0X2xldmVs X2NoaWxkcmVuX29ubHksCj4gKwkJCSAgICAgICBzdHJ1Y3QgcmVzb3VyY2UgKnJlcykKPiAgewo+ IC0JcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBlbmQ7Cj4gIAlzdHJ1Y3QgcmVzb3VyY2UgKnA7Cj4g IAlib29sIHNpYmxpbmdfb25seSA9IGZhbHNlOwo+ICAKPiAgCUJVR19PTighcmVzKTsKPiAtCj4g LQlzdGFydCA9IHJlcy0+c3RhcnQ7Cj4gLQllbmQgPSByZXMtPmVuZDsKPiAgCUJVR19PTihzdGFy dCA+PSBlbmQpOwo+ICAKPiAgCWlmIChmaXJzdF9sZXZlbF9jaGlsZHJlbl9vbmx5KQo+IEBAIC0z NDQsNyArMzQ3LDcgQEAgc3RhdGljIGludCBmaW5kX25leHRfaW9tZW1fcmVzKHN0cnVjdCByZXNv dXJjZSAqcmVzLCB1bnNpZ25lZCBsb25nIGRlc2MsCj4gIAlyZWFkX2xvY2soJnJlc291cmNlX2xv Y2spOwo+ICAKPiAgCWZvciAocCA9IGlvbWVtX3Jlc291cmNlLmNoaWxkOyBwOyBwID0gbmV4dF9y ZXNvdXJjZShwLCBzaWJsaW5nX29ubHkpKSB7Cj4gLQkJaWYgKChwLT5mbGFncyAmIHJlcy0+Zmxh Z3MpICE9IHJlcy0+ZmxhZ3MpCj4gKwkJaWYgKChwLT5mbGFncyAmIGZsYWdzKSAhPSBmbGFncykK PiAgCQkJY29udGludWU7Cj4gIAkJaWYgKChkZXNjICE9IElPUkVTX0RFU0NfTk9ORSkgJiYgKGRl c2MgIT0gcC0+ZGVzYykpCj4gIAkJCWNvbnRpbnVlOwo+IEBAIC0zNTksMzIgKzM2MiwzMSBAQCBz dGF0aWMgaW50IGZpbmRfbmV4dF9pb21lbV9yZXMoc3RydWN0IHJlc291cmNlICpyZXMsIHVuc2ln bmVkIGxvbmcgZGVzYywKPiAgCXJlYWRfdW5sb2NrKCZyZXNvdXJjZV9sb2NrKTsKPiAgCWlmICgh cCkKPiAgCQlyZXR1cm4gLTE7Cj4gKwo+ICAJLyogY29weSBkYXRhICovCj4gLQlpZiAocmVzLT5z dGFydCA8IHAtPnN0YXJ0KQo+IC0JCXJlcy0+c3RhcnQgPSBwLT5zdGFydDsKPiAtCWlmIChyZXMt PmVuZCA+IHAtPmVuZCkKPiAtCQlyZXMtPmVuZCA9IHAtPmVuZDsKPiArCXJlcy0+c3RhcnQgPSBt YXgoc3RhcnQsIHAtPnN0YXJ0KTsKPiArCXJlcy0+ZW5kID0gbWluKGVuZCwgcC0+ZW5kKTsKPiAg CXJlcy0+ZmxhZ3MgPSBwLT5mbGFnczsKPiAgCXJlcy0+ZGVzYyA9IHAtPmRlc2M7Cj4gIAlyZXR1 cm4gMDsKPiAgfQo+ICAKPiAtc3RhdGljIGludCBfX3dhbGtfaW9tZW1fcmVzX2Rlc2Moc3RydWN0 IHJlc291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgZGVzYywKPiAtCQkJCSBib29sIGZpcnN0X2xl dmVsX2NoaWxkcmVuX29ubHksCj4gLQkJCQkgdm9pZCAqYXJnLAo+ICtzdGF0aWMgaW50IF9fd2Fs a19pb21lbV9yZXNfZGVzYyhyZXNvdXJjZV9zaXplX3Qgc3RhcnQsIHJlc291cmNlX3NpemVfdCBl bmQsCj4gKwkJCQkgdW5zaWduZWQgbG9uZyBmbGFncywgdW5zaWduZWQgbG9uZyBkZXNjLAo+ICsJ CQkJIGJvb2wgZmlyc3RfbGV2ZWxfY2hpbGRyZW5fb25seSwgdm9pZCAqYXJnLAo+ICAJCQkJIGlu dCAoKmZ1bmMpKHN0cnVjdCByZXNvdXJjZSAqLCB2b2lkICopKQo+ICB7Cj4gLQl1NjQgb3JpZ19l bmQgPSByZXMtPmVuZDsKPiArCXN0cnVjdCByZXNvdXJjZSByZXM7Cj4gIAlpbnQgcmV0ID0gLTE7 Cj4gIAo+IC0Jd2hpbGUgKChyZXMtPnN0YXJ0IDwgcmVzLT5lbmQpICYmCj4gLQkgICAgICAgIWZp bmRfbmV4dF9pb21lbV9yZXMocmVzLCBkZXNjLCBmaXJzdF9sZXZlbF9jaGlsZHJlbl9vbmx5KSkg ewo+IC0JCXJldCA9ICgqZnVuYykocmVzLCBhcmcpOwo+ICsJd2hpbGUgKHN0YXJ0IDwgZW5kICYm Cj4gKwkgICAgICAgIWZpbmRfbmV4dF9pb21lbV9yZXMoc3RhcnQsIGVuZCwgZmxhZ3MsIGRlc2Ms Cj4gKwkJCQkgICAgZmlyc3RfbGV2ZWxfY2hpbGRyZW5fb25seSwgJnJlcykpIHsKPiArCQlyZXQg PSAoKmZ1bmMpKCZyZXMsIGFyZyk7Cj4gIAkJaWYgKHJldCkKPiAgCQkJYnJlYWs7Cj4gIAo+IC0J CXJlcy0+c3RhcnQgPSByZXMtPmVuZCArIDE7Cj4gLQkJcmVzLT5lbmQgPSBvcmlnX2VuZDsKPiAr CQlzdGFydCA9IHJlcy5lbmQgKyAxOwo+ICAJfQo+ICAKPiAgCXJldHVybiByZXQ7Cj4gQEAgLTQw NywxMyArNDA5LDcgQEAgc3RhdGljIGludCBfX3dhbGtfaW9tZW1fcmVzX2Rlc2Moc3RydWN0IHJl c291cmNlICpyZXMsIHVuc2lnbmVkIGxvbmcgZGVzYywKPiAgaW50IHdhbGtfaW9tZW1fcmVzX2Rl c2ModW5zaWduZWQgbG9uZyBkZXNjLCB1bnNpZ25lZCBsb25nIGZsYWdzLCB1NjQgc3RhcnQsCj4g IAkJdTY0IGVuZCwgdm9pZCAqYXJnLCBpbnQgKCpmdW5jKShzdHJ1Y3QgcmVzb3VyY2UgKiwgdm9p ZCAqKSkKPiAgewo+IC0Jc3RydWN0IHJlc291cmNlIHJlczsKPiAtCj4gLQlyZXMuc3RhcnQgPSBz dGFydDsKPiAtCXJlcy5lbmQgPSBlbmQ7Cj4gLQlyZXMuZmxhZ3MgPSBmbGFnczsKPiAtCj4gLQly ZXR1cm4gX193YWxrX2lvbWVtX3Jlc19kZXNjKCZyZXMsIGRlc2MsIGZhbHNlLCBhcmcsIGZ1bmMp Owo+ICsJcmV0dXJuIF9fd2Fsa19pb21lbV9yZXNfZGVzYyhzdGFydCwgZW5kLCBmbGFncywgZGVz YywgZmFsc2UsIGFyZywgZnVuYyk7Cj4gIH0KPiAgRVhQT1JUX1NZTUJPTF9HUEwod2Fsa19pb21l bV9yZXNfZGVzYyk7Cj4gIAo+IEBAIC00MjcsMTMgKzQyMyw5IEBAIEVYUE9SVF9TWU1CT0xfR1BM KHdhbGtfaW9tZW1fcmVzX2Rlc2MpOwo+ICBpbnQgd2Fsa19zeXN0ZW1fcmFtX3Jlcyh1NjQgc3Rh cnQsIHU2NCBlbmQsIHZvaWQgKmFyZywKPiAgCQkJCWludCAoKmZ1bmMpKHN0cnVjdCByZXNvdXJj ZSAqLCB2b2lkICopKQo+ICB7Cj4gLQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwo+IC0KPiAtCXJlcy5z dGFydCA9IHN0YXJ0Owo+IC0JcmVzLmVuZCA9IGVuZDsKPiAtCXJlcy5mbGFncyA9IElPUkVTT1VS Q0VfU1lTVEVNX1JBTSB8IElPUkVTT1VSQ0VfQlVTWTsKPiArCXVuc2lnbmVkIGxvbmcgZmxhZ3Mg PSBJT1JFU09VUkNFX1NZU1RFTV9SQU0gfCBJT1JFU09VUkNFX0JVU1k7Cj4gIAo+IC0JcmV0dXJu IF9fd2Fsa19pb21lbV9yZXNfZGVzYygmcmVzLCBJT1JFU19ERVNDX05PTkUsIHRydWUsCj4gKwly ZXR1cm4gX193YWxrX2lvbWVtX3Jlc19kZXNjKHN0YXJ0LCBlbmQsIGZsYWdzLCBJT1JFU19ERVND X05PTkUsIHRydWUsCj4gIAkJCQkgICAgIGFyZywgZnVuYyk7Cj4gIH0KPiAgCj4gQEAgLTQ0NCwx MyArNDM2LDkgQEAgaW50IHdhbGtfc3lzdGVtX3JhbV9yZXModTY0IHN0YXJ0LCB1NjQgZW5kLCB2 b2lkICphcmcsCj4gIGludCB3YWxrX21lbV9yZXModTY0IHN0YXJ0LCB1NjQgZW5kLCB2b2lkICph cmcsCj4gIAkJIGludCAoKmZ1bmMpKHN0cnVjdCByZXNvdXJjZSAqLCB2b2lkICopKQo+ICB7Cj4g LQlzdHJ1Y3QgcmVzb3VyY2UgcmVzOwo+IC0KPiAtCXJlcy5zdGFydCA9IHN0YXJ0Owo+IC0JcmVz LmVuZCA9IGVuZDsKPiAtCXJlcy5mbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJDRV9C VVNZOwo+ICsJdW5zaWduZWQgbG9uZyBmbGFncyA9IElPUkVTT1VSQ0VfTUVNIHwgSU9SRVNPVVJD RV9CVVNZOwo+ICAKPiAtCXJldHVybiBfX3dhbGtfaW9tZW1fcmVzX2Rlc2MoJnJlcywgSU9SRVNf REVTQ19OT05FLCB0cnVlLAo+ICsJcmV0dXJuIF9fd2Fsa19pb21lbV9yZXNfZGVzYyhzdGFydCwg ZW5kLCBmbGFncywgSU9SRVNfREVTQ19OT05FLCB0cnVlLAo+ICAJCQkJICAgICBhcmcsIGZ1bmMp Owo+ICB9Cj4gIAo+IEBAIC00NjQsMjUgKzQ1MiwyNSBAQCBpbnQgd2Fsa19tZW1fcmVzKHU2NCBz dGFydCwgdTY0IGVuZCwgdm9pZCAqYXJnLAo+ICBpbnQgd2Fsa19zeXN0ZW1fcmFtX3JhbmdlKHVu c2lnbmVkIGxvbmcgc3RhcnRfcGZuLCB1bnNpZ25lZCBsb25nIG5yX3BhZ2VzLAo+ICAJCXZvaWQg KmFyZywgaW50ICgqZnVuYykodW5zaWduZWQgbG9uZywgdW5zaWduZWQgbG9uZywgdm9pZCAqKSkK PiAgewo+ICsJcmVzb3VyY2Vfc2l6ZV90IHN0YXJ0LCBlbmQ7Cj4gKwl1bnNpZ25lZCBsb25nIGZs YWdzOwo+ICAJc3RydWN0IHJlc291cmNlIHJlczsKPiAgCXVuc2lnbmVkIGxvbmcgcGZuLCBlbmRf cGZuOwo+IC0JdTY0IG9yaWdfZW5kOwo+ICAJaW50IHJldCA9IC0xOwo+ICAKPiAtCXJlcy5zdGFy dCA9ICh1NjQpIHN0YXJ0X3BmbiA8PCBQQUdFX1NISUZUOwo+IC0JcmVzLmVuZCA9ICgodTY0KShz dGFydF9wZm4gKyBucl9wYWdlcykgPDwgUEFHRV9TSElGVCkgLSAxOwo+IC0JcmVzLmZsYWdzID0g SU9SRVNPVVJDRV9TWVNURU1fUkFNIHwgSU9SRVNPVVJDRV9CVVNZOwo+IC0Jb3JpZ19lbmQgPSBy ZXMuZW5kOwo+IC0Jd2hpbGUgKChyZXMuc3RhcnQgPCByZXMuZW5kKSAmJgo+IC0JCShmaW5kX25l eHRfaW9tZW1fcmVzKCZyZXMsIElPUkVTX0RFU0NfTk9ORSwgdHJ1ZSkgPj0gMCkpIHsKPiArCXN0 YXJ0ID0gKHU2NCkgc3RhcnRfcGZuIDw8IFBBR0VfU0hJRlQ7Cj4gKwllbmQgPSAoKHU2NCkoc3Rh cnRfcGZuICsgbnJfcGFnZXMpIDw8IFBBR0VfU0hJRlQpIC0gMTsKPiArCWZsYWdzID0gSU9SRVNP VVJDRV9TWVNURU1fUkFNIHwgSU9SRVNPVVJDRV9CVVNZOwo+ICsJd2hpbGUgKHN0YXJ0IDwgZW5k ICYmCj4gKwkgICAgICAgIWZpbmRfbmV4dF9pb21lbV9yZXMoc3RhcnQsIGVuZCwgZmxhZ3MsIElP UkVTX0RFU0NfTk9ORSwKPiArCQkJCSAgICB0cnVlLCAmcmVzKSkgewo+ICAJCXBmbiA9IChyZXMu c3RhcnQgKyBQQUdFX1NJWkUgLSAxKSA+PiBQQUdFX1NISUZUOwo+ICAJCWVuZF9wZm4gPSAocmVz LmVuZCArIDEpID4+IFBBR0VfU0hJRlQ7Cj4gIAkJaWYgKGVuZF9wZm4gPiBwZm4pCj4gIAkJCXJl dCA9ICgqZnVuYykocGZuLCBlbmRfcGZuIC0gcGZuLCBhcmcpOwo+ICAJCWlmIChyZXQpCj4gIAkJ CWJyZWFrOwo+IC0JCXJlcy5zdGFydCA9IHJlcy5lbmQgKyAxOwo+IC0JCXJlcy5lbmQgPSBvcmln X2VuZDsKPiArCQlzdGFydCA9IHJlcy5lbmQgKyAxOwo+ICAJfQo+ICAJcmV0dXJuIHJldDsKPiAg fQo+IAo+IAo+IF9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f Cj4ga2V4ZWMgbWFpbGluZyBsaXN0Cj4ga2V4ZWNAbGlzdHMuaW5mcmFkZWFkLm9yZwo+IGh0dHA6 Ly9saXN0cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8va2V4ZWMKPiAKCl9fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmtleGVjIG1haWxpbmcgbGlz dAprZXhlY0BsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0cy5pbmZyYWRlYWQub3JnL21h aWxtYW4vbGlzdGluZm8va2V4ZWMK