From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from lindbergh.monkeyblade.net (lindbergh.monkeyblade.net [23.128.96.19]) (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 A545A366 for ; Tue, 29 Aug 2023 00:54:29 +0000 (UTC) Received: from out-253.mta0.migadu.com (out-253.mta0.migadu.com [91.218.175.253]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id D94FDA2 for ; Mon, 28 Aug 2023 17:54:26 -0700 (PDT) Message-ID: <7b01b195-ee7e-b400-76f2-8b9085ac28bb@linux.dev> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1693270465; h=from:from:reply-to: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:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kiAocASxCH7x27u5cYdC0uVadmL5/wCWLX59Dc7Q268=; b=XIwv72SDgPazeikBq9fMVMvKUCuoy5KGai+SCx7SfWnfRo6nRIlaiYMWnlNxKrkhLpy5CQ Pgcq5QKzYysOqQlDRfAmkSCLsub8AJaPC0gOQkjxK/iCXABkDhSAjSxkLfBS7kFKr+veOQ tNFVIDKD//kpzlqRkIRx66i8zpV+ZKw= Date: Mon, 28 Aug 2023 20:54:21 -0400 Precedence: bulk X-Mailing-List: bpf@vger.kernel.org List-Id: List-Subscribe: List-Unsubscribe: MIME-Version: 1.0 Reply-To: yonghong.song@linux.dev Subject: Re: WARNING: CPU: 3 PID: 261 at kernel/bpf/memalloc.c:342 Content-Language: en-US To: Hou Tao , =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= , bpf@vger.kernel.org Cc: linux-riscv@lists.infradead.org, Alexei Starovoitov References: <87jztjmmy4.fsf@all.your.base.are.belong.to.us> <2f4f0dfc-ec06-8ac8-a56a-395cc2373def@linux.dev> <200dcce6-34ff-83e0-02fb-709a24403cc6@huaweicloud.com> <87zg2e88ds.fsf@all.your.base.are.belong.to.us> <64873e42-9be1-1812-b80d-5ea86b4677f0@huaweicloud.com> <87sf8684ex.fsf@all.your.base.are.belong.to.us> <878r9wswwy.fsf@all.your.base.are.belong.to.us> <65c9e8d9-7682-2c8d-cd4d-9f0ca1213066@huaweicloud.com> X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Yonghong Song In-Reply-To: <65c9e8d9-7682-2c8d-cd4d-9f0ca1213066@huaweicloud.com> Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 8bit X-Migadu-Flow: FLOW_OUT X-Spam-Status: No, score=-2.1 required=5.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_BLOCKED, SPF_HELO_NONE,SPF_PASS autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net On 8/28/23 6:57 AM, Hou Tao wrote: > Hi, > > On 8/27/2023 10:53 PM, Yonghong Song wrote: >> >> >> On 8/27/23 1:37 AM, Björn Töpel wrote: >>> Björn Töpel writes: >>> >>>> Hou Tao writes: >>>> >>>>> Hi, >>>>> >>>>> On 8/26/2023 5:23 PM, Björn Töpel wrote: >>>>>> Hou Tao writes: >>>>>> >>>>>>> Hi, >>>>>>> >>>>>>> On 8/25/2023 11:28 PM, Yonghong Song wrote: >>>>>>>> >>>>>>>> On 8/25/23 3:32 AM, Björn Töpel wrote: >>>>>>>>> I'm chasing a workqueue hang on RISC-V/qemu (TCG), using the bpf >>>>>>>>> selftests on bpf-next 9e3b47abeb8f. >>>>>>>>> >>>>>>>>> I'm able to reproduce the hang by multiple runs of: >>>>>>>>>    | ./test_progs -a link_api -a linked_list >>>>>>>>> I'm currently investigating that. >>>>>>>>> >>>>>>>>> But! Sometimes (every blue moon) I get a warn_on_once hit: >>>>>>>>>    | ------------[ cut here ]------------ >>>>>>>>>    | WARNING: CPU: 3 PID: 261 at kernel/bpf/memalloc.c:342 >>>>>>>>> bpf_mem_refill+0x1fc/0x206 >>>>>>>>>    | Modules linked in: bpf_testmod(OE) >>>>>>>>>    | CPU: 3 PID: 261 Comm: test_progs-cpuv Tainted: G           OE >>>>>>>>> N 6.5.0-rc5-01743-gdcb152bb8328 #2 >>>>>>>>>    | Hardware name: riscv-virtio,qemu (DT) >>>>>>>>>    | epc : bpf_mem_refill+0x1fc/0x206 >>>>>>>>>    |  ra : irq_work_single+0x68/0x70 >>>>>>>>>    | epc : ffffffff801b1bc4 ra : ffffffff8015fe84 sp : >>>>>>>>> ff2000000001be20 >>>>>>>>>    |  gp : ffffffff82d26138 tp : ff6000008477a800 t0 : >>>>>>>>> 0000000000046600 >>>>>>>>>    |  t1 : ffffffff812b6ddc t2 : 0000000000000000 s0 : >>>>>>>>> ff2000000001be70 >>>>>>>>>    |  s1 : ff5ffffffffe8998 a0 : ff5ffffffffe8998 a1 : >>>>>>>>> ff600003fef4b000 >>>>>>>>>    |  a2 : 000000000000003f a3 : ffffffff80008250 a4 : >>>>>>>>> 0000000000000060 >>>>>>>>>    |  a5 : 0000000000000080 a6 : 0000000000000000 a7 : >>>>>>>>> 0000000000735049 >>>>>>>>>    |  s2 : ff5ffffffffe8998 s3 : 0000000000000022 s4 : >>>>>>>>> 0000000000001000 >>>>>>>>>    |  s5 : 0000000000000007 s6 : ff5ffffffffe8570 s7 : >>>>>>>>> ffffffff82d6bd30 >>>>>>>>>    |  s8 : 000000000000003f s9 : ffffffff82d2c5e8 s10: >>>>>>>>> 000000000000ffff >>>>>>>>>    |  s11: ffffffff82d2c5d8 t3 : ffffffff81ea8f28 t4 : >>>>>>>>> 0000000000000000 >>>>>>>>>    |  t5 : ff6000008fd28278 t6 : 0000000000040000 >>>>>>>>>    | status: 0000000200000100 badaddr: 0000000000000000 cause: >>>>>>>>> 0000000000000003 >>>>>>>>>    | [] bpf_mem_refill+0x1fc/0x206 >>>>>>>>>    | [] irq_work_single+0x68/0x70 >>>>>>>>>    | [] irq_work_run_list+0x28/0x36 >>>>>>>>>    | [] irq_work_run+0x38/0x66 >>>>>>>>>    | [] handle_IPI+0x3a/0xb4 >>>>>>>>>    | [] handle_percpu_devid_irq+0xa4/0x1f8 >>>>>>>>>    | [] generic_handle_domain_irq+0x28/0x36 >>>>>>>>>    | [] ipi_mux_process+0xac/0xfa >>>>>>>>>    | [] sbi_ipi_handle+0x2e/0x88 >>>>>>>>>    | [] generic_handle_domain_irq+0x28/0x36 >>>>>>>>>    | [] riscv_intc_irq+0x36/0x4e >>>>>>>>>    | [] handle_riscv_irq+0x54/0x86 >>>>>>>>>    | [] do_irq+0x66/0x98 >>>>>>>>>    | ---[ end trace 0000000000000000 ]--- >>>>>>>>> >>>>>>>>> Code: >>>>>>>>>    | static void free_bulk(struct bpf_mem_cache *c) >>>>>>>>>    | { >>>>>>>>>    |     struct bpf_mem_cache *tgt = c->tgt; >>>>>>>>>    |     struct llist_node *llnode, *t; >>>>>>>>>    |     unsigned long flags; >>>>>>>>>    |     int cnt; >>>>>>>>>    | >>>>>>>>>    |     WARN_ON_ONCE(tgt->unit_size != c->unit_size); >>>>>>>>>    | ... >>>>>>>>> >>>>>>>>> I'm not well versed in the memory allocator; Before I dive into >>>>>>>>> it -- >>>>>>>>> has anyone else hit it? Ideas on why the warn_on_once is hit? >>>>>>>> Maybe take a look at the patch >>>>>>>>    822fb26bdb55  bpf: Add a hint to allocated objects. >>>>>>>> >>>>>>>> In the above patch, we have >>>>>>>> >>>>>>>> +       /* >>>>>>>> +        * Remember bpf_mem_cache that allocated this object. >>>>>>>> +        * The hint is not accurate. >>>>>>>> +        */ >>>>>>>> +       c->tgt = *(struct bpf_mem_cache **)llnode; >>>>>>>> >>>>>>>> I suspect that the warning may be related to the above. >>>>>>>> I tried the above ./test_progs command line (running multiple >>>>>>>> at the same time) and didn't trigger the issue. >>>>>>> The extra 8-bytes before the freed pointer is used to save the >>>>>>> pointer >>>>>>> of the original bpf memory allocator where the freed pointer came >>>>>>> from, >>>>>>> so unit_free() could free the pointer back to the original >>>>>>> allocator to >>>>>>> prevent alloc-and-free unbalance. >>>>>>> >>>>>>> I suspect that a wrong pointer was passed to bpf_obj_drop, but do >>>>>>> not >>>>>>> find anything suspicious after checking linked_list. Another >>>>>>> possibility >>>>>>> is that there is write-after-free problem which corrupts the extra >>>>>>> 8-bytes before the freed pointer. Could you please apply the >>>>>>> following >>>>>>> debug patch to check whether or not the extra 8-bytes are >>>>>>> corrupted ? >>>>>> Thanks for getting back! >>>>>> >>>>>> I took your patch for a run, and there's a hit: >>>>>>    | bad cache ff5ffffffffe8570: got size 96 work >>>>>> ffffffff801b19c8, cache ff5ffffffffe8980 exp size 128 work >>>>>> ffffffff801b19c8 >>>>> >>>>> The extra 8-bytes are not corrupted. Both of these two >>>>> bpf_mem_cache are >>>>> valid and there are in the cache array defined in bpf_mem_caches. BPF >>>>> memory allocator allocated the pointer from 96-bytes sized-cache, >>>>> but it >>>>> tried to free the pointer through 128-bytes sized-cache. >>>>> >>>>> Now I suspect there is no 96-bytes slab in your system and ksize(ptr - >>>>> LLIST_NODE_SZ) returns 128, so bpf memory allocator selected the >>>>> 128-byte sized-cache instead of 96-bytes sized-cache. Could you please >>>>> check the value of KMALLOC_MIN_SIZE in your kernel .config and >>>>> using the >>>>> following command to check whether there is 96-bytes slab in your >>>>> system: >>>> >>>> KMALLOC_MIN_SIZE is 64. >>>> >>>>> $ cat /proc/slabinfo |grep kmalloc-96 >>>>> dma-kmalloc-96         0      0     96   42    1 : tunables    0    0 >>>>> 0 : slabdata      0      0      0 >>>>> kmalloc-96          1865   2268     96   42    1 : tunables    0    0 >>>>> 0 : slabdata     54     54      0 >>>>> >>>>> In my system, slab has 96-bytes cached, so grep outputs something, >>>>> but I >>>>> think there will no output in your system. >>>> >>>> You're right! No kmalloc-96. >>> >>> To get rid of the warning, limit available sizes from >>> bpf_mem_alloc_init()? > > It is not enough. We need to adjust size_index accordingly during > initialization. Could you please try the attached patch below ? It is > not a formal patch and I am considering to disable prefilling for these > redirected bpf_mem_caches. >> >> Do you know why your system does not have kmalloc-96? > > According to the implementation of setup_kmalloc_cache_index_table() and > create_kmalloc_caches(),  when KMALLOC_MIN_SIZE is greater than 64, > kmalloc-96 will be omitted. If KMALLOC_MIN_SIZE is greater than 128, > kmalloc-192 will be omitted as well. Thanks! This indeed the case except the above 'greater than' should be 'greater than or equal to'. For example, greater than or equal to 64 means the minimum alignment is 64, so 96 is removed. Similar for greater than or equal to 128. I agree it is a good idea to align memalloc cache unit size matching underlying kmalloc cache unit size. >> >>> >>> >>> Björn >> >> . > 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 5B6EBC83F11 for ; Tue, 29 Aug 2023 00:54:47 +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-Type: Content-Transfer-Encoding:Reply-To:List-Subscribe:List-Help:List-Post: List-Archive:List-Unsubscribe:List-Id:In-Reply-To:From:References:Cc:To: Subject:MIME-Version:Date:Message-ID:Content-ID:Content-Description: Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc:Resent-Message-ID: List-Owner; bh=GZXZdyKJSVoImFi2AkW0Lb8hBSpMiUXI5yOZJKBmcoo=; b=KkcncMSLICu9qJ P4KvROfNk4i2SlCln0WB/lpq4zvSbVcB7BnfcYoq4uCxnUJoMIoLusWJQacAXpY0MDWEW64WfqgMk 4BgXWCjsKEyfDV3sE4rMd5Sy/Yx25QA1UfAuClnPxIb4nNGClGJQqMtda7c1DZvQXtdPVB/LHGV5v X3699CdI9Ab1PGpLCFyxu7w9oZoyRfcvZPys1cLRoCtyFYBGGjAs7pn5wq6cUv8+oH212qvg49YPE nWKFrk83owFLc/cgiwPArS1n5oC8xXT+AYpJQZ0NpqA1u22K3Jm+WKssBlZP1+D1H4fIsfioX4+WX tdcWGcsEMR7GTClqrtYw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.96 #2 (Red Hat Linux)) id 1qan08-00AWjC-0j; Tue, 29 Aug 2023 00:54:36 +0000 Received: from out-248.mta0.migadu.com ([2001:41d0:1004:224b::f8]) by bombadil.infradead.org with esmtps (Exim 4.96 #2 (Red Hat Linux)) id 1qan04-00AWhj-28 for linux-riscv@lists.infradead.org; Tue, 29 Aug 2023 00:54:35 +0000 Message-ID: <7b01b195-ee7e-b400-76f2-8b9085ac28bb@linux.dev> DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1693270465; h=from:from:reply-to: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:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=kiAocASxCH7x27u5cYdC0uVadmL5/wCWLX59Dc7Q268=; b=XIwv72SDgPazeikBq9fMVMvKUCuoy5KGai+SCx7SfWnfRo6nRIlaiYMWnlNxKrkhLpy5CQ Pgcq5QKzYysOqQlDRfAmkSCLsub8AJaPC0gOQkjxK/iCXABkDhSAjSxkLfBS7kFKr+veOQ tNFVIDKD//kpzlqRkIRx66i8zpV+ZKw= Date: Mon, 28 Aug 2023 20:54:21 -0400 MIME-Version: 1.0 Subject: Re: WARNING: CPU: 3 PID: 261 at kernel/bpf/memalloc.c:342 Content-Language: en-US To: Hou Tao , =?UTF-8?B?QmrDtnJuIFTDtnBlbA==?= , bpf@vger.kernel.org Cc: linux-riscv@lists.infradead.org, Alexei Starovoitov References: <87jztjmmy4.fsf@all.your.base.are.belong.to.us> <2f4f0dfc-ec06-8ac8-a56a-395cc2373def@linux.dev> <200dcce6-34ff-83e0-02fb-709a24403cc6@huaweicloud.com> <87zg2e88ds.fsf@all.your.base.are.belong.to.us> <64873e42-9be1-1812-b80d-5ea86b4677f0@huaweicloud.com> <87sf8684ex.fsf@all.your.base.are.belong.to.us> <878r9wswwy.fsf@all.your.base.are.belong.to.us> <65c9e8d9-7682-2c8d-cd4d-9f0ca1213066@huaweicloud.com> X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Yonghong Song In-Reply-To: <65c9e8d9-7682-2c8d-cd4d-9f0ca1213066@huaweicloud.com> X-Migadu-Flow: FLOW_OUT X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20230828_175433_502921_38BCA8BE X-CRM114-Status: GOOD ( 26.86 ) X-BeenThere: linux-riscv@lists.infradead.org X-Mailman-Version: 2.1.34 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: yonghong.song@linux.dev Content-Transfer-Encoding: base64 Content-Type: text/plain; charset="utf-8"; Format="flowed" Sender: "linux-riscv" Errors-To: linux-riscv-bounces+linux-riscv=archiver.kernel.org@lists.infradead.org CgpPbiA4LzI4LzIzIDY6NTcgQU0sIEhvdSBUYW8gd3JvdGU6Cj4gSGksCj4gCj4gT24gOC8yNy8y MDIzIDEwOjUzIFBNLCBZb25naG9uZyBTb25nIHdyb3RlOgo+Pgo+Pgo+PiBPbiA4LzI3LzIzIDE6 MzcgQU0sIEJqw7ZybiBUw7ZwZWwgd3JvdGU6Cj4+PiBCasO2cm4gVMO2cGVsIDxiam9ybkBrZXJu ZWwub3JnPiB3cml0ZXM6Cj4+Pgo+Pj4+IEhvdSBUYW8gPGhvdXRhb0BodWF3ZWljbG91ZC5jb20+ IHdyaXRlczoKPj4+Pgo+Pj4+PiBIaSwKPj4+Pj4KPj4+Pj4gT24gOC8yNi8yMDIzIDU6MjMgUE0s IEJqw7ZybiBUw7ZwZWwgd3JvdGU6Cj4+Pj4+PiBIb3UgVGFvIDxob3V0YW9AaHVhd2VpY2xvdWQu Y29tPiB3cml0ZXM6Cj4+Pj4+Pgo+Pj4+Pj4+IEhpLAo+Pj4+Pj4+Cj4+Pj4+Pj4gT24gOC8yNS8y MDIzIDExOjI4IFBNLCBZb25naG9uZyBTb25nIHdyb3RlOgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBPbiA4 LzI1LzIzIDM6MzIgQU0sIEJqw7ZybiBUw7ZwZWwgd3JvdGU6Cj4+Pj4+Pj4+PiBJJ20gY2hhc2lu ZyBhIHdvcmtxdWV1ZSBoYW5nIG9uIFJJU0MtVi9xZW11IChUQ0cpLCB1c2luZyB0aGUgYnBmCj4+ Pj4+Pj4+PiBzZWxmdGVzdHMgb24gYnBmLW5leHQgOWUzYjQ3YWJlYjhmLgo+Pj4+Pj4+Pj4KPj4+ Pj4+Pj4+IEknbSBhYmxlIHRvIHJlcHJvZHVjZSB0aGUgaGFuZyBieSBtdWx0aXBsZSBydW5zIG9m Ogo+Pj4+Pj4+Pj4gIMKgwqAgfCAuL3Rlc3RfcHJvZ3MgLWEgbGlua19hcGkgLWEgbGlua2VkX2xp c3QKPj4+Pj4+Pj4+IEknbSBjdXJyZW50bHkgaW52ZXN0aWdhdGluZyB0aGF0Lgo+Pj4+Pj4+Pj4K Pj4+Pj4+Pj4+IEJ1dCEgU29tZXRpbWVzIChldmVyeSBibHVlIG1vb24pIEkgZ2V0IGEgd2Fybl9v bl9vbmNlIGhpdDoKPj4+Pj4+Pj4+ICDCoMKgIHwgLS0tLS0tLS0tLS0tWyBjdXQgaGVyZSBdLS0t LS0tLS0tLS0tCj4+Pj4+Pj4+PiAgwqDCoCB8IFdBUk5JTkc6IENQVTogMyBQSUQ6IDI2MSBhdCBr ZXJuZWwvYnBmL21lbWFsbG9jLmM6MzQyCj4+Pj4+Pj4+PiBicGZfbWVtX3JlZmlsbCsweDFmYy8w eDIwNgo+Pj4+Pj4+Pj4gIMKgwqAgfCBNb2R1bGVzIGxpbmtlZCBpbjogYnBmX3Rlc3Rtb2QoT0Up Cj4+Pj4+Pj4+PiAgwqDCoCB8IENQVTogMyBQSUQ6IDI2MSBDb21tOiB0ZXN0X3Byb2dzLWNwdXYg VGFpbnRlZDogR8KgwqDCoMKgwqDCoMKgwqDCoMKgIE9FCj4+Pj4+Pj4+PiBOIDYuNS4wLXJjNS0w MTc0My1nZGNiMTUyYmI4MzI4ICMyCj4+Pj4+Pj4+PiAgwqDCoCB8IEhhcmR3YXJlIG5hbWU6IHJp c2N2LXZpcnRpbyxxZW11IChEVCkKPj4+Pj4+Pj4+ICDCoMKgIHwgZXBjIDogYnBmX21lbV9yZWZp bGwrMHgxZmMvMHgyMDYKPj4+Pj4+Pj4+ICDCoMKgIHzCoCByYSA6IGlycV93b3JrX3NpbmdsZSsw eDY4LzB4NzAKPj4+Pj4+Pj4+ICDCoMKgIHwgZXBjIDogZmZmZmZmZmY4MDFiMWJjNCByYSA6IGZm ZmZmZmZmODAxNWZlODQgc3AgOgo+Pj4+Pj4+Pj4gZmYyMDAwMDAwMDAxYmUyMAo+Pj4+Pj4+Pj4g IMKgwqAgfMKgIGdwIDogZmZmZmZmZmY4MmQyNjEzOCB0cCA6IGZmNjAwMDAwODQ3N2E4MDAgdDAg Ogo+Pj4+Pj4+Pj4gMDAwMDAwMDAwMDA0NjYwMAo+Pj4+Pj4+Pj4gIMKgwqAgfMKgIHQxIDogZmZm ZmZmZmY4MTJiNmRkYyB0MiA6IDAwMDAwMDAwMDAwMDAwMDAgczAgOgo+Pj4+Pj4+Pj4gZmYyMDAw MDAwMDAxYmU3MAo+Pj4+Pj4+Pj4gIMKgwqAgfMKgIHMxIDogZmY1ZmZmZmZmZmZlODk5OCBhMCA6 IGZmNWZmZmZmZmZmZTg5OTggYTEgOgo+Pj4+Pj4+Pj4gZmY2MDAwMDNmZWY0YjAwMAo+Pj4+Pj4+ Pj4gIMKgwqAgfMKgIGEyIDogMDAwMDAwMDAwMDAwMDAzZiBhMyA6IGZmZmZmZmZmODAwMDgyNTAg YTQgOgo+Pj4+Pj4+Pj4gMDAwMDAwMDAwMDAwMDA2MAo+Pj4+Pj4+Pj4gIMKgwqAgfMKgIGE1IDog MDAwMDAwMDAwMDAwMDA4MCBhNiA6IDAwMDAwMDAwMDAwMDAwMDAgYTcgOgo+Pj4+Pj4+Pj4gMDAw MDAwMDAwMDczNTA0OQo+Pj4+Pj4+Pj4gIMKgwqAgfMKgIHMyIDogZmY1ZmZmZmZmZmZlODk5OCBz MyA6IDAwMDAwMDAwMDAwMDAwMjIgczQgOgo+Pj4+Pj4+Pj4gMDAwMDAwMDAwMDAwMTAwMAo+Pj4+ Pj4+Pj4gIMKgwqAgfMKgIHM1IDogMDAwMDAwMDAwMDAwMDAwNyBzNiA6IGZmNWZmZmZmZmZmZTg1 NzAgczcgOgo+Pj4+Pj4+Pj4gZmZmZmZmZmY4MmQ2YmQzMAo+Pj4+Pj4+Pj4gIMKgwqAgfMKgIHM4 IDogMDAwMDAwMDAwMDAwMDAzZiBzOSA6IGZmZmZmZmZmODJkMmM1ZTggczEwOgo+Pj4+Pj4+Pj4g MDAwMDAwMDAwMDAwZmZmZgo+Pj4+Pj4+Pj4gIMKgwqAgfMKgIHMxMTogZmZmZmZmZmY4MmQyYzVk OCB0MyA6IGZmZmZmZmZmODFlYThmMjggdDQgOgo+Pj4+Pj4+Pj4gMDAwMDAwMDAwMDAwMDAwMAo+ Pj4+Pj4+Pj4gIMKgwqAgfMKgIHQ1IDogZmY2MDAwMDA4ZmQyODI3OCB0NiA6IDAwMDAwMDAwMDAw NDAwMDAKPj4+Pj4+Pj4+ICDCoMKgIHwgc3RhdHVzOiAwMDAwMDAwMjAwMDAwMTAwIGJhZGFkZHI6 IDAwMDAwMDAwMDAwMDAwMDAgY2F1c2U6Cj4+Pj4+Pj4+PiAwMDAwMDAwMDAwMDAwMDAzCj4+Pj4+ Pj4+PiAgwqDCoCB8IFs8ZmZmZmZmZmY4MDFiMWJjND5dIGJwZl9tZW1fcmVmaWxsKzB4MWZjLzB4 MjA2Cj4+Pj4+Pj4+PiAgwqDCoCB8IFs8ZmZmZmZmZmY4MDE1ZmU4ND5dIGlycV93b3JrX3Npbmds ZSsweDY4LzB4NzAKPj4+Pj4+Pj4+ICDCoMKgIHwgWzxmZmZmZmZmZjgwMTVmZWI0Pl0gaXJxX3dv cmtfcnVuX2xpc3QrMHgyOC8weDM2Cj4+Pj4+Pj4+PiAgwqDCoCB8IFs8ZmZmZmZmZmY4MDE1ZmVm YT5dIGlycV93b3JrX3J1bisweDM4LzB4NjYKPj4+Pj4+Pj4+ICDCoMKgIHwgWzxmZmZmZmZmZjgw MDA4MjhhPl0gaGFuZGxlX0lQSSsweDNhLzB4YjQKPj4+Pj4+Pj4+ICDCoMKgIHwgWzxmZmZmZmZm ZjgwMGE1YzNhPl0gaGFuZGxlX3BlcmNwdV9kZXZpZF9pcnErMHhhNC8weDFmOAo+Pj4+Pj4+Pj4g IMKgwqAgfCBbPGZmZmZmZmZmODAwOWZhZmE+XSBnZW5lcmljX2hhbmRsZV9kb21haW5faXJxKzB4 MjgvMHgzNgo+Pj4+Pj4+Pj4gIMKgwqAgfCBbPGZmZmZmZmZmODAwYWU1NzA+XSBpcGlfbXV4X3By b2Nlc3MrMHhhYy8weGZhCj4+Pj4+Pj4+PiAgwqDCoCB8IFs8ZmZmZmZmZmY4MDAwYThlYT5dIHNi aV9pcGlfaGFuZGxlKzB4MmUvMHg4OAo+Pj4+Pj4+Pj4gIMKgwqAgfCBbPGZmZmZmZmZmODAwOWZh ZmE+XSBnZW5lcmljX2hhbmRsZV9kb21haW5faXJxKzB4MjgvMHgzNgo+Pj4+Pj4+Pj4gIMKgwqAg fCBbPGZmZmZmZmZmODA3ZWU3MGU+XSByaXNjdl9pbnRjX2lycSsweDM2LzB4NGUKPj4+Pj4+Pj4+ ICDCoMKgIHwgWzxmZmZmZmZmZjgxMmI1ZDNhPl0gaGFuZGxlX3Jpc2N2X2lycSsweDU0LzB4ODYK Pj4+Pj4+Pj4+ICDCoMKgIHwgWzxmZmZmZmZmZjgxMmI2OTA0Pl0gZG9faXJxKzB4NjYvMHg5OAo+ Pj4+Pj4+Pj4gIMKgwqAgfCAtLS1bIGVuZCB0cmFjZSAwMDAwMDAwMDAwMDAwMDAwIF0tLS0KPj4+ Pj4+Pj4+Cj4+Pj4+Pj4+PiBDb2RlOgo+Pj4+Pj4+Pj4gIMKgwqAgfCBzdGF0aWMgdm9pZCBmcmVl X2J1bGsoc3RydWN0IGJwZl9tZW1fY2FjaGUgKmMpCj4+Pj4+Pj4+PiAgwqDCoCB8IHsKPj4+Pj4+ Pj4+ICDCoMKgIHzCoMKgwqDCoCBzdHJ1Y3QgYnBmX21lbV9jYWNoZSAqdGd0ID0gYy0+dGd0Owo+ Pj4+Pj4+Pj4gIMKgwqAgfMKgwqDCoMKgIHN0cnVjdCBsbGlzdF9ub2RlICpsbG5vZGUsICp0Owo+ Pj4+Pj4+Pj4gIMKgwqAgfMKgwqDCoMKgIHVuc2lnbmVkIGxvbmcgZmxhZ3M7Cj4+Pj4+Pj4+PiAg wqDCoCB8wqDCoMKgwqAgaW50IGNudDsKPj4+Pj4+Pj4+ICDCoMKgIHwKPj4+Pj4+Pj4+ICDCoMKg IHzCoMKgwqDCoCBXQVJOX09OX09OQ0UodGd0LT51bml0X3NpemUgIT0gYy0+dW5pdF9zaXplKTsK Pj4+Pj4+Pj4+ICDCoMKgIHwgLi4uCj4+Pj4+Pj4+Pgo+Pj4+Pj4+Pj4gSSdtIG5vdCB3ZWxsIHZl cnNlZCBpbiB0aGUgbWVtb3J5IGFsbG9jYXRvcjsgQmVmb3JlIEkgZGl2ZSBpbnRvCj4+Pj4+Pj4+ PiBpdCAtLQo+Pj4+Pj4+Pj4gaGFzIGFueW9uZSBlbHNlIGhpdCBpdD8gSWRlYXMgb24gd2h5IHRo ZSB3YXJuX29uX29uY2UgaXMgaGl0Pwo+Pj4+Pj4+PiBNYXliZSB0YWtlIGEgbG9vayBhdCB0aGUg cGF0Y2gKPj4+Pj4+Pj4gIMKgwqAgODIyZmIyNmJkYjU1wqAgYnBmOiBBZGQgYSBoaW50IHRvIGFs bG9jYXRlZCBvYmplY3RzLgo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBJbiB0aGUgYWJvdmUgcGF0Y2gsIHdl IGhhdmUKPj4+Pj4+Pj4KPj4+Pj4+Pj4gK8KgwqDCoMKgwqDCoCAvKgo+Pj4+Pj4+PiArwqDCoMKg wqDCoMKgwqAgKiBSZW1lbWJlciBicGZfbWVtX2NhY2hlIHRoYXQgYWxsb2NhdGVkIHRoaXMgb2Jq ZWN0Lgo+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgwqAgKiBUaGUgaGludCBpcyBub3QgYWNjdXJhdGUu Cj4+Pj4+Pj4+ICvCoMKgwqDCoMKgwqDCoCAqLwo+Pj4+Pj4+PiArwqDCoMKgwqDCoMKgIGMtPnRn dCA9ICooc3RydWN0IGJwZl9tZW1fY2FjaGUgKiopbGxub2RlOwo+Pj4+Pj4+Pgo+Pj4+Pj4+PiBJ IHN1c3BlY3QgdGhhdCB0aGUgd2FybmluZyBtYXkgYmUgcmVsYXRlZCB0byB0aGUgYWJvdmUuCj4+ Pj4+Pj4+IEkgdHJpZWQgdGhlIGFib3ZlIC4vdGVzdF9wcm9ncyBjb21tYW5kIGxpbmUgKHJ1bm5p bmcgbXVsdGlwbGUKPj4+Pj4+Pj4gYXQgdGhlIHNhbWUgdGltZSkgYW5kIGRpZG4ndCB0cmlnZ2Vy IHRoZSBpc3N1ZS4KPj4+Pj4+PiBUaGUgZXh0cmEgOC1ieXRlcyBiZWZvcmUgdGhlIGZyZWVkIHBv aW50ZXIgaXMgdXNlZCB0byBzYXZlIHRoZQo+Pj4+Pj4+IHBvaW50ZXIKPj4+Pj4+PiBvZiB0aGUg b3JpZ2luYWwgYnBmIG1lbW9yeSBhbGxvY2F0b3Igd2hlcmUgdGhlIGZyZWVkIHBvaW50ZXIgY2Ft ZQo+Pj4+Pj4+IGZyb20sCj4+Pj4+Pj4gc28gdW5pdF9mcmVlKCkgY291bGQgZnJlZSB0aGUgcG9p bnRlciBiYWNrIHRvIHRoZSBvcmlnaW5hbAo+Pj4+Pj4+IGFsbG9jYXRvciB0bwo+Pj4+Pj4+IHBy ZXZlbnQgYWxsb2MtYW5kLWZyZWUgdW5iYWxhbmNlLgo+Pj4+Pj4+Cj4+Pj4+Pj4gSSBzdXNwZWN0 IHRoYXQgYSB3cm9uZyBwb2ludGVyIHdhcyBwYXNzZWQgdG8gYnBmX29ial9kcm9wLCBidXQgZG8K Pj4+Pj4+PiBub3QKPj4+Pj4+PiBmaW5kIGFueXRoaW5nIHN1c3BpY2lvdXMgYWZ0ZXIgY2hlY2tp bmcgbGlua2VkX2xpc3QuIEFub3RoZXIKPj4+Pj4+PiBwb3NzaWJpbGl0eQo+Pj4+Pj4+IGlzIHRo YXQgdGhlcmUgaXMgd3JpdGUtYWZ0ZXItZnJlZSBwcm9ibGVtIHdoaWNoIGNvcnJ1cHRzIHRoZSBl eHRyYQo+Pj4+Pj4+IDgtYnl0ZXMgYmVmb3JlIHRoZSBmcmVlZCBwb2ludGVyLiBDb3VsZCB5b3Ug cGxlYXNlIGFwcGx5IHRoZQo+Pj4+Pj4+IGZvbGxvd2luZwo+Pj4+Pj4+IGRlYnVnIHBhdGNoIHRv IGNoZWNrIHdoZXRoZXIgb3Igbm90IHRoZSBleHRyYSA4LWJ5dGVzIGFyZQo+Pj4+Pj4+IGNvcnJ1 cHRlZCA/Cj4+Pj4+PiBUaGFua3MgZm9yIGdldHRpbmcgYmFjayEKPj4+Pj4+Cj4+Pj4+PiBJIHRv b2sgeW91ciBwYXRjaCBmb3IgYSBydW4sIGFuZCB0aGVyZSdzIGEgaGl0Ogo+Pj4+Pj4gIMKgwqAg fCBiYWQgY2FjaGUgZmY1ZmZmZmZmZmZlODU3MDogZ290IHNpemUgOTYgd29yawo+Pj4+Pj4gZmZm ZmZmZmY4MDFiMTljOCwgY2FjaGUgZmY1ZmZmZmZmZmZlODk4MCBleHAgc2l6ZSAxMjggd29yawo+ Pj4+Pj4gZmZmZmZmZmY4MDFiMTljOAo+Pj4+Pgo+Pj4+PiBUaGUgZXh0cmEgOC1ieXRlcyBhcmUg bm90IGNvcnJ1cHRlZC4gQm90aCBvZiB0aGVzZSB0d28KPj4+Pj4gYnBmX21lbV9jYWNoZSBhcmUK Pj4+Pj4gdmFsaWQgYW5kIHRoZXJlIGFyZSBpbiB0aGUgY2FjaGUgYXJyYXkgZGVmaW5lZCBpbiBi cGZfbWVtX2NhY2hlcy4gQlBGCj4+Pj4+IG1lbW9yeSBhbGxvY2F0b3IgYWxsb2NhdGVkIHRoZSBw b2ludGVyIGZyb20gOTYtYnl0ZXMgc2l6ZWQtY2FjaGUsCj4+Pj4+IGJ1dCBpdAo+Pj4+PiB0cmll ZCB0byBmcmVlIHRoZSBwb2ludGVyIHRocm91Z2ggMTI4LWJ5dGVzIHNpemVkLWNhY2hlLgo+Pj4+ Pgo+Pj4+PiBOb3cgSSBzdXNwZWN0IHRoZXJlIGlzIG5vIDk2LWJ5dGVzIHNsYWIgaW4geW91ciBz eXN0ZW0gYW5kIGtzaXplKHB0ciAtCj4+Pj4+IExMSVNUX05PREVfU1opIHJldHVybnMgMTI4LCBz byBicGYgbWVtb3J5IGFsbG9jYXRvciBzZWxlY3RlZCB0aGUKPj4+Pj4gMTI4LWJ5dGUgc2l6ZWQt Y2FjaGUgaW5zdGVhZCBvZiA5Ni1ieXRlcyBzaXplZC1jYWNoZS4gQ291bGQgeW91IHBsZWFzZQo+ Pj4+PiBjaGVjayB0aGUgdmFsdWUgb2YgS01BTExPQ19NSU5fU0laRSBpbiB5b3VyIGtlcm5lbCAu Y29uZmlnIGFuZAo+Pj4+PiB1c2luZyB0aGUKPj4+Pj4gZm9sbG93aW5nIGNvbW1hbmQgdG8gY2hl Y2sgd2hldGhlciB0aGVyZSBpcyA5Ni1ieXRlcyBzbGFiIGluIHlvdXIKPj4+Pj4gc3lzdGVtOgo+ Pj4+Cj4+Pj4gS01BTExPQ19NSU5fU0laRSBpcyA2NC4KPj4+Pgo+Pj4+PiAkIGNhdCAvcHJvYy9z bGFiaW5mbyB8Z3JlcCBrbWFsbG9jLTk2Cj4+Pj4+IGRtYS1rbWFsbG9jLTk2wqDCoMKgwqDCoMKg wqDCoCAwwqDCoMKgwqDCoCAwwqDCoMKgwqAgOTbCoMKgIDQywqDCoMKgIDEgOiB0dW5hYmxlc8Kg wqDCoCAwwqDCoMKgIDAKPj4+Pj4gMCA6IHNsYWJkYXRhwqDCoMKgwqDCoCAwwqDCoMKgwqDCoCAw wqDCoMKgwqDCoCAwCj4+Pj4+IGttYWxsb2MtOTbCoMKgwqDCoMKgwqDCoMKgwqAgMTg2NcKgwqAg MjI2OMKgwqDCoMKgIDk2wqDCoCA0MsKgwqDCoCAxIDogdHVuYWJsZXPCoMKgwqAgMMKgwqDCoCAw Cj4+Pj4+IDAgOiBzbGFiZGF0YcKgwqDCoMKgIDU0wqDCoMKgwqAgNTTCoMKgwqDCoMKgIDAKPj4+ Pj4KPj4+Pj4gSW4gbXkgc3lzdGVtLCBzbGFiIGhhcyA5Ni1ieXRlcyBjYWNoZWQsIHNvIGdyZXAg b3V0cHV0cyBzb21ldGhpbmcsCj4+Pj4+IGJ1dCBJCj4+Pj4+IHRoaW5rIHRoZXJlIHdpbGwgbm8g b3V0cHV0IGluIHlvdXIgc3lzdGVtLgo+Pj4+Cj4+Pj4gWW91J3JlIHJpZ2h0ISBObyBrbWFsbG9j LTk2Lgo+Pj4KPj4+IFRvIGdldCByaWQgb2YgdGhlIHdhcm5pbmcsIGxpbWl0IGF2YWlsYWJsZSBz aXplcyBmcm9tCj4+PiBicGZfbWVtX2FsbG9jX2luaXQoKT8KPiAKPiBJdCBpcyBub3QgZW5vdWdo LiBXZSBuZWVkIHRvIGFkanVzdCBzaXplX2luZGV4IGFjY29yZGluZ2x5IGR1cmluZwo+IGluaXRp YWxpemF0aW9uLiBDb3VsZCB5b3UgcGxlYXNlIHRyeSB0aGUgYXR0YWNoZWQgcGF0Y2ggYmVsb3cg PyBJdCBpcwo+IG5vdCBhIGZvcm1hbCBwYXRjaCBhbmQgSSBhbSBjb25zaWRlcmluZyB0byBkaXNh YmxlIHByZWZpbGxpbmcgZm9yIHRoZXNlCj4gcmVkaXJlY3RlZCBicGZfbWVtX2NhY2hlcy4KPj4K Pj4gRG8geW91IGtub3cgd2h5IHlvdXIgc3lzdGVtIGRvZXMgbm90IGhhdmUga21hbGxvYy05Nj8K PiAKPiBBY2NvcmRpbmcgdG8gdGhlIGltcGxlbWVudGF0aW9uIG9mIHNldHVwX2ttYWxsb2NfY2Fj aGVfaW5kZXhfdGFibGUoKSBhbmQKPiBjcmVhdGVfa21hbGxvY19jYWNoZXMoKSzCoCB3aGVuIEtN QUxMT0NfTUlOX1NJWkUgaXMgZ3JlYXRlciB0aGFuIDY0LAo+IGttYWxsb2MtOTYgd2lsbCBiZSBv bWl0dGVkLiBJZiBLTUFMTE9DX01JTl9TSVpFIGlzIGdyZWF0ZXIgdGhhbiAxMjgsCj4ga21hbGxv Yy0xOTIgd2lsbCBiZSBvbWl0dGVkIGFzIHdlbGwuCgpUaGFua3MhIFRoaXMgaW5kZWVkIHRoZSBj YXNlIGV4Y2VwdCB0aGUgYWJvdmUgJ2dyZWF0ZXIgdGhhbicgc2hvdWxkIGJlCidncmVhdGVyIHRo YW4gb3IgZXF1YWwgdG8nLiBGb3IgZXhhbXBsZSwgZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDY0 Cm1lYW5zIHRoZSBtaW5pbXVtIGFsaWdubWVudCBpcyA2NCwgc28gOTYgaXMgcmVtb3ZlZC4gU2lt aWxhciBmb3IKZ3JlYXRlciB0aGFuIG9yIGVxdWFsIHRvIDEyOC4KCkkgYWdyZWUgaXQgaXMgYSBn b29kIGlkZWEgdG8gYWxpZ24gbWVtYWxsb2MgY2FjaGUgdW5pdCBzaXplIG1hdGNoaW5nCnVuZGVy bHlpbmcga21hbGxvYyBjYWNoZSB1bml0IHNpemUuCgo+Pgo+Pj4KPj4+Cj4+PiBCasO2cm4KPj4K Pj4gLgo+IAoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18K bGludXgtcmlzY3YgbWFpbGluZyBsaXN0CmxpbnV4LXJpc2N2QGxpc3RzLmluZnJhZGVhZC5vcmcK aHR0cDovL2xpc3RzLmluZnJhZGVhZC5vcmcvbWFpbG1hbi9saXN0aW5mby9saW51eC1yaXNjdgo=