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 6F277CEBF81 for ; Fri, 27 Sep 2024 08:28:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CDB356B0083; Fri, 27 Sep 2024 04:28:49 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C8BEE6B0095; Fri, 27 Sep 2024 04:28:49 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id B52B16B00B2; Fri, 27 Sep 2024 04:28:49 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0017.hostedemail.com [216.40.44.17]) by kanga.kvack.org (Postfix) with ESMTP id 9266A6B0083 for ; Fri, 27 Sep 2024 04:28:49 -0400 (EDT) Received: from smtpin12.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 117D81C6262 for ; Fri, 27 Sep 2024 08:28:49 +0000 (UTC) X-FDA: 82609842378.12.7C74A03 Received: from mail-lj1-f182.google.com (mail-lj1-f182.google.com [209.85.208.182]) by imf21.hostedemail.com (Postfix) with ESMTP id 282691C0007 for ; Fri, 27 Sep 2024 08:28:45 +0000 (UTC) Authentication-Results: imf21.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=ZJlsBp5B; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf21.hostedemail.com: domain of suhua.tanke@gmail.com designates 209.85.208.182 as permitted sender) smtp.mailfrom=suhua.tanke@gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1727425689; a=rsa-sha256; cv=none; b=azVbNueQGEjO/xzi0hxcM1XCK5+90+ZNlIkpBt36MjOzvYhq926iEiPldQKWwq9g9q6Ur6 BZ/2clm1Wp4GNDNB0OLhT9vf5Yeq39HjyyeGLHMCsaubDzpTDg9JSW/JS/x4wk/GCWX8WJ 9rrDY3/jTKi4G8Kaj5P49Z3dvoXOTKo= ARC-Authentication-Results: i=1; imf21.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=ZJlsBp5B; dmarc=pass (policy=none) header.from=gmail.com; spf=pass (imf21.hostedemail.com: domain of suhua.tanke@gmail.com designates 209.85.208.182 as permitted sender) smtp.mailfrom=suhua.tanke@gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1727425689; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-type:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=RkbJZAE59lD5c4gxbcEpUfeeuStrIvONlyGy96bhTUQ=; b=gDl65H2yYpX9uTsyUhK9JWjjIodiRYp89VlmIpuHi87giCjtmOXSIu1aHWmD8Umhbvdf2Q 3AiVfMZZNogDa4qifVXeGNOFqKnICkjycBul3CIXxzX+7Nh0+xdKs/6W9DP2N7ggOh+gnU RhgjqL+JpUoJgPdCieSYsTUyC2dsP8Y= Received: by mail-lj1-f182.google.com with SMTP id 38308e7fff4ca-2f75c205e4aso21533841fa.0 for ; Fri, 27 Sep 2024 01:28:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1727425724; x=1728030524; darn=kvack.org; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:from:to:cc:subject:date:message-id:reply-to; bh=RkbJZAE59lD5c4gxbcEpUfeeuStrIvONlyGy96bhTUQ=; b=ZJlsBp5BNNdRcJZnlrkYEw/Z3GaLFAkW+GqzvHW2ohUQWNFiZoN3UqiTTR8G0cb2DR ztWRM68SNRanCwuaBEXn/zvpRnR/tRnsb+iQWX4ago35AJRpFjqhOxOMZtv/QIE8I3Bj yanMO6jDX6P9/98rgCWybUvs9/WO3F0u4JmoQwB8koQyfy9T2x2x3cpDjjnvudLl4yu2 6qdv2Tn0bET+5pDXtF53FnVVMdJmJx7NTiLu5kKqoOOYb+inUMnIGO76khGSGZz4XN3O bCaOkzkchkcF1WQa2pNapNZ1O3jasm8xmyU9NtYSOYPBBrMhyBlRpEiFShmJ6GP+wwWE n8fQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1727425724; x=1728030524; h=cc:to:subject:message-id:date:from:in-reply-to:references :mime-version:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=RkbJZAE59lD5c4gxbcEpUfeeuStrIvONlyGy96bhTUQ=; b=NNrLv/CS5C4/Fhzc3mYE0Rcb/I3O7YujUnBAFfNR5sSTrqy2RNr7vj/6O5LKct8p7A yglQzr6une7Zc31LQV/i05pcPWwO0/KDUln4YGaBEOxv1ZnBCJfOZV++vlootRU4VgaR Dscqt/W0P2WBl8lju58f2lo6mfMirOqY8xo88XrOG2DKYs64IMNae/2lQNkbr7TAkZz3 1QxF3EBLLrxn69l2AHCgB3HUz816bOI7nQoya842bug53CDFOXpRT5QCC6DZlwZfCp2/ VGFmiIxFTPpEaS3EPtJbM29gXtWYVvtv5+VZfFj+10jOPU96z5LTNVuMpzOkxbhqDWHj 5R0g== X-Forwarded-Encrypted: i=1; AJvYcCWyhsqUJ0zagrsZgfG5Jiak/4hNgC5A4Tvysq6JyGEXEp/Opj7k/37gYTgdj6L21e0w2BV4ZvfwFw==@kvack.org X-Gm-Message-State: AOJu0YztbbgPYnXm6P2N67Ra4kwD8RIjhj14rKMOasBKLvyHNT8ZsnyY /Q4kg6xgvIlkpZ1BxX8k+V4chk4sWHzvd6qkhJXMN0w2f0bVun+4G49kDSEO49iO054hHAZeoU5 WyvxPNXJ5/9aZAPVhkoJgJxJselc= X-Google-Smtp-Source: AGHT+IHnVKZ63b0yvLI5k9b7on276YWyzFYjUCGVQMqiHHjTcgyXlbetDwMmrxXXrv+7DHNQi3biMxVJKCS5//PBoXI= X-Received: by 2002:a05:6512:b90:b0:536:553f:3eed with SMTP id 2adb3069b0e04-5389fc435e7mr1233785e87.23.1727425723757; Fri, 27 Sep 2024 01:28:43 -0700 (PDT) MIME-Version: 1.0 References: <20240925110235.3157-1-suhua1@kingsoft.com> In-Reply-To: <20240925110235.3157-1-suhua1@kingsoft.com> From: Su Hua Date: Fri, 27 Sep 2024 16:28:07 +0800 Message-ID: Subject: Re: [PATCH v1] memblock: Initialized the memory of memblock.reserve to the MIGRATE_MOVABL To: rppt@kernel.org, akpm@linux-foundation.org Cc: muchun.song@linux.dev, linux-mm@kvack.org, linux-kernel@vger.kernel.org, suhua Content-Type: multipart/alternative; boundary="000000000000a3fd2a062315a488" X-Rspam-User: X-Rspamd-Queue-Id: 282691C0007 X-Rspamd-Server: rspam01 X-Stat-Signature: q7tqrg5qtehq5boxhe7i987h4g57c9im X-HE-Tag: 1727425725-305497 X-HE-Meta: U2FsdGVkX1/ZCYe6e3cBTAf0qmgp+prWik3VCkr9PnJ3VOzIP1hJ1DnMKqzyvkmbCkz3AlUBFUn7ihGAHmry7d3UtOeyTEs7Iun0GQs1/ZsK8oQzD+jmtbjVzh1WlMr16qBkPx0DFzzLcPkjx1H/MDL2/izfB4RrU9MelcUSunIzkAi/FedIQCXzLgD8nxPWu5WmtVbz872CxJf7oUzIp6Grz4Sp5gjjBD6QV1YjyMMVzRPRTeJIDJ4+KNXdlke5NgqNPnqXuYrK8wgiQHZ6QCyGGRoGgAcPOiNqz1LEoqmT/FpJbCgVT+FB0t6qJcBdGC7AMQ0Rv6pTbXYMiCRuzZzbAo4PUIvpVZf8NmnGJpW2FnjlrbkFN8piaNv4HmF4ynZj64Mx39tei86/zXeO+9nt+zg4GLS8+8kRssRT+5uqnxQBJsWmI0btAC2LjbHgCAjdZvbmpcnn52nq7drNX5QmBL02uB/Q/Rs0Ok6mdvIsksFlk28koeWCyph54S3isMpc5TtagkWRysK52XhpZZKhd/dpsB8KdNUkNLBYultUb6XppK0ZDOf+MXlR8u8bPq8al/0q9sTelSvMrWv+pRl+55dn+TcmZGPSliep7V3bb84qQ5qkNtZO+IlFTXJlq6P1aNby6dRN/crNLROQS7zGDcJyga4ARiILpjoQTfFM7PcPshFvvtMoGk4ipY8DGc1e9DgF/cvTdzecgqEZGcVKRDDFSsVFfo3sLUZ0arEoyKBWzxhiQfeYpztPGuMNH6hfR0Oc5MJOcriBXfaur+h6/VBvuebj0n/6eR0+EYz41G8TnZfIU6oojxSCqWm5iVilgaHBQ/BrGC3jYoB5vvz0jOx93+xQ3ZULUMAba5eEGTNJ8gNhtXyrNiCV0IbNF/WECCHxBSqBnFHjbjG7IMIRFNbxVT8gedLZKUfblaUnOOhSsI7ef1YCez6uTMxFC5dfUmWY+I2FQVJCjcD M5CZ/zun sB8zfIRdp4EyUiuGtxraV7M8SQnOkq13O93OCQwD2McvPGfGsI5TFqOquB8E05Aa+gfNz1LUQdyALPSgr5pklRpQyjZ+04xBf+fhfGyfl7scoXg7aswodnNontrM7vOXnrIM4O/ZQCLtqkZxqhQ/jZ14HZQXHnnD6hlVl0nBwUmCtdm2nzrpoHSqGGjfUN4gu4vtLDkuGSZUrdDaBofVOBCWLNGRSHegSgCsxJyZJmjhubwfZqA8tQj+J+eVmrtxyRStcxOumpcKMbfEuZczbr1onxvzvDUBmOpyh2M/cqZjDOU8Q5CspoPWTlPGXAJEOJTOH8MuJps9DSxmSesrZKKgGD3MwKhp2AX0GVJEJjGX8VUZ1Y6BJzTEvJLYJIT92UcnRqYn9UtIz7iNzSmGB+oOt/2aTVpo0C8Cc99c0ikgvyJO2Y3MGPOSM59wkBM0tLHhLC2Ete95BIhvs53frDLNPGdupwnMOl4xg09XjLNFBUpc0rMnqHUkmRnBMyLa7ePL3B3vBUiTRm2rz83wIrIUGn1tId65mtx7g8K8ti/DWHIvGdwkL1SMmpTN9Q9LfwRFY9kzO6JeCFneQCHjAdjLjaxWR3PXTqEf3q+yRSpG8/grOwNRmWA8skg== X-Bogosity: Ham, tests=bogofilter, spamicity=0.000004, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: List-Subscribe: List-Unsubscribe: --000000000000a3fd2a062315a488 Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable The main purpose of this patch is to unify the migration type settings for memblock.reserve to MIGRATE_MOVABL, both with and without CONFIG_DEFERRED_STRUCT_PAGE_INIT. Thanks suhua suhua =E4=BA=8E2024=E5=B9=B49=E6=9C=8825=E6=97=A5= =E5=91=A8=E4=B8=89 19:02=E5=86=99=E9=81=93=EF=BC=9A > After sparse_init function requests memory for struct page in memblock an= d > adds it to memblock.reserved, this memory area is present in both > memblock.memory and memblock.reserved. > > When CONFIG_DEFERRED_STRUCT_PAGE_INIT is not set. The memmap_init functio= n > is called during the initialization of the free area of the zone, this > function calls for_each_mem_pfn_range to initialize all memblock.memory, > excluding memory that is also placed in memblock.reserved, such as the > struct page metadata that describes the page, 1TB memory is about 16GB, > and generally this part of reserved memory occupies more than 90% of the > total reserved memory of the system. So all memory in memblock.memory is > set to MIGRATE_MOVABLE according to the alignment of pageblock_nr_pages. > For example, if hugetlb_optimize_vmemmap=3D1, huge pages are allocated, t= he > freed pages are placed on buddy's MIGRATE_MOVABL list for use. > > When CONFIG_DEFERRED_STRUCT_PAGE_INIT=3Dy, only the first_deferred_pfn ra= nge > is initialized in memmap_init. The subsequent free_low_memory_core_early > initializes all memblock.reserved memory but not MIGRATE_MOVABL. All > memblock.memory is set to MIGRATE_MOVABL when it is placed in buddy via > free_low_memory_core_early and deferred_init_memmap. As a result, when > hugetlb_optimize_vmemmap=3D1 and huge pages are allocated, the freed page= s > will be placed on buddy's MIGRATE_UNMOVABL list (For example, on machines > with 1TB of memory, alloc 2MB huge page size of 1000GB frees up about 15G= B > to MIGRATE_UNMOVABL). Since the huge page alloc requires a MIGRATE_MOVABL > page, a fallback is performed to alloc memory from MIGRATE_UNMOVABL for > MIGRATE_MOVABL. > > Large amount of UNMOVABL memory is not conducive to defragmentation, so > the reserved memory is also set to MIGRATE_MOVABLE in the > free_low_memory_core_early phase following the alignment of > pageblock_nr_pages. > > Eg=EF=BC=9A > echo 500000 > /proc/sys/vm/nr_hugepages > cat /proc/pagetypeinfo > > before=EF=BC=9A > Free pages count per migrate type at order 0 1 2 3 > 4 5 6 7 8 9 10 > =E2=80=A6 > Node 0, zone Normal, type Unmovable 51 2 1 28 > 53 35 35 43 40 69 3852 > Node 0, zone Normal, type Movable 6485 4610 666 202 > 200 185 208 87 54 2 240 > Node 0, zone Normal, type Reclaimable 2 2 1 23 > 13 1 2 1 0 1 0 > Node 0, zone Normal, type HighAtomic 0 0 0 0 > 0 0 0 0 0 0 0 > Node 0, zone Normal, type Isolate 0 0 0 0 > 0 0 0 0 0 0 0 > Unmovable =E2=89=88 15GB > > after=EF=BC=9A > Free pages count per migrate type at order 0 1 2 3 > 4 5 6 7 8 9 10 > =E2=80=A6 > Node 0, zone Normal, type Unmovable 0 1 1 0 > 0 0 0 1 1 1 0 > Node 0, zone Normal, type Movable 1563 4107 1119 189 > 256 368 286 132 109 4 3841 > Node 0, zone Normal, type Reclaimable 2 2 1 23 > 13 1 2 1 0 1 0 > Node 0, zone Normal, type HighAtomic 0 0 0 0 > 0 0 0 0 0 0 0 > Node 0, zone Normal, type Isolate 0 0 0 0 > 0 0 0 0 0 0 0 > > Signed-off-by: suhua > --- > mm/mm_init.c | 6 ++++++ > 1 file changed, 6 insertions(+) > > diff --git a/mm/mm_init.c b/mm/mm_init.c > index 4ba5607aaf19..e0190e3f8f26 100644 > --- a/mm/mm_init.c > +++ b/mm/mm_init.c > @@ -722,6 +722,12 @@ static void __meminit init_reserved_page(unsigned > long pfn, int nid) > if (zone_spans_pfn(zone, pfn)) > break; > } > + > + if (pageblock_aligned(pfn)) { > + set_pageblock_migratetype(pfn_to_page(pfn), > MIGRATE_MOVABLE); > + cond_resched(); > + } > + > __init_single_page(pfn_to_page(pfn), pfn, zid, nid); > } > #else > -- > 2.34.1 > > --000000000000a3fd2a062315a488 Content-Type: text/html; charset="UTF-8" Content-Transfer-Encoding: base64 PGRpdiBkaXI9Imx0ciI+VGhlIG1haW4gcHVycG9zZSBvZiB0aGlzIHBhdGNoIGlzIHRvIHVuaWZ5 IHRoZSBtaWdyYXRpb24gdHlwZSBzZXR0aW5ncyBmb3IgbWVtYmxvY2sucmVzZXJ2ZSB0byBNSUdS QVRFX01PVkFCTCwgYm90aCB3aXRoIGFuZCB3aXRob3V0IENPTkZJR19ERUZFUlJFRF9TVFJVQ1Rf UEFHRV9JTklULjxicj48ZGl2Pjxicj48L2Rpdj48ZGl2PlRoYW5rczwvZGl2PjxkaXY+c3VodWE8 L2Rpdj48L2Rpdj48YnI+PGRpdiBjbGFzcz0iZ21haWxfcXVvdGUiPjxkaXYgZGlyPSJsdHIiIGNs YXNzPSJnbWFpbF9hdHRyIj5zdWh1YSAmbHQ7PGEgaHJlZj0ibWFpbHRvOnN1aHVhLnRhbmtlQGdt YWlsLmNvbSI+c3VodWEudGFua2VAZ21haWwuY29tPC9hPiZndDsg5LqOMjAyNOW5tDnmnIgyNeaX peWRqOS4iSAxOTowMuWGmemBk++8mjxicj48L2Rpdj48YmxvY2txdW90ZSBjbGFzcz0iZ21haWxf cXVvdGUiIHN0eWxlPSJtYXJnaW46MHB4IDBweCAwcHggMC44ZXg7Ym9yZGVyLWxlZnQ6MXB4IHNv bGlkIHJnYigyMDQsMjA0LDIwNCk7cGFkZGluZy1sZWZ0OjFleCI+QWZ0ZXIgc3BhcnNlX2luaXQg ZnVuY3Rpb24gcmVxdWVzdHMgbWVtb3J5IGZvciBzdHJ1Y3QgcGFnZSBpbiBtZW1ibG9jayBhbmQ8 YnI+DQphZGRzIGl0IHRvIG1lbWJsb2NrLnJlc2VydmVkLCB0aGlzIG1lbW9yeSBhcmVhIGlzIHBy ZXNlbnQgaW4gYm90aDxicj4NCm1lbWJsb2NrLm1lbW9yeSBhbmQgbWVtYmxvY2sucmVzZXJ2ZWQu PGJyPg0KPGJyPg0KV2hlbiBDT05GSUdfREVGRVJSRURfU1RSVUNUX1BBR0VfSU5JVCBpcyBub3Qg c2V0LiBUaGUgbWVtbWFwX2luaXQgZnVuY3Rpb248YnI+DQppcyBjYWxsZWQgZHVyaW5nIHRoZSBp bml0aWFsaXphdGlvbiBvZiB0aGUgZnJlZSBhcmVhIG9mIHRoZSB6b25lLCB0aGlzPGJyPg0KZnVu Y3Rpb24gY2FsbHMgZm9yX2VhY2hfbWVtX3Bmbl9yYW5nZSB0byBpbml0aWFsaXplIGFsbCBtZW1i bG9jay5tZW1vcnksPGJyPg0KZXhjbHVkaW5nIG1lbW9yeSB0aGF0IGlzIGFsc28gcGxhY2VkIGlu IG1lbWJsb2NrLnJlc2VydmVkLCBzdWNoIGFzIHRoZTxicj4NCnN0cnVjdCBwYWdlIG1ldGFkYXRh IHRoYXQgZGVzY3JpYmVzIHRoZSBwYWdlLCAxVEIgbWVtb3J5IGlzIGFib3V0IDE2R0IsPGJyPg0K YW5kIGdlbmVyYWxseSB0aGlzIHBhcnQgb2YgcmVzZXJ2ZWQgbWVtb3J5IG9jY3VwaWVzIG1vcmUg dGhhbiA5MCUgb2YgdGhlPGJyPg0KdG90YWwgcmVzZXJ2ZWQgbWVtb3J5IG9mIHRoZSBzeXN0ZW0u IFNvIGFsbCBtZW1vcnkgaW4gbWVtYmxvY2subWVtb3J5IGlzPGJyPg0Kc2V0IHRvIE1JR1JBVEVf TU9WQUJMRSBhY2NvcmRpbmcgdG8gdGhlIGFsaWdubWVudCBvZiBwYWdlYmxvY2tfbnJfcGFnZXMu PGJyPg0KRm9yIGV4YW1wbGUsIGlmIGh1Z2V0bGJfb3B0aW1pemVfdm1lbW1hcD0xLCBodWdlIHBh Z2VzIGFyZSBhbGxvY2F0ZWQsIHRoZTxicj4NCmZyZWVkIHBhZ2VzIGFyZSBwbGFjZWQgb24gYnVk ZHkmIzM5O3MgTUlHUkFURV9NT1ZBQkwgbGlzdCBmb3IgdXNlLjxicj4NCjxicj4NCldoZW4gQ09O RklHX0RFRkVSUkVEX1NUUlVDVF9QQUdFX0lOSVQ9eSwgb25seSB0aGUgZmlyc3RfZGVmZXJyZWRf cGZuIHJhbmdlPGJyPg0KaXMgaW5pdGlhbGl6ZWQgaW4gbWVtbWFwX2luaXQuIFRoZSBzdWJzZXF1 ZW50IGZyZWVfbG93X21lbW9yeV9jb3JlX2Vhcmx5PGJyPg0KaW5pdGlhbGl6ZXMgYWxsIG1lbWJs b2NrLnJlc2VydmVkIG1lbW9yeSBidXQgbm90IE1JR1JBVEVfTU9WQUJMLiBBbGw8YnI+DQptZW1i bG9jay5tZW1vcnkgaXMgc2V0IHRvIE1JR1JBVEVfTU9WQUJMIHdoZW4gaXQgaXMgcGxhY2VkIGlu IGJ1ZGR5IHZpYTxicj4NCmZyZWVfbG93X21lbW9yeV9jb3JlX2Vhcmx5IGFuZCBkZWZlcnJlZF9p bml0X21lbW1hcC4gQXMgYSByZXN1bHQsIHdoZW48YnI+DQpodWdldGxiX29wdGltaXplX3ZtZW1t YXA9MSBhbmQgaHVnZSBwYWdlcyBhcmUgYWxsb2NhdGVkLCB0aGUgZnJlZWQgcGFnZXM8YnI+DQp3 aWxsIGJlIHBsYWNlZCBvbiBidWRkeSYjMzk7cyBNSUdSQVRFX1VOTU9WQUJMIGxpc3QgKEZvciBl eGFtcGxlLCBvbiBtYWNoaW5lczxicj4NCndpdGggMVRCIG9mIG1lbW9yeSwgYWxsb2MgMk1CIGh1 Z2UgcGFnZSBzaXplIG9mIDEwMDBHQiBmcmVlcyB1cCBhYm91dCAxNUdCPGJyPg0KdG8gTUlHUkFU RV9VTk1PVkFCTCkuIFNpbmNlIHRoZSBodWdlIHBhZ2UgYWxsb2MgcmVxdWlyZXMgYSBNSUdSQVRF X01PVkFCTDxicj4NCnBhZ2UsIGEgZmFsbGJhY2sgaXMgcGVyZm9ybWVkIHRvIGFsbG9jIG1lbW9y eSBmcm9tIE1JR1JBVEVfVU5NT1ZBQkwgZm9yPGJyPg0KTUlHUkFURV9NT1ZBQkwuPGJyPg0KPGJy Pg0KTGFyZ2UgYW1vdW50IG9mIFVOTU9WQUJMIG1lbW9yeSBpcyBub3QgY29uZHVjaXZlIHRvIGRl ZnJhZ21lbnRhdGlvbiwgc288YnI+DQp0aGUgcmVzZXJ2ZWQgbWVtb3J5IGlzIGFsc28gc2V0IHRv IE1JR1JBVEVfTU9WQUJMRSBpbiB0aGU8YnI+DQpmcmVlX2xvd19tZW1vcnlfY29yZV9lYXJseSBw aGFzZSBmb2xsb3dpbmcgdGhlIGFsaWdubWVudCBvZjxicj4NCnBhZ2VibG9ja19ucl9wYWdlcy48 YnI+DQo8YnI+DQpFZ++8mjxicj4NCmVjaG8gNTAwMDAwICZndDsgL3Byb2Mvc3lzL3ZtL25yX2h1 Z2VwYWdlczxicj4NCmNhdCAvcHJvYy9wYWdldHlwZWluZm88YnI+DQo8YnI+DQpiZWZvcmXvvJo8 YnI+DQpGcmVlIHBhZ2VzIGNvdW50IHBlciBtaWdyYXRlIHR5cGUgYXQgb3JkZXLCoCDCoCDCoCDC oDDCoCDCoCDCoCAxwqAgwqAgwqAgMsKgIMKgIMKgIDPCoCDCoCDCoCA0wqAgwqAgwqAgNcKgIMKg IMKgIDbCoCDCoCDCoCA3wqAgwqAgwqAgOMKgIMKgIMKgIDnCoCDCoCDCoDEwPGJyPg0K4oCmPGJy Pg0KTm9kZcKgIMKgIDAsIHpvbmXCoCDCoE5vcm1hbCwgdHlwZcKgIMKgIFVubW92YWJsZcKgIMKg IMKgNTHCoCDCoCDCoCAywqAgwqAgwqAgMcKgIMKgIMKgMjjCoCDCoCDCoDUzwqAgwqAgwqAzNcKg IMKgIMKgMzXCoCDCoCDCoDQzwqAgwqAgwqA0MMKgIMKgIMKgNjnCoCDCoDM4NTI8YnI+DQpOb2Rl wqAgwqAgMCwgem9uZcKgIMKgTm9ybWFsLCB0eXBlwqAgwqAgwqAgTW92YWJsZcKgIMKgNjQ4NcKg IMKgNDYxMMKgIMKgIDY2NsKgIMKgIDIwMsKgIMKgIDIwMMKgIMKgIDE4NcKgIMKgIDIwOMKgIMKg IMKgODfCoCDCoCDCoDU0wqAgwqAgwqAgMsKgIMKgIDI0MDxicj4NCk5vZGXCoCDCoCAwLCB6b25l wqAgwqBOb3JtYWwsIHR5cGXCoCBSZWNsYWltYWJsZcKgIMKgIMKgIDLCoCDCoCDCoCAywqAgwqAg wqAgMcKgIMKgIMKgMjPCoCDCoCDCoDEzwqAgwqAgwqAgMcKgIMKgIMKgIDLCoCDCoCDCoCAxwqAg wqAgwqAgMMKgIMKgIMKgIDHCoCDCoCDCoCAwPGJyPg0KTm9kZcKgIMKgIDAsIHpvbmXCoCDCoE5v cm1hbCwgdHlwZcKgIMKgSGlnaEF0b21pY8KgIMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAgwqAgMMKg IMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAgwqAg MMKgIMKgIMKgIDDCoCDCoCDCoCAwPGJyPg0KTm9kZcKgIMKgIDAsIHpvbmXCoCDCoE5vcm1hbCwg dHlwZcKgIMKgIMKgIElzb2xhdGXCoCDCoCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDCoCDCoCDC oCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDCoCDC oCDCoCAwwqAgwqAgwqAgMDxicj4NClVubW92YWJsZSDiiYggMTVHQjxicj4NCjxicj4NCmFmdGVy 77yaPGJyPg0KRnJlZSBwYWdlcyBjb3VudCBwZXIgbWlncmF0ZSB0eXBlIGF0IG9yZGVywqAgwqAg wqAgwqAwwqAgwqAgwqAgMcKgIMKgIMKgIDLCoCDCoCDCoCAzwqAgwqAgwqAgNMKgIMKgIMKgIDXC oCDCoCDCoCA2wqAgwqAgwqAgN8KgIMKgIMKgIDjCoCDCoCDCoCA5wqAgwqAgwqAxMDxicj4NCuKA pjxicj4NCk5vZGXCoCDCoCAwLCB6b25lwqAgwqBOb3JtYWwsIHR5cGXCoCDCoCBVbm1vdmFibGXC oCDCoCDCoCAwwqAgwqAgwqAgMcKgIMKgIMKgIDHCoCDCoCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKg IDDCoCDCoCDCoCAwwqAgwqAgwqAgMcKgIMKgIMKgIDHCoCDCoCDCoCAxwqAgwqAgwqAgMDxicj4N Ck5vZGXCoCDCoCAwLCB6b25lwqAgwqBOb3JtYWwsIHR5cGXCoCDCoCDCoCBNb3ZhYmxlwqAgwqAx NTYzwqAgwqA0MTA3wqAgwqAxMTE5wqAgwqAgMTg5wqAgwqAgMjU2wqAgwqAgMzY4wqAgwqAgMjg2 wqAgwqAgMTMywqAgwqAgMTA5wqAgwqAgwqAgNMKgIMKgMzg0MTxicj4NCk5vZGXCoCDCoCAwLCB6 b25lwqAgwqBOb3JtYWwsIHR5cGXCoCBSZWNsYWltYWJsZcKgIMKgIMKgIDLCoCDCoCDCoCAywqAg wqAgwqAgMcKgIMKgIMKgMjPCoCDCoCDCoDEzwqAgwqAgwqAgMcKgIMKgIMKgIDLCoCDCoCDCoCAx wqAgwqAgwqAgMMKgIMKgIMKgIDHCoCDCoCDCoCAwPGJyPg0KTm9kZcKgIMKgIDAsIHpvbmXCoCDC oE5vcm1hbCwgdHlwZcKgIMKgSGlnaEF0b21pY8KgIMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAgwqAg MMKgIMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAg wqAgMMKgIMKgIMKgIDDCoCDCoCDCoCAwPGJyPg0KTm9kZcKgIMKgIDAsIHpvbmXCoCDCoE5vcm1h bCwgdHlwZcKgIMKgIMKgIElzb2xhdGXCoCDCoCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDCoCDC oCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDCoCDCoCDCoCAwwqAgwqAgwqAgMMKgIMKgIMKgIDDC oCDCoCDCoCAwwqAgwqAgwqAgMDxicj4NCjxicj4NClNpZ25lZC1vZmYtYnk6IHN1aHVhICZsdDs8 YSBocmVmPSJtYWlsdG86c3VodWExQGtpbmdzb2Z0LmNvbSIgdGFyZ2V0PSJfYmxhbmsiPnN1aHVh MUBraW5nc29mdC5jb208L2E+Jmd0Ozxicj4NCi0tLTxicj4NCsKgbW0vbW1faW5pdC5jIHwgNiAr KysrKys8YnI+DQrCoDEgZmlsZSBjaGFuZ2VkLCA2IGluc2VydGlvbnMoKyk8YnI+DQo8YnI+DQpk aWZmIC0tZ2l0IGEvbW0vbW1faW5pdC5jIGIvbW0vbW1faW5pdC5jPGJyPg0KaW5kZXggNGJhNTYw N2FhZjE5Li5lMDE5MGUzZjhmMjYgMTAwNjQ0PGJyPg0KLS0tIGEvbW0vbW1faW5pdC5jPGJyPg0K KysrIGIvbW0vbW1faW5pdC5jPGJyPg0KQEAgLTcyMiw2ICs3MjIsMTIgQEAgc3RhdGljIHZvaWQg X19tZW1pbml0IGluaXRfcmVzZXJ2ZWRfcGFnZSh1bnNpZ25lZCBsb25nIHBmbiwgaW50IG5pZCk8 YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBpZiAoem9uZV9zcGFuc19wZm4oem9uZSwgcGZu KSk8YnI+DQrCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCDCoCBicmVhazs8YnI+DQrC oCDCoCDCoCDCoCB9PGJyPg0KKzxicj4NCivCoCDCoCDCoCDCoGlmIChwYWdlYmxvY2tfYWxpZ25l ZChwZm4pKSB7PGJyPg0KK8KgIMKgIMKgIMKgIMKgIMKgIMKgIMKgc2V0X3BhZ2VibG9ja19taWdy YXRldHlwZShwZm5fdG9fcGFnZShwZm4pLCBNSUdSQVRFX01PVkFCTEUpOzxicj4NCivCoCDCoCDC oCDCoCDCoCDCoCDCoCDCoGNvbmRfcmVzY2hlZCgpOzxicj4NCivCoCDCoCDCoCDCoH08YnI+DQor PGJyPg0KwqAgwqAgwqAgwqAgX19pbml0X3NpbmdsZV9wYWdlKHBmbl90b19wYWdlKHBmbiksIHBm biwgemlkLCBuaWQpOzxicj4NCsKgfTxicj4NCsKgI2Vsc2U8YnI+DQotLSA8YnI+DQoyLjM0LjE8 YnI+DQo8YnI+DQo8L2Jsb2NrcXVvdGU+PC9kaXY+DQo= --000000000000a3fd2a062315a488--