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 X-Spam-Level: X-Spam-Status: No, score=-9.6 required=3.0 tests=DKIM_SIGNED,DKIM_VALID, DKIM_VALID_AU,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=unavailable autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id D8888C2D0BF for ; Tue, 10 Dec 2019 08:06:54 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by mail.kernel.org (Postfix) with ESMTP id 993DC2077B for ; Tue, 10 Dec 2019 08:06:54 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GdRAAQdC" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1727065AbfLJIGu (ORCPT ); Tue, 10 Dec 2019 03:06:50 -0500 Received: from mail-wr1-f67.google.com ([209.85.221.67]:42525 "EHLO mail-wr1-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1727032AbfLJIGs (ORCPT ); Tue, 10 Dec 2019 03:06:48 -0500 Received: by mail-wr1-f67.google.com with SMTP id a15so18848968wrf.9; Tue, 10 Dec 2019 00:06:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7GoRrqMVjX62ovnIfLayQu397lbmVjmI5+RiUUbRiGQ=; b=GdRAAQdC6QZDUZIYk/X86ZA51nIRrjCvroKLQhl+vQNMWYaGDanM7DGEKpwca3zPHu ppBTghPnROkT+2cwPnoApk+kexmUcttpTEOHDGjP9sFmG/0QCNJJH/HUIa3O6LUDD/n2 ITNGCFFe/LqwmGna6pPDWwfbm0NBHLkEkyStYSyeSuxKAbiVKwcijmSl/keWRtj4VY76 OmK4G2aOsbj81v5cZ52R9eLEM8Yr1vCbPCH3ZWcpi1Qdaqa6fZrLXufUfnYU5ygurCSm 607C4uLL5VEa5N8yyRUBLfDUR8Xbm8eqKjohmnY8PcNmd3MpRep9+B7y8ohOHqmeINyt BCgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7GoRrqMVjX62ovnIfLayQu397lbmVjmI5+RiUUbRiGQ=; b=SBlY1ULbGY/+yraoBh4+n72LqV7DETew/keNFW+FRUtUu1c1jpSprn2YnFObQBnTaT fL9faK3EyIefcJuwOwfRGULCvOChXUjB0WS7uIEdsafGTDl03HJUxG1GKy64zc7KGdcT 7Blew+xF6gOJQUtL2LNDVWHH4mkBdJHrDWqp+fAXJ66n2KrbIyuB2Ae0S+lBIHiD2HXp WO5RGcjuP6q8VnF3nr6fK4uds9BUCYIoxp96Q47Y2YsUFInFYOPBZjDSKzpoCR81x7ef eQ7JHGCPR/qBy9rc5i6IzQ5LPT4ieIoAfCxLErSpHkhD/eXgDPfAZR0OqXXRcYlJt4W9 B32g== X-Gm-Message-State: APjAAAUjOyFNRyuXLvdAly8JTvhU99RlyTZfw4ZGF6DJl6xw4UeWOyFk kkQq5HCguXISN2wRCnVSsSw= X-Google-Smtp-Source: APXvYqzH9cYr9GL5jOU9NlCTPtbT6Sylija6v00hFlZeRgKAwbbYW8L0T8jLsHZY4duoYruQpEfytA== X-Received: by 2002:adf:f504:: with SMTP id q4mr1468459wro.299.1575965205566; Tue, 10 Dec 2019 00:06:45 -0800 (PST) Received: from localhost.localdomain (x2f7fae7.dyn.telefonica.de. [2.247.250.231]) by smtp.gmail.com with ESMTPSA id a16sm2342587wrt.37.2019.12.10.00.06.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Dec 2019 00:06:44 -0800 (PST) From: SeongJae Park X-Google-Original-From: SeongJae Park To: sjpark@amazon.com Cc: axboe@kernel.dk, konrad.wilk@oracle.com, linux-block@vger.kernel.org, linux-kernel@vger.kernel.org, pdurrant@amazon.com, roger.pau@citrix.com, sj38.park@gmail.com, xen-devel@lists.xenproject.org, SeongJae Park Subject: [PATCH v5 2/2] xen/blkback: Squeeze page pools if a memory pressure is detected Date: Tue, 10 Dec 2019 08:06:28 +0000 Message-Id: <20191210080628.5264-3-sjpark@amazon.de> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191210080628.5264-1-sjpark@amazon.de> References: <20191210080628.5264-1-sjpark@amazon.de> Sender: linux-block-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-block@vger.kernel.org Each `blkif` has a free pages pool for the grant mapping. The size of the pool starts from zero and be increased on demand while processing the I/O requests. If current I/O requests handling is finished or 100 milliseconds has passed since last I/O requests handling, it checks and shrinks the pool to not exceed the size limit, `max_buffer_pages`. Therefore, `blkfront` running guests can cause a memory pressure in the `blkback` running guest by attaching a large number of block devices and inducing I/O. System administrators can avoid such problematic situations by limiting the maximum number of devices each guest can attach. However, finding the optimal limit is not so easy. Improper set of the limit can results in the memory pressure or a resource underutilization. This commit avoids such problematic situations by squeezing the pools (returns every free page in the pool to the system) for a while (users can set this duration via a module parameter) if a memory pressure is detected. Discussions =========== The `blkback`'s original shrinking mechanism returns only pages in the pool, which are not currently be used by `blkback`, to the system. In other words, the pages are not mapped with foreign pages. Because this commit is changing only the shrink limit but uses the mechanism as is, this commit does not introduce improper mappings related security issues. Once a memory pressure is detected, this commit keeps the squeezing limit for a user-specified time duration. The duration should be neither too long nor too short. If it is too long, the squeezing incurring overhead can reduce the I/O performance. If it is too short, `blkback` will not free enough pages to reduce the memory pressure. This commit sets the value as `10 milliseconds` by default because it is a short time in terms of I/O while it is a long time in terms of memory operations. Also, as the original shrinking mechanism works for at least every 100 milliseconds, this could be a somewhat reasonable choice. I also tested other durations (refer to the below section for more details) and confirmed that 10 milliseconds is the one that works best with the test. That said, the proper duration depends on actual configurations and workloads. That's why this commit is allowing users to set it as their optimal value via the module parameter. Memory Pressure Test ==================== To show how this commit fixes the memory pressure situation well, I configured a test environment on a xen-running virtualization system. On the `blkfront` running guest instances, I attach a large number of network-backed volume devices and induce I/O to those. Meanwhile, I measure the number of pages that swapped in and out on the `blkback` running guest. The test ran twice, once for the `blkback` before this commit and once for that after this commit. As shown below, this commit has dramatically reduced the memory pressure: pswpin pswpout before 76,672 185,799 after 212 3,325 Optimal Aggressive Shrinking Duration ------------------------------------- To find a best squeezing duration, I repeated the test with three different durations (1ms, 10ms, and 100ms). The results are as below: duration pswpin pswpout 1 852 6,424 10 212 3,325 100 203 3,340 As expected, the memory pressure has decreased as the duration is increased, but the reduction stopped from the `10ms`. Based on this results, I chose the default duration as 10ms. Performance Overhead Test ========================= This commit could incur I/O performance degradation under severe memory pressure because the squeezing will require more page allocations per I/O. To show the overhead, I artificially made a worst-case squeezing situation and measured the I/O performance of a `blkfront` running guest. For the artificial squeezing, I set the `blkback.max_buffer_pages` using the `/sys/module/xen_blkback/parameters/max_buffer_pages` file. We set the value to `1024` and `0`. The `1024` is the default value. Setting the value as `0` is same to a situation doing the squeezing always (worst-case). For the I/O performance measurement, I use a simple `dd` command. Default Performance ------------------- [dom0]# echo 1024 > /sys/module/xen_blkback/parameters/max_buffer_pages [instance]$ for i in {1..5}; do dd if=/dev/zero of=file bs=4k count=$((256*512)); sync; done 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 11.7257 s, 45.8 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8827 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8781 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8737 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8702 s, 38.7 MB/s Worst-case Performance ---------------------- [dom0]# echo 0 > /sys/module/xen_blkback/parameters/max_buffer_pages [instance]$ for i in {1..5}; do dd if=/dev/zero of=file bs=4k count=$((256*512)); sync; done 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 11.7257 s, 45.8 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.878 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8746 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8786 s, 38.7 MB/s 131072+0 records in 131072+0 records out 536870912 bytes (537 MB) copied, 13.8749 s, 38.7 MB/s In short, even worst case squeezing makes no visible performance degradation. I think this is due to the slow speed of the I/O. In other words, the additional page allocation overhead is hidden under the much slower I/O latency. Nevertheless, pleaset note that this is just a very simple and minimal test. Reviewed-by: Juergen Gross Signed-off-by: SeongJae Park --- drivers/block/xen-blkback/blkback.c | 23 +++++++++++++++++++++-- drivers/block/xen-blkback/common.h | 1 + drivers/block/xen-blkback/xenbus.c | 3 ++- 3 files changed, 24 insertions(+), 3 deletions(-) diff --git a/drivers/block/xen-blkback/blkback.c b/drivers/block/xen-blkback/blkback.c index fd1e19f1a49f..4d4dba7ea721 100644 --- a/drivers/block/xen-blkback/blkback.c +++ b/drivers/block/xen-blkback/blkback.c @@ -142,6 +142,22 @@ static inline bool persistent_gnt_timeout(struct persistent_gnt *persistent_gnt) HZ * xen_blkif_pgrant_timeout); } +/* Once a memory pressure is detected, squeeze free page pools for a while. */ +static int xen_blkif_buffer_squeeze_duration_ms = 10; +module_param_named(buffer_squeeze_duration_ms, + xen_blkif_buffer_squeeze_duration_ms, int, 0644); +MODULE_PARM_DESC(buffer_squeeze_duration_ms, +"Duration in ms to squeeze pages buffer when a memory pressure is detected"); + +static unsigned long xen_blk_buffer_squeeze_end; + +unsigned xen_blkbk_reclaim(struct xenbus_device *dev) +{ + xen_blk_buffer_squeeze_end = jiffies + + msecs_to_jiffies(xen_blkif_buffer_squeeze_duration_ms); + return 0; +} + static inline int get_free_page(struct xen_blkif_ring *ring, struct page **page) { unsigned long flags; @@ -656,8 +672,11 @@ int xen_blkif_schedule(void *arg) ring->next_lru = jiffies + msecs_to_jiffies(LRU_INTERVAL); } - /* Shrink if we have more than xen_blkif_max_buffer_pages */ - shrink_free_pagepool(ring, xen_blkif_max_buffer_pages); + /* Shrink the free pages pool if it is too large. */ + if (time_before(jiffies, xen_blk_buffer_squeeze_end)) + shrink_free_pagepool(ring, 0); + else + shrink_free_pagepool(ring, xen_blkif_max_buffer_pages); if (log_stats && time_after(jiffies, ring->st_print)) print_stats(ring); diff --git a/drivers/block/xen-blkback/common.h b/drivers/block/xen-blkback/common.h index 1d3002d773f7..c0334cda79fe 100644 --- a/drivers/block/xen-blkback/common.h +++ b/drivers/block/xen-blkback/common.h @@ -383,6 +383,7 @@ irqreturn_t xen_blkif_be_int(int irq, void *dev_id); int xen_blkif_schedule(void *arg); int xen_blkif_purge_persistent(void *arg); void xen_blkbk_free_caches(struct xen_blkif_ring *ring); +unsigned xen_blkbk_reclaim(struct xenbus_device *dev); int xen_blkbk_flush_diskcache(struct xenbus_transaction xbt, struct backend_info *be, int state); diff --git a/drivers/block/xen-blkback/xenbus.c b/drivers/block/xen-blkback/xenbus.c index b90dbcd99c03..de49a09e6933 100644 --- a/drivers/block/xen-blkback/xenbus.c +++ b/drivers/block/xen-blkback/xenbus.c @@ -1115,7 +1115,8 @@ static struct xenbus_driver xen_blkbk_driver = { .ids = xen_blkbk_ids, .probe = xen_blkbk_probe, .remove = xen_blkbk_remove, - .otherend_changed = frontend_changed + .otherend_changed = frontend_changed, + .reclaim = xen_blkbk_reclaim }; int xen_blkif_xenbus_init(void) -- 2.17.1 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 X-Spam-Level: X-Spam-Status: No, score=-9.3 required=3.0 tests=DKIM_ADSP_CUSTOM_MED, DKIM_INVALID,DKIM_SIGNED,FREEMAIL_FORGED_FROMDOMAIN,FREEMAIL_FROM, HEADER_FROM_DIFFERENT_DOMAINS,INCLUDES_PATCH,MAILING_LIST_MULTI,SIGNED_OFF_BY, SPF_HELO_NONE,SPF_PASS,USER_AGENT_GIT autolearn=ham autolearn_force=no version=3.4.0 Received: from mail.kernel.org (mail.kernel.org [198.145.29.99]) by smtp.lore.kernel.org (Postfix) with ESMTP id C99EFC43603 for ; Tue, 10 Dec 2019 08:07:05 +0000 (UTC) Received: from lists.xenproject.org (lists.xenproject.org [192.237.175.120]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mail.kernel.org (Postfix) with ESMTPS id 8B7622073B for ; Tue, 10 Dec 2019 08:07:05 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=fail reason="signature verification failed" (2048-bit key) header.d=gmail.com header.i=@gmail.com header.b="GdRAAQdC" DMARC-Filter: OpenDMARC Filter v1.3.2 mail.kernel.org 8B7622073B Authentication-Results: mail.kernel.org; dmarc=fail (p=none dis=none) header.from=gmail.com Authentication-Results: mail.kernel.org; spf=none smtp.mailfrom=xen-devel-bounces@lists.xenproject.org Received: from localhost ([127.0.0.1] helo=lists.xenproject.org) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ieaXn-0002SV-PE; Tue, 10 Dec 2019 08:06:55 +0000 Received: from us1-rack-iad1.inumbo.com ([172.99.69.81]) by lists.xenproject.org with esmtp (Exim 4.89) (envelope-from ) id 1ieaXm-0002S7-AK for xen-devel@lists.xenproject.org; Tue, 10 Dec 2019 08:06:54 +0000 X-Inumbo-ID: 02644d1c-1b24-11ea-a914-bc764e2007e4 Received: from mail-wr1-x442.google.com (unknown [2a00:1450:4864:20::442]) by us1-rack-iad1.inumbo.com (Halon) with ESMTPS id 02644d1c-1b24-11ea-a914-bc764e2007e4; Tue, 10 Dec 2019 08:06:46 +0000 (UTC) Received: by mail-wr1-x442.google.com with SMTP id y17so18893460wrh.5 for ; Tue, 10 Dec 2019 00:06:46 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=7GoRrqMVjX62ovnIfLayQu397lbmVjmI5+RiUUbRiGQ=; b=GdRAAQdC6QZDUZIYk/X86ZA51nIRrjCvroKLQhl+vQNMWYaGDanM7DGEKpwca3zPHu ppBTghPnROkT+2cwPnoApk+kexmUcttpTEOHDGjP9sFmG/0QCNJJH/HUIa3O6LUDD/n2 ITNGCFFe/LqwmGna6pPDWwfbm0NBHLkEkyStYSyeSuxKAbiVKwcijmSl/keWRtj4VY76 OmK4G2aOsbj81v5cZ52R9eLEM8Yr1vCbPCH3ZWcpi1Qdaqa6fZrLXufUfnYU5ygurCSm 607C4uLL5VEa5N8yyRUBLfDUR8Xbm8eqKjohmnY8PcNmd3MpRep9+B7y8ohOHqmeINyt BCgQ== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=7GoRrqMVjX62ovnIfLayQu397lbmVjmI5+RiUUbRiGQ=; b=t3/iFZjikHhxTTmk8jGBDaw3XC8ARpXQKzNrqlDlu0Gr5UZbk6VYJlYVlpNmT21qS1 WQhFnpCC9QFtkD0cSkAMR/symUfdpxobc390Hbk3YkYum23mdk20hpszN6BcOqvslgyy Mbi19HWgaM3QfYMNBlRO6JNz1wI6uH23QDeqQdqFU7DqHY880ufAMwb/u0wHQYVwbSN1 oqZ6jtv199SbygObhwrLUp+TJ2K5tyZvgYhTGjbEsa4U7KQHzC3b+F4WDAilVEQUkmxy 5eR2IleZIeYbu9UsFvPpaYmAvWgFk8/vKq0Pu0Yq53qZJhAZmQ5tjEt4xoggk1uP7u2Z dedA== X-Gm-Message-State: APjAAAUl5eUDWBS1arPCOVbDFlyOF2aUedMNT88b44Wxs2rDxJuf5Aj1 1AwecB7E30aP2+XNWrQs7jU= X-Google-Smtp-Source: APXvYqzH9cYr9GL5jOU9NlCTPtbT6Sylija6v00hFlZeRgKAwbbYW8L0T8jLsHZY4duoYruQpEfytA== X-Received: by 2002:adf:f504:: with SMTP id q4mr1468459wro.299.1575965205566; Tue, 10 Dec 2019 00:06:45 -0800 (PST) Received: from localhost.localdomain (x2f7fae7.dyn.telefonica.de. [2.247.250.231]) by smtp.gmail.com with ESMTPSA id a16sm2342587wrt.37.2019.12.10.00.06.44 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 10 Dec 2019 00:06:44 -0800 (PST) From: SeongJae Park X-Google-Original-From: SeongJae Park To: sjpark@amazon.com Date: Tue, 10 Dec 2019 08:06:28 +0000 Message-Id: <20191210080628.5264-3-sjpark@amazon.de> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20191210080628.5264-1-sjpark@amazon.de> References: <20191210080628.5264-1-sjpark@amazon.de> Subject: [Xen-devel] [PATCH v5 2/2] xen/blkback: Squeeze page pools if a memory pressure is detected X-BeenThere: xen-devel@lists.xenproject.org X-Mailman-Version: 2.1.23 Precedence: list List-Id: Xen developer discussion List-Unsubscribe: , List-Post: List-Help: List-Subscribe: , Cc: axboe@kernel.dk, sj38.park@gmail.com, konrad.wilk@oracle.com, pdurrant@amazon.com, SeongJae Park , linux-kernel@vger.kernel.org, linux-block@vger.kernel.org, xen-devel@lists.xenproject.org, roger.pau@citrix.com MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: base64 Errors-To: xen-devel-bounces@lists.xenproject.org Sender: "Xen-devel" RWFjaCBgYmxraWZgIGhhcyBhIGZyZWUgcGFnZXMgcG9vbCBmb3IgdGhlIGdyYW50IG1hcHBpbmcu ICBUaGUgc2l6ZSBvZgp0aGUgcG9vbCBzdGFydHMgZnJvbSB6ZXJvIGFuZCBiZSBpbmNyZWFzZWQg b24gZGVtYW5kIHdoaWxlIHByb2Nlc3NpbmcKdGhlIEkvTyByZXF1ZXN0cy4gIElmIGN1cnJlbnQg SS9PIHJlcXVlc3RzIGhhbmRsaW5nIGlzIGZpbmlzaGVkIG9yIDEwMAptaWxsaXNlY29uZHMgaGFz IHBhc3NlZCBzaW5jZSBsYXN0IEkvTyByZXF1ZXN0cyBoYW5kbGluZywgaXQgY2hlY2tzIGFuZApz aHJpbmtzIHRoZSBwb29sIHRvIG5vdCBleGNlZWQgdGhlIHNpemUgbGltaXQsIGBtYXhfYnVmZmVy X3BhZ2VzYC4KClRoZXJlZm9yZSwgYGJsa2Zyb250YCBydW5uaW5nIGd1ZXN0cyBjYW4gY2F1c2Ug YSBtZW1vcnkgcHJlc3N1cmUgaW4gdGhlCmBibGtiYWNrYCBydW5uaW5nIGd1ZXN0IGJ5IGF0dGFj aGluZyBhIGxhcmdlIG51bWJlciBvZiBibG9jayBkZXZpY2VzIGFuZAppbmR1Y2luZyBJL08uICBT eXN0ZW0gYWRtaW5pc3RyYXRvcnMgY2FuIGF2b2lkIHN1Y2ggcHJvYmxlbWF0aWMKc2l0dWF0aW9u cyBieSBsaW1pdGluZyB0aGUgbWF4aW11bSBudW1iZXIgb2YgZGV2aWNlcyBlYWNoIGd1ZXN0IGNh bgphdHRhY2guICBIb3dldmVyLCBmaW5kaW5nIHRoZSBvcHRpbWFsIGxpbWl0IGlzIG5vdCBzbyBl YXN5LiAgSW1wcm9wZXIKc2V0IG9mIHRoZSBsaW1pdCBjYW4gcmVzdWx0cyBpbiB0aGUgbWVtb3J5 IHByZXNzdXJlIG9yIGEgcmVzb3VyY2UKdW5kZXJ1dGlsaXphdGlvbi4gIFRoaXMgY29tbWl0IGF2 b2lkcyBzdWNoIHByb2JsZW1hdGljIHNpdHVhdGlvbnMgYnkKc3F1ZWV6aW5nIHRoZSBwb29scyAo cmV0dXJucyBldmVyeSBmcmVlIHBhZ2UgaW4gdGhlIHBvb2wgdG8gdGhlIHN5c3RlbSkKZm9yIGEg d2hpbGUgKHVzZXJzIGNhbiBzZXQgdGhpcyBkdXJhdGlvbiB2aWEgYSBtb2R1bGUgcGFyYW1ldGVy KSBpZiBhCm1lbW9yeSBwcmVzc3VyZSBpcyBkZXRlY3RlZC4KCkRpc2N1c3Npb25zCj09PT09PT09 PT09CgpUaGUgYGJsa2JhY2tgJ3Mgb3JpZ2luYWwgc2hyaW5raW5nIG1lY2hhbmlzbSByZXR1cm5z IG9ubHkgcGFnZXMgaW4gdGhlCnBvb2wsIHdoaWNoIGFyZSBub3QgY3VycmVudGx5IGJlIHVzZWQg YnkgYGJsa2JhY2tgLCB0byB0aGUgc3lzdGVtLiAgSW4Kb3RoZXIgd29yZHMsIHRoZSBwYWdlcyBh cmUgbm90IG1hcHBlZCB3aXRoIGZvcmVpZ24gcGFnZXMuICBCZWNhdXNlIHRoaXMKY29tbWl0IGlz IGNoYW5naW5nIG9ubHkgdGhlIHNocmluayBsaW1pdCBidXQgdXNlcyB0aGUgbWVjaGFuaXNtIGFz IGlzLAp0aGlzIGNvbW1pdCBkb2VzIG5vdCBpbnRyb2R1Y2UgaW1wcm9wZXIgbWFwcGluZ3MgcmVs YXRlZCBzZWN1cml0eQppc3N1ZXMuCgpPbmNlIGEgbWVtb3J5IHByZXNzdXJlIGlzIGRldGVjdGVk LCB0aGlzIGNvbW1pdCBrZWVwcyB0aGUgc3F1ZWV6aW5nCmxpbWl0IGZvciBhIHVzZXItc3BlY2lm aWVkIHRpbWUgZHVyYXRpb24uICBUaGUgZHVyYXRpb24gc2hvdWxkIGJlCm5laXRoZXIgdG9vIGxv bmcgbm9yIHRvbyBzaG9ydC4gIElmIGl0IGlzIHRvbyBsb25nLCB0aGUgc3F1ZWV6aW5nCmluY3Vy cmluZyBvdmVyaGVhZCBjYW4gcmVkdWNlIHRoZSBJL08gcGVyZm9ybWFuY2UuICBJZiBpdCBpcyB0 b28gc2hvcnQsCmBibGtiYWNrYCB3aWxsIG5vdCBmcmVlIGVub3VnaCBwYWdlcyB0byByZWR1Y2Ug dGhlIG1lbW9yeSBwcmVzc3VyZS4KVGhpcyBjb21taXQgc2V0cyB0aGUgdmFsdWUgYXMgYDEwIG1p bGxpc2Vjb25kc2AgYnkgZGVmYXVsdCBiZWNhdXNlIGl0IGlzCmEgc2hvcnQgdGltZSBpbiB0ZXJt cyBvZiBJL08gd2hpbGUgaXQgaXMgYSBsb25nIHRpbWUgaW4gdGVybXMgb2YgbWVtb3J5Cm9wZXJh dGlvbnMuICBBbHNvLCBhcyB0aGUgb3JpZ2luYWwgc2hyaW5raW5nIG1lY2hhbmlzbSB3b3JrcyBm b3IgYXQKbGVhc3QgZXZlcnkgMTAwIG1pbGxpc2Vjb25kcywgdGhpcyBjb3VsZCBiZSBhIHNvbWV3 aGF0IHJlYXNvbmFibGUKY2hvaWNlLiAgSSBhbHNvIHRlc3RlZCBvdGhlciBkdXJhdGlvbnMgKHJl ZmVyIHRvIHRoZSBiZWxvdyBzZWN0aW9uIGZvcgptb3JlIGRldGFpbHMpIGFuZCBjb25maXJtZWQg dGhhdCAxMCBtaWxsaXNlY29uZHMgaXMgdGhlIG9uZSB0aGF0IHdvcmtzCmJlc3Qgd2l0aCB0aGUg dGVzdC4gIFRoYXQgc2FpZCwgdGhlIHByb3BlciBkdXJhdGlvbiBkZXBlbmRzIG9uIGFjdHVhbApj b25maWd1cmF0aW9ucyBhbmQgd29ya2xvYWRzLiAgVGhhdCdzIHdoeSB0aGlzIGNvbW1pdCBpcyBh bGxvd2luZyB1c2Vycwp0byBzZXQgaXQgYXMgdGhlaXIgb3B0aW1hbCB2YWx1ZSB2aWEgdGhlIG1v ZHVsZSBwYXJhbWV0ZXIuCgpNZW1vcnkgUHJlc3N1cmUgVGVzdAo9PT09PT09PT09PT09PT09PT09 PQoKVG8gc2hvdyBob3cgdGhpcyBjb21taXQgZml4ZXMgdGhlIG1lbW9yeSBwcmVzc3VyZSBzaXR1 YXRpb24gd2VsbCwgSQpjb25maWd1cmVkIGEgdGVzdCBlbnZpcm9ubWVudCBvbiBhIHhlbi1ydW5u aW5nIHZpcnR1YWxpemF0aW9uIHN5c3RlbS4KT24gdGhlIGBibGtmcm9udGAgcnVubmluZyBndWVz dCBpbnN0YW5jZXMsIEkgYXR0YWNoIGEgbGFyZ2UgbnVtYmVyIG9mCm5ldHdvcmstYmFja2VkIHZv bHVtZSBkZXZpY2VzIGFuZCBpbmR1Y2UgSS9PIHRvIHRob3NlLiAgTWVhbndoaWxlLCBJCm1lYXN1 cmUgdGhlIG51bWJlciBvZiBwYWdlcyB0aGF0IHN3YXBwZWQgaW4gYW5kIG91dCBvbiB0aGUgYGJs a2JhY2tgCnJ1bm5pbmcgZ3Vlc3QuICBUaGUgdGVzdCByYW4gdHdpY2UsIG9uY2UgZm9yIHRoZSBg YmxrYmFja2AgYmVmb3JlIHRoaXMKY29tbWl0IGFuZCBvbmNlIGZvciB0aGF0IGFmdGVyIHRoaXMg Y29tbWl0LiAgQXMgc2hvd24gYmVsb3csIHRoaXMgY29tbWl0CmhhcyBkcmFtYXRpY2FsbHkgcmVk dWNlZCB0aGUgbWVtb3J5IHByZXNzdXJlOgoKICAgICAgICAgICAgICAgIHBzd3BpbiAgcHN3cG91 dAogICAgYmVmb3JlICAgICAgNzYsNjcyICAxODUsNzk5CiAgICBhZnRlciAgICAgICAgICAyMTIg ICAgMywzMjUKCk9wdGltYWwgQWdncmVzc2l2ZSBTaHJpbmtpbmcgRHVyYXRpb24KLS0tLS0tLS0t LS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLQoKVG8gZmluZCBhIGJlc3Qgc3F1ZWV6aW5nIGR1 cmF0aW9uLCBJIHJlcGVhdGVkIHRoZSB0ZXN0IHdpdGggdGhyZWUKZGlmZmVyZW50IGR1cmF0aW9u cyAoMW1zLCAxMG1zLCBhbmQgMTAwbXMpLiAgVGhlIHJlc3VsdHMgYXJlIGFzIGJlbG93OgoKICAg IGR1cmF0aW9uICAgIHBzd3BpbiAgcHN3cG91dAogICAgMSAgICAgICAgICAgODUyICAgICA2LDQy NAogICAgMTAgICAgICAgICAgMjEyICAgICAzLDMyNQogICAgMTAwICAgICAgICAgMjAzICAgICAz LDM0MAoKQXMgZXhwZWN0ZWQsIHRoZSBtZW1vcnkgcHJlc3N1cmUgaGFzIGRlY3JlYXNlZCBhcyB0 aGUgZHVyYXRpb24gaXMKaW5jcmVhc2VkLCBidXQgdGhlIHJlZHVjdGlvbiBzdG9wcGVkIGZyb20g dGhlIGAxMG1zYC4gIEJhc2VkIG9uIHRoaXMKcmVzdWx0cywgSSBjaG9zZSB0aGUgZGVmYXVsdCBk dXJhdGlvbiBhcyAxMG1zLgoKUGVyZm9ybWFuY2UgT3ZlcmhlYWQgVGVzdAo9PT09PT09PT09PT09 PT09PT09PT09PT09CgpUaGlzIGNvbW1pdCBjb3VsZCBpbmN1ciBJL08gcGVyZm9ybWFuY2UgZGVn cmFkYXRpb24gdW5kZXIgc2V2ZXJlIG1lbW9yeQpwcmVzc3VyZSBiZWNhdXNlIHRoZSBzcXVlZXpp bmcgd2lsbCByZXF1aXJlIG1vcmUgcGFnZSBhbGxvY2F0aW9ucyBwZXIKSS9PLiAgVG8gc2hvdyB0 aGUgb3ZlcmhlYWQsIEkgYXJ0aWZpY2lhbGx5IG1hZGUgYSB3b3JzdC1jYXNlIHNxdWVlemluZwpz aXR1YXRpb24gYW5kIG1lYXN1cmVkIHRoZSBJL08gcGVyZm9ybWFuY2Ugb2YgYSBgYmxrZnJvbnRg IHJ1bm5pbmcKZ3Vlc3QuCgpGb3IgdGhlIGFydGlmaWNpYWwgc3F1ZWV6aW5nLCBJIHNldCB0aGUg YGJsa2JhY2subWF4X2J1ZmZlcl9wYWdlc2AgdXNpbmcKdGhlIGAvc3lzL21vZHVsZS94ZW5fYmxr YmFjay9wYXJhbWV0ZXJzL21heF9idWZmZXJfcGFnZXNgIGZpbGUuICBXZSBzZXQKdGhlIHZhbHVl IHRvIGAxMDI0YCBhbmQgYDBgLiAgVGhlIGAxMDI0YCBpcyB0aGUgZGVmYXVsdCB2YWx1ZS4gIFNl dHRpbmcKdGhlIHZhbHVlIGFzIGAwYCBpcyBzYW1lIHRvIGEgc2l0dWF0aW9uIGRvaW5nIHRoZSBz cXVlZXppbmcgYWx3YXlzCih3b3JzdC1jYXNlKS4KCkZvciB0aGUgSS9PIHBlcmZvcm1hbmNlIG1l YXN1cmVtZW50LCBJIHVzZSBhIHNpbXBsZSBgZGRgIGNvbW1hbmQuCgpEZWZhdWx0IFBlcmZvcm1h bmNlCi0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBbZG9tMF0jIGVjaG8gMTAyNCA+IC9zeXMvbW9k dWxlL3hlbl9ibGtiYWNrL3BhcmFtZXRlcnMvbWF4X2J1ZmZlcl9wYWdlcwogICAgW2luc3RhbmNl XSQgZm9yIGkgaW4gezEuLjV9OyBkbyBkZCBpZj0vZGV2L3plcm8gb2Y9ZmlsZSBicz00ayBjb3Vu dD0kKCgyNTYqNTEyKSk7IHN5bmM7IGRvbmUKICAgIDEzMTA3MiswIHJlY29yZHMgaW4KICAgIDEz MTA3MiswIHJlY29yZHMgb3V0CiAgICA1MzY4NzA5MTIgYnl0ZXMgKDUzNyBNQikgY29waWVkLCAx MS43MjU3IHMsIDQ1LjggTUIvcwogICAgMTMxMDcyKzAgcmVjb3JkcyBpbgogICAgMTMxMDcyKzAg cmVjb3JkcyBvdXQKICAgIDUzNjg3MDkxMiBieXRlcyAoNTM3IE1CKSBjb3BpZWQsIDEzLjg4Mjcg cywgMzguNyBNQi9zCiAgICAxMzEwNzIrMCByZWNvcmRzIGluCiAgICAxMzEwNzIrMCByZWNvcmRz IG91dAogICAgNTM2ODcwOTEyIGJ5dGVzICg1MzcgTUIpIGNvcGllZCwgMTMuODc4MSBzLCAzOC43 IE1CL3MKICAgIDEzMTA3MiswIHJlY29yZHMgaW4KICAgIDEzMTA3MiswIHJlY29yZHMgb3V0CiAg ICA1MzY4NzA5MTIgYnl0ZXMgKDUzNyBNQikgY29waWVkLCAxMy44NzM3IHMsIDM4LjcgTUIvcwog ICAgMTMxMDcyKzAgcmVjb3JkcyBpbgogICAgMTMxMDcyKzAgcmVjb3JkcyBvdXQKICAgIDUzNjg3 MDkxMiBieXRlcyAoNTM3IE1CKSBjb3BpZWQsIDEzLjg3MDIgcywgMzguNyBNQi9zCgpXb3JzdC1j YXNlIFBlcmZvcm1hbmNlCi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0KCiAgICBbZG9tMF0jIGVjaG8g MCA+IC9zeXMvbW9kdWxlL3hlbl9ibGtiYWNrL3BhcmFtZXRlcnMvbWF4X2J1ZmZlcl9wYWdlcwog ICAgW2luc3RhbmNlXSQgZm9yIGkgaW4gezEuLjV9OyBkbyBkZCBpZj0vZGV2L3plcm8gb2Y9Zmls ZSBicz00ayBjb3VudD0kKCgyNTYqNTEyKSk7IHN5bmM7IGRvbmUKICAgIDEzMTA3MiswIHJlY29y ZHMgaW4KICAgIDEzMTA3MiswIHJlY29yZHMgb3V0CiAgICA1MzY4NzA5MTIgYnl0ZXMgKDUzNyBN QikgY29waWVkLCAxMS43MjU3IHMsIDQ1LjggTUIvcwogICAgMTMxMDcyKzAgcmVjb3JkcyBpbgog ICAgMTMxMDcyKzAgcmVjb3JkcyBvdXQKICAgIDUzNjg3MDkxMiBieXRlcyAoNTM3IE1CKSBjb3Bp ZWQsIDEzLjg3OCBzLCAzOC43IE1CL3MKICAgIDEzMTA3MiswIHJlY29yZHMgaW4KICAgIDEzMTA3 MiswIHJlY29yZHMgb3V0CiAgICA1MzY4NzA5MTIgYnl0ZXMgKDUzNyBNQikgY29waWVkLCAxMy44 NzQ2IHMsIDM4LjcgTUIvcwogICAgMTMxMDcyKzAgcmVjb3JkcyBpbgogICAgMTMxMDcyKzAgcmVj b3JkcyBvdXQKICAgIDUzNjg3MDkxMiBieXRlcyAoNTM3IE1CKSBjb3BpZWQsIDEzLjg3ODYgcywg MzguNyBNQi9zCiAgICAxMzEwNzIrMCByZWNvcmRzIGluCiAgICAxMzEwNzIrMCByZWNvcmRzIG91 dAogICAgNTM2ODcwOTEyIGJ5dGVzICg1MzcgTUIpIGNvcGllZCwgMTMuODc0OSBzLCAzOC43IE1C L3MKCkluIHNob3J0LCBldmVuIHdvcnN0IGNhc2Ugc3F1ZWV6aW5nIG1ha2VzIG5vIHZpc2libGUg cGVyZm9ybWFuY2UKZGVncmFkYXRpb24uICBJIHRoaW5rIHRoaXMgaXMgZHVlIHRvIHRoZSBzbG93 IHNwZWVkIG9mIHRoZSBJL08uICBJbgpvdGhlciB3b3JkcywgdGhlIGFkZGl0aW9uYWwgcGFnZSBh bGxvY2F0aW9uIG92ZXJoZWFkIGlzIGhpZGRlbiB1bmRlciB0aGUKbXVjaCBzbG93ZXIgSS9PIGxh dGVuY3kuCgpOZXZlcnRoZWxlc3MsIHBsZWFzZXQgbm90ZSB0aGF0IHRoaXMgaXMganVzdCBhIHZl cnkgc2ltcGxlIGFuZCBtaW5pbWFsCnRlc3QuCgpSZXZpZXdlZC1ieTogSnVlcmdlbiBHcm9zcyA8 amdyb3NzQHN1c2UuY29tPgpTaWduZWQtb2ZmLWJ5OiBTZW9uZ0phZSBQYXJrIDxzanBhcmtAYW1h em9uLmRlPgotLS0KIGRyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svYmxrYmFjay5jIHwgMjMgKysr KysrKysrKysrKysrKysrKysrLS0KIGRyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svY29tbW9uLmgg IHwgIDEgKwogZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyAgfCAgMyArKy0KIDMg ZmlsZXMgY2hhbmdlZCwgMjQgaW5zZXJ0aW9ucygrKSwgMyBkZWxldGlvbnMoLSkKCmRpZmYgLS1n aXQgYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYyBiL2RyaXZlcnMvYmxvY2sv eGVuLWJsa2JhY2svYmxrYmFjay5jCmluZGV4IGZkMWUxOWYxYTQ5Zi4uNGQ0ZGJhN2VhNzIxIDEw MDY0NAotLS0gYS9kcml2ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYworKysgYi9kcml2 ZXJzL2Jsb2NrL3hlbi1ibGtiYWNrL2Jsa2JhY2suYwpAQCAtMTQyLDYgKzE0MiwyMiBAQCBzdGF0 aWMgaW5saW5lIGJvb2wgcGVyc2lzdGVudF9nbnRfdGltZW91dChzdHJ1Y3QgcGVyc2lzdGVudF9n bnQgKnBlcnNpc3RlbnRfZ250KQogCQlIWiAqIHhlbl9ibGtpZl9wZ3JhbnRfdGltZW91dCk7CiB9 CiAKKy8qIE9uY2UgYSBtZW1vcnkgcHJlc3N1cmUgaXMgZGV0ZWN0ZWQsIHNxdWVlemUgZnJlZSBw YWdlIHBvb2xzIGZvciBhIHdoaWxlLiAqLworc3RhdGljIGludCB4ZW5fYmxraWZfYnVmZmVyX3Nx dWVlemVfZHVyYXRpb25fbXMgPSAxMDsKK21vZHVsZV9wYXJhbV9uYW1lZChidWZmZXJfc3F1ZWV6 ZV9kdXJhdGlvbl9tcywKKwkJeGVuX2Jsa2lmX2J1ZmZlcl9zcXVlZXplX2R1cmF0aW9uX21zLCBp bnQsIDA2NDQpOworTU9EVUxFX1BBUk1fREVTQyhidWZmZXJfc3F1ZWV6ZV9kdXJhdGlvbl9tcywK KyJEdXJhdGlvbiBpbiBtcyB0byBzcXVlZXplIHBhZ2VzIGJ1ZmZlciB3aGVuIGEgbWVtb3J5IHBy ZXNzdXJlIGlzIGRldGVjdGVkIik7CisKK3N0YXRpYyB1bnNpZ25lZCBsb25nIHhlbl9ibGtfYnVm ZmVyX3NxdWVlemVfZW5kOworCit1bnNpZ25lZCB4ZW5fYmxrYmtfcmVjbGFpbShzdHJ1Y3QgeGVu YnVzX2RldmljZSAqZGV2KQoreworCXhlbl9ibGtfYnVmZmVyX3NxdWVlemVfZW5kID0gamlmZmll cyArCisJCW1zZWNzX3RvX2ppZmZpZXMoeGVuX2Jsa2lmX2J1ZmZlcl9zcXVlZXplX2R1cmF0aW9u X21zKTsKKwlyZXR1cm4gMDsKK30KKwogc3RhdGljIGlubGluZSBpbnQgZ2V0X2ZyZWVfcGFnZShz dHJ1Y3QgeGVuX2Jsa2lmX3JpbmcgKnJpbmcsIHN0cnVjdCBwYWdlICoqcGFnZSkKIHsKIAl1bnNp Z25lZCBsb25nIGZsYWdzOwpAQCAtNjU2LDggKzY3MiwxMSBAQCBpbnQgeGVuX2Jsa2lmX3NjaGVk dWxlKHZvaWQgKmFyZykKIAkJCXJpbmctPm5leHRfbHJ1ID0gamlmZmllcyArIG1zZWNzX3RvX2pp ZmZpZXMoTFJVX0lOVEVSVkFMKTsKIAkJfQogCi0JCS8qIFNocmluayBpZiB3ZSBoYXZlIG1vcmUg dGhhbiB4ZW5fYmxraWZfbWF4X2J1ZmZlcl9wYWdlcyAqLwotCQlzaHJpbmtfZnJlZV9wYWdlcG9v bChyaW5nLCB4ZW5fYmxraWZfbWF4X2J1ZmZlcl9wYWdlcyk7CisJCS8qIFNocmluayB0aGUgZnJl ZSBwYWdlcyBwb29sIGlmIGl0IGlzIHRvbyBsYXJnZS4gKi8KKwkJaWYgKHRpbWVfYmVmb3JlKGpp ZmZpZXMsIHhlbl9ibGtfYnVmZmVyX3NxdWVlemVfZW5kKSkKKwkJCXNocmlua19mcmVlX3BhZ2Vw b29sKHJpbmcsIDApOworCQllbHNlCisJCQlzaHJpbmtfZnJlZV9wYWdlcG9vbChyaW5nLCB4ZW5f YmxraWZfbWF4X2J1ZmZlcl9wYWdlcyk7CiAKIAkJaWYgKGxvZ19zdGF0cyAmJiB0aW1lX2FmdGVy KGppZmZpZXMsIHJpbmctPnN0X3ByaW50KSkKIAkJCXByaW50X3N0YXRzKHJpbmcpOwpkaWZmIC0t Z2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay9jb21tb24uaCBiL2RyaXZlcnMvYmxvY2sv eGVuLWJsa2JhY2svY29tbW9uLmgKaW5kZXggMWQzMDAyZDc3M2Y3Li5jMDMzNGNkYTc5ZmUgMTAw NjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2svY29tbW9uLmgKKysrIGIvZHJpdmVy cy9ibG9jay94ZW4tYmxrYmFjay9jb21tb24uaApAQCAtMzgzLDYgKzM4Myw3IEBAIGlycXJldHVy bl90IHhlbl9ibGtpZl9iZV9pbnQoaW50IGlycSwgdm9pZCAqZGV2X2lkKTsKIGludCB4ZW5fYmxr aWZfc2NoZWR1bGUodm9pZCAqYXJnKTsKIGludCB4ZW5fYmxraWZfcHVyZ2VfcGVyc2lzdGVudCh2 b2lkICphcmcpOwogdm9pZCB4ZW5fYmxrYmtfZnJlZV9jYWNoZXMoc3RydWN0IHhlbl9ibGtpZl9y aW5nICpyaW5nKTsKK3Vuc2lnbmVkIHhlbl9ibGtia19yZWNsYWltKHN0cnVjdCB4ZW5idXNfZGV2 aWNlICpkZXYpOwogCiBpbnQgeGVuX2Jsa2JrX2ZsdXNoX2Rpc2tjYWNoZShzdHJ1Y3QgeGVuYnVz X3RyYW5zYWN0aW9uIHhidCwKIAkJCSAgICAgIHN0cnVjdCBiYWNrZW5kX2luZm8gKmJlLCBpbnQg c3RhdGUpOwpkaWZmIC0tZ2l0IGEvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYyBi L2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVzLmMKaW5kZXggYjkwZGJjZDk5YzAzLi5k ZTQ5YTA5ZTY5MzMgMTAwNjQ0Ci0tLSBhL2RyaXZlcnMvYmxvY2sveGVuLWJsa2JhY2sveGVuYnVz LmMKKysrIGIvZHJpdmVycy9ibG9jay94ZW4tYmxrYmFjay94ZW5idXMuYwpAQCAtMTExNSw3ICsx MTE1LDggQEAgc3RhdGljIHN0cnVjdCB4ZW5idXNfZHJpdmVyIHhlbl9ibGtia19kcml2ZXIgPSB7 CiAJLmlkcyAgPSB4ZW5fYmxrYmtfaWRzLAogCS5wcm9iZSA9IHhlbl9ibGtia19wcm9iZSwKIAku cmVtb3ZlID0geGVuX2Jsa2JrX3JlbW92ZSwKLQkub3RoZXJlbmRfY2hhbmdlZCA9IGZyb250ZW5k X2NoYW5nZWQKKwkub3RoZXJlbmRfY2hhbmdlZCA9IGZyb250ZW5kX2NoYW5nZWQsCisJLnJlY2xh aW0gPSB4ZW5fYmxrYmtfcmVjbGFpbQogfTsKIAogaW50IHhlbl9ibGtpZl94ZW5idXNfaW5pdCh2 b2lkKQotLSAKMi4xNy4xCgoKX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fX19fX18KWGVuLWRldmVsIG1haWxpbmcgbGlzdApYZW4tZGV2ZWxAbGlzdHMueGVucHJvamVj dC5vcmcKaHR0cHM6Ly9saXN0cy54ZW5wcm9qZWN0Lm9yZy9tYWlsbWFuL2xpc3RpbmZvL3hlbi1k ZXZlbA==