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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id BAEE7C43334 for ; Wed, 6 Jul 2022 22:01:38 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234740AbiGFWBg (ORCPT ); Wed, 6 Jul 2022 18:01:36 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44458 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S234627AbiGFWBP (ORCPT ); Wed, 6 Jul 2022 18:01:15 -0400 Received: from mail-yb1-xb49.google.com (mail-yb1-xb49.google.com [IPv6:2607:f8b0:4864:20::b49]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 866B42AC5B for ; Wed, 6 Jul 2022 15:01:05 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id w15-20020a25ac0f000000b0066e50e4a553so6134006ybi.16 for ; Wed, 06 Jul 2022 15:01:05 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc:content-transfer-encoding; bh=ZS7i+zWbsuFYZiRlenI/F/Y7PzZj3Cv3ABmuogIV+d0=; b=Is9nnwDLdoF8cmdhQhl8FEZEIPLZOTCQNPziPrZ3WCv4Hkh+8SM7Qirn2/JzlJe5Qt IMzoKhGVVu62zPGO2f8uqvwVO7ZBpwGEu3Y0nx+xsR+UR6rSMs9BgDYfSl6hxumhEzXQ AVU29P45SCq1drQE+AuDu2NsKyQ+R9NLi2XNN7GjQzGIS59mnKnciabxZ70kUwocqXEh TsuagDSQmmH5SjPkOzOUNm6Sk8f3JEhf7X8a1bPpbg+ozA3KspzkTBjkMrHomLe9ffcm BFgwNEyH9XBgnj0m4gnfT2SYRWWY1k3MsXJMQ+zIJmqc6vDRB4WpYW/qGMJadOFCZfMM nXgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=ZS7i+zWbsuFYZiRlenI/F/Y7PzZj3Cv3ABmuogIV+d0=; b=MaaN7BdHU8fZEY5WIC20C9r5OU4cVtihrn8bFsmzN8RJLNtvjEc3l872ZpQ/6WE42u 0+1kbHJQOTZa3KzPkpEXhgf41GZDcEMC5P/1dFwT8F7Q6QaWoH0r3EDeGHFZUmUcR1LS rWcP6okOLnCFRTXiY54hUizgpoMfbujDdvhQYw2GcPE+L0tCjMcV+eXcqQlcj7t/CQ51 WGy9Tb9G+YaRqtb6PFdBA+vAcm74/Hhqw5EjAVXkrzPxkYlw4mduqlwWyWdfcYw7Ld+y bVfe7jOVHzaZ9h8WeIxFwDjORHURvIYnm361atGVTNapdMscvSTQZLj9XGXWEjaQMAS2 n+Dg== X-Gm-Message-State: AJIora/sqDVA6YDz5425udVpWljWDljry6pEiBfOeK9zbntf4chXAg1i MeLLJcHvguKKoWHAkIUcV8Fg7qgwnhA= X-Google-Smtp-Source: AGRyM1uwFcCEi/xhgZ0h4sIMbRvSkHm3hRssR6SxZ63hO5m3+xAhe4vRctYY9iQ6nmc/njn1u9BXzW/MiYM= X-Received: from yuzhao.bld.corp.google.com ([2620:15c:183:200:b89c:e10a:466e:cf7d]) (user=yuzhao job=sendgmr) by 2002:a25:abb3:0:b0:66e:2f9a:4201 with SMTP id v48-20020a25abb3000000b0066e2f9a4201mr26479914ybi.125.1657144864829; Wed, 06 Jul 2022 15:01:04 -0700 (PDT) Date: Wed, 6 Jul 2022 16:00:18 -0600 In-Reply-To: <20220706220022.968789-1-yuzhao@google.com> Message-Id: <20220706220022.968789-10-yuzhao@google.com> Mime-Version: 1.0 References: <20220706220022.968789-1-yuzhao@google.com> X-Mailer: git-send-email 2.37.0.rc0.161.g10f37bed90-goog Subject: [PATCH v13 09/14] mm: multi-gen LRU: optimize multiple memcgs From: Yu Zhao To: Andrew Morton Cc: Andi Kleen , Aneesh Kumar , Catalin Marinas , Dave Hansen , Hillf Danton , Jens Axboe , Johannes Weiner , Jonathan Corbet , Linus Torvalds , Matthew Wilcox , Mel Gorman , Michael Larabel , Michal Hocko , Mike Rapoport , Peter Zijlstra , Tejun Heo , Vlastimil Babka , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org, page-reclaim@google.com, Yu Zhao , Brian Geffon , Jan Alexander Steffens , Oleksandr Natalenko , Steven Barrett , Suleiman Souhlal , Daniel Byrne , Donald Carr , "=?UTF-8?q?Holger=20Hoffst=C3=A4tte?=" , Konstantin Kharlamov , Shuang Zhai , Sofia Trinh , Vaibhav Jain Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When multiple memcgs are available, it is possible to make better choices based on generations and tiers and therefore improve the overall performance under global memory pressure. This patch adds a rudimentary optimization to select memcgs that can drop single-use unmapped clean pages first. Doing so reduces the chance of going into the aging path or swapping. These two decisions can be costly. A typical example that benefits from this optimization is a server running mixed types of workloads, e.g., heavy anon workload in one memcg and heavy buffered I/O workload in the other. Though this optimization can be applied to both kswapd and direct reclaim, it is only added to kswapd to keep the patchset manageable. Later improvements will cover the direct reclaim path. Server benchmark results: Mixed workloads: fio (buffered I/O): +[19, 21]% IOPS BW patch1-8: 1880k 7343MiB/s patch1-9: 2252k 8796MiB/s memcached (anon): +[119, 123]% Ops/sec KB/sec patch1-8: 862768.65 33514.68 patch1-9: 1911022.12 74234.54 Mixed workloads: fio (buffered I/O): +[75, 77]% IOPS BW 5.19-rc1: 1279k 4996MiB/s patch1-9: 2252k 8796MiB/s memcached (anon): +[13, 15]% Ops/sec KB/sec 5.19-rc1: 1673524.04 65008.87 patch1-9: 1911022.12 74234.54 Configurations: (changes since patch 6) cat mixed.sh modprobe brd rd_nr=3D2 rd_size=3D56623104 swapoff -a mkswap /dev/ram0 swapon /dev/ram0 mkfs.ext4 /dev/ram1 mount -t ext4 /dev/ram1 /mnt memtier_benchmark -S /var/run/memcached/memcached.sock \ -P memcache_binary -n allkeys --key-minimum=3D1 \ --key-maximum=3D50000000 --key-pattern=3DP:P -c 1 -t 36 \ --ratio 1:0 --pipeline 8 -d 2000 fio -name=3Dmglru --numjobs=3D36 --directory=3D/mnt --size=3D1408m \ --buffered=3D1 --ioengine=3Dio_uring --iodepth=3D128 \ --iodepth_batch_submit=3D32 --iodepth_batch_complete=3D32 \ --rw=3Drandread --random_distribution=3Drandom --norandommap \ --time_based --ramp_time=3D10m --runtime=3D90m --group_reporting & pid=3D$! sleep 200 memtier_benchmark -S /var/run/memcached/memcached.sock \ -P memcache_binary -n allkeys --key-minimum=3D1 \ --key-maximum=3D50000000 --key-pattern=3DR:R -c 1 -t 36 \ --ratio 0:1 --pipeline 8 --randomize --distinct-client-seed kill -INT $pid wait Client benchmark results: no change (CONFIG_MEMCG=3Dn) Signed-off-by: Yu Zhao Acked-by: Brian Geffon Acked-by: Jan Alexander Steffens (heftig) Acked-by: Oleksandr Natalenko Acked-by: Steven Barrett Acked-by: Suleiman Souhlal Tested-by: Daniel Byrne Tested-by: Donald Carr Tested-by: Holger Hoffst=C3=A4tte Tested-by: Konstantin Kharlamov Tested-by: Shuang Zhai Tested-by: Sofia Trinh Tested-by: Vaibhav Jain --- mm/vmscan.c | 55 ++++++++++++++++++++++++++++++++++++++++++++--------- 1 file changed, 46 insertions(+), 9 deletions(-) diff --git a/mm/vmscan.c b/mm/vmscan.c index 8e55a1ce1ae0..f469a2740835 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -129,6 +129,13 @@ struct scan_control { /* Always discard instead of demoting to lower tier memory */ unsigned int no_demotion:1; =20 +#ifdef CONFIG_LRU_GEN + /* help make better choices when multiple memcgs are available */ + unsigned int memcgs_need_aging:1; + unsigned int memcgs_need_swapping:1; + unsigned int memcgs_avoid_swapping:1; +#endif + /* Allocation order */ s8 order; =20 @@ -4372,6 +4379,22 @@ static void lru_gen_age_node(struct pglist_data *pgd= at, struct scan_control *sc) =20 VM_WARN_ON_ONCE(!current_is_kswapd()); =20 + /* + * To reduce the chance of going into the aging path or swapping, which + * can be costly, optimistically skip them unless their corresponding + * flags were cleared in the eviction path. This improves the overall + * performance when multiple memcgs are available. + */ + if (!sc->memcgs_need_aging) { + sc->memcgs_need_aging =3D true; + sc->memcgs_avoid_swapping =3D !sc->memcgs_need_swapping; + sc->memcgs_need_swapping =3D true; + return; + } + + sc->memcgs_need_swapping =3D true; + sc->memcgs_avoid_swapping =3D true; + set_mm_walk(pgdat); =20 memcg =3D mem_cgroup_iter(NULL, NULL, NULL); @@ -4781,7 +4804,8 @@ static int isolate_folios(struct lruvec *lruvec, stru= ct scan_control *sc, int sw return scanned; } =20 -static int evict_folios(struct lruvec *lruvec, struct scan_control *sc, in= t swappiness) +static int evict_folios(struct lruvec *lruvec, struct scan_control *sc, in= t swappiness, + bool *need_swapping) { int type; int scanned; @@ -4844,14 +4868,16 @@ static int evict_folios(struct lruvec *lruvec, stru= ct scan_control *sc, int swap =20 sc->nr_reclaimed +=3D reclaimed; =20 + if (type =3D=3D LRU_GEN_ANON && need_swapping) + *need_swapping =3D true; + return scanned; } =20 static unsigned long get_nr_to_scan(struct lruvec *lruvec, struct scan_con= trol *sc, - bool can_swap, unsigned long reclaimed) + bool can_swap, unsigned long reclaimed, bool *need_aging) { int priority; - bool need_aging; unsigned long nr_to_scan; struct mem_cgroup *memcg =3D lruvec_memcg(lruvec); DEFINE_MAX_SEQ(lruvec); @@ -4861,7 +4887,7 @@ static unsigned long get_nr_to_scan(struct lruvec *lr= uvec, struct scan_control * (mem_cgroup_below_low(memcg) && !sc->memcg_low_reclaim)) return 0; =20 - nr_to_scan =3D get_nr_evictable(lruvec, max_seq, min_seq, can_swap, &need= _aging); + nr_to_scan =3D get_nr_evictable(lruvec, max_seq, min_seq, can_swap, need_= aging); if (!nr_to_scan) return 0; =20 @@ -4877,7 +4903,7 @@ static unsigned long get_nr_to_scan(struct lruvec *lr= uvec, struct scan_control * if (!nr_to_scan) return 0; =20 - if (!need_aging) + if (!*need_aging) return nr_to_scan; =20 /* skip the aging path at the default priority */ @@ -4897,6 +4923,8 @@ static unsigned long get_nr_to_scan(struct lruvec *lr= uvec, struct scan_control * static void lru_gen_shrink_lruvec(struct lruvec *lruvec, struct scan_contr= ol *sc) { struct blk_plug plug; + bool need_aging =3D false; + bool need_swapping =3D false; unsigned long scanned =3D 0; unsigned long reclaimed =3D sc->nr_reclaimed; =20 @@ -4918,21 +4946,30 @@ static void lru_gen_shrink_lruvec(struct lruvec *lr= uvec, struct scan_control *sc else swappiness =3D 0; =20 - nr_to_scan =3D get_nr_to_scan(lruvec, sc, swappiness, reclaimed); + nr_to_scan =3D get_nr_to_scan(lruvec, sc, swappiness, reclaimed, &need_a= ging); if (!nr_to_scan) - break; + goto done; =20 - delta =3D evict_folios(lruvec, sc, swappiness); + delta =3D evict_folios(lruvec, sc, swappiness, &need_swapping); if (!delta) - break; + goto done; =20 scanned +=3D delta; if (scanned >=3D nr_to_scan) break; =20 + if (sc->memcgs_avoid_swapping && swappiness < 200 && need_swapping) + break; + cond_resched(); } =20 + /* see the comment in lru_gen_age_node() */ + if (!need_aging) + sc->memcgs_need_aging =3D false; + if (!need_swapping) + sc->memcgs_need_swapping =3D false; +done: clear_mm_walk(); =20 blk_finish_plug(&plug); --=20 2.37.0.rc0.161.g10f37bed90-goog 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 F042EC433EF for ; Wed, 6 Jul 2022 22:25:03 +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:Cc:To:From:Subject:References: Mime-Version:Message-Id:In-Reply-To:Date:Reply-To:Content-ID: Content-Description:Resent-Date:Resent-From:Resent-Sender:Resent-To:Resent-Cc :Resent-Message-ID:List-Owner; bh=tOld0mycu7Btf63ByyZvx/Z0eAcW0k4TTCwG8saV5Is=; b=WZ0z5mNFTsK7hRYJL/tCGGNA2R iiznQtlbgg8vLE61AzG+y1WOAL8n4oAZaDRxzs7VG7T/XKSlnSIXj2zfskgR16i9+sx+SmMrTshj3 Rhjm+IRJTRR51xdqhBqyHYd9gEZY6d+nFfuSWzik8lZjsa7kgq2U28rXqc3iBYRKo64G2hQkr1Fh2 0AAIblG8sUW91n9klrycAut5Kn+W2H8PrBW1fMV+6LmXbTlLa38BUCauswJqNQXspcogqgL5QxDy9 AnrXpXmaC3WcGCZaWItqtaNf3IbcI+uBOqIaAvE/JlW0AXERLFg/86HqXddt44qdFmQmq11/vfgJr /LhEzUUA==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9DQx-00CaKQ-7t; Wed, 06 Jul 2022 22:23:47 +0000 Received: from casper.infradead.org ([2001:8b0:10b:1236::1]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9DPt-00CZxO-A3 for linux-arm-kernel@bombadil.infradead.org; Wed, 06 Jul 2022 22:22:41 +0000 DKIM-Signature: v=1; a=rsa-sha256; q=dns/txt; c=relaxed/relaxed; d=infradead.org; s=casper.20170209; h=Content-Transfer-Encoding:Content-Type: Cc:To:From:Subject:References:Mime-Version:Message-Id:In-Reply-To:Date:Sender :Reply-To:Content-ID:Content-Description; bh=ZS7i+zWbsuFYZiRlenI/F/Y7PzZj3Cv3ABmuogIV+d0=; b=TeAh1eIZ03w6HrNkTRlz9qeQMr vjtPWcTiEX5m7VQpC2G8vHYID0KM123xTb+3PPWyWmjSLmi0qJNX/0Jy/rOobi4BpgGBtmqVIFog7 knes6t5A8tnUvgxsNychZrfNzSR19niYLR9GAB99rqI9DXXnuZ+fg76tfMWeFMG2OxQPqE27YV+V7 OFJWjWOmK1ePwmkg25C0umCQgtjhfTU+xwuBPXcyeLvgSGRMN6lMjmKPqCc5EKr2n22riO+UKHnkq y2ctRxFyq08boHwyErmsC+2N/WKWW054aLRYpWaUpGTFOvkwALng4wVazpw8NZEW3FTM4hGltvGWd tksBRiAw==; Received: from mail-yw1-x114a.google.com ([2607:f8b0:4864:20::114a]) by casper.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1o9D54-0021TC-Ht for linux-arm-kernel@lists.infradead.org; Wed, 06 Jul 2022 22:01:12 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-31c858e18c8so80044267b3.4 for ; Wed, 06 Jul 2022 15:01:09 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=20210112; h=date:in-reply-to:message-id:mime-version:references:subject:from:to :cc:content-transfer-encoding; bh=ZS7i+zWbsuFYZiRlenI/F/Y7PzZj3Cv3ABmuogIV+d0=; b=Is9nnwDLdoF8cmdhQhl8FEZEIPLZOTCQNPziPrZ3WCv4Hkh+8SM7Qirn2/JzlJe5Qt IMzoKhGVVu62zPGO2f8uqvwVO7ZBpwGEu3Y0nx+xsR+UR6rSMs9BgDYfSl6hxumhEzXQ AVU29P45SCq1drQE+AuDu2NsKyQ+R9NLi2XNN7GjQzGIS59mnKnciabxZ70kUwocqXEh TsuagDSQmmH5SjPkOzOUNm6Sk8f3JEhf7X8a1bPpbg+ozA3KspzkTBjkMrHomLe9ffcm BFgwNEyH9XBgnj0m4gnfT2SYRWWY1k3MsXJMQ+zIJmqc6vDRB4WpYW/qGMJadOFCZfMM nXgA== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=x-gm-message-state:date:in-reply-to:message-id:mime-version :references:subject:from:to:cc:content-transfer-encoding; bh=ZS7i+zWbsuFYZiRlenI/F/Y7PzZj3Cv3ABmuogIV+d0=; b=m5GMfpcTgXdZv0bvOBFOaQ5/3zkN4nLnJ2JXpxvwe+7VsjltyOTJbO4+xVuYq/aLyR K2h6SW8P0jwd6uMtnxMi6OaUGHMtqzg+fssK04A/eEyzhTtfvvb8oIQfUQhfCMOK84rC Ug3Mh/5TYlvXawV8msprDi7+5cmJ6V1YMiIfRwdfDEBZlKMfrxPqa4iHtJ0zM7WvL6GP ny3n/eqmmBenMRf57/T0qjyxf1iCcY0mMSJpCt7EemKa67Nm7b4+IboRKlU3xCCInkcO jX2AyNmVY4Ycd9QL+fXratviYp8zhj2H+x0kpbsX01ml+n7zP2ST5UNyUqN/YklJh8eP EWpg== X-Gm-Message-State: AJIora91IwfVwl9xAefQ4nVfpr0qkzxfwL8I866kZDLzQEcZJP6CVSie sYu9K3RnrWDpjoU+PQ0L1oouffqAR/0= X-Google-Smtp-Source: AGRyM1uwFcCEi/xhgZ0h4sIMbRvSkHm3hRssR6SxZ63hO5m3+xAhe4vRctYY9iQ6nmc/njn1u9BXzW/MiYM= X-Received: from yuzhao.bld.corp.google.com ([2620:15c:183:200:b89c:e10a:466e:cf7d]) (user=yuzhao job=sendgmr) by 2002:a25:abb3:0:b0:66e:2f9a:4201 with SMTP id v48-20020a25abb3000000b0066e2f9a4201mr26479914ybi.125.1657144864829; Wed, 06 Jul 2022 15:01:04 -0700 (PDT) Date: Wed, 6 Jul 2022 16:00:18 -0600 In-Reply-To: <20220706220022.968789-1-yuzhao@google.com> Message-Id: <20220706220022.968789-10-yuzhao@google.com> Mime-Version: 1.0 References: <20220706220022.968789-1-yuzhao@google.com> X-Mailer: git-send-email 2.37.0.rc0.161.g10f37bed90-goog Subject: [PATCH v13 09/14] mm: multi-gen LRU: optimize multiple memcgs From: Yu Zhao To: Andrew Morton Cc: Andi Kleen , Aneesh Kumar , Catalin Marinas , Dave Hansen , Hillf Danton , Jens Axboe , Johannes Weiner , Jonathan Corbet , Linus Torvalds , Matthew Wilcox , Mel Gorman , Michael Larabel , Michal Hocko , Mike Rapoport , Peter Zijlstra , Tejun Heo , Vlastimil Babka , Will Deacon , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, linux-mm@kvack.org, x86@kernel.org, page-reclaim@google.com, Yu Zhao , Brian Geffon , Jan Alexander Steffens , Oleksandr Natalenko , Steven Barrett , Suleiman Souhlal , Daniel Byrne , Donald Carr , "=?UTF-8?q?Holger=20Hoffst=C3=A4tte?=" , Konstantin Kharlamov , Shuang Zhai , Sofia Trinh , Vaibhav Jain X-CRM114-Version: 20100106-BlameMichelson ( TRE 0.8.0 (BSD) ) MR-646709E3 X-CRM114-CacheID: sfid-20220706_230110_630694_3009F2C2 X-CRM114-Status: GOOD ( 17.04 ) 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 V2hlbiBtdWx0aXBsZSBtZW1jZ3MgYXJlIGF2YWlsYWJsZSwgaXQgaXMgcG9zc2libGUgdG8gbWFr ZSBiZXR0ZXIKY2hvaWNlcyBiYXNlZCBvbiBnZW5lcmF0aW9ucyBhbmQgdGllcnMgYW5kIHRoZXJl Zm9yZSBpbXByb3ZlIHRoZQpvdmVyYWxsIHBlcmZvcm1hbmNlIHVuZGVyIGdsb2JhbCBtZW1vcnkg cHJlc3N1cmUuIFRoaXMgcGF0Y2ggYWRkcyBhCnJ1ZGltZW50YXJ5IG9wdGltaXphdGlvbiB0byBz ZWxlY3QgbWVtY2dzIHRoYXQgY2FuIGRyb3Agc2luZ2xlLXVzZQp1bm1hcHBlZCBjbGVhbiBwYWdl cyBmaXJzdC4gRG9pbmcgc28gcmVkdWNlcyB0aGUgY2hhbmNlIG9mIGdvaW5nIGludG8KdGhlIGFn aW5nIHBhdGggb3Igc3dhcHBpbmcuIFRoZXNlIHR3byBkZWNpc2lvbnMgY2FuIGJlIGNvc3RseS4K CkEgdHlwaWNhbCBleGFtcGxlIHRoYXQgYmVuZWZpdHMgZnJvbSB0aGlzIG9wdGltaXphdGlvbiBp cyBhIHNlcnZlcgpydW5uaW5nIG1peGVkIHR5cGVzIG9mIHdvcmtsb2FkcywgZS5nLiwgaGVhdnkg YW5vbiB3b3JrbG9hZCBpbiBvbmUKbWVtY2cgYW5kIGhlYXZ5IGJ1ZmZlcmVkIEkvTyB3b3JrbG9h ZCBpbiB0aGUgb3RoZXIuCgpUaG91Z2ggdGhpcyBvcHRpbWl6YXRpb24gY2FuIGJlIGFwcGxpZWQg dG8gYm90aCBrc3dhcGQgYW5kIGRpcmVjdApyZWNsYWltLCBpdCBpcyBvbmx5IGFkZGVkIHRvIGtz d2FwZCB0byBrZWVwIHRoZSBwYXRjaHNldCBtYW5hZ2VhYmxlLgpMYXRlciBpbXByb3ZlbWVudHMg d2lsbCBjb3ZlciB0aGUgZGlyZWN0IHJlY2xhaW0gcGF0aC4KClNlcnZlciBiZW5jaG1hcmsgcmVz dWx0czoKICBNaXhlZCB3b3JrbG9hZHM6CiAgICBmaW8gKGJ1ZmZlcmVkIEkvTyk6ICtbMTksIDIx XSUKICAgICAgICAgICAgICAgIElPUFMgICAgICAgICBCVwogICAgICBwYXRjaDEtODogMTg4MGsg ICAgICAgIDczNDNNaUIvcwogICAgICBwYXRjaDEtOTogMjI1MmsgICAgICAgIDg3OTZNaUIvcwoK ICAgIG1lbWNhY2hlZCAoYW5vbik6ICtbMTE5LCAxMjNdJQogICAgICAgICAgICAgICAgT3BzL3Nl YyAgICAgIEtCL3NlYwogICAgICBwYXRjaDEtODogODYyNzY4LjY1ICAgIDMzNTE0LjY4CiAgICAg IHBhdGNoMS05OiAxOTExMDIyLjEyICAgNzQyMzQuNTQKCiAgTWl4ZWQgd29ya2xvYWRzOgogICAg ZmlvIChidWZmZXJlZCBJL08pOiArWzc1LCA3N10lCiAgICAgICAgICAgICAgICBJT1BTICAgICAg ICAgQlcKICAgICAgNS4xOS1yYzE6IDEyNzlrICAgICAgICA0OTk2TWlCL3MKICAgICAgcGF0Y2gx LTk6IDIyNTJrICAgICAgICA4Nzk2TWlCL3MKCiAgICBtZW1jYWNoZWQgKGFub24pOiArWzEzLCAx NV0lCiAgICAgICAgICAgICAgICBPcHMvc2VjICAgICAgS0Ivc2VjCiAgICAgIDUuMTktcmMxOiAx NjczNTI0LjA0ICAgNjUwMDguODcKICAgICAgcGF0Y2gxLTk6IDE5MTEwMjIuMTIgICA3NDIzNC41 NAoKICBDb25maWd1cmF0aW9uczoKICAgIChjaGFuZ2VzIHNpbmNlIHBhdGNoIDYpCgogICAgY2F0 IG1peGVkLnNoCiAgICBtb2Rwcm9iZSBicmQgcmRfbnI9MiByZF9zaXplPTU2NjIzMTA0CgogICAg c3dhcG9mZiAtYQogICAgbWtzd2FwIC9kZXYvcmFtMAogICAgc3dhcG9uIC9kZXYvcmFtMAoKICAg IG1rZnMuZXh0NCAvZGV2L3JhbTEKICAgIG1vdW50IC10IGV4dDQgL2Rldi9yYW0xIC9tbnQKCiAg ICBtZW10aWVyX2JlbmNobWFyayAtUyAvdmFyL3J1bi9tZW1jYWNoZWQvbWVtY2FjaGVkLnNvY2sg XAogICAgICAtUCBtZW1jYWNoZV9iaW5hcnkgLW4gYWxsa2V5cyAtLWtleS1taW5pbXVtPTEgXAog ICAgICAtLWtleS1tYXhpbXVtPTUwMDAwMDAwIC0ta2V5LXBhdHRlcm49UDpQIC1jIDEgLXQgMzYg XAogICAgICAtLXJhdGlvIDE6MCAtLXBpcGVsaW5lIDggLWQgMjAwMAoKICAgIGZpbyAtbmFtZT1t Z2xydSAtLW51bWpvYnM9MzYgLS1kaXJlY3Rvcnk9L21udCAtLXNpemU9MTQwOG0gXAogICAgICAt LWJ1ZmZlcmVkPTEgLS1pb2VuZ2luZT1pb191cmluZyAtLWlvZGVwdGg9MTI4IFwKICAgICAgLS1p b2RlcHRoX2JhdGNoX3N1Ym1pdD0zMiAtLWlvZGVwdGhfYmF0Y2hfY29tcGxldGU9MzIgXAogICAg ICAtLXJ3PXJhbmRyZWFkIC0tcmFuZG9tX2Rpc3RyaWJ1dGlvbj1yYW5kb20gLS1ub3JhbmRvbW1h cCBcCiAgICAgIC0tdGltZV9iYXNlZCAtLXJhbXBfdGltZT0xMG0gLS1ydW50aW1lPTkwbSAtLWdy b3VwX3JlcG9ydGluZyAmCiAgICBwaWQ9JCEKCiAgICBzbGVlcCAyMDAKCiAgICBtZW10aWVyX2Jl bmNobWFyayAtUyAvdmFyL3J1bi9tZW1jYWNoZWQvbWVtY2FjaGVkLnNvY2sgXAogICAgICAtUCBt ZW1jYWNoZV9iaW5hcnkgLW4gYWxsa2V5cyAtLWtleS1taW5pbXVtPTEgXAogICAgICAtLWtleS1t YXhpbXVtPTUwMDAwMDAwIC0ta2V5LXBhdHRlcm49UjpSIC1jIDEgLXQgMzYgXAogICAgICAtLXJh dGlvIDA6MSAtLXBpcGVsaW5lIDggLS1yYW5kb21pemUgLS1kaXN0aW5jdC1jbGllbnQtc2VlZAoK ICAgIGtpbGwgLUlOVCAkcGlkCiAgICB3YWl0CgpDbGllbnQgYmVuY2htYXJrIHJlc3VsdHM6CiAg bm8gY2hhbmdlIChDT05GSUdfTUVNQ0c9bikKClNpZ25lZC1vZmYtYnk6IFl1IFpoYW8gPHl1emhh b0Bnb29nbGUuY29tPgpBY2tlZC1ieTogQnJpYW4gR2VmZm9uIDxiZ2VmZm9uQGdvb2dsZS5jb20+ CkFja2VkLWJ5OiBKYW4gQWxleGFuZGVyIFN0ZWZmZW5zIChoZWZ0aWcpIDxoZWZ0aWdAYXJjaGxp bnV4Lm9yZz4KQWNrZWQtYnk6IE9sZWtzYW5kciBOYXRhbGVua28gPG9sZWtzYW5kckBuYXRhbGVu a28ubmFtZT4KQWNrZWQtYnk6IFN0ZXZlbiBCYXJyZXR0IDxzdGV2ZW5AbGlxdW9yaXgubmV0PgpB Y2tlZC1ieTogU3VsZWltYW4gU291aGxhbCA8c3VsZWltYW5AZ29vZ2xlLmNvbT4KVGVzdGVkLWJ5 OiBEYW5pZWwgQnlybmUgPGRqYnlybmVAbXR1LmVkdT4KVGVzdGVkLWJ5OiBEb25hbGQgQ2FyciA8 ZEBjaGFvcy1yZWlucy5jb20+ClRlc3RlZC1ieTogSG9sZ2VyIEhvZmZzdMOkdHRlIDxob2xnZXJA YXBwbGllZC1hc3luY2hyb255LmNvbT4KVGVzdGVkLWJ5OiBLb25zdGFudGluIEtoYXJsYW1vdiA8 SGktQW5nZWxAeWFuZGV4LnJ1PgpUZXN0ZWQtYnk6IFNodWFuZyBaaGFpIDxzemhhaTJAY3Mucm9j aGVzdGVyLmVkdT4KVGVzdGVkLWJ5OiBTb2ZpYSBUcmluaCA8c29maWEudHJpbmhAZWRpLndvcmtz PgpUZXN0ZWQtYnk6IFZhaWJoYXYgSmFpbiA8dmFpYmhhdkBsaW51eC5pYm0uY29tPgotLS0KIG1t L3Ztc2Nhbi5jIHwgNTUgKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKysr KystLS0tLS0tLS0KIDEgZmlsZSBjaGFuZ2VkLCA0NiBpbnNlcnRpb25zKCspLCA5IGRlbGV0aW9u cygtKQoKZGlmZiAtLWdpdCBhL21tL3Ztc2Nhbi5jIGIvbW0vdm1zY2FuLmMKaW5kZXggOGU1NWEx Y2UxYWUwLi5mNDY5YTI3NDA4MzUgMTAwNjQ0Ci0tLSBhL21tL3Ztc2Nhbi5jCisrKyBiL21tL3Zt c2Nhbi5jCkBAIC0xMjksNiArMTI5LDEzIEBAIHN0cnVjdCBzY2FuX2NvbnRyb2wgewogCS8qIEFs d2F5cyBkaXNjYXJkIGluc3RlYWQgb2YgZGVtb3RpbmcgdG8gbG93ZXIgdGllciBtZW1vcnkgKi8K IAl1bnNpZ25lZCBpbnQgbm9fZGVtb3Rpb246MTsKIAorI2lmZGVmIENPTkZJR19MUlVfR0VOCisJ LyogaGVscCBtYWtlIGJldHRlciBjaG9pY2VzIHdoZW4gbXVsdGlwbGUgbWVtY2dzIGFyZSBhdmFp bGFibGUgKi8KKwl1bnNpZ25lZCBpbnQgbWVtY2dzX25lZWRfYWdpbmc6MTsKKwl1bnNpZ25lZCBp bnQgbWVtY2dzX25lZWRfc3dhcHBpbmc6MTsKKwl1bnNpZ25lZCBpbnQgbWVtY2dzX2F2b2lkX3N3 YXBwaW5nOjE7CisjZW5kaWYKKwogCS8qIEFsbG9jYXRpb24gb3JkZXIgKi8KIAlzOCBvcmRlcjsK IApAQCAtNDM3Miw2ICs0Mzc5LDIyIEBAIHN0YXRpYyB2b2lkIGxydV9nZW5fYWdlX25vZGUoc3Ry dWN0IHBnbGlzdF9kYXRhICpwZ2RhdCwgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCiAKIAlWTV9X QVJOX09OX09OQ0UoIWN1cnJlbnRfaXNfa3N3YXBkKCkpOwogCisJLyoKKwkgKiBUbyByZWR1Y2Ug dGhlIGNoYW5jZSBvZiBnb2luZyBpbnRvIHRoZSBhZ2luZyBwYXRoIG9yIHN3YXBwaW5nLCB3aGlj aAorCSAqIGNhbiBiZSBjb3N0bHksIG9wdGltaXN0aWNhbGx5IHNraXAgdGhlbSB1bmxlc3MgdGhl aXIgY29ycmVzcG9uZGluZworCSAqIGZsYWdzIHdlcmUgY2xlYXJlZCBpbiB0aGUgZXZpY3Rpb24g cGF0aC4gVGhpcyBpbXByb3ZlcyB0aGUgb3ZlcmFsbAorCSAqIHBlcmZvcm1hbmNlIHdoZW4gbXVs dGlwbGUgbWVtY2dzIGFyZSBhdmFpbGFibGUuCisJICovCisJaWYgKCFzYy0+bWVtY2dzX25lZWRf YWdpbmcpIHsKKwkJc2MtPm1lbWNnc19uZWVkX2FnaW5nID0gdHJ1ZTsKKwkJc2MtPm1lbWNnc19h dm9pZF9zd2FwcGluZyA9ICFzYy0+bWVtY2dzX25lZWRfc3dhcHBpbmc7CisJCXNjLT5tZW1jZ3Nf bmVlZF9zd2FwcGluZyA9IHRydWU7CisJCXJldHVybjsKKwl9CisKKwlzYy0+bWVtY2dzX25lZWRf c3dhcHBpbmcgPSB0cnVlOworCXNjLT5tZW1jZ3NfYXZvaWRfc3dhcHBpbmcgPSB0cnVlOworCiAJ c2V0X21tX3dhbGsocGdkYXQpOwogCiAJbWVtY2cgPSBtZW1fY2dyb3VwX2l0ZXIoTlVMTCwgTlVM TCwgTlVMTCk7CkBAIC00NzgxLDcgKzQ4MDQsOCBAQCBzdGF0aWMgaW50IGlzb2xhdGVfZm9saW9z KHN0cnVjdCBscnV2ZWMgKmxydXZlYywgc3RydWN0IHNjYW5fY29udHJvbCAqc2MsIGludCBzdwog CXJldHVybiBzY2FubmVkOwogfQogCi1zdGF0aWMgaW50IGV2aWN0X2ZvbGlvcyhzdHJ1Y3QgbHJ1 dmVjICpscnV2ZWMsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjLCBpbnQgc3dhcHBpbmVzcykKK3N0 YXRpYyBpbnQgZXZpY3RfZm9saW9zKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgc3RydWN0IHNjYW5f Y29udHJvbCAqc2MsIGludCBzd2FwcGluZXNzLAorCQkJYm9vbCAqbmVlZF9zd2FwcGluZykKIHsK IAlpbnQgdHlwZTsKIAlpbnQgc2Nhbm5lZDsKQEAgLTQ4NDQsMTQgKzQ4NjgsMTYgQEAgc3RhdGlj IGludCBldmljdF9mb2xpb3Moc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBzdHJ1Y3Qgc2Nhbl9jb250 cm9sICpzYywgaW50IHN3YXAKIAogCXNjLT5ucl9yZWNsYWltZWQgKz0gcmVjbGFpbWVkOwogCisJ aWYgKHR5cGUgPT0gTFJVX0dFTl9BTk9OICYmIG5lZWRfc3dhcHBpbmcpCisJCSpuZWVkX3N3YXBw aW5nID0gdHJ1ZTsKKwogCXJldHVybiBzY2FubmVkOwogfQogCiBzdGF0aWMgdW5zaWduZWQgbG9u ZyBnZXRfbnJfdG9fc2NhbihzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIHN0cnVjdCBzY2FuX2NvbnRy b2wgKnNjLAotCQkJCSAgICBib29sIGNhbl9zd2FwLCB1bnNpZ25lZCBsb25nIHJlY2xhaW1lZCkK KwkJCQkgICAgYm9vbCBjYW5fc3dhcCwgdW5zaWduZWQgbG9uZyByZWNsYWltZWQsIGJvb2wgKm5l ZWRfYWdpbmcpCiB7CiAJaW50IHByaW9yaXR5OwotCWJvb2wgbmVlZF9hZ2luZzsKIAl1bnNpZ25l ZCBsb25nIG5yX3RvX3NjYW47CiAJc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnID0gbHJ1dmVjX21l bWNnKGxydXZlYyk7CiAJREVGSU5FX01BWF9TRVEobHJ1dmVjKTsKQEAgLTQ4NjEsNyArNDg4Nyw3 IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9ucl90b19zY2FuKHN0cnVjdCBscnV2ZWMgKmxy dXZlYywgc3RydWN0IHNjYW5fY29udHJvbCAqCiAJICAgIChtZW1fY2dyb3VwX2JlbG93X2xvdyht ZW1jZykgJiYgIXNjLT5tZW1jZ19sb3dfcmVjbGFpbSkpCiAJCXJldHVybiAwOwogCi0JbnJfdG9f c2NhbiA9IGdldF9ucl9ldmljdGFibGUobHJ1dmVjLCBtYXhfc2VxLCBtaW5fc2VxLCBjYW5fc3dh cCwgJm5lZWRfYWdpbmcpOworCW5yX3RvX3NjYW4gPSBnZXRfbnJfZXZpY3RhYmxlKGxydXZlYywg bWF4X3NlcSwgbWluX3NlcSwgY2FuX3N3YXAsIG5lZWRfYWdpbmcpOwogCWlmICghbnJfdG9fc2Nh bikKIAkJcmV0dXJuIDA7CiAKQEAgLTQ4NzcsNyArNDkwMyw3IEBAIHN0YXRpYyB1bnNpZ25lZCBs b25nIGdldF9ucl90b19zY2FuKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgc3RydWN0IHNjYW5fY29u dHJvbCAqCiAJaWYgKCFucl90b19zY2FuKQogCQlyZXR1cm4gMDsKIAotCWlmICghbmVlZF9hZ2lu ZykKKwlpZiAoISpuZWVkX2FnaW5nKQogCQlyZXR1cm4gbnJfdG9fc2NhbjsKIAogCS8qIHNraXAg dGhlIGFnaW5nIHBhdGggYXQgdGhlIGRlZmF1bHQgcHJpb3JpdHkgKi8KQEAgLTQ4OTcsNiArNDky Myw4IEBAIHN0YXRpYyB1bnNpZ25lZCBsb25nIGdldF9ucl90b19zY2FuKHN0cnVjdCBscnV2ZWMg KmxydXZlYywgc3RydWN0IHNjYW5fY29udHJvbCAqCiBzdGF0aWMgdm9pZCBscnVfZ2VuX3Nocmlu a19scnV2ZWMoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykK IHsKIAlzdHJ1Y3QgYmxrX3BsdWcgcGx1ZzsKKwlib29sIG5lZWRfYWdpbmcgPSBmYWxzZTsKKwli b29sIG5lZWRfc3dhcHBpbmcgPSBmYWxzZTsKIAl1bnNpZ25lZCBsb25nIHNjYW5uZWQgPSAwOwog CXVuc2lnbmVkIGxvbmcgcmVjbGFpbWVkID0gc2MtPm5yX3JlY2xhaW1lZDsKIApAQCAtNDkxOCwy MSArNDk0NiwzMCBAQCBzdGF0aWMgdm9pZCBscnVfZ2VuX3Nocmlua19scnV2ZWMoc3RydWN0IGxy dXZlYyAqbHJ1dmVjLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYwogCQllbHNlCiAJCQlzd2FwcGlu ZXNzID0gMDsKIAotCQlucl90b19zY2FuID0gZ2V0X25yX3RvX3NjYW4obHJ1dmVjLCBzYywgc3dh cHBpbmVzcywgcmVjbGFpbWVkKTsKKwkJbnJfdG9fc2NhbiA9IGdldF9ucl90b19zY2FuKGxydXZl Yywgc2MsIHN3YXBwaW5lc3MsIHJlY2xhaW1lZCwgJm5lZWRfYWdpbmcpOwogCQlpZiAoIW5yX3Rv X3NjYW4pCi0JCQlicmVhazsKKwkJCWdvdG8gZG9uZTsKIAotCQlkZWx0YSA9IGV2aWN0X2ZvbGlv cyhscnV2ZWMsIHNjLCBzd2FwcGluZXNzKTsKKwkJZGVsdGEgPSBldmljdF9mb2xpb3MobHJ1dmVj LCBzYywgc3dhcHBpbmVzcywgJm5lZWRfc3dhcHBpbmcpOwogCQlpZiAoIWRlbHRhKQotCQkJYnJl YWs7CisJCQlnb3RvIGRvbmU7CiAKIAkJc2Nhbm5lZCArPSBkZWx0YTsKIAkJaWYgKHNjYW5uZWQg Pj0gbnJfdG9fc2NhbikKIAkJCWJyZWFrOwogCisJCWlmIChzYy0+bWVtY2dzX2F2b2lkX3N3YXBw aW5nICYmIHN3YXBwaW5lc3MgPCAyMDAgJiYgbmVlZF9zd2FwcGluZykKKwkJCWJyZWFrOworCiAJ CWNvbmRfcmVzY2hlZCgpOwogCX0KIAorCS8qIHNlZSB0aGUgY29tbWVudCBpbiBscnVfZ2VuX2Fn ZV9ub2RlKCkgKi8KKwlpZiAoIW5lZWRfYWdpbmcpCisJCXNjLT5tZW1jZ3NfbmVlZF9hZ2luZyA9 IGZhbHNlOworCWlmICghbmVlZF9zd2FwcGluZykKKwkJc2MtPm1lbWNnc19uZWVkX3N3YXBwaW5n ID0gZmFsc2U7Citkb25lOgogCWNsZWFyX21tX3dhbGsoKTsKIAogCWJsa19maW5pc2hfcGx1Zygm cGx1Zyk7Ci0tIAoyLjM3LjAucmMwLjE2MS5nMTBmMzdiZWQ5MC1nb29nCgoKX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX18KbGludXgtYXJtLWtlcm5lbCBtYWls aW5nIGxpc3QKbGludXgtYXJtLWtlcm5lbEBsaXN0cy5pbmZyYWRlYWQub3JnCmh0dHA6Ly9saXN0 cy5pbmZyYWRlYWQub3JnL21haWxtYW4vbGlzdGluZm8vbGludXgtYXJtLWtlcm5lbAo=