From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (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 BA640A924 for ; Thu, 6 Jul 2023 14:52:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1688655174; x=1720191174; h=date:from:to:cc:subject:message-id:references: mime-version:content-transfer-encoding:in-reply-to; bh=7TWDTrZhqpzH7WQViyzB8gJRad/lUc15Zt3pA8KbCZI=; b=NOsBcAXWHEPGB6y1Dtgg7QVx9K+nPaoNJbMwiEX8DH3l3Wgaj8yJMVui 9QYKrFTM2mDkESEyU2v+Yx7mLO3TS0g9uze/mZiHZaczkcvVYvxPJ1bh/ cLfqOTlygiup5BMQqikimzp5kcaVzagSF+lEr8GIzVb4gxRXpDX0q86h9 ZpdNkv3i8s3y9WmkVw8JTDvOqrfRdlFFFMpdMYjshGCbwUyiliMdf+gdC IaPHeekFlzNVSScHfP3RD/bA+OaedZ1jQ82tjjGgTUvygPrw0qDPai2BE BLuJajr9YvWcQn6rWsE2qJDT4+Qe/ViBpWKt/ruha5N1PCJvy9Eluvg5/ Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10763"; a="394380266" X-IronPort-AV: E=Sophos;i="6.01,185,1684825200"; d="scan'208";a="394380266" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2023 07:52:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10763"; a="669777985" X-IronPort-AV: E=Sophos;i="6.01,185,1684825200"; d="scan'208";a="669777985" Received: from hegang-mobl.ccr.corp.intel.com (HELO localhost) ([10.255.31.139]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2023 07:52:50 -0700 Date: Thu, 6 Jul 2023 22:52:47 +0800 From: Yu Zhang To: David Stevens Cc: Sean Christopherson , Marc Zyngier , Michael Ellerman , Peter Xu , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org Subject: Re: [PATCH v7 2/8] KVM: Introduce __kvm_follow_pfn function Message-ID: <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> References: <20230704075054.3344915-1-stevensd@google.com> <20230704075054.3344915-3-stevensd@google.com> <20230705031002.xrxk42hli6oavtlt@linux.intel.com> <20230705105343.iounmlflfued7lco@linux.intel.com> 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-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: NeoMutt/20171215 On Thu, Jul 06, 2023 at 02:29:24PM +0900, David Stevens wrote: > On Wed, Jul 5, 2023 at 7:53 PM Yu Zhang wrote: > > > > On Wed, Jul 05, 2023 at 06:22:59PM +0900, David Stevens wrote: > > > On Wed, Jul 5, 2023 at 12:10 PM Yu Zhang wrote: > > > > > > > > > @@ -2514,35 +2512,26 @@ static bool hva_to_pfn_fast(unsigned long addr, bool write_fault, > > > > > * The slow path to get the pfn of the specified host virtual address, > > > > > * 1 indicates success, -errno is returned if error is detected. > > > > > */ > > > > > -static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault, > > > > > - bool interruptible, bool *writable, kvm_pfn_t *pfn) > > > > > +static int hva_to_pfn_slow(struct kvm_follow_pfn *foll, kvm_pfn_t *pfn) > > > > > { > > > > > - unsigned int flags = FOLL_HWPOISON; > > > > > + unsigned int flags = FOLL_HWPOISON | FOLL_GET | foll->flags; > > > > > struct page *page; > > > > > int npages; > > > > > > > > > > might_sleep(); > > > > > > > > > > - if (writable) > > > > > - *writable = write_fault; > > > > > - > > > > > - if (write_fault) > > > > > - flags |= FOLL_WRITE; > > > > > - if (async) > > > > > - flags |= FOLL_NOWAIT; > > > > > - if (interruptible) > > > > > - flags |= FOLL_INTERRUPTIBLE; > > > > > - > > > > > - npages = get_user_pages_unlocked(addr, 1, &page, flags); > > > > > + npages = get_user_pages_unlocked(foll->hva, 1, &page, flags); > > > > > if (npages != 1) > > > > > return npages; > > > > > > > > > > + foll->writable = (foll->flags & FOLL_WRITE) && foll->allow_write_mapping; > > > > > + > > > > > /* map read fault as writable if possible */ > > > > > - if (unlikely(!write_fault) && writable) { > > > > > + if (unlikely(!foll->writable) && foll->allow_write_mapping) { > > > > > > > > I guess !foll->writable should be !(foll->flags & FOLL_WRITE) here. > > > > > > The two statements are logically equivalent, although I guess using > > > !(foll->flags & FOLL_WRITE) may be a little clearer, if a little more > > > verbose. > > > > Well, as the comment says, we wanna try to map the read fault as writable > > whenever possible. And __gfn_to_pfn_memslot() will only set the FOLL_WRITE > > for write faults. So I guess using !foll->writable will not allow this. > > Did I miss anything? > > We just set the foll->writable out parameter to be equal to > ((foll->flags & FOLL_WRITE) && foll->allow_write_mapping). Taking a = > foll->flags & FOLL_WRITE and b = foll->allow_write_mapping, we have > !(a && b) && b -> (!a || !b) && b -> (!a && b) || (!b && b) -> !a && > b. Ouch, my bad again... I typed "!foll->writable", but missed the "!" in my head while calculating... Thanks! :) B.R. Yu 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 lists.ozlabs.org (lists.ozlabs.org [112.213.38.117]) (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 755E4EB64D9 for ; Thu, 6 Jul 2023 14:53:56 +0000 (UTC) Authentication-Results: lists.ozlabs.org; dkim=fail reason="signature verification failed" (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=fz5KTzif; dkim-atps=neutral Received: from boromir.ozlabs.org (localhost [IPv6:::1]) by lists.ozlabs.org (Postfix) with ESMTP id 4Qxfg64p0Lz3c3g for ; Fri, 7 Jul 2023 00:53:54 +1000 (AEST) Authentication-Results: lists.ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=intel.com header.i=@intel.com header.a=rsa-sha256 header.s=Intel header.b=fz5KTzif; dkim-atps=neutral Authentication-Results: lists.ozlabs.org; spf=none (no SPF record) smtp.mailfrom=linux.intel.com (client-ip=192.55.52.88; helo=mga01.intel.com; envelope-from=yu.c.zhang@linux.intel.com; receiver=lists.ozlabs.org) Received: from mga01.intel.com (mga01.intel.com [192.55.52.88]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by lists.ozlabs.org (Postfix) with ESMTPS id 4Qxff45rLjz30hM for ; Fri, 7 Jul 2023 00:52:58 +1000 (AEST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1688655181; x=1720191181; h=date:from:to:cc:subject:message-id:references: mime-version:content-transfer-encoding:in-reply-to; bh=7TWDTrZhqpzH7WQViyzB8gJRad/lUc15Zt3pA8KbCZI=; b=fz5KTzifnXLrcUUo7MxVYDK+dUwtceTO86PQaICrrfAtIjS7OGovsF5G AIjDFToxr/lqWuQmsxAvADBJJxrPtlfSP0Om5tAIGSIh6cK8H/tg8ffWz SfJoURpgVBu5eZ7vF7af0z6S+d8AqnhhFxzXWR1RB/iQip1dQO7FByoN5 eZfVW/Hm4zjtCgirg+qopMBlf7j1CODuTTrrpdSFgDCFifH6dWWTvkcwK qUp33rljyPduwaHMNQo/qqiY1bgqz+hHVyRC2mHhH6GQ0lron4qo8Tw2C 63dOc2zMDDDy6Ro7+ffXA+bi05ZsDjwAliFGL8eM3S3jsE63sS4Aac2xV Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10763"; a="394380263" X-IronPort-AV: E=Sophos;i="6.01,185,1684825200"; d="scan'208";a="394380263" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2023 07:52:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10763"; a="669777985" X-IronPort-AV: E=Sophos;i="6.01,185,1684825200"; d="scan'208";a="669777985" Received: from hegang-mobl.ccr.corp.intel.com (HELO localhost) ([10.255.31.139]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2023 07:52:50 -0700 Date: Thu, 6 Jul 2023 22:52:47 +0800 From: Yu Zhang To: David Stevens Subject: Re: [PATCH v7 2/8] KVM: Introduce __kvm_follow_pfn function Message-ID: <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> References: <20230704075054.3344915-1-stevensd@google.com> <20230704075054.3344915-3-stevensd@google.com> <20230705031002.xrxk42hli6oavtlt@linux.intel.com> <20230705105343.iounmlflfued7lco@linux.intel.com> MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Disposition: inline Content-Transfer-Encoding: 8bit In-Reply-To: User-Agent: NeoMutt/20171215 X-BeenThere: linuxppc-dev@lists.ozlabs.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Linux on PowerPC Developers Mail List List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Cc: Marc Zyngier , kvm@vger.kernel.org, Sean Christopherson , linux-kernel@vger.kernel.org, Peter Xu , kvmarm@lists.linux.dev, linuxppc-dev@lists.ozlabs.org, linux-arm-kernel@lists.infradead.org Errors-To: linuxppc-dev-bounces+linuxppc-dev=archiver.kernel.org@lists.ozlabs.org Sender: "Linuxppc-dev" On Thu, Jul 06, 2023 at 02:29:24PM +0900, David Stevens wrote: > On Wed, Jul 5, 2023 at 7:53 PM Yu Zhang wrote: > > > > On Wed, Jul 05, 2023 at 06:22:59PM +0900, David Stevens wrote: > > > On Wed, Jul 5, 2023 at 12:10 PM Yu Zhang wrote: > > > > > > > > > @@ -2514,35 +2512,26 @@ static bool hva_to_pfn_fast(unsigned long addr, bool write_fault, > > > > > * The slow path to get the pfn of the specified host virtual address, > > > > > * 1 indicates success, -errno is returned if error is detected. > > > > > */ > > > > > -static int hva_to_pfn_slow(unsigned long addr, bool *async, bool write_fault, > > > > > - bool interruptible, bool *writable, kvm_pfn_t *pfn) > > > > > +static int hva_to_pfn_slow(struct kvm_follow_pfn *foll, kvm_pfn_t *pfn) > > > > > { > > > > > - unsigned int flags = FOLL_HWPOISON; > > > > > + unsigned int flags = FOLL_HWPOISON | FOLL_GET | foll->flags; > > > > > struct page *page; > > > > > int npages; > > > > > > > > > > might_sleep(); > > > > > > > > > > - if (writable) > > > > > - *writable = write_fault; > > > > > - > > > > > - if (write_fault) > > > > > - flags |= FOLL_WRITE; > > > > > - if (async) > > > > > - flags |= FOLL_NOWAIT; > > > > > - if (interruptible) > > > > > - flags |= FOLL_INTERRUPTIBLE; > > > > > - > > > > > - npages = get_user_pages_unlocked(addr, 1, &page, flags); > > > > > + npages = get_user_pages_unlocked(foll->hva, 1, &page, flags); > > > > > if (npages != 1) > > > > > return npages; > > > > > > > > > > + foll->writable = (foll->flags & FOLL_WRITE) && foll->allow_write_mapping; > > > > > + > > > > > /* map read fault as writable if possible */ > > > > > - if (unlikely(!write_fault) && writable) { > > > > > + if (unlikely(!foll->writable) && foll->allow_write_mapping) { > > > > > > > > I guess !foll->writable should be !(foll->flags & FOLL_WRITE) here. > > > > > > The two statements are logically equivalent, although I guess using > > > !(foll->flags & FOLL_WRITE) may be a little clearer, if a little more > > > verbose. > > > > Well, as the comment says, we wanna try to map the read fault as writable > > whenever possible. And __gfn_to_pfn_memslot() will only set the FOLL_WRITE > > for write faults. So I guess using !foll->writable will not allow this. > > Did I miss anything? > > We just set the foll->writable out parameter to be equal to > ((foll->flags & FOLL_WRITE) && foll->allow_write_mapping). Taking a = > foll->flags & FOLL_WRITE and b = foll->allow_write_mapping, we have > !(a && b) && b -> (!a || !b) && b -> (!a && b) || (!b && b) -> !a && > b. Ouch, my bad again... I typed "!foll->writable", but missed the "!" in my head while calculating... Thanks! :) B.R. Yu 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 CAB02EB64DD for ; Thu, 6 Jul 2023 14:53:23 +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: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=68svi4PmXKXPQcR1NHfW7nP/1pXiGOhjI1A1e2waFwA=; b=afH2XxDJxiy4I+ /kX6qKj9p4eA+bIRVl++9+5F5tPwHdThJZkzMOz+1ZQKALu+YxPbxVnGwBRqsJeK9bB5GJKJE3YmL 8TkNS26RtQXvaKNuXwPa+4k8gZRtnHn4vx5BH6tnt5XZyjTg7u/2JTyYyay1HJ8U61YJG9ynTC9VA WlQA6EutguYBLHRoap9zYryoxZN+0GWQXOeJ+j1GyvdXCCocI6wCq9xQkCrePUBcE8b3ewGq3b0q9 KD9UcQdNEWJkVoB1CZVbBsrr1mzse/ZHPpV5/eoyr5PpyzrpnGKVSh+zT243ZD45+z691s5yZzD0h /8xLVu1e/yeAgDmvIGnw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qHQLs-001vS9-0u; Thu, 06 Jul 2023 14:53:00 +0000 Received: from mga01.intel.com ([192.55.52.88]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qHQLp-001vOI-01 for linux-arm-kernel@lists.infradead.org; Thu, 06 Jul 2023 14:52:58 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/simple; d=intel.com; i=@intel.com; q=dns/txt; s=Intel; t=1688655176; x=1720191176; h=date:from:to:cc:subject:message-id:references: mime-version:content-transfer-encoding:in-reply-to; bh=7TWDTrZhqpzH7WQViyzB8gJRad/lUc15Zt3pA8KbCZI=; b=IzVnc1H9yDMbyYgTS8vGhJCpP16j9EN4n+sFcuANH3pQQT3Iak6cLEIa 64Av0zTDGOrJZy5uflUL7DQSoHwPzRwbIiCumQftLkgBcOSPyfxYtjvgt KtlMJBu0QrDL1GDG1tbhq1OHyGvK2IjBE4vKsY1vvlsDFE8Zjn+IKM8ZU nVSfmC3zUNYnlVWRwWOj9PeIzLsa8ymPIGZbfNFURN3TNyJnfi07oa11I MrEgYfHSPRNE6p3yKQzdqEO2rdpCzaeW8ovjkvhHwDrjDEJWB0nq3/MkG UJ5XF1b4FVNu5GlsG5ho3tW8eL7IJ8eH5AfDpmwJWDwxSfNhAmrcbPxtH Q==; X-IronPort-AV: E=McAfee;i="6600,9927,10763"; a="394380261" X-IronPort-AV: E=Sophos;i="6.01,185,1684825200"; d="scan'208";a="394380261" Received: from orsmga003.jf.intel.com ([10.7.209.27]) by fmsmga101.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2023 07:52:53 -0700 X-ExtLoop1: 1 X-IronPort-AV: E=McAfee;i="6600,9927,10763"; a="669777985" X-IronPort-AV: E=Sophos;i="6.01,185,1684825200"; d="scan'208";a="669777985" Received: from hegang-mobl.ccr.corp.intel.com (HELO localhost) ([10.255.31.139]) by orsmga003-auth.jf.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 06 Jul 2023 07:52:50 -0700 Date: Thu, 6 Jul 2023 22:52:47 +0800 From: Yu Zhang To: David Stevens Cc: Sean Christopherson , Marc Zyngier , Michael Ellerman , Peter Xu , linux-arm-kernel@lists.infradead.org, kvmarm@lists.linux.dev, linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org, kvm@vger.kernel.org Subject: Re: [PATCH v7 2/8] KVM: Introduce __kvm_follow_pfn function Message-ID: <20230706145247.ddjqsvmfdeimzva6@linux.intel.com> References: <20230704075054.3344915-1-stevensd@google.com> <20230704075054.3344915-3-stevensd@google.com> <20230705031002.xrxk42hli6oavtlt@linux.intel.com> <20230705105343.iounmlflfued7lco@linux.intel.com> MIME-Version: 1.0 Content-Disposition: inline In-Reply-To: User-Agent: NeoMutt/20171215 X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230706_075257_058669_7A06CC29 X-CRM114-Status: GOOD ( 24.62 ) 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 T24gVGh1LCBKdWwgMDYsIDIwMjMgYXQgMDI6Mjk6MjRQTSArMDkwMCwgRGF2aWQgU3RldmVucyB3 cm90ZToKPiBPbiBXZWQsIEp1bCA1LCAyMDIzIGF0IDc6NTPigK9QTSBZdSBaaGFuZyA8eXUuYy56 aGFuZ0BsaW51eC5pbnRlbC5jb20+IHdyb3RlOgo+ID4KPiA+IE9uIFdlZCwgSnVsIDA1LCAyMDIz IGF0IDA2OjIyOjU5UE0gKzA5MDAsIERhdmlkIFN0ZXZlbnMgd3JvdGU6Cj4gPiA+IE9uIFdlZCwg SnVsIDUsIDIwMjMgYXQgMTI6MTDigK9QTSBZdSBaaGFuZyA8eXUuYy56aGFuZ0BsaW51eC5pbnRl bC5jb20+IHdyb3RlOgo+ID4gPiA+Cj4gPiA+ID4gPiBAQCAtMjUxNCwzNSArMjUxMiwyNiBAQCBz dGF0aWMgYm9vbCBodmFfdG9fcGZuX2Zhc3QodW5zaWduZWQgbG9uZyBhZGRyLCBib29sIHdyaXRl X2ZhdWx0LAo+ID4gPiA+ID4gICAqIFRoZSBzbG93IHBhdGggdG8gZ2V0IHRoZSBwZm4gb2YgdGhl IHNwZWNpZmllZCBob3N0IHZpcnR1YWwgYWRkcmVzcywKPiA+ID4gPiA+ICAgKiAxIGluZGljYXRl cyBzdWNjZXNzLCAtZXJybm8gaXMgcmV0dXJuZWQgaWYgZXJyb3IgaXMgZGV0ZWN0ZWQuCj4gPiA+ ID4gPiAgICovCj4gPiA+ID4gPiAtc3RhdGljIGludCBodmFfdG9fcGZuX3Nsb3codW5zaWduZWQg bG9uZyBhZGRyLCBib29sICphc3luYywgYm9vbCB3cml0ZV9mYXVsdCwKPiA+ID4gPiA+IC0gICAg ICAgICAgICAgICAgICAgICAgICBib29sIGludGVycnVwdGlibGUsIGJvb2wgKndyaXRhYmxlLCBr dm1fcGZuX3QgKnBmbikKPiA+ID4gPiA+ICtzdGF0aWMgaW50IGh2YV90b19wZm5fc2xvdyhzdHJ1 Y3Qga3ZtX2ZvbGxvd19wZm4gKmZvbGwsIGt2bV9wZm5fdCAqcGZuKQo+ID4gPiA+ID4gIHsKPiA+ ID4gPiA+IC0gICAgIHVuc2lnbmVkIGludCBmbGFncyA9IEZPTExfSFdQT0lTT047Cj4gPiA+ID4g PiArICAgICB1bnNpZ25lZCBpbnQgZmxhZ3MgPSBGT0xMX0hXUE9JU09OIHwgRk9MTF9HRVQgfCBm b2xsLT5mbGFnczsKPiA+ID4gPiA+ICAgICAgIHN0cnVjdCBwYWdlICpwYWdlOwo+ID4gPiA+ID4g ICAgICAgaW50IG5wYWdlczsKPiA+ID4gPiA+Cj4gPiA+ID4gPiAgICAgICBtaWdodF9zbGVlcCgp Owo+ID4gPiA+ID4KPiA+ID4gPiA+IC0gICAgIGlmICh3cml0YWJsZSkKPiA+ID4gPiA+IC0gICAg ICAgICAgICAgKndyaXRhYmxlID0gd3JpdGVfZmF1bHQ7Cj4gPiA+ID4gPiAtCj4gPiA+ID4gPiAt ICAgICBpZiAod3JpdGVfZmF1bHQpCj4gPiA+ID4gPiAtICAgICAgICAgICAgIGZsYWdzIHw9IEZP TExfV1JJVEU7Cj4gPiA+ID4gPiAtICAgICBpZiAoYXN5bmMpCj4gPiA+ID4gPiAtICAgICAgICAg ICAgIGZsYWdzIHw9IEZPTExfTk9XQUlUOwo+ID4gPiA+ID4gLSAgICAgaWYgKGludGVycnVwdGli bGUpCj4gPiA+ID4gPiAtICAgICAgICAgICAgIGZsYWdzIHw9IEZPTExfSU5URVJSVVBUSUJMRTsK PiA+ID4gPiA+IC0KPiA+ID4gPiA+IC0gICAgIG5wYWdlcyA9IGdldF91c2VyX3BhZ2VzX3VubG9j a2VkKGFkZHIsIDEsICZwYWdlLCBmbGFncyk7Cj4gPiA+ID4gPiArICAgICBucGFnZXMgPSBnZXRf dXNlcl9wYWdlc191bmxvY2tlZChmb2xsLT5odmEsIDEsICZwYWdlLCBmbGFncyk7Cj4gPiA+ID4g PiAgICAgICBpZiAobnBhZ2VzICE9IDEpCj4gPiA+ID4gPiAgICAgICAgICAgICAgIHJldHVybiBu cGFnZXM7Cj4gPiA+ID4gPgo+ID4gPiA+ID4gKyAgICAgZm9sbC0+d3JpdGFibGUgPSAoZm9sbC0+ ZmxhZ3MgJiBGT0xMX1dSSVRFKSAmJiBmb2xsLT5hbGxvd193cml0ZV9tYXBwaW5nOwo+ID4gPiA+ ID4gKwo+ID4gPiA+ID4gICAgICAgLyogbWFwIHJlYWQgZmF1bHQgYXMgd3JpdGFibGUgaWYgcG9z c2libGUgKi8KPiA+ID4gPiA+IC0gICAgIGlmICh1bmxpa2VseSghd3JpdGVfZmF1bHQpICYmIHdy aXRhYmxlKSB7Cj4gPiA+ID4gPiArICAgICBpZiAodW5saWtlbHkoIWZvbGwtPndyaXRhYmxlKSAm JiBmb2xsLT5hbGxvd193cml0ZV9tYXBwaW5nKSB7Cj4gPiA+ID4KPiA+ID4gPiBJIGd1ZXNzICFm b2xsLT53cml0YWJsZSBzaG91bGQgYmUgIShmb2xsLT5mbGFncyAmIEZPTExfV1JJVEUpIGhlcmUu Cj4gPiA+Cj4gPiA+IFRoZSB0d28gc3RhdGVtZW50cyBhcmUgbG9naWNhbGx5IGVxdWl2YWxlbnQs IGFsdGhvdWdoIEkgZ3Vlc3MgdXNpbmcKPiA+ID4gIShmb2xsLT5mbGFncyAmIEZPTExfV1JJVEUp IG1heSBiZSBhIGxpdHRsZSBjbGVhcmVyLCBpZiBhIGxpdHRsZSBtb3JlCj4gPiA+IHZlcmJvc2Uu Cj4gPgo+ID4gV2VsbCwgYXMgdGhlIGNvbW1lbnQgc2F5cywgd2Ugd2FubmEgdHJ5IHRvIG1hcCB0 aGUgcmVhZCBmYXVsdCBhcyB3cml0YWJsZQo+ID4gd2hlbmV2ZXIgcG9zc2libGUuIEFuZCBfX2dm bl90b19wZm5fbWVtc2xvdCgpIHdpbGwgb25seSBzZXQgdGhlIEZPTExfV1JJVEUKPiA+IGZvciB3 cml0ZSBmYXVsdHMuIFNvIEkgZ3Vlc3MgdXNpbmcgIWZvbGwtPndyaXRhYmxlIHdpbGwgbm90IGFs bG93IHRoaXMuCj4gPiBEaWQgSSBtaXNzIGFueXRoaW5nPwo+IAo+IFdlIGp1c3Qgc2V0IHRoZSBm b2xsLT53cml0YWJsZSBvdXQgcGFyYW1ldGVyIHRvIGJlIGVxdWFsIHRvCj4gKChmb2xsLT5mbGFn cyAmIEZPTExfV1JJVEUpICYmIGZvbGwtPmFsbG93X3dyaXRlX21hcHBpbmcpLiBUYWtpbmcgYSA9 Cj4gZm9sbC0+ZmxhZ3MgJiBGT0xMX1dSSVRFIGFuZCBiID0gZm9sbC0+YWxsb3dfd3JpdGVfbWFw cGluZywgd2UgaGF2ZQo+ICEoYSAmJiBiKSAmJiBiIC0+ICghYSB8fCAhYikgJiYgYiAtPiAoIWEg JiYgYikgfHwgKCFiICYmIGIpIC0+ICFhICYmCj4gYi4KCk91Y2gsIG15IGJhZCBhZ2Fpbi4uLiBJ IHR5cGVkICIhZm9sbC0+d3JpdGFibGUiLCBidXQgbWlzc2VkIHRoZSAiISIgaW4KbXkgaGVhZCB3 aGlsZSBjYWxjdWxhdGluZy4uLiBUaGFua3MhIDopCgpCLlIuCll1CgpfX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwpsaW51eC1hcm0ta2VybmVsIG1haWxpbmcg bGlzdApsaW51eC1hcm0ta2VybmVsQGxpc3RzLmluZnJhZGVhZC5vcmcKaHR0cDovL2xpc3RzLmlu ZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1hcm0ta2VybmVsCg==