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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id C31BAC433F5 for ; Fri, 4 Mar 2022 05:06:56 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 323398D0002; Fri, 4 Mar 2022 00:06:56 -0500 (EST) Received: by kanga.kvack.org (Postfix, from userid 40) id 2D2988D0001; Fri, 4 Mar 2022 00:06:56 -0500 (EST) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 19A0F8D0002; Fri, 4 Mar 2022 00:06:56 -0500 (EST) X-Delivered-To: linux-mm@kvack.org Received: from forelay.hostedemail.com (smtprelay0160.hostedemail.com [216.40.44.160]) by kanga.kvack.org (Postfix) with ESMTP id 0739E8D0001 for ; Fri, 4 Mar 2022 00:06:56 -0500 (EST) Received: from smtpin23.hostedemail.com (10.5.19.251.rfc1918.com [10.5.19.251]) by forelay02.hostedemail.com (Postfix) with ESMTP id B6B4E84773 for ; Fri, 4 Mar 2022 05:06:55 +0000 (UTC) X-FDA: 79205519190.23.E870FBA Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by imf26.hostedemail.com (Postfix) with ESMTP id EE94C140006 for ; Fri, 4 Mar 2022 05:06:54 +0000 (UTC) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1646370414; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: in-reply-to:in-reply-to:references:references; bh=z0zO1JVVvgUIKejWXgnTnnsPHcpKgQ4MDMK2r29qES4=; b=IGouFlgzoiOCDbwPILChoAutM2Cw8/0x8oIm1j3JVcgIZgKWaCyVav3iiJFt0oyijjvWF3 TGm8NGifD0JblnioYYy4PfU/RqlmIl9CwYGhxlavBn5aygKfH5TxPp3gLAMprM19dHuq4r +Koy/Bg2uld7rmZ4+vx++XwTUI3kDBw= Received: from mail-lf1-f69.google.com (mail-lf1-f69.google.com [209.85.167.69]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-93-V7m3MiNGOUiR53bexSjJ2Q-1; Fri, 04 Mar 2022 00:06:52 -0500 X-MC-Unique: V7m3MiNGOUiR53bexSjJ2Q-1 Received: by mail-lf1-f69.google.com with SMTP id m13-20020a19520d000000b00443423ff116so2240673lfb.11 for ; Thu, 03 Mar 2022 21:06:52 -0800 (PST) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:mime-version:references:in-reply-to:from:date :message-id:subject:to:cc; bh=z0zO1JVVvgUIKejWXgnTnnsPHcpKgQ4MDMK2r29qES4=; b=KBMmYCWsT16hW4PlnIuHVwLprHoLsbzWA0yWsQKVL745nKPe+fA0vDXnshNYtk3hpS 4n1+tVH/6k//okUQggX94K8NqsSOcvUy+msjFh+jwYZ2AnGVArSWHHJDXryjUOzXkb2W smiB7eU9kXOAOqaacgdgKCSnhdjghSQG1bjEUE39ZYhUklyn2+0a0hbfef5T9YXOKlgC e0AQ2bTgT7FBqdl4MKqeDU9F44ku/BXGsttreLhJtPzN/3mKKf50UoaEi9HY8WZZ0L/G pQcxN0966OEGnMOUP16tNMuOchmoR7eskSvIVdDO+UMOa9eZPXscEKx1FxGC53c+f35V vFdA== X-Gm-Message-State: AOAM531SsdOF4Q83Chkd51L71jAb43b5UszhYWXxa1Rj3VJqABRt3Fsh 6H08VhNZhhP46ntMIQorQW+6bxWVfRhYXwypy7s0maV4rEmpxuSmOum6i9nhteJ0Cl845GyYPHu 6BsarAlFO73VJW3T6HTdZr1bBqTM= X-Received: by 2002:ac2:4e11:0:b0:443:b076:460d with SMTP id e17-20020ac24e11000000b00443b076460dmr23133401lfr.209.1646370411031; Thu, 03 Mar 2022 21:06:51 -0800 (PST) X-Google-Smtp-Source: ABdhPJxo92/UTxZguOkGu188D5iAfeKg5ed/O/jWQL9o6KiDC91OWKwiWVtFDHZylaDkqDu0Phwa/aItf79UTQNemIs= X-Received: by 2002:ac2:4e11:0:b0:443:b076:460d with SMTP id e17-20020ac24e11000000b00443b076460dmr23133384lfr.209.1646370410749; Thu, 03 Mar 2022 21:06:50 -0800 (PST) MIME-Version: 1.0 References: <20220303222014.517033-1-shy828301@gmail.com> In-Reply-To: <20220303222014.517033-1-shy828301@gmail.com> From: David Hildenbrand Date: Fri, 4 Mar 2022 06:06:40 +0100 Message-ID: Subject: Re: [PATCH] mm: thp: don't have to lock page anymore when splitting PMD To: Yang Shi Cc: aarcange@redhat.com, akpm@linux-foundation.org, hughd@google.com, kirill.shutemov@linux.intel.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Type: multipart/alternative; boundary="000000000000807ae405d95d7be4" X-Rspamd-Server: rspam09 X-Rspamd-Queue-Id: EE94C140006 X-Stat-Signature: bjemwxww5ztp5iz4rwseqnhpnie6ab3q Authentication-Results: imf26.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=IGouFlgz; spf=none (imf26.hostedemail.com: domain of dhildenb@redhat.com has no SPF policy when checking 170.10.129.124) smtp.mailfrom=dhildenb@redhat.com; dmarc=pass (policy=none) header.from=redhat.com X-Rspam-User: X-HE-Tag: 1646370414-881040 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: --000000000000807ae405d95d7be4 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Hi, This probably bounces on the list due to html junk from the gmail app. What happened to https://lore.kernel.org/linux-mm/20220131162940.210846-10-david@redhat.com/ Included in the very series mentioned below? Was this silently dropped due to folio conversion collisions? :/ Yang Shi schrieb am Do. 3. M=C3=A4rz 2022 um 23:20: > The commit c444eb564fb1 ("mm: thp: make the THP mapcount atomic against > __split_huge_pmd_locked()") locked the page for PMD split to make > mapcount stable for reuse_swap_page(), then commit 1c2f67308af4 ("mm: > thp: fix MADV_REMOVE deadlock on shmem THP") reduce the scope to > anonymous page only. > > However COW has not used mapcount to determine if the page is shared or > not anymore due to the COW fixes [1] from David Hildenbrand and the > reuse_swap_page() was removed as well. So PMD split doesn't have to > lock the page anymore. This patch basically reverted the above two > commits. > > [1] > https://lore.kernel.org/linux-mm/20220131162940.210846-1-david@redhat.com= / > > Cc: David Hildenbrand > Cc: Andrea Arcangeli > Cc: Hugh Dickins > Cc: "Kirill A . Shutemov" > Signed-off-by: Yang Shi > --- > mm/huge_memory.c | 44 +++++--------------------------------------- > 1 file changed, 5 insertions(+), 39 deletions(-) > > diff --git a/mm/huge_memory.c b/mm/huge_memory.c > index b49e1a11df2e..daaa698bd273 100644 > --- a/mm/huge_memory.c > +++ b/mm/huge_memory.c > @@ -2134,8 +2134,6 @@ void __split_huge_pmd(struct vm_area_struct *vma, > pmd_t *pmd, > { > spinlock_t *ptl; > struct mmu_notifier_range range; > - bool do_unlock_folio =3D false; > - pmd_t _pmd; > > mmu_notifier_range_init(&range, MMU_NOTIFY_CLEAR, 0, vma, > vma->vm_mm, > address & HPAGE_PMD_MASK, > @@ -2148,48 +2146,16 @@ void __split_huge_pmd(struct vm_area_struct *vma, > pmd_t *pmd, > * pmd against. Otherwise we can end up replacing wrong folio. > */ > VM_BUG_ON(freeze && !folio); > - if (folio) { > - VM_WARN_ON_ONCE(!folio_test_locked(folio)); > - if (folio !=3D page_folio(pmd_page(*pmd))) > - goto out; > - } > + if (folio && folio !=3D page_folio(pmd_page(*pmd))) > + goto out; > > -repeat: > - if (pmd_trans_huge(*pmd)) { > - if (!folio) { > - folio =3D page_folio(pmd_page(*pmd)); > - /* > - * An anonymous page must be locked, to ensure > that a > - * concurrent reuse_swap_page() sees stable > mapcount; > - * but reuse_swap_page() is not used on shmem or > file, > - * and page lock must not be taken when > zap_pmd_range() > - * calls __split_huge_pmd() while i_mmap_lock is > held. > - */ > - if (folio_test_anon(folio)) { > - if (unlikely(!folio_trylock(folio))) { > - folio_get(folio); > - _pmd =3D *pmd; > - spin_unlock(ptl); > - folio_lock(folio); > - spin_lock(ptl); > - if (unlikely(!pmd_same(*pmd, > _pmd))) { > - folio_unlock(folio); > - folio_put(folio); > - folio =3D NULL; > - goto repeat; > - } > - folio_put(folio); > - } > - do_unlock_folio =3D true; > - } > - } > - } else if (!(pmd_devmap(*pmd) || is_pmd_migration_entry(*pmd))) > + if (!(pmd_devmap(*pmd) || is_pmd_migration_entry(*pmd))) > goto out; > + > __split_huge_pmd_locked(vma, pmd, range.start, freeze); > out: > spin_unlock(ptl); > - if (do_unlock_folio) > - folio_unlock(folio); > + > /* > * No need to double call mmu_notifier->invalidate_range() > callback. > * They are 3 cases to consider inside __split_huge_pmd_locked(): > -- > 2.26.3 > > --000000000000807ae405d95d7be4 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9ImF1dG8iPkhpLDwvZGl2PjxkaXYgZGlyPSJhdXRvIj48YnI+PC9kaXY+PGRpdiBk aXI9ImF1dG8iPlRoaXMgcHJvYmFibHkgYm91bmNlcyBvbiB0aGUgbGlzdCBkdWUgdG8gaHRtbCBq dW5rIGZyb20gdGhlIGdtYWlsIGFwcC48L2Rpdj48ZGl2IGRpcj0iYXV0byI+PGJyPjwvZGl2Pjxk aXYgZGlyPSJhdXRvIj5XaGF0IGhhcHBlbmVkIHRvPC9kaXY+PGRpdiBkaXI9ImF1dG8iPjxicj48 L2Rpdj48ZGl2IGRpcj0iYXV0byI+PGRpdj48YSBocmVmPSJodHRwczovL2xvcmUua2VybmVsLm9y Zy9saW51eC1tbS8yMDIyMDEzMTE2Mjk0MC4yMTA4NDYtMTAtZGF2aWRAcmVkaGF0LmNvbS8iPmh0 dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xpbnV4LW1tLzIwMjIwMTMxMTYyOTQwLjIxMDg0Ni0xMC1k YXZpZEByZWRoYXQuY29tLzwvYT48L2Rpdj48YnI+PC9kaXY+PGRpdiBkaXI9ImF1dG8iPkluY2x1 ZGVkIGluIHRoZSB2ZXJ5IHNlcmllcyBtZW50aW9uZWQgYmVsb3c/PC9kaXY+PGRpdiBkaXI9ImF1 dG8iPjxicj48L2Rpdj48ZGl2IGRpcj0iYXV0byI+V2FzIHRoaXMgc2lsZW50bHkgZHJvcHBlZCBk dWUgdG8gZm9saW8gY29udmVyc2lvbiBjb2xsaXNpb25zPyA6LzwvZGl2PjxkaXY+PGJyPjxkaXYg Y2xhc3M9ImdtYWlsX3F1b3RlIj48ZGl2IGRpcj0ibHRyIiBjbGFzcz0iZ21haWxfYXR0ciI+WWFu ZyBTaGkgJmx0OzxhIGhyZWY9Im1haWx0bzpzaHk4MjgzMDFAZ21haWwuY29tIj5zaHk4MjgzMDFA Z21haWwuY29tPC9hPiZndDsgc2NocmllYiBhbSBEby4gMy4gTcOkcnogMjAyMiB1bSAyMzoyMDo8 YnI+PC9kaXY+PGJsb2NrcXVvdGUgY2xhc3M9ImdtYWlsX3F1b3RlIiBzdHlsZT0ibWFyZ2luOjBw eCAwcHggMHB4IDAuOGV4O2JvcmRlci1sZWZ0LXdpZHRoOjFweDtib3JkZXItbGVmdC1zdHlsZTpz b2xpZDtwYWRkaW5nLWxlZnQ6MWV4O2JvcmRlci1sZWZ0LWNvbG9yOnJnYigyMDQsMjA0LDIwNCki PlRoZSBjb21taXQgYzQ0NGViNTY0ZmIxICgmcXVvdDttbTogdGhwOiBtYWtlIHRoZSBUSFAgbWFw Y291bnQgYXRvbWljIGFnYWluc3Q8YnI+DQpfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCgpJnF1b3Q7 KSBsb2NrZWQgdGhlIHBhZ2UgZm9yIFBNRCBzcGxpdCB0byBtYWtlPGJyPg0KbWFwY291bnQgc3Rh YmxlIGZvciByZXVzZV9zd2FwX3BhZ2UoKSwgdGhlbiBjb21taXQgMWMyZjY3MzA4YWY0ICgmcXVv dDttbTo8YnI+DQp0aHA6IGZpeCBNQURWX1JFTU9WRSBkZWFkbG9jayBvbiBzaG1lbSBUSFAmcXVv dDspIHJlZHVjZSB0aGUgc2NvcGUgdG88YnI+DQphbm9ueW1vdXMgcGFnZSBvbmx5Ljxicj4NCjxi cj4NCkhvd2V2ZXIgQ09XIGhhcyBub3QgdXNlZCBtYXBjb3VudCB0byBkZXRlcm1pbmUgaWYgdGhl IHBhZ2UgaXMgc2hhcmVkIG9yPGJyPg0Kbm90IGFueW1vcmUgZHVlIHRvIHRoZSBDT1cgZml4ZXMg WzFdIGZyb20gRGF2aWQgSGlsZGVuYnJhbmQgYW5kIHRoZTxicj4NCnJldXNlX3N3YXBfcGFnZSgp IHdhcyByZW1vdmVkIGFzIHdlbGwuwqAgU28gUE1EIHNwbGl0IGRvZXNuJiMzOTt0IGhhdmUgdG88 YnI+DQpsb2NrIHRoZSBwYWdlIGFueW1vcmUuwqAgVGhpcyBwYXRjaCBiYXNpY2FsbHkgcmV2ZXJ0 ZWQgdGhlIGFib3ZlIHR3bzxicj4NCmNvbW1pdHMuPGJyPg0KPGJyPg0KWzFdIDxhIGhyZWY9Imh0 dHBzOi8vbG9yZS5rZXJuZWwub3JnL2xpbnV4LW1tLzIwMjIwMTMxMTYyOTQwLjIxMDg0Ni0xLWRh dmlkQHJlZGhhdC5jb20vIiByZWw9Im5vcmVmZXJyZXIiIHRhcmdldD0iX2JsYW5rIj5odHRwczov L2xvcmUua2VybmVsLm9yZy9saW51eC1tbS8yMDIyMDEzMTE2Mjk0MC4yMTA4NDYtMS1kYXZpZEBy ZWRoYXQuY29tLzwvYT48YnI+DQo8YnI+DQpDYzogRGF2aWQgSGlsZGVuYnJhbmQgJmx0OzxhIGhy ZWY9Im1haWx0bzpkYXZpZEByZWRoYXQuY29tIiB0YXJnZXQ9Il9ibGFuayI+ZGF2aWRAcmVkaGF0 LmNvbTwvYT4mZ3Q7PGJyPg0KQ2M6IEFuZHJlYSBBcmNhbmdlbGkgJmx0OzxhIGhyZWY9Im1haWx0 bzphYXJjYW5nZUByZWRoYXQuY29tIiB0YXJnZXQ9Il9ibGFuayI+YWFyY2FuZ2VAcmVkaGF0LmNv bTwvYT4mZ3Q7PGJyPg0KQ2M6IEh1Z2ggRGlja2lucyAmbHQ7PGEgaHJlZj0ibWFpbHRvOmh1Z2hk QGdvb2dsZS5jb20iIHRhcmdldD0iX2JsYW5rIj5odWdoZEBnb29nbGUuY29tPC9hPiZndDs8YnI+ DQpDYzogJnF1b3Q7S2lyaWxsIEEgLiBTaHV0ZW1vdiZxdW90OyAmbHQ7PGEgaHJlZj0ibWFpbHRv OmtpcmlsbC5zaHV0ZW1vdkBsaW51eC5pbnRlbC5jb20iIHRhcmdldD0iX2JsYW5rIj5raXJpbGwu c2h1dGVtb3ZAbGludXguaW50ZWwuY29tPC9hPiZndDs8YnI+DQpTaWduZWQtb2ZmLWJ5OiBZYW5n IFNoaSAmbHQ7PGEgaHJlZj0ibWFpbHRvOnNoeTgyODMwMUBnbWFpbC5jb20iIHRhcmdldD0iX2Js YW5rIj5zaHk4MjgzMDFAZ21haWwuY29tPC9hPiZndDs8YnI+DQotLS08YnI+DQrCoG1tL2h1Z2Vf bWVtb3J5LmMgfCA0NCArKysrKy0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0t LTxicj4NCsKgMSBmaWxlIGNoYW5nZWQsIDUgaW5zZXJ0aW9ucygrKSwgMzkgZGVsZXRpb25zKC0p PGJyPg0KPGJyPg0KZGlmZiAtLWdpdCBhL21tL2h1Z2VfbWVtb3J5LmMgYi9tbS9odWdlX21lbW9y eS5jPGJyPg0KaW5kZXggYjQ5ZTFhMTFkZjJlLi5kYWFhNjk4YmQyNzMgMTAwNjQ0PGJyPg0KLS0t IGEvbW0vaHVnZV9tZW1vcnkuYzxicj4NCisrKyBiL21tL2h1Z2VfbWVtb3J5LmM8YnI+DQpAQCAt MjEzNCw4ICsyMTM0LDYgQEAgdm9pZCBfX3NwbGl0X2h1Z2VfcG1kKHN0cnVjdCB2bV9hcmVhX3N0 cnVjdCAqdm1hLCBwbWRfdCAqcG1kLDxicj4NCsKgezxicj4NCsKgIMKgIMKgIMKgIHNwaW5sb2Nr X3QgKnB0bDs8YnI+DQrCoCDCoCDCoCDCoCBzdHJ1Y3QgbW11X25vdGlmaWVyX3JhbmdlIHJhbmdl Ozxicj4NCi3CoCDCoCDCoCDCoGJvb2wgZG9fdW5sb2NrX2ZvbGlvID0gZmFsc2U7PGJyPg0KLcKg IMKgIMKgIMKgcG1kX3QgX3BtZDs8YnI+DQo8YnI+DQrCoCDCoCDCoCDCoCBtbXVfbm90aWZpZXJf cmFuZ2VfaW5pdCgmYW1wO3JhbmdlLCBNTVVfTk9USUZZX0NMRUFSLCAwLCB2bWEsIHZtYS0mZ3Q7 dm1fbW0sPGJyPg0KwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgYWRkcmVzcyAmYW1wOyBIUEFHRV9QTURfTUFTSyw8YnI+DQpAQCAtMjE0OCw0OCArMjE0Niwx NiBAQCB2b2lkIF9fc3BsaXRfaHVnZV9wbWQoc3RydWN0IHZtX2FyZWFfc3RydWN0ICp2bWEsIHBt ZF90ICpwbWQsPGJyPg0KwqAgwqAgwqAgwqAgwqAqIHBtZCBhZ2FpbnN0LiBPdGhlcndpc2Ugd2Ug Y2FuIGVuZCB1cCByZXBsYWNpbmcgd3JvbmcgZm9saW8uPGJyPg0KwqAgwqAgwqAgwqAgwqAqLzxi cj4NCsKgIMKgIMKgIMKgIFZNX0JVR19PTihmcmVlemUgJmFtcDsmYW1wOyAhZm9saW8pOzxicj4N Ci3CoCDCoCDCoCDCoGlmIChmb2xpbykgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoFZN X1dBUk5fT05fT05DRSghZm9saW9fdGVzdF9sb2NrZWQoZm9saW8pKTs8YnI+DQotwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqBpZiAoZm9saW8gIT0gcGFnZV9mb2xpbyhwbWRfcGFnZSgqcG1kKSkpPGJy Pg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZ290byBvdXQ7PGJyPg0KLcKg IMKgIMKgIMKgfTxicj4NCivCoCDCoCDCoCDCoGlmIChmb2xpbyAmYW1wOyZhbXA7IGZvbGlvICE9 IHBhZ2VfZm9saW8ocG1kX3BhZ2UoKnBtZCkpKTxicj4NCivCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oGdvdG8gb3V0Ozxicj4NCjxicj4NCi1yZXBlYXQ6PGJyPg0KLcKgIMKgIMKgIMKgaWYgKHBtZF90 cmFuc19odWdlKCpwbWQpKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKCFmb2xp bykgezxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGZvbGlvID0gcGFn ZV9mb2xpbyhwbWRfcGFnZSgqcG1kKSk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgLyo8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgKiBB biBhbm9ueW1vdXMgcGFnZSBtdXN0IGJlIGxvY2tlZCwgdG8gZW5zdXJlIHRoYXQgYTxicj4NCi3C oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqIGNvbmN1cnJlbnQgcmV1c2Vfc3dh cF9wYWdlKCkgc2VlcyBzdGFibGUgbWFwY291bnQ7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgICogYnV0IHJldXNlX3N3YXBfcGFnZSgpIGlzIG5vdCB1c2VkIG9uIHNo bWVtIG9yIGZpbGUsPGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgICog YW5kIHBhZ2UgbG9jayBtdXN0IG5vdCBiZSB0YWtlbiB3aGVuIHphcF9wbWRfcmFuZ2UoKTxicj4N Ci3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCAqIGNhbGxzIF9fc3BsaXRfaHVn ZV9wbWQoKSB3aGlsZSBpX21tYXBfbG9jayBpcyBoZWxkLjxicj4NCi3CoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCAqLzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoGlmIChmb2xpb190ZXN0X2Fub24oZm9saW8pKSB7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHVubGlrZWx5KCFmb2xpb190cnls b2NrKGZvbGlvKSkpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmb2xpb19nZXQoZm9saW8pOzxicj4NCi3CoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoF9wbWQgPSAq cG1kOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoHNwaW5fdW5sb2NrKHB0bCk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgZm9saW9fbG9jayhmb2xpbyk7 PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgc3Bpbl9sb2NrKHB0bCk7PGJyPg0KLcKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgaWYgKHVubGlrZWx5KCFwbWRfc2FtZSgq cG1kLCBfcG1kKSkpIHs8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmb2xpb191bmxvY2soZm9saW8pOzxi cj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoGZvbGlvX3B1dChmb2xpbyk7PGJyPg0KLcKgIMKgIMKgIMKgIMKg IMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKgIMKg Zm9saW8gPSBOVUxMOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoGdvdG8gcmVwZWF0Ozxicj4NCi3CoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08 YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqBmb2xpb19wdXQoZm9saW8pOzxicj4NCi3CoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqAgwqAgwqAgwqAgwqAgwqAgwqBkb191bmxvY2tfZm9saW8gPSB0cnVlOzxicj4NCi3CoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoH08YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAg wqB9PGJyPg0KLcKgIMKgIMKgIMKgfSBlbHNlIGlmICghKHBtZF9kZXZtYXAoKnBtZCkgfHwgaXNf cG1kX21pZ3JhdGlvbl9lbnRyeSgqcG1kKSkpPGJyPg0KK8KgIMKgIMKgIMKgaWYgKCEocG1kX2Rl dm1hcCgqcG1kKSB8fCBpc19wbWRfbWlncmF0aW9uX2VudHJ5KCpwbWQpKSk8YnI+DQrCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoCBnb3RvIG91dDs8YnI+DQorPGJyPg0KwqAgwqAgwqAgwqAgX19zcGxp dF9odWdlX3BtZF9sb2NrZWQodm1hLCBwbWQsIHJhbmdlLnN0YXJ0LCBmcmVlemUpOzxicj4NCsKg b3V0Ojxicj4NCsKgIMKgIMKgIMKgIHNwaW5fdW5sb2NrKHB0bCk7PGJyPg0KLcKgIMKgIMKgIMKg aWYgKGRvX3VubG9ja19mb2xpbyk8YnI+DQotwqAgwqAgwqAgwqAgwqAgwqAgwqAgwqBmb2xpb191 bmxvY2soZm9saW8pOzxicj4NCis8YnI+DQrCoCDCoCDCoCDCoCAvKjxicj4NCsKgIMKgIMKgIMKg IMKgKiBObyBuZWVkIHRvIGRvdWJsZSBjYWxsIG1tdV9ub3RpZmllci0mZ3Q7aW52YWxpZGF0ZV9y YW5nZSgpIGNhbGxiYWNrLjxicj4NCsKgIMKgIMKgIMKgIMKgKiBUaGV5IGFyZSAzIGNhc2VzIHRv IGNvbnNpZGVyIGluc2lkZSBfX3NwbGl0X2h1Z2VfcG1kX2xvY2tlZCgpOjxicj4NCi0tIDxicj4N CjIuMjYuMzxicj4NCjxicj4NCjwvYmxvY2txdW90ZT48L2Rpdj48L2Rpdj4NCg== --000000000000807ae405d95d7be4--