From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from frasgout.his.huawei.com (frasgout.his.huawei.com [185.176.79.56]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by smtp.subspace.kernel.org (Postfix) with ESMTPS id 425445D464; Mon, 15 Apr 2024 10:52:07 +0000 (UTC) Authentication-Results: smtp.subspace.kernel.org; arc=none smtp.client-ip=185.176.79.56 ARC-Seal:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178331; cv=none; b=LDgUbc1GWIw8Yf2hAczrdAc0f5IO9f2J4j6mkQXArw0VrnUbo3kCv9cCUoB4mSCNRmfJ90Iau8y05wc4yKN2erZ7jfc8CO2qzsP8aeqcHfijryfsAMc7BICdbOy9FSwwVyIJrx6fD3l0ycb22rAh3KW7zT2xxJtJI1QvgUCAzZo= ARC-Message-Signature:i=1; a=rsa-sha256; d=subspace.kernel.org; s=arc-20240116; t=1713178331; c=relaxed/simple; bh=YjzZLPQbXgfdGlGbGlYWn308Tq/4T7rk/4RnIScxBMU=; h=Date:From:To:CC:Subject:Message-ID:In-Reply-To:References: MIME-Version:Content-Type; b=VK5+iWeT0gZBArsBn5IIAfYEkuBHb2i1r6f2PCTaf2jJ0JROl0i7746IBhhlZ253r1cc8n2WzBGaQrZEoIbDndVwsuJ59oEtl4eBjHEovFvVSBreGS5n343wJtstf8N4hCe8Zd44v+HtyfP645ULHwQOENXMYeBUPaKCRvy2aQQ= ARC-Authentication-Results:i=1; smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=Huawei.com; spf=pass smtp.mailfrom=huawei.com; arc=none smtp.client-ip=185.176.79.56 Authentication-Results: smtp.subspace.kernel.org; dmarc=pass (p=quarantine dis=none) header.from=Huawei.com Authentication-Results: smtp.subspace.kernel.org; spf=pass smtp.mailfrom=huawei.com Received: from mail.maildlp.com (unknown [172.18.186.31]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4VJ3lL5dzRz6K919; Mon, 15 Apr 2024 18:47:10 +0800 (CST) Received: from lhrpeml500005.china.huawei.com (unknown [7.191.163.240]) by mail.maildlp.com (Postfix) with ESMTPS id 5943D140A08; Mon, 15 Apr 2024 18:52:05 +0800 (CST) Received: from localhost (10.202.227.76) by lhrpeml500005.china.huawei.com (7.191.163.240) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Mon, 15 Apr 2024 11:52:04 +0100 Date: Mon, 15 Apr 2024 11:52:03 +0100 From: Jonathan Cameron To: "Rafael J. Wysocki" CC: , , , , , , , , Russell King , Miguel Luis , James Morse , Salil Mehta , "Jean-Philippe Brucker" , Catalin Marinas , Will Deacon , , , Subject: Re: [PATCH v5 03/18] ACPI: processor: Register deferred CPUs from acpi_processor_get_info() Message-ID: <20240415115203.0000011b@Huawei.com> In-Reply-To: References: <20240412143719.11398-1-Jonathan.Cameron@huawei.com> <20240412143719.11398-4-Jonathan.Cameron@huawei.com> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32) Precedence: bulk X-Mailing-List: kvmarm@lists.linux.dev List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-ClientProxiedBy: lhrpeml100002.china.huawei.com (7.191.160.241) To lhrpeml500005.china.huawei.com (7.191.163.240) On Fri, 12 Apr 2024 20:30:40 +0200 "Rafael J. Wysocki" wrote: > On Fri, Apr 12, 2024 at 4:38=E2=80=AFPM Jonathan Cameron > wrote: > > > > From: James Morse > > > > The arm64 specific arch_register_cpu() call may defer CPU registration > > until the ACPI interpreter is available and the _STA method can > > be evaluated. > > > > If this occurs, then a second attempt is made in > > acpi_processor_get_info(). Note that the arm64 specific call has > > not yet been added so for now this will never be successfully > > called. > > > > Systems can still be booted with 'acpi=3Doff', or not include an > > ACPI description at all as in these cases arch_register_cpu() > > will not have deferred registration when first called. > > > > This moves the CPU register logic back to a subsys_initcall(), > > while the memory nodes will have been registered earlier. > > Note this is where the call was prior to the cleanup series so > > there should be no side effects of moving it back again for this > > specific case. > > > > [PATCH 00/21] Initial cleanups for vCPU HP. > > https://lore.kernel.org/all/ZVyz%2FVe5pPu8AWoA@shell.armlinux.org.uk/ > > > > e.g. 5b95f94c3b9f ("x86/topology: Switch over to GENERIC_CPU_DEVICES") > > > > Signed-off-by: James Morse > > Reviewed-by: Gavin Shan > > Tested-by: Miguel Luis > > Tested-by: Vishnu Pajjuri > > Tested-by: Jianyong Wu > > Signed-off-by: Russell King (Oracle) > > Co-developed-by: Jonathan Cameron > > Signed-off-by: Joanthan Cameron > > --- > > v5: Update commit message to make it clear this is moving the > > init back to where it was until very recently. > > > > No longer change the condition in the earlier registration point > > as that will be handled by the arm64 registration routine > > deferring until called again here. > > --- > > drivers/acpi/acpi_processor.c | 12 ++++++++++++ > > 1 file changed, 12 insertions(+) > > > > diff --git a/drivers/acpi/acpi_processor.c b/drivers/acpi/acpi_processo= r.c > > index 93e029403d05..c78398cdd060 100644 > > --- a/drivers/acpi/acpi_processor.c > > +++ b/drivers/acpi/acpi_processor.c > > @@ -317,6 +317,18 @@ static int acpi_processor_get_info(struct acpi_dev= ice *device) > > > > c =3D &per_cpu(cpu_devices, pr->id); > > ACPI_COMPANION_SET(&c->dev, device); > > + /* > > + * Register CPUs that are present. get_cpu_device() is used to = skip > > + * duplicate CPU descriptions from firmware. > > + */ > > + if (!invalid_logical_cpuid(pr->id) && cpu_present(pr->id) && > > + !get_cpu_device(pr->id)) { > > + int ret =3D arch_register_cpu(pr->id); > > + > > + if (ret) > > + return ret; > > + } > > + > > /* > > * Extra Processor objects may be enumerated on MP systems with > > * less than the max # of CPUs. They should be ignored _iff > > -- =20 >=20 > I am still unsure why there need to be two paths calling > arch_register_cpu() in acpi_processor_get_info(). I replied further down the thread, but the key point was to maintain the strong distinction between 'what' was done in a real hotplug path vs one where onlining was all. We can relax that but it goes contrary to the careful dance that was needed to get any agreement to the ARM architecture aspects of this. >=20 > Just below the comment partially pulled into the patch context above, > there is this code: >=20 > if (invalid_logical_cpuid(pr->id) || !cpu_present(pr->id)) { > int ret =3D acpi_processor_hotadd_init(pr); >=20 > if (ret) > return ret; > } >=20 > For the sake of the argument, fold acpi_processor_hotadd_init() into > it and drop the redundant _STA check from it: If we combine these, the _STA check is necessary because we will call this path for delayed onlining of ARM64 CPUs (if the earlier registration code call or arch_register_cpu() returned -EPROBE defer). That's the only way we know that a given CPU is online capable but firmware is saying we can't bring it online yet (it may be be vHP later). >=20 > if (invalid_logical_cpuid(pr->id) || !cpu_present(pr->id)) { > if (invalid_phys_cpuid(pr->phys_id)) > return -ENODEV; >=20 > cpu_maps_update_begin(); > cpus_write_lock(); >=20 > ret =3D acpi_map_cpu(pr->handle, pr->phys_id, pr->acpi_id, &pr->id= ); I read that call as acpi_map_cpu_for_physical_cpu_hotplug() but we could make it equivalent of. acpi_map_cpu_for_whatever_cpu_hotplug() (I'm not proposing those names though ;) in which case it is fine to just stub it out on ARM64. > if (ret) { > cpus_write_unlock(); > cpu_maps_update_done(); > return ret; > } > ret =3D arch_register_cpu(pr->id); > if (ret) { > acpi_unmap_cpu(pr->id); >=20 > cpus_write_unlock(); > cpu_maps_update_done(); > return ret; > } > pr_info("CPU%d has been hot-added\n", pr->id); > pr->flags.need_hotplug_init =3D 1; This one needs more careful handling because we are calling this for non hotplug cases on arm64 in which case we end up setting this for initially online CPUs - thus if we offline and online them again via sysfs /sys/bus/cpu/device/cpuX/online it goes through the hotplug path and should not. So I need a way to detect if we are hotplugging the cpu or not. Is there a standard way to do this? I haven't figured out how to use flags in drivers to communicate this state. >=20 > cpus_write_unlock(); > cpu_maps_update_done(); > } >=20 > so I'm not sure why this cannot be combined with the new code. >=20 > Say acpi_map_cpu) / acpi_unmap_cpu() are turned into arch calls. > What's the difference then? The locking, which should be fine if I'm > not mistaken and need_hotplug_init that needs to be set if this code > runs after the processor driver has loaded AFAICS. That's the bit that I'm currently finding a challenge. Is there a clean way to detect that? Jonathan 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 BB31BC4345F for ; Mon, 15 Apr 2024 10:52:26 +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:MIME-Version:References:In-Reply-To: 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=9tk9IbEwamoG12RfpNVOlWTsKwiE3+KzsQ2tvQ68GDM=; b=naQT6AZwNonLUs W6qdj9uAyUHWOUmbUYmj+XPTsuc/WetEsuz2bF+7bf7dzi7neOBdt1V/oO4z5ADAzrUuY/JiqqjJ2 JHu22ybIUyNuPO/y0i/baKkMlq+nKt8nHkaPnKrg9C02t/7VZVoPcn1iQTdG4Z+JWz5eqHIboIBmP LQa95JHycQbYjkNOPAYpxfNL0jYRVyrTTDZHeXSWVlmT/K0CtIItAVhJRRDMUpftpphUWBtu9pRc+ TKaI6xIiAKv0R7ZA6V1Y5wdYe8NLOh0GM3ruJqb752Kca4e+bWBERnZ72kJGsQ11pxOpaYUs8nd3D YD4UT0gFVGqvxwyZ1Owg==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.97.1 #2 (Red Hat Linux)) id 1rwJwf-00000007w7A-1bsl; Mon, 15 Apr 2024 10:52:17 +0000 Received: from frasgout.his.huawei.com ([185.176.79.56]) by bombadil.infradead.org with esmtps (Exim 4.97.1 #2 (Red Hat Linux)) id 1rwJwa-00000007w5h-3rqN for linux-arm-kernel@lists.infradead.org; Mon, 15 Apr 2024 10:52:15 +0000 Received: from mail.maildlp.com (unknown [172.18.186.31]) by frasgout.his.huawei.com (SkyGuard) with ESMTP id 4VJ3lL5dzRz6K919; Mon, 15 Apr 2024 18:47:10 +0800 (CST) Received: from lhrpeml500005.china.huawei.com (unknown [7.191.163.240]) by mail.maildlp.com (Postfix) with ESMTPS id 5943D140A08; Mon, 15 Apr 2024 18:52:05 +0800 (CST) Received: from localhost (10.202.227.76) by lhrpeml500005.china.huawei.com (7.191.163.240) with Microsoft SMTP Server (version=TLS1_2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id 15.1.2507.35; Mon, 15 Apr 2024 11:52:04 +0100 Date: Mon, 15 Apr 2024 11:52:03 +0100 From: Jonathan Cameron To: "Rafael J. Wysocki" CC: , , , , , , , , Russell King , Miguel Luis , James Morse , Salil Mehta , "Jean-Philippe Brucker" , Catalin Marinas , Will Deacon , , , Subject: Re: [PATCH v5 03/18] ACPI: processor: Register deferred CPUs from acpi_processor_get_info() Message-ID: <20240415115203.0000011b@Huawei.com> In-Reply-To: References: <20240412143719.11398-1-Jonathan.Cameron@huawei.com> <20240412143719.11398-4-Jonathan.Cameron@huawei.com> Organization: Huawei Technologies Research and Development (UK) Ltd. X-Mailer: Claws Mail 4.1.0 (GTK 3.24.33; x86_64-w64-mingw32) MIME-Version: 1.0 X-Originating-IP: [10.202.227.76] X-ClientProxiedBy: lhrpeml100002.china.huawei.com (7.191.160.241) To lhrpeml500005.china.huawei.com (7.191.163.240) X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20240415_035213_340876_3A994A11 X-CRM114-Status: GOOD ( 48.52 ) 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 T24gRnJpLCAxMiBBcHIgMjAyNCAyMDozMDo0MCArMDIwMAoiUmFmYWVsIEouIFd5c29ja2kiIDxy YWZhZWxAa2VybmVsLm9yZz4gd3JvdGU6Cgo+IE9uIEZyaSwgQXByIDEyLCAyMDI0IGF0IDQ6Mzji gK9QTSBKb25hdGhhbiBDYW1lcm9uCj4gPEpvbmF0aGFuLkNhbWVyb25AaHVhd2VpLmNvbT4gd3Jv dGU6Cj4gPgo+ID4gRnJvbTogSmFtZXMgTW9yc2UgPGphbWVzLm1vcnNlQGFybS5jb20+Cj4gPgo+ ID4gVGhlIGFybTY0IHNwZWNpZmljIGFyY2hfcmVnaXN0ZXJfY3B1KCkgY2FsbCBtYXkgZGVmZXIg Q1BVIHJlZ2lzdHJhdGlvbgo+ID4gdW50aWwgdGhlIEFDUEkgaW50ZXJwcmV0ZXIgaXMgYXZhaWxh YmxlIGFuZCB0aGUgX1NUQSBtZXRob2QgY2FuCj4gPiBiZSBldmFsdWF0ZWQuCj4gPgo+ID4gSWYg dGhpcyBvY2N1cnMsIHRoZW4gYSBzZWNvbmQgYXR0ZW1wdCBpcyBtYWRlIGluCj4gPiBhY3BpX3By b2Nlc3Nvcl9nZXRfaW5mbygpLiBOb3RlIHRoYXQgdGhlIGFybTY0IHNwZWNpZmljIGNhbGwgaGFz Cj4gPiBub3QgeWV0IGJlZW4gYWRkZWQgc28gZm9yIG5vdyB0aGlzIHdpbGwgbmV2ZXIgYmUgc3Vj Y2Vzc2Z1bGx5Cj4gPiBjYWxsZWQuCj4gPgo+ID4gU3lzdGVtcyBjYW4gc3RpbGwgYmUgYm9vdGVk IHdpdGggJ2FjcGk9b2ZmJywgb3Igbm90IGluY2x1ZGUgYW4KPiA+IEFDUEkgZGVzY3JpcHRpb24g YXQgYWxsIGFzIGluIHRoZXNlIGNhc2VzIGFyY2hfcmVnaXN0ZXJfY3B1KCkKPiA+IHdpbGwgbm90 IGhhdmUgZGVmZXJyZWQgcmVnaXN0cmF0aW9uIHdoZW4gZmlyc3QgY2FsbGVkLgo+ID4KPiA+IFRo aXMgbW92ZXMgdGhlIENQVSByZWdpc3RlciBsb2dpYyBiYWNrIHRvIGEgc3Vic3lzX2luaXRjYWxs KCksCj4gPiB3aGlsZSB0aGUgbWVtb3J5IG5vZGVzIHdpbGwgaGF2ZSBiZWVuIHJlZ2lzdGVyZWQg ZWFybGllci4KPiA+IE5vdGUgdGhpcyBpcyB3aGVyZSB0aGUgY2FsbCB3YXMgcHJpb3IgdG8gdGhl IGNsZWFudXAgc2VyaWVzIHNvCj4gPiB0aGVyZSBzaG91bGQgYmUgbm8gc2lkZSBlZmZlY3RzIG9m IG1vdmluZyBpdCBiYWNrIGFnYWluIGZvciB0aGlzCj4gPiBzcGVjaWZpYyBjYXNlLgo+ID4KPiA+ IFtQQVRDSCAwMC8yMV0gSW5pdGlhbCBjbGVhbnVwcyBmb3IgdkNQVSBIUC4KPiA+IGh0dHBzOi8v bG9yZS5rZXJuZWwub3JnL2FsbC9aVnl6JTJGVmU1cFB1OEFXb0FAc2hlbGwuYXJtbGludXgub3Jn LnVrLwo+ID4KPiA+IGUuZy4gNWI5NWY5NGMzYjlmICgieDg2L3RvcG9sb2d5OiBTd2l0Y2ggb3Zl ciB0byBHRU5FUklDX0NQVV9ERVZJQ0VTIikKPiA+Cj4gPiBTaWduZWQtb2ZmLWJ5OiBKYW1lcyBN b3JzZSA8amFtZXMubW9yc2VAYXJtLmNvbT4KPiA+IFJldmlld2VkLWJ5OiBHYXZpbiBTaGFuIDxn c2hhbkByZWRoYXQuY29tPgo+ID4gVGVzdGVkLWJ5OiBNaWd1ZWwgTHVpcyA8bWlndWVsLmx1aXNA b3JhY2xlLmNvbT4KPiA+IFRlc3RlZC1ieTogVmlzaG51IFBhamp1cmkgPHZpc2hudUBvcy5hbXBl cmVjb21wdXRpbmcuY29tPgo+ID4gVGVzdGVkLWJ5OiBKaWFueW9uZyBXdSA8amlhbnlvbmcud3VA YXJtLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IFJ1c3NlbGwgS2luZyAoT3JhY2xlKSA8cm1rK2tl cm5lbEBhcm1saW51eC5vcmcudWs+Cj4gPiBDby1kZXZlbG9wZWQtYnk6IEpvbmF0aGFuIENhbWVy b24gPEpvbmF0aGFuLkNhbWVyb25AaHVhd2VpLmNvbT4KPiA+IFNpZ25lZC1vZmYtYnk6IEpvYW50 aGFuIENhbWVyb24gPEpvbmF0aGFuLkNhbWVyb25AaHVhd2VpLmNvbT4KPiA+IC0tLQo+ID4gdjU6 IFVwZGF0ZSBjb21taXQgbWVzc2FnZSB0byBtYWtlIGl0IGNsZWFyIHRoaXMgaXMgbW92aW5nIHRo ZQo+ID4gICAgIGluaXQgYmFjayB0byB3aGVyZSBpdCB3YXMgdW50aWwgdmVyeSByZWNlbnRseS4K PiA+Cj4gPiAgICAgTm8gbG9uZ2VyIGNoYW5nZSB0aGUgY29uZGl0aW9uIGluIHRoZSBlYXJsaWVy IHJlZ2lzdHJhdGlvbiBwb2ludAo+ID4gICAgIGFzIHRoYXQgd2lsbCBiZSBoYW5kbGVkIGJ5IHRo ZSBhcm02NCByZWdpc3RyYXRpb24gcm91dGluZQo+ID4gICAgIGRlZmVycmluZyB1bnRpbCBjYWxs ZWQgYWdhaW4gaGVyZS4KPiA+IC0tLQo+ID4gIGRyaXZlcnMvYWNwaS9hY3BpX3Byb2Nlc3Nvci5j IHwgMTIgKysrKysrKysrKysrCj4gPiAgMSBmaWxlIGNoYW5nZWQsIDEyIGluc2VydGlvbnMoKykK PiA+Cj4gPiBkaWZmIC0tZ2l0IGEvZHJpdmVycy9hY3BpL2FjcGlfcHJvY2Vzc29yLmMgYi9kcml2 ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYwo+ID4gaW5kZXggOTNlMDI5NDAzZDA1Li5jNzgzOThj ZGQwNjAgMTAwNjQ0Cj4gPiAtLS0gYS9kcml2ZXJzL2FjcGkvYWNwaV9wcm9jZXNzb3IuYwo+ID4g KysrIGIvZHJpdmVycy9hY3BpL2FjcGlfcHJvY2Vzc29yLmMKPiA+IEBAIC0zMTcsNiArMzE3LDE4 IEBAIHN0YXRpYyBpbnQgYWNwaV9wcm9jZXNzb3JfZ2V0X2luZm8oc3RydWN0IGFjcGlfZGV2aWNl ICpkZXZpY2UpCj4gPgo+ID4gICAgICAgICBjID0gJnBlcl9jcHUoY3B1X2RldmljZXMsIHByLT5p ZCk7Cj4gPiAgICAgICAgIEFDUElfQ09NUEFOSU9OX1NFVCgmYy0+ZGV2LCBkZXZpY2UpOwo+ID4g KyAgICAgICAvKgo+ID4gKyAgICAgICAgKiBSZWdpc3RlciBDUFVzIHRoYXQgYXJlIHByZXNlbnQu IGdldF9jcHVfZGV2aWNlKCkgaXMgdXNlZCB0byBza2lwCj4gPiArICAgICAgICAqIGR1cGxpY2F0 ZSBDUFUgZGVzY3JpcHRpb25zIGZyb20gZmlybXdhcmUuCj4gPiArICAgICAgICAqLwo+ID4gKyAg ICAgICBpZiAoIWludmFsaWRfbG9naWNhbF9jcHVpZChwci0+aWQpICYmIGNwdV9wcmVzZW50KHBy LT5pZCkgJiYKPiA+ICsgICAgICAgICAgICFnZXRfY3B1X2RldmljZShwci0+aWQpKSB7Cj4gPiAr ICAgICAgICAgICAgICAgaW50IHJldCA9IGFyY2hfcmVnaXN0ZXJfY3B1KHByLT5pZCk7Cj4gPiAr Cj4gPiArICAgICAgICAgICAgICAgaWYgKHJldCkKPiA+ICsgICAgICAgICAgICAgICAgICAgICAg IHJldHVybiByZXQ7Cj4gPiArICAgICAgIH0KPiA+ICsKPiA+ICAgICAgICAgLyoKPiA+ICAgICAg ICAgICogIEV4dHJhIFByb2Nlc3NvciBvYmplY3RzIG1heSBiZSBlbnVtZXJhdGVkIG9uIE1QIHN5 c3RlbXMgd2l0aAo+ID4gICAgICAgICAgKiAgbGVzcyB0aGFuIHRoZSBtYXggIyBvZiBDUFVzLiBU aGV5IHNob3VsZCBiZSBpZ25vcmVkIF9pZmYKPiA+IC0tICAKPiAKPiBJIGFtIHN0aWxsIHVuc3Vy ZSB3aHkgdGhlcmUgbmVlZCB0byBiZSB0d28gcGF0aHMgY2FsbGluZwo+IGFyY2hfcmVnaXN0ZXJf Y3B1KCkgaW4gYWNwaV9wcm9jZXNzb3JfZ2V0X2luZm8oKS4KCkkgcmVwbGllZCBmdXJ0aGVyIGRv d24gdGhlIHRocmVhZCwgYnV0IHRoZSBrZXkgcG9pbnQgd2FzIHRvIG1haW50YWluCnRoZSBzdHJv bmcgZGlzdGluY3Rpb24gYmV0d2VlbiAnd2hhdCcgd2FzIGRvbmUgaW4gYSByZWFsIGhvdHBsdWcK cGF0aCB2cyBvbmUgd2hlcmUgb25saW5pbmcgd2FzIGFsbC4gIFdlIGNhbiByZWxheCB0aGF0IGJ1 dCBpdCBnb2VzCmNvbnRyYXJ5IHRvIHRoZSBjYXJlZnVsIGRhbmNlIHRoYXQgd2FzIG5lZWRlZCB0 byBnZXQgYW55IGFncmVlbWVudAp0byB0aGUgQVJNIGFyY2hpdGVjdHVyZSBhc3BlY3RzIG9mIHRo aXMuCgo+IAo+IEp1c3QgYmVsb3cgdGhlIGNvbW1lbnQgcGFydGlhbGx5IHB1bGxlZCBpbnRvIHRo ZSBwYXRjaCBjb250ZXh0IGFib3ZlLAo+IHRoZXJlIGlzIHRoaXMgY29kZToKPiAKPiBpZiAoaW52 YWxpZF9sb2dpY2FsX2NwdWlkKHByLT5pZCkgfHwgIWNwdV9wcmVzZW50KHByLT5pZCkpIHsKPiAg ICAgICAgICBpbnQgcmV0ID0gYWNwaV9wcm9jZXNzb3JfaG90YWRkX2luaXQocHIpOwo+IAo+ICAg ICAgICAgaWYgKHJldCkKPiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiB9Cj4gCj4gRm9y IHRoZSBzYWtlIG9mIHRoZSBhcmd1bWVudCwgZm9sZCBhY3BpX3Byb2Nlc3Nvcl9ob3RhZGRfaW5p dCgpIGludG8KPiBpdCBhbmQgZHJvcCB0aGUgcmVkdW5kYW50IF9TVEEgY2hlY2sgZnJvbSBpdDoK CklmIHdlIGNvbWJpbmUgdGhlc2UsIHRoZSBfU1RBIGNoZWNrIGlzIG5lY2Vzc2FyeSBiZWNhdXNl IHdlIHdpbGwgY2FsbCB0aGlzCnBhdGggZm9yIGRlbGF5ZWQgb25saW5pbmcgb2YgQVJNNjQgQ1BV cyAoaWYgdGhlIGVhcmxpZXIgcmVnaXN0cmF0aW9uIGNvZGUKY2FsbCBvciBhcmNoX3JlZ2lzdGVy X2NwdSgpIHJldHVybmVkIC1FUFJPQkUgZGVmZXIpLiBUaGF0J3MgdGhlIG9ubHkgd2F5CndlIGtu b3cgdGhhdCBhIGdpdmVuIENQVSBpcyBvbmxpbmUgY2FwYWJsZSBidXQgZmlybXdhcmUgaXMgc2F5 aW5nIHdlIGNhbid0CmJyaW5nIGl0IG9ubGluZSB5ZXQgKGl0IG1heSBiZSBiZSB2SFAgbGF0ZXIp LgoKPiAKPiBpZiAoaW52YWxpZF9sb2dpY2FsX2NwdWlkKHByLT5pZCkgfHwgIWNwdV9wcmVzZW50 KHByLT5pZCkpIHsKPiAgICAgICAgIGlmIChpbnZhbGlkX3BoeXNfY3B1aWQocHItPnBoeXNfaWQp KQo+ICAgICAgICAgICAgICAgICByZXR1cm4gLUVOT0RFVjsKPiAKPiAgICAgICAgIGNwdV9tYXBz X3VwZGF0ZV9iZWdpbigpOwo+ICAgICAgICAgY3B1c193cml0ZV9sb2NrKCk7Cj4gCj4gICAgICAg IHJldCA9IGFjcGlfbWFwX2NwdShwci0+aGFuZGxlLCBwci0+cGh5c19pZCwgcHItPmFjcGlfaWQs ICZwci0+aWQpOwoKSSByZWFkIHRoYXQgY2FsbCBhcwoJYWNwaV9tYXBfY3B1X2Zvcl9waHlzaWNh bF9jcHVfaG90cGx1ZygpCmJ1dCB3ZSBjb3VsZCBtYWtlIGl0IGVxdWl2YWxlbnQgb2YuCglhY3Bp X21hcF9jcHVfZm9yX3doYXRldmVyX2NwdV9ob3RwbHVnKCkKKEknbSBub3QgcHJvcG9zaW5nIHRo b3NlIG5hbWVzIHRob3VnaCA7KQoKaW4gd2hpY2ggY2FzZSBpdCBpcyBmaW5lIHRvIGp1c3Qgc3R1 YiBpdCBvdXQgb24gQVJNNjQuCj4gICAgICAgIGlmIChyZXQpIHsKPiAgICAgICAgICAgICAgICAg Y3B1c193cml0ZV91bmxvY2soKTsKPiAgICAgICAgICAgICAgICAgY3B1X21hcHNfdXBkYXRlX2Rv bmUoKTsKPiAgICAgICAgICAgICAgICAgcmV0dXJuIHJldDsKPiAgICAgICAgfQo+ICAgICAgICBy ZXQgPSBhcmNoX3JlZ2lzdGVyX2NwdShwci0+aWQpOwo+ICAgICAgICBpZiAocmV0KSB7Cj4gICAg ICAgICAgICAgICAgIGFjcGlfdW5tYXBfY3B1KHByLT5pZCk7Cj4gCj4gICAgICAgICAgICAgICAg IGNwdXNfd3JpdGVfdW5sb2NrKCk7Cj4gICAgICAgICAgICAgICAgIGNwdV9tYXBzX3VwZGF0ZV9k b25lKCk7Cj4gICAgICAgICAgICAgICAgIHJldHVybiByZXQ7Cj4gICAgICAgIH0KPiAgICAgICBw cl9pbmZvKCJDUFUlZCBoYXMgYmVlbiBob3QtYWRkZWRcbiIsIHByLT5pZCk7Cj4gICAgICAgcHIt PmZsYWdzLm5lZWRfaG90cGx1Z19pbml0ID0gMTsKVGhpcyBvbmUgbmVlZHMgbW9yZSBjYXJlZnVs IGhhbmRsaW5nIGJlY2F1c2Ugd2UgYXJlIGNhbGxpbmcgdGhpcwpmb3Igbm9uIGhvdHBsdWcgY2Fz ZXMgb24gYXJtNjQgaW4gd2hpY2ggY2FzZSB3ZSBlbmQgdXAgc2V0dGluZyB0aGlzCmZvciBpbml0 aWFsbHkgb25saW5lIENQVXMgLSB0aHVzIGlmIHdlIG9mZmxpbmUgYW5kIG9ubGluZSB0aGVtCmFn YWluIHZpYSBzeXNmcyAvc3lzL2J1cy9jcHUvZGV2aWNlL2NwdVgvb25saW5lIGl0IGdvZXMgdGhy b3VnaCB0aGUKaG90cGx1ZyBwYXRoIGFuZCBzaG91bGQgbm90LgoKU28gSSBuZWVkIGEgd2F5IHRv IGRldGVjdCBpZiB3ZSBhcmUgaG90cGx1Z2dpbmcgdGhlIGNwdSBvciBub3QuCklzIHRoZXJlIGEg c3RhbmRhcmQgd2F5IHRvIGRvIHRoaXM/ICBJIGhhdmVuJ3QgZmlndXJlZCBvdXQgaG93CnRvIHVz ZSBmbGFncyBpbiBkcml2ZXJzIHRvIGNvbW11bmljYXRlIHRoaXMgc3RhdGUuCgo+IAo+ICAgICAg IGNwdXNfd3JpdGVfdW5sb2NrKCk7Cj4gICAgICAgY3B1X21hcHNfdXBkYXRlX2RvbmUoKTsKPiB9 Cj4gCj4gc28gSSdtIG5vdCBzdXJlIHdoeSB0aGlzIGNhbm5vdCBiZSBjb21iaW5lZCB3aXRoIHRo ZSBuZXcgY29kZS4KPiAKPiBTYXkgYWNwaV9tYXBfY3B1KSAvIGFjcGlfdW5tYXBfY3B1KCkgYXJl IHR1cm5lZCBpbnRvIGFyY2ggY2FsbHMuCj4gV2hhdCdzIHRoZSBkaWZmZXJlbmNlIHRoZW4/ICBU aGUgbG9ja2luZywgd2hpY2ggc2hvdWxkIGJlIGZpbmUgaWYgSSdtCj4gbm90IG1pc3Rha2VuIGFu ZCBuZWVkX2hvdHBsdWdfaW5pdCB0aGF0IG5lZWRzIHRvIGJlIHNldCBpZiB0aGlzIGNvZGUKPiBy dW5zIGFmdGVyIHRoZSBwcm9jZXNzb3IgZHJpdmVyIGhhcyBsb2FkZWQgQUZBSUNTLgoKVGhhdCdz IHRoZSBiaXQgdGhhdCBJJ20gY3VycmVudGx5IGZpbmRpbmcgYSBjaGFsbGVuZ2UuIElzIHRoZXJl IGEgY2xlYW4Kd2F5IHRvIGRldGVjdCB0aGF0PwoKSm9uYXRoYW4KCgoKCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=