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 79067C433EF for ; Thu, 7 Apr 2022 03:17:15 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S240002AbiDGDTI (ORCPT ); Wed, 6 Apr 2022 23:19:08 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:44376 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S240021AbiDGDS1 (ORCPT ); Wed, 6 Apr 2022 23:18:27 -0400 Received: from mail-yw1-x114a.google.com (mail-yw1-x114a.google.com [IPv6:2607:f8b0:4864:20::114a]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 300F2E2F73 for ; Wed, 6 Apr 2022 20:16:12 -0700 (PDT) Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2eb4f03f212so38540907b3.2 for ; Wed, 06 Apr 2022 20:16:12 -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=Artd3VgmPfRvgJSGx+z1Kh9KEzM48iDqoWnEYSArpAs=; b=RXSD1P20FecKhU9EvkEbe8qQkdfzqFyaZHASZakqNZpIs9fyF0EvUnJ2YTOIhkeXOE tJztkP9xyGj6ZEPMFdDptYgmHHfOJEOkPjmxlKMWBV6/wbWDZ6QgyYPhZ0RIHOEJrZb1 Rad+U2zx4t8ASeZdZ07fVR/TwXApI0p8rfxN6Adx5eOAMJryyGoGNQG7Acc7UUHUYiH0 9sVKxpnURKJmZCokKSnmE9Qht71V0tjrfRVa1NkRGaSb3POt9zoueAT0J/EH/q+B4uVW 7s5wAAmBIfP04+WaEqS9xmPcfj5TCuQArZFhC/mD2A1QN7FXDHd9opM6upZI78Fv6LVB sH3w== 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=Artd3VgmPfRvgJSGx+z1Kh9KEzM48iDqoWnEYSArpAs=; b=i5QA0HC4sFUpX0BUdrU0XxJYbnm/QmQ1duFVeEl35N02MfGHFX9FjGmC+aUHbSNv7L UJS8NdJPm618OWYgY+jzvIiQ1vdEqn3AVfRl/d5MPzDbQ53ma13WXB2NrD40fpiVIQkG DWJzYHy12ebkk+g5jRoxKhdqergXvC/e6d8gvahYPa8vqcoWrHlaPsjYDEg1F60+QpBS 4V/hOJDLTPvmlytE6/AEPrgHn4uqV3w5erJXt9kSEboTHJj75Jr6Ypbzzhvu+Dzp+28T cj54xt8wnsSK9NvE4Ykhcsg57K8DS4qzGJltqRFl31nIvKBCRUMe7ochxiIxUVnK/wjU mchg== X-Gm-Message-State: AOAM53069ZcguP31cuu++4nO09jPgODEEkwtQcA/2neYrc4qaTSOJUti CIkQ6BuilJrLMq3lPkIzKV+5AvrhyRU= X-Google-Smtp-Source: ABdhPJwFwHRQ5a4Ww5IVXUAiiZXrkd1a8KUZIIAq0wSKl1tfIV4Z7oQsyhEIU6/ovaLsXaPu7ShP1QBdOt4= X-Received: from yuzhao.bld.corp.google.com ([2620:15c:183:200:9ea2:c755:ae22:6862]) (user=yuzhao job=sendgmr) by 2002:a81:a50b:0:b0:2eb:9a58:cfda with SMTP id u11-20020a81a50b000000b002eb9a58cfdamr10031842ywg.464.1649301371926; Wed, 06 Apr 2022 20:16:11 -0700 (PDT) Date: Wed, 6 Apr 2022 21:15:22 -0600 In-Reply-To: <20220407031525.2368067-1-yuzhao@google.com> Message-Id: <20220407031525.2368067-11-yuzhao@google.com> Mime-Version: 1.0 References: <20220407031525.2368067-1-yuzhao@google.com> X-Mailer: git-send-email 2.35.1.1094.g7c7d902a7c-goog Subject: [PATCH v10 10/14] mm: multi-gen LRU: kill switch From: Yu Zhao To: Stephen Rothwell , linux-mm@kvack.org Cc: Andi Kleen , Andrew Morton , Aneesh Kumar , Barry Song <21cnbao@gmail.com>, Catalin Marinas , Dave Hansen , Hillf Danton , Jens Axboe , Jesse Barnes , Johannes Weiner , Jonathan Corbet , Linus Torvalds , Matthew Wilcox , Mel Gorman , Michael Larabel , Michal Hocko , Mike Rapoport , Rik van Riel , Vlastimil Babka , Will Deacon , Ying Huang , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, page-reclaim@google.com, x86@kernel.org, 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 Add /sys/kernel/mm/lru_gen/enabled as a kill switch. Components that can be disabled include: 0x0001: the multi-gen LRU core 0x0002: walking page table, when arch_has_hw_pte_young() returns true 0x0004: clearing the accessed bit in non-leaf PMD entries, when CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG=3Dy [yYnN]: apply to all the components above E.g., echo y >/sys/kernel/mm/lru_gen/enabled cat /sys/kernel/mm/lru_gen/enabled 0x0007 echo 5 >/sys/kernel/mm/lru_gen/enabled cat /sys/kernel/mm/lru_gen/enabled 0x0005 NB: the page table walks happen on the scale of seconds under heavy memory pressure, in which case the mmap_lock contention is a lesser concern, compared with the LRU lock contention and the I/O congestion. So far the only well-known case of the mmap_lock contention happens on Android, due to Scudo [1] which allocates several thousand VMAs for merely a few hundred MBs. The SPF and the Maple Tree also have provided their own assessments [2][3]. However, if walking page tables does worsen the mmap_lock contention, the kill switch can be used to disable it. In this case the multi-gen LRU will suffer a minor performance degradation, as shown previously. Clearing the accessed bit in non-leaf PMD entries can also be disabled, since this behavior was not tested on x86 varieties other than Intel and AMD. [1] https://source.android.com/devices/tech/debug/scudo [2] https://lore.kernel.org/r/20220128131006.67712-1-michel@lespinasse.org/ [3] https://lore.kernel.org/r/20220202024137.2516438-1-Liam.Howlett@oracle.= com/ 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 --- include/linux/cgroup.h | 15 +- include/linux/mm_inline.h | 12 +- include/linux/mmzone.h | 9 ++ kernel/cgroup/cgroup-internal.h | 1 - mm/Kconfig | 6 + mm/vmscan.c | 238 +++++++++++++++++++++++++++++++- 6 files changed, 272 insertions(+), 9 deletions(-) diff --git a/include/linux/cgroup.h b/include/linux/cgroup.h index 0d1ada8968d7..1bc0cabf993f 100644 --- a/include/linux/cgroup.h +++ b/include/linux/cgroup.h @@ -432,6 +432,18 @@ static inline void cgroup_put(struct cgroup *cgrp) css_put(&cgrp->self); } =20 +extern struct mutex cgroup_mutex; + +static inline void cgroup_lock(void) +{ + mutex_lock(&cgroup_mutex); +} + +static inline void cgroup_unlock(void) +{ + mutex_unlock(&cgroup_mutex); +} + /** * task_css_set_check - obtain a task's css_set with extra access conditio= ns * @task: the task to obtain css_set for @@ -446,7 +458,6 @@ static inline void cgroup_put(struct cgroup *cgrp) * as locks used during the cgroup_subsys::attach() methods. */ #ifdef CONFIG_PROVE_RCU -extern struct mutex cgroup_mutex; extern spinlock_t css_set_lock; #define task_css_set_check(task, __c) \ rcu_dereference_check((task)->cgroups, \ @@ -708,6 +719,8 @@ struct cgroup; static inline u64 cgroup_id(const struct cgroup *cgrp) { return 1; } static inline void css_get(struct cgroup_subsys_state *css) {} static inline void css_put(struct cgroup_subsys_state *css) {} +static inline void cgroup_lock(void) {} +static inline void cgroup_unlock(void) {} static inline int cgroup_attach_task_all(struct task_struct *from, struct task_struct *t) { return 0; } static inline int cgroupstats_build(struct cgroupstats *stats, diff --git a/include/linux/mm_inline.h b/include/linux/mm_inline.h index 8a8f87b72540..352862af2669 100644 --- a/include/linux/mm_inline.h +++ b/include/linux/mm_inline.h @@ -106,7 +106,15 @@ static __always_inline enum lru_list folio_lru_list(st= ruct folio *folio) =20 static inline bool lru_gen_enabled(void) { - return true; +#ifdef CONFIG_LRU_GEN_ENABLED + DECLARE_STATIC_KEY_TRUE(lru_gen_caps[NR_LRU_GEN_CAPS]); + + return static_branch_likely(&lru_gen_caps[LRU_GEN_CORE]); +#else + DECLARE_STATIC_KEY_FALSE(lru_gen_caps[NR_LRU_GEN_CAPS]); + + return static_branch_unlikely(&lru_gen_caps[LRU_GEN_CORE]); +#endif } =20 static inline bool lru_gen_in_fault(void) @@ -196,7 +204,7 @@ static inline bool lru_gen_add_folio(struct lruvec *lru= vec, struct folio *folio, int zone =3D folio_zonenum(folio); struct lru_gen_struct *lrugen =3D &lruvec->lrugen; =20 - if (folio_test_unevictable(folio)) + if (folio_test_unevictable(folio) || !lrugen->enabled) return false; /* * There are three common cases for this page: diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index a1a99971ff9c..525dbf5e14fa 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -384,6 +384,13 @@ enum { LRU_GEN_FILE, }; =20 +enum { + LRU_GEN_CORE, + LRU_GEN_MM_WALK, + LRU_GEN_NONLEAF_YOUNG, + NR_LRU_GEN_CAPS +}; + #define MIN_LRU_BATCH BITS_PER_LONG #define MAX_LRU_BATCH (MIN_LRU_BATCH * 128) =20 @@ -422,6 +429,8 @@ struct lru_gen_struct { /* can be modified without holding the LRU lock */ atomic_long_t evicted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; atomic_long_t refaulted[NR_HIST_GENS][ANON_AND_FILE][MAX_NR_TIERS]; + /* whether the multi-gen LRU is enabled */ + bool enabled; }; =20 enum { diff --git a/kernel/cgroup/cgroup-internal.h b/kernel/cgroup/cgroup-interna= l.h index 6e36e854b512..929ed3bf1a7c 100644 --- a/kernel/cgroup/cgroup-internal.h +++ b/kernel/cgroup/cgroup-internal.h @@ -165,7 +165,6 @@ struct cgroup_mgctx { #define DEFINE_CGROUP_MGCTX(name) \ struct cgroup_mgctx name =3D CGROUP_MGCTX_INIT(name) =20 -extern struct mutex cgroup_mutex; extern spinlock_t css_set_lock; extern struct cgroup_subsys *cgroup_subsys[]; extern struct list_head cgroup_roots; diff --git a/mm/Kconfig b/mm/Kconfig index c40777d098a8..b55546191369 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -918,6 +918,12 @@ config LRU_GEN help A high performance LRU implementation to overcommit memory. =20 +config LRU_GEN_ENABLED + bool "Enable by default" + depends on LRU_GEN + help + This option enables the multi-gen LRU by default. + config LRU_GEN_STATS bool "Full stats for debugging" depends on LRU_GEN diff --git a/mm/vmscan.c b/mm/vmscan.c index 0663f1a3f72a..33845796d100 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -52,6 +52,7 @@ #include #include #include +#include =20 #include #include @@ -2989,6 +2990,12 @@ static bool can_age_anon_pages(struct pglist_data *p= gdat, =20 #ifdef CONFIG_LRU_GEN =20 +#ifdef CONFIG_LRU_GEN_ENABLED +DEFINE_STATIC_KEY_ARRAY_TRUE(lru_gen_caps, NR_LRU_GEN_CAPS); +#else +DEFINE_STATIC_KEY_ARRAY_FALSE(lru_gen_caps, NR_LRU_GEN_CAPS); +#endif + /*************************************************************************= ***** * shorthand helpers *************************************************************************= *****/ @@ -3025,6 +3032,15 @@ static int folio_lru_tier(struct folio *folio) return lru_tier_from_refs(refs); } =20 +static bool get_cap(int cap) +{ +#ifdef CONFIG_LRU_GEN_ENABLED + return static_branch_likely(&lru_gen_caps[cap]); +#else + return static_branch_unlikely(&lru_gen_caps[cap]); +#endif +} + static struct lruvec *get_lruvec(struct mem_cgroup *memcg, int nid) { struct pglist_data *pgdat =3D NODE_DATA(nid); @@ -3833,7 +3849,8 @@ static void walk_pmd_range_locked(pud_t *pud, unsigne= d long next, struct vm_area goto next; =20 if (!pmd_trans_huge(pmd[i])) { - if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG)) + if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) && + get_cap(LRU_GEN_NONLEAF_YOUNG)) pmdp_test_and_clear_young(vma, addr, pmd + i); goto next; } @@ -3940,10 +3957,12 @@ static void walk_pmd_range(pud_t *pud, unsigned lon= g start, unsigned long end, priv->mm_stats[MM_PMD_TOTAL]++; =20 #ifdef CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG - if (!pmd_young(val)) - continue; + if (get_cap(LRU_GEN_NONLEAF_YOUNG)) { + if (!pmd_young(val)) + continue; =20 - walk_pmd_range_locked(pud, addr, vma, walk, &pos); + walk_pmd_range_locked(pud, addr, vma, walk, &pos); + } #endif if (!priv->full_scan && !test_bloom_filter(priv->lruvec, priv->max_seq, = pmd + i)) continue; @@ -4180,7 +4199,7 @@ static bool try_to_inc_max_seq(struct lruvec *lruvec,= unsigned long max_seq, * handful of PTEs. Spreading the work out over a period of time usually * is less efficient, but it avoids bursty page faults. */ - if (!full_scan && !arch_has_hw_pte_young()) { + if (!full_scan && (!arch_has_hw_pte_young() || !get_cap(LRU_GEN_MM_WALK))= ) { success =3D iterate_mm_list_nowalk(lruvec, max_seq); goto done; } @@ -4910,6 +4929,211 @@ static void lru_gen_shrink_lruvec(struct lruvec *lr= uvec, struct scan_control *sc blk_finish_plug(&plug); } =20 +/*************************************************************************= ***** + * state change + *************************************************************************= *****/ + +static bool __maybe_unused state_is_valid(struct lruvec *lruvec) +{ + struct lru_gen_struct *lrugen =3D &lruvec->lrugen; + + if (lrugen->enabled) { + enum lru_list lru; + + for_each_evictable_lru(lru) { + if (!list_empty(&lruvec->lists[lru])) + return false; + } + } else { + int gen, type, zone; + + for_each_gen_type_zone(gen, type, zone) { + if (!list_empty(&lrugen->lists[gen][type][zone])) + return false; + + /* unlikely but not a bug when reset_batch_size() is pending */ + VM_WARN_ON(lrugen->nr_pages[gen][type][zone]); + } + } + + return true; +} + +static bool fill_evictable(struct lruvec *lruvec) +{ + enum lru_list lru; + int remaining =3D MAX_LRU_BATCH; + + for_each_evictable_lru(lru) { + int type =3D is_file_lru(lru); + bool active =3D is_active_lru(lru); + struct list_head *head =3D &lruvec->lists[lru]; + + while (!list_empty(head)) { + bool success; + struct folio *folio =3D lru_to_folio(head); + + VM_BUG_ON_FOLIO(folio_test_unevictable(folio), folio); + VM_BUG_ON_FOLIO(folio_test_active(folio) !=3D active, folio); + VM_BUG_ON_FOLIO(folio_is_file_lru(folio) !=3D type, folio); + VM_BUG_ON_FOLIO(folio_lru_gen(folio) < MAX_NR_GENS, folio); + + lruvec_del_folio(lruvec, folio); + success =3D lru_gen_add_folio(lruvec, folio, false); + VM_BUG_ON(!success); + + if (!--remaining) + return false; + } + } + + return true; +} + +static bool drain_evictable(struct lruvec *lruvec) +{ + int gen, type, zone; + int remaining =3D MAX_LRU_BATCH; + + for_each_gen_type_zone(gen, type, zone) { + struct list_head *head =3D &lruvec->lrugen.lists[gen][type][zone]; + + while (!list_empty(head)) { + bool success; + struct folio *folio =3D lru_to_folio(head); + + VM_BUG_ON_FOLIO(folio_test_unevictable(folio), folio); + VM_BUG_ON_FOLIO(folio_test_active(folio), folio); + VM_BUG_ON_FOLIO(folio_is_file_lru(folio) !=3D type, folio); + VM_BUG_ON_FOLIO(folio_zonenum(folio) !=3D zone, folio); + + success =3D lru_gen_del_folio(lruvec, folio, false); + VM_BUG_ON(!success); + lruvec_add_folio(lruvec, folio); + + if (!--remaining) + return false; + } + } + + return true; +} + +static void lru_gen_change_state(bool enable) +{ + static DEFINE_MUTEX(state_mutex); + + struct mem_cgroup *memcg; + + cgroup_lock(); + cpus_read_lock(); + get_online_mems(); + mutex_lock(&state_mutex); + + if (enable =3D=3D lru_gen_enabled()) + goto unlock; + + if (enable) + static_branch_enable_cpuslocked(&lru_gen_caps[LRU_GEN_CORE]); + else + static_branch_disable_cpuslocked(&lru_gen_caps[LRU_GEN_CORE]); + + memcg =3D mem_cgroup_iter(NULL, NULL, NULL); + do { + int nid; + + for_each_node(nid) { + struct lruvec *lruvec =3D get_lruvec(memcg, nid); + + if (!lruvec) + continue; + + spin_lock_irq(&lruvec->lru_lock); + + VM_BUG_ON(!seq_is_valid(lruvec)); + VM_BUG_ON(!state_is_valid(lruvec)); + + lruvec->lrugen.enabled =3D enable; + + while (!(enable ? fill_evictable(lruvec) : drain_evictable(lruvec))) { + spin_unlock_irq(&lruvec->lru_lock); + cond_resched(); + spin_lock_irq(&lruvec->lru_lock); + } + + spin_unlock_irq(&lruvec->lru_lock); + } + + cond_resched(); + } while ((memcg =3D mem_cgroup_iter(NULL, memcg, NULL))); +unlock: + mutex_unlock(&state_mutex); + put_online_mems(); + cpus_read_unlock(); + cgroup_unlock(); +} + +/*************************************************************************= ***** + * sysfs interface + *************************************************************************= *****/ + +static ssize_t show_enable(struct kobject *kobj, struct kobj_attribute *at= tr, char *buf) +{ + unsigned int caps =3D 0; + + if (get_cap(LRU_GEN_CORE)) + caps |=3D BIT(LRU_GEN_CORE); + + if (arch_has_hw_pte_young() && get_cap(LRU_GEN_MM_WALK)) + caps |=3D BIT(LRU_GEN_MM_WALK); + + if (IS_ENABLED(CONFIG_ARCH_HAS_NONLEAF_PMD_YOUNG) && get_cap(LRU_GEN_NONL= EAF_YOUNG)) + caps |=3D BIT(LRU_GEN_NONLEAF_YOUNG); + + return snprintf(buf, PAGE_SIZE, "0x%04x\n", caps); +} + +static ssize_t store_enable(struct kobject *kobj, struct kobj_attribute *a= ttr, + const char *buf, size_t len) +{ + int i; + unsigned int caps; + + if (tolower(*buf) =3D=3D 'n') + caps =3D 0; + else if (tolower(*buf) =3D=3D 'y') + caps =3D -1; + else if (kstrtouint(buf, 0, &caps)) + return -EINVAL; + + for (i =3D 0; i < NR_LRU_GEN_CAPS; i++) { + bool enable =3D caps & BIT(i); + + if (i =3D=3D LRU_GEN_CORE) + lru_gen_change_state(enable); + else if (enable) + static_branch_enable(&lru_gen_caps[i]); + else + static_branch_disable(&lru_gen_caps[i]); + } + + return len; +} + +static struct kobj_attribute lru_gen_enabled_attr =3D __ATTR( + enabled, 0644, show_enable, store_enable +); + +static struct attribute *lru_gen_attrs[] =3D { + &lru_gen_enabled_attr.attr, + NULL +}; + +static struct attribute_group lru_gen_attr_group =3D { + .name =3D "lru_gen", + .attrs =3D lru_gen_attrs, +}; + /*************************************************************************= ***** * initialization *************************************************************************= *****/ @@ -4920,6 +5144,7 @@ void lru_gen_init_lruvec(struct lruvec *lruvec) struct lru_gen_struct *lrugen =3D &lruvec->lrugen; =20 lrugen->max_seq =3D MIN_NR_GENS + 1; + lrugen->enabled =3D lru_gen_enabled(); =20 for_each_gen_type_zone(gen, type, zone) INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); @@ -4960,6 +5185,9 @@ static int __init init_lru_gen(void) BUILD_BUG_ON(BIT(LRU_GEN_WIDTH) <=3D MAX_NR_GENS); BUILD_BUG_ON(sizeof(MM_STAT_CODES) !=3D NR_MM_STATS + 1); =20 + if (sysfs_create_group(mm_kobj, &lru_gen_attr_group)) + pr_err("lru_gen: failed to create sysfs group\n"); + return 0; }; late_initcall(init_lru_gen); --=20 2.35.1.1094.g7c7d902a7c-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 6A8C8C433EF for ; Thu, 7 Apr 2022 03:38:12 +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=SP5u1peMUVyu40PfXLxRuWUczAO5P8nFKTc0szQR+V4=; b=Y4zkgQqeOnY5FRShauWW5z6u1F FlNdx6ZSENbhU3gF4wBNH8fYfxw4QO8bA1vg+OiT9zQfmYkQrFbw88TsRJukoqDH4qcQQlkuspnHX VElfkPRwC9yLw++66VeGktTzQKnE3KM/xq6m/wN/uuqNAqutvLORlFjQLHxjeTivGmw57nU7Vz+pr /pIxePg+EvgGH+YUj4yfYevEHT7qfck/7U3XsRW1/r3E911Bw1lVUlIsmlA2j7xczMI5MGr6I/tWj y1+2ukPq7PUjlhKHCekMp4TK6Vl0MGEc2gTXvOpSGN8XGwjRD9epjjTDkj+ZE/K8giAjEVKTxS7HU fPIV/hDw==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1ncIwe-0098my-6g; Thu, 07 Apr 2022 03:36:28 +0000 Received: from mail-yb1-xb4a.google.com ([2607:f8b0:4864:20::b4a]) by bombadil.infradead.org with esmtps (Exim 4.94.2 #2 (Red Hat Linux)) id 1ncId3-0091es-Mi for linux-arm-kernel@lists.infradead.org; Thu, 07 Apr 2022 03:16:29 +0000 Received: by mail-yb1-xb4a.google.com with SMTP id b6-20020a5b0b46000000b0063dcbfa6dd3so3280047ybr.2 for ; Wed, 06 Apr 2022 20:16:12 -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=Artd3VgmPfRvgJSGx+z1Kh9KEzM48iDqoWnEYSArpAs=; b=RXSD1P20FecKhU9EvkEbe8qQkdfzqFyaZHASZakqNZpIs9fyF0EvUnJ2YTOIhkeXOE tJztkP9xyGj6ZEPMFdDptYgmHHfOJEOkPjmxlKMWBV6/wbWDZ6QgyYPhZ0RIHOEJrZb1 Rad+U2zx4t8ASeZdZ07fVR/TwXApI0p8rfxN6Adx5eOAMJryyGoGNQG7Acc7UUHUYiH0 9sVKxpnURKJmZCokKSnmE9Qht71V0tjrfRVa1NkRGaSb3POt9zoueAT0J/EH/q+B4uVW 7s5wAAmBIfP04+WaEqS9xmPcfj5TCuQArZFhC/mD2A1QN7FXDHd9opM6upZI78Fv6LVB sH3w== 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=Artd3VgmPfRvgJSGx+z1Kh9KEzM48iDqoWnEYSArpAs=; b=zECm4pM/BRky5O+Whxe+SVcd1FZH3J8wZZsq4L3vDgagkYQCYZ7/mYxwI8K9QdQYu7 Ll+jl3M/6mNmGlTTI0XRUGeLKn+9AHIUI4rQ56s57CtVEOOYt+fQS+MJKBLhS2FaSbgq qb+JGqDIwCDZ+N0DojmlPtMF1oHpqDJe6YWPsw7PIHpjbFWIBtvNVrwTQnHComTkharj ak9qD4XuoOwTMspX1jGQeBFX+Z+vHuS0y3wxcF0B/I0+8qqPO9AKdHsv54JSIccwuYe3 AkReoXNAV9xByU8MgLBF3cNZetET9gK8BRqq/EGxlpuL5E7hYbKBNvPinAjTueiDxZ19 cRMQ== X-Gm-Message-State: AOAM530gGvhYAha6C01rsGw58Dp7J+cXy4JQ/eDeI0tw5e+t7aP420nf R7ihV8yOFFqgrSxy9W3Df5SVLYRN6UA= X-Google-Smtp-Source: ABdhPJwFwHRQ5a4Ww5IVXUAiiZXrkd1a8KUZIIAq0wSKl1tfIV4Z7oQsyhEIU6/ovaLsXaPu7ShP1QBdOt4= X-Received: from yuzhao.bld.corp.google.com ([2620:15c:183:200:9ea2:c755:ae22:6862]) (user=yuzhao job=sendgmr) by 2002:a81:a50b:0:b0:2eb:9a58:cfda with SMTP id u11-20020a81a50b000000b002eb9a58cfdamr10031842ywg.464.1649301371926; Wed, 06 Apr 2022 20:16:11 -0700 (PDT) Date: Wed, 6 Apr 2022 21:15:22 -0600 In-Reply-To: <20220407031525.2368067-1-yuzhao@google.com> Message-Id: <20220407031525.2368067-11-yuzhao@google.com> Mime-Version: 1.0 References: <20220407031525.2368067-1-yuzhao@google.com> X-Mailer: git-send-email 2.35.1.1094.g7c7d902a7c-goog Subject: [PATCH v10 10/14] mm: multi-gen LRU: kill switch From: Yu Zhao To: Stephen Rothwell , linux-mm@kvack.org Cc: Andi Kleen , Andrew Morton , Aneesh Kumar , Barry Song <21cnbao@gmail.com>, Catalin Marinas , Dave Hansen , Hillf Danton , Jens Axboe , Jesse Barnes , Johannes Weiner , Jonathan Corbet , Linus Torvalds , Matthew Wilcox , Mel Gorman , Michael Larabel , Michal Hocko , Mike Rapoport , Rik van Riel , Vlastimil Babka , Will Deacon , Ying Huang , linux-arm-kernel@lists.infradead.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org, page-reclaim@google.com, x86@kernel.org, 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-20220406_201613_819089_F807D6A4 X-CRM114-Status: GOOD ( 27.56 ) 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 QWRkIC9zeXMva2VybmVsL21tL2xydV9nZW4vZW5hYmxlZCBhcyBhIGtpbGwgc3dpdGNoLiBDb21w b25lbnRzIHRoYXQKY2FuIGJlIGRpc2FibGVkIGluY2x1ZGU6CiAgMHgwMDAxOiB0aGUgbXVsdGkt Z2VuIExSVSBjb3JlCiAgMHgwMDAyOiB3YWxraW5nIHBhZ2UgdGFibGUsIHdoZW4gYXJjaF9oYXNf aHdfcHRlX3lvdW5nKCkgcmV0dXJucwogICAgICAgICAgdHJ1ZQogIDB4MDAwNDogY2xlYXJpbmcg dGhlIGFjY2Vzc2VkIGJpdCBpbiBub24tbGVhZiBQTUQgZW50cmllcywgd2hlbgogICAgICAgICAg Q09ORklHX0FSQ0hfSEFTX05PTkxFQUZfUE1EX1lPVU5HPXkKICBbeVluTl06IGFwcGx5IHRvIGFs bCB0aGUgY29tcG9uZW50cyBhYm92ZQpFLmcuLAogIGVjaG8geSA+L3N5cy9rZXJuZWwvbW0vbHJ1 X2dlbi9lbmFibGVkCiAgY2F0IC9zeXMva2VybmVsL21tL2xydV9nZW4vZW5hYmxlZAogIDB4MDAw NwogIGVjaG8gNSA+L3N5cy9rZXJuZWwvbW0vbHJ1X2dlbi9lbmFibGVkCiAgY2F0IC9zeXMva2Vy bmVsL21tL2xydV9nZW4vZW5hYmxlZAogIDB4MDAwNQoKTkI6IHRoZSBwYWdlIHRhYmxlIHdhbGtz IGhhcHBlbiBvbiB0aGUgc2NhbGUgb2Ygc2Vjb25kcyB1bmRlciBoZWF2eQptZW1vcnkgcHJlc3N1 cmUsIGluIHdoaWNoIGNhc2UgdGhlIG1tYXBfbG9jayBjb250ZW50aW9uIGlzIGEgbGVzc2VyCmNv bmNlcm4sIGNvbXBhcmVkIHdpdGggdGhlIExSVSBsb2NrIGNvbnRlbnRpb24gYW5kIHRoZSBJL08g Y29uZ2VzdGlvbi4KU28gZmFyIHRoZSBvbmx5IHdlbGwta25vd24gY2FzZSBvZiB0aGUgbW1hcF9s b2NrIGNvbnRlbnRpb24gaGFwcGVucyBvbgpBbmRyb2lkLCBkdWUgdG8gU2N1ZG8gWzFdIHdoaWNo IGFsbG9jYXRlcyBzZXZlcmFsIHRob3VzYW5kIFZNQXMgZm9yCm1lcmVseSBhIGZldyBodW5kcmVk IE1Ccy4gVGhlIFNQRiBhbmQgdGhlIE1hcGxlIFRyZWUgYWxzbyBoYXZlCnByb3ZpZGVkIHRoZWly IG93biBhc3Nlc3NtZW50cyBbMl1bM10uIEhvd2V2ZXIsIGlmIHdhbGtpbmcgcGFnZSB0YWJsZXMK ZG9lcyB3b3JzZW4gdGhlIG1tYXBfbG9jayBjb250ZW50aW9uLCB0aGUga2lsbCBzd2l0Y2ggY2Fu IGJlIHVzZWQgdG8KZGlzYWJsZSBpdC4gSW4gdGhpcyBjYXNlIHRoZSBtdWx0aS1nZW4gTFJVIHdp bGwgc3VmZmVyIGEgbWlub3IKcGVyZm9ybWFuY2UgZGVncmFkYXRpb24sIGFzIHNob3duIHByZXZp b3VzbHkuCgpDbGVhcmluZyB0aGUgYWNjZXNzZWQgYml0IGluIG5vbi1sZWFmIFBNRCBlbnRyaWVz IGNhbiBhbHNvIGJlCmRpc2FibGVkLCBzaW5jZSB0aGlzIGJlaGF2aW9yIHdhcyBub3QgdGVzdGVk IG9uIHg4NiB2YXJpZXRpZXMgb3RoZXIKdGhhbiBJbnRlbCBhbmQgQU1ELgoKWzFdIGh0dHBzOi8v c291cmNlLmFuZHJvaWQuY29tL2RldmljZXMvdGVjaC9kZWJ1Zy9zY3VkbwpbMl0gaHR0cHM6Ly9s b3JlLmtlcm5lbC5vcmcvci8yMDIyMDEyODEzMTAwNi42NzcxMi0xLW1pY2hlbEBsZXNwaW5hc3Nl Lm9yZy8KWzNdIGh0dHBzOi8vbG9yZS5rZXJuZWwub3JnL3IvMjAyMjAyMDIwMjQxMzcuMjUxNjQz OC0xLUxpYW0uSG93bGV0dEBvcmFjbGUuY29tLwoKU2lnbmVkLW9mZi1ieTogWXUgWmhhbyA8eXV6 aGFvQGdvb2dsZS5jb20+CkFja2VkLWJ5OiBCcmlhbiBHZWZmb24gPGJnZWZmb25AZ29vZ2xlLmNv bT4KQWNrZWQtYnk6IEphbiBBbGV4YW5kZXIgU3RlZmZlbnMgKGhlZnRpZykgPGhlZnRpZ0BhcmNo bGludXgub3JnPgpBY2tlZC1ieTogT2xla3NhbmRyIE5hdGFsZW5rbyA8b2xla3NhbmRyQG5hdGFs ZW5rby5uYW1lPgpBY2tlZC1ieTogU3RldmVuIEJhcnJldHQgPHN0ZXZlbkBsaXF1b3JpeC5uZXQ+ CkFja2VkLWJ5OiBTdWxlaW1hbiBTb3VobGFsIDxzdWxlaW1hbkBnb29nbGUuY29tPgpUZXN0ZWQt Ynk6IERhbmllbCBCeXJuZSA8ZGpieXJuZUBtdHUuZWR1PgpUZXN0ZWQtYnk6IERvbmFsZCBDYXJy IDxkQGNoYW9zLXJlaW5zLmNvbT4KVGVzdGVkLWJ5OiBIb2xnZXIgSG9mZnN0w6R0dGUgPGhvbGdl ckBhcHBsaWVkLWFzeW5jaHJvbnkuY29tPgpUZXN0ZWQtYnk6IEtvbnN0YW50aW4gS2hhcmxhbW92 IDxIaS1BbmdlbEB5YW5kZXgucnU+ClRlc3RlZC1ieTogU2h1YW5nIFpoYWkgPHN6aGFpMkBjcy5y b2NoZXN0ZXIuZWR1PgpUZXN0ZWQtYnk6IFNvZmlhIFRyaW5oIDxzb2ZpYS50cmluaEBlZGkud29y a3M+ClRlc3RlZC1ieTogVmFpYmhhdiBKYWluIDx2YWliaGF2QGxpbnV4LmlibS5jb20+Ci0tLQog aW5jbHVkZS9saW51eC9jZ3JvdXAuaCAgICAgICAgICB8ICAxNSArLQogaW5jbHVkZS9saW51eC9t bV9pbmxpbmUuaCAgICAgICB8ICAxMiArLQogaW5jbHVkZS9saW51eC9tbXpvbmUuaCAgICAgICAg ICB8ICAgOSArKwoga2VybmVsL2Nncm91cC9jZ3JvdXAtaW50ZXJuYWwuaCB8ICAgMSAtCiBtbS9L Y29uZmlnICAgICAgICAgICAgICAgICAgICAgIHwgICA2ICsKIG1tL3Ztc2Nhbi5jICAgICAgICAg ICAgICAgICAgICAgfCAyMzggKysrKysrKysrKysrKysrKysrKysrKysrKysrKysrKy0KIDYgZmls ZXMgY2hhbmdlZCwgMjcyIGluc2VydGlvbnMoKyksIDkgZGVsZXRpb25zKC0pCgpkaWZmIC0tZ2l0 IGEvaW5jbHVkZS9saW51eC9jZ3JvdXAuaCBiL2luY2x1ZGUvbGludXgvY2dyb3VwLmgKaW5kZXgg MGQxYWRhODk2OGQ3Li4xYmMwY2FiZjk5M2YgMTAwNjQ0Ci0tLSBhL2luY2x1ZGUvbGludXgvY2dy b3VwLmgKKysrIGIvaW5jbHVkZS9saW51eC9jZ3JvdXAuaApAQCAtNDMyLDYgKzQzMiwxOCBAQCBz dGF0aWMgaW5saW5lIHZvaWQgY2dyb3VwX3B1dChzdHJ1Y3QgY2dyb3VwICpjZ3JwKQogCWNzc19w dXQoJmNncnAtPnNlbGYpOwogfQogCitleHRlcm4gc3RydWN0IG11dGV4IGNncm91cF9tdXRleDsK Kworc3RhdGljIGlubGluZSB2b2lkIGNncm91cF9sb2NrKHZvaWQpCit7CisJbXV0ZXhfbG9jaygm Y2dyb3VwX211dGV4KTsKK30KKworc3RhdGljIGlubGluZSB2b2lkIGNncm91cF91bmxvY2sodm9p ZCkKK3sKKwltdXRleF91bmxvY2soJmNncm91cF9tdXRleCk7Cit9CisKIC8qKgogICogdGFza19j c3Nfc2V0X2NoZWNrIC0gb2J0YWluIGEgdGFzaydzIGNzc19zZXQgd2l0aCBleHRyYSBhY2Nlc3Mg Y29uZGl0aW9ucwogICogQHRhc2s6IHRoZSB0YXNrIHRvIG9idGFpbiBjc3Nfc2V0IGZvcgpAQCAt NDQ2LDcgKzQ1OCw2IEBAIHN0YXRpYyBpbmxpbmUgdm9pZCBjZ3JvdXBfcHV0KHN0cnVjdCBjZ3Jv dXAgKmNncnApCiAgKiBhcyBsb2NrcyB1c2VkIGR1cmluZyB0aGUgY2dyb3VwX3N1YnN5czo6YXR0 YWNoKCkgbWV0aG9kcy4KICAqLwogI2lmZGVmIENPTkZJR19QUk9WRV9SQ1UKLWV4dGVybiBzdHJ1 Y3QgbXV0ZXggY2dyb3VwX211dGV4OwogZXh0ZXJuIHNwaW5sb2NrX3QgY3NzX3NldF9sb2NrOwog I2RlZmluZSB0YXNrX2Nzc19zZXRfY2hlY2sodGFzaywgX19jKQkJCQkJXAogCXJjdV9kZXJlZmVy ZW5jZV9jaGVjaygodGFzayktPmNncm91cHMsCQkJCVwKQEAgLTcwOCw2ICs3MTksOCBAQCBzdHJ1 Y3QgY2dyb3VwOwogc3RhdGljIGlubGluZSB1NjQgY2dyb3VwX2lkKGNvbnN0IHN0cnVjdCBjZ3Jv dXAgKmNncnApIHsgcmV0dXJuIDE7IH0KIHN0YXRpYyBpbmxpbmUgdm9pZCBjc3NfZ2V0KHN0cnVj dCBjZ3JvdXBfc3Vic3lzX3N0YXRlICpjc3MpIHt9CiBzdGF0aWMgaW5saW5lIHZvaWQgY3NzX3B1 dChzdHJ1Y3QgY2dyb3VwX3N1YnN5c19zdGF0ZSAqY3NzKSB7fQorc3RhdGljIGlubGluZSB2b2lk IGNncm91cF9sb2NrKHZvaWQpIHt9CitzdGF0aWMgaW5saW5lIHZvaWQgY2dyb3VwX3VubG9jayh2 b2lkKSB7fQogc3RhdGljIGlubGluZSBpbnQgY2dyb3VwX2F0dGFjaF90YXNrX2FsbChzdHJ1Y3Qg dGFza19zdHJ1Y3QgKmZyb20sCiAJCQkJCSBzdHJ1Y3QgdGFza19zdHJ1Y3QgKnQpIHsgcmV0dXJu IDA7IH0KIHN0YXRpYyBpbmxpbmUgaW50IGNncm91cHN0YXRzX2J1aWxkKHN0cnVjdCBjZ3JvdXBz dGF0cyAqc3RhdHMsCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tX2lubGluZS5oIGIvaW5j bHVkZS9saW51eC9tbV9pbmxpbmUuaAppbmRleCA4YThmODdiNzI1NDAuLjM1Mjg2MmFmMjY2OSAx MDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbV9pbmxpbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4 L21tX2lubGluZS5oCkBAIC0xMDYsNyArMTA2LDE1IEBAIHN0YXRpYyBfX2Fsd2F5c19pbmxpbmUg ZW51bSBscnVfbGlzdCBmb2xpb19scnVfbGlzdChzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCiBzdGF0 aWMgaW5saW5lIGJvb2wgbHJ1X2dlbl9lbmFibGVkKHZvaWQpCiB7Ci0JcmV0dXJuIHRydWU7Cisj aWZkZWYgQ09ORklHX0xSVV9HRU5fRU5BQkxFRAorCURFQ0xBUkVfU1RBVElDX0tFWV9UUlVFKGxy dV9nZW5fY2Fwc1tOUl9MUlVfR0VOX0NBUFNdKTsKKworCXJldHVybiBzdGF0aWNfYnJhbmNoX2xp a2VseSgmbHJ1X2dlbl9jYXBzW0xSVV9HRU5fQ09SRV0pOworI2Vsc2UKKwlERUNMQVJFX1NUQVRJ Q19LRVlfRkFMU0UobHJ1X2dlbl9jYXBzW05SX0xSVV9HRU5fQ0FQU10pOworCisJcmV0dXJuIHN0 YXRpY19icmFuY2hfdW5saWtlbHkoJmxydV9nZW5fY2Fwc1tMUlVfR0VOX0NPUkVdKTsKKyNlbmRp ZgogfQogCiBzdGF0aWMgaW5saW5lIGJvb2wgbHJ1X2dlbl9pbl9mYXVsdCh2b2lkKQpAQCAtMTk2 LDcgKzIwNCw3IEBAIHN0YXRpYyBpbmxpbmUgYm9vbCBscnVfZ2VuX2FkZF9mb2xpbyhzdHJ1Y3Qg bHJ1dmVjICpscnV2ZWMsIHN0cnVjdCBmb2xpbyAqZm9saW8sCiAJaW50IHpvbmUgPSBmb2xpb196 b25lbnVtKGZvbGlvKTsKIAlzdHJ1Y3QgbHJ1X2dlbl9zdHJ1Y3QgKmxydWdlbiA9ICZscnV2ZWMt PmxydWdlbjsKIAotCWlmIChmb2xpb190ZXN0X3VuZXZpY3RhYmxlKGZvbGlvKSkKKwlpZiAoZm9s aW9fdGVzdF91bmV2aWN0YWJsZShmb2xpbykgfHwgIWxydWdlbi0+ZW5hYmxlZCkKIAkJcmV0dXJu IGZhbHNlOwogCS8qCiAJICogVGhlcmUgYXJlIHRocmVlIGNvbW1vbiBjYXNlcyBmb3IgdGhpcyBw YWdlOgpkaWZmIC0tZ2l0IGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaCBiL2luY2x1ZGUvbGludXgv bW16b25lLmgKaW5kZXggYTFhOTk5NzFmZjljLi41MjVkYmY1ZTE0ZmEgMTAwNjQ0Ci0tLSBhL2lu Y2x1ZGUvbGludXgvbW16b25lLmgKKysrIGIvaW5jbHVkZS9saW51eC9tbXpvbmUuaApAQCAtMzg0 LDYgKzM4NCwxMyBAQCBlbnVtIHsKIAlMUlVfR0VOX0ZJTEUsCiB9OwogCitlbnVtIHsKKwlMUlVf R0VOX0NPUkUsCisJTFJVX0dFTl9NTV9XQUxLLAorCUxSVV9HRU5fTk9OTEVBRl9ZT1VORywKKwlO Ul9MUlVfR0VOX0NBUFMKK307CisKICNkZWZpbmUgTUlOX0xSVV9CQVRDSAkJQklUU19QRVJfTE9O RwogI2RlZmluZSBNQVhfTFJVX0JBVENICQkoTUlOX0xSVV9CQVRDSCAqIDEyOCkKIApAQCAtNDIy LDYgKzQyOSw4IEBAIHN0cnVjdCBscnVfZ2VuX3N0cnVjdCB7CiAJLyogY2FuIGJlIG1vZGlmaWVk IHdpdGhvdXQgaG9sZGluZyB0aGUgTFJVIGxvY2sgKi8KIAlhdG9taWNfbG9uZ190IGV2aWN0ZWRb TlJfSElTVF9HRU5TXVtBTk9OX0FORF9GSUxFXVtNQVhfTlJfVElFUlNdOwogCWF0b21pY19sb25n X3QgcmVmYXVsdGVkW05SX0hJU1RfR0VOU11bQU5PTl9BTkRfRklMRV1bTUFYX05SX1RJRVJTXTsK KwkvKiB3aGV0aGVyIHRoZSBtdWx0aS1nZW4gTFJVIGlzIGVuYWJsZWQgKi8KKwlib29sIGVuYWJs ZWQ7CiB9OwogCiBlbnVtIHsKZGlmZiAtLWdpdCBhL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLWludGVy bmFsLmggYi9rZXJuZWwvY2dyb3VwL2Nncm91cC1pbnRlcm5hbC5oCmluZGV4IDZlMzZlODU0YjUx Mi4uOTI5ZWQzYmYxYTdjIDEwMDY0NAotLS0gYS9rZXJuZWwvY2dyb3VwL2Nncm91cC1pbnRlcm5h bC5oCisrKyBiL2tlcm5lbC9jZ3JvdXAvY2dyb3VwLWludGVybmFsLmgKQEAgLTE2NSw3ICsxNjUs NiBAQCBzdHJ1Y3QgY2dyb3VwX21nY3R4IHsKICNkZWZpbmUgREVGSU5FX0NHUk9VUF9NR0NUWChu YW1lKQkJCQkJCVwKIAlzdHJ1Y3QgY2dyb3VwX21nY3R4IG5hbWUgPSBDR1JPVVBfTUdDVFhfSU5J VChuYW1lKQogCi1leHRlcm4gc3RydWN0IG11dGV4IGNncm91cF9tdXRleDsKIGV4dGVybiBzcGlu bG9ja190IGNzc19zZXRfbG9jazsKIGV4dGVybiBzdHJ1Y3QgY2dyb3VwX3N1YnN5cyAqY2dyb3Vw X3N1YnN5c1tdOwogZXh0ZXJuIHN0cnVjdCBsaXN0X2hlYWQgY2dyb3VwX3Jvb3RzOwpkaWZmIC0t Z2l0IGEvbW0vS2NvbmZpZyBiL21tL0tjb25maWcKaW5kZXggYzQwNzc3ZDA5OGE4Li5iNTU1NDYx OTEzNjkgMTAwNjQ0Ci0tLSBhL21tL0tjb25maWcKKysrIGIvbW0vS2NvbmZpZwpAQCAtOTE4LDYg KzkxOCwxMiBAQCBjb25maWcgTFJVX0dFTgogCWhlbHAKIAkgIEEgaGlnaCBwZXJmb3JtYW5jZSBM UlUgaW1wbGVtZW50YXRpb24gdG8gb3ZlcmNvbW1pdCBtZW1vcnkuCiAKK2NvbmZpZyBMUlVfR0VO X0VOQUJMRUQKKwlib29sICJFbmFibGUgYnkgZGVmYXVsdCIKKwlkZXBlbmRzIG9uIExSVV9HRU4K KwloZWxwCisJICBUaGlzIG9wdGlvbiBlbmFibGVzIHRoZSBtdWx0aS1nZW4gTFJVIGJ5IGRlZmF1 bHQuCisKIGNvbmZpZyBMUlVfR0VOX1NUQVRTCiAJYm9vbCAiRnVsbCBzdGF0cyBmb3IgZGVidWdn aW5nIgogCWRlcGVuZHMgb24gTFJVX0dFTgpkaWZmIC0tZ2l0IGEvbW0vdm1zY2FuLmMgYi9tbS92 bXNjYW4uYwppbmRleCAwNjYzZjFhM2Y3MmEuLjMzODQ1Nzk2ZDEwMCAxMDA2NDQKLS0tIGEvbW0v dm1zY2FuLmMKKysrIGIvbW0vdm1zY2FuLmMKQEAgLTUyLDYgKzUyLDcgQEAKICNpbmNsdWRlIDxs aW51eC9wc2kuaD4KICNpbmNsdWRlIDxsaW51eC9wYWdld2Fsay5oPgogI2luY2x1ZGUgPGxpbnV4 L3NobWVtX2ZzLmg+CisjaW5jbHVkZSA8bGludXgvY3R5cGUuaD4KIAogI2luY2x1ZGUgPGFzbS90 bGJmbHVzaC5oPgogI2luY2x1ZGUgPGFzbS9kaXY2NC5oPgpAQCAtMjk4OSw2ICsyOTkwLDEyIEBA IHN0YXRpYyBib29sIGNhbl9hZ2VfYW5vbl9wYWdlcyhzdHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0 LAogCiAjaWZkZWYgQ09ORklHX0xSVV9HRU4KIAorI2lmZGVmIENPTkZJR19MUlVfR0VOX0VOQUJM RUQKK0RFRklORV9TVEFUSUNfS0VZX0FSUkFZX1RSVUUobHJ1X2dlbl9jYXBzLCBOUl9MUlVfR0VO X0NBUFMpOworI2Vsc2UKK0RFRklORV9TVEFUSUNfS0VZX0FSUkFZX0ZBTFNFKGxydV9nZW5fY2Fw cywgTlJfTFJVX0dFTl9DQVBTKTsKKyNlbmRpZgorCiAvKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAg KiAgICAgICAgICAgICAgICAgICAgICAgICAgc2hvcnRoYW5kIGhlbHBlcnMKICAqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKiovCkBAIC0zMDI1LDYgKzMwMzIsMTUgQEAgc3RhdGljIGludCBmb2xpb19scnVf dGllcihzdHJ1Y3QgZm9saW8gKmZvbGlvKQogCXJldHVybiBscnVfdGllcl9mcm9tX3JlZnMocmVm cyk7CiB9CiAKK3N0YXRpYyBib29sIGdldF9jYXAoaW50IGNhcCkKK3sKKyNpZmRlZiBDT05GSUdf TFJVX0dFTl9FTkFCTEVECisJcmV0dXJuIHN0YXRpY19icmFuY2hfbGlrZWx5KCZscnVfZ2VuX2Nh cHNbY2FwXSk7CisjZWxzZQorCXJldHVybiBzdGF0aWNfYnJhbmNoX3VubGlrZWx5KCZscnVfZ2Vu X2NhcHNbY2FwXSk7CisjZW5kaWYKK30KKwogc3RhdGljIHN0cnVjdCBscnV2ZWMgKmdldF9scnV2 ZWMoc3RydWN0IG1lbV9jZ3JvdXAgKm1lbWNnLCBpbnQgbmlkKQogewogCXN0cnVjdCBwZ2xpc3Rf ZGF0YSAqcGdkYXQgPSBOT0RFX0RBVEEobmlkKTsKQEAgLTM4MzMsNyArMzg0OSw4IEBAIHN0YXRp YyB2b2lkIHdhbGtfcG1kX3JhbmdlX2xvY2tlZChwdWRfdCAqcHVkLCB1bnNpZ25lZCBsb25nIG5l eHQsIHN0cnVjdCB2bV9hcmVhCiAJCQlnb3RvIG5leHQ7CiAKIAkJaWYgKCFwbWRfdHJhbnNfaHVn ZShwbWRbaV0pKSB7Ci0JCQlpZiAoSVNfRU5BQkxFRChDT05GSUdfQVJDSF9IQVNfTk9OTEVBRl9Q TURfWU9VTkcpKQorCQkJaWYgKElTX0VOQUJMRUQoQ09ORklHX0FSQ0hfSEFTX05PTkxFQUZfUE1E X1lPVU5HKSAmJgorCQkJICAgIGdldF9jYXAoTFJVX0dFTl9OT05MRUFGX1lPVU5HKSkKIAkJCQlw bWRwX3Rlc3RfYW5kX2NsZWFyX3lvdW5nKHZtYSwgYWRkciwgcG1kICsgaSk7CiAJCQlnb3RvIG5l eHQ7CiAJCX0KQEAgLTM5NDAsMTAgKzM5NTcsMTIgQEAgc3RhdGljIHZvaWQgd2Fsa19wbWRfcmFu Z2UocHVkX3QgKnB1ZCwgdW5zaWduZWQgbG9uZyBzdGFydCwgdW5zaWduZWQgbG9uZyBlbmQsCiAJ CXByaXYtPm1tX3N0YXRzW01NX1BNRF9UT1RBTF0rKzsKIAogI2lmZGVmIENPTkZJR19BUkNIX0hB U19OT05MRUFGX1BNRF9ZT1VORwotCQlpZiAoIXBtZF95b3VuZyh2YWwpKQotCQkJY29udGludWU7 CisJCWlmIChnZXRfY2FwKExSVV9HRU5fTk9OTEVBRl9ZT1VORykpIHsKKwkJCWlmICghcG1kX3lv dW5nKHZhbCkpCisJCQkJY29udGludWU7CiAKLQkJd2Fsa19wbWRfcmFuZ2VfbG9ja2VkKHB1ZCwg YWRkciwgdm1hLCB3YWxrLCAmcG9zKTsKKwkJCXdhbGtfcG1kX3JhbmdlX2xvY2tlZChwdWQsIGFk ZHIsIHZtYSwgd2FsaywgJnBvcyk7CisJCX0KICNlbmRpZgogCQlpZiAoIXByaXYtPmZ1bGxfc2Nh biAmJiAhdGVzdF9ibG9vbV9maWx0ZXIocHJpdi0+bHJ1dmVjLCBwcml2LT5tYXhfc2VxLCBwbWQg KyBpKSkKIAkJCWNvbnRpbnVlOwpAQCAtNDE4MCw3ICs0MTk5LDcgQEAgc3RhdGljIGJvb2wgdHJ5 X3RvX2luY19tYXhfc2VxKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgdW5zaWduZWQgbG9uZyBtYXhf c2VxLAogCSAqIGhhbmRmdWwgb2YgUFRFcy4gU3ByZWFkaW5nIHRoZSB3b3JrIG91dCBvdmVyIGEg cGVyaW9kIG9mIHRpbWUgdXN1YWxseQogCSAqIGlzIGxlc3MgZWZmaWNpZW50LCBidXQgaXQgYXZv aWRzIGJ1cnN0eSBwYWdlIGZhdWx0cy4KIAkgKi8KLQlpZiAoIWZ1bGxfc2NhbiAmJiAhYXJjaF9o YXNfaHdfcHRlX3lvdW5nKCkpIHsKKwlpZiAoIWZ1bGxfc2NhbiAmJiAoIWFyY2hfaGFzX2h3X3B0 ZV95b3VuZygpIHx8ICFnZXRfY2FwKExSVV9HRU5fTU1fV0FMSykpKSB7CiAJCXN1Y2Nlc3MgPSBp dGVyYXRlX21tX2xpc3Rfbm93YWxrKGxydXZlYywgbWF4X3NlcSk7CiAJCWdvdG8gZG9uZTsKIAl9 CkBAIC00OTEwLDYgKzQ5MjksMjExIEBAIHN0YXRpYyB2b2lkIGxydV9nZW5fc2hyaW5rX2xydXZl YyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjCiAJYmxrX2Zp bmlzaF9wbHVnKCZwbHVnKTsKIH0KIAorLyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgorICogICAgICAg ICAgICAgICAgICAgICAgICAgIHN0YXRlIGNoYW5nZQorICoqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8K Kworc3RhdGljIGJvb2wgX19tYXliZV91bnVzZWQgc3RhdGVfaXNfdmFsaWQoc3RydWN0IGxydXZl YyAqbHJ1dmVjKQoreworCXN0cnVjdCBscnVfZ2VuX3N0cnVjdCAqbHJ1Z2VuID0gJmxydXZlYy0+ bHJ1Z2VuOworCisJaWYgKGxydWdlbi0+ZW5hYmxlZCkgeworCQllbnVtIGxydV9saXN0IGxydTsK KworCQlmb3JfZWFjaF9ldmljdGFibGVfbHJ1KGxydSkgeworCQkJaWYgKCFsaXN0X2VtcHR5KCZs cnV2ZWMtPmxpc3RzW2xydV0pKQorCQkJCXJldHVybiBmYWxzZTsKKwkJfQorCX0gZWxzZSB7CisJ CWludCBnZW4sIHR5cGUsIHpvbmU7CisKKwkJZm9yX2VhY2hfZ2VuX3R5cGVfem9uZShnZW4sIHR5 cGUsIHpvbmUpIHsKKwkJCWlmICghbGlzdF9lbXB0eSgmbHJ1Z2VuLT5saXN0c1tnZW5dW3R5cGVd W3pvbmVdKSkKKwkJCQlyZXR1cm4gZmFsc2U7CisKKwkJCS8qIHVubGlrZWx5IGJ1dCBub3QgYSBi dWcgd2hlbiByZXNldF9iYXRjaF9zaXplKCkgaXMgcGVuZGluZyAqLworCQkJVk1fV0FSTl9PTihs cnVnZW4tPm5yX3BhZ2VzW2dlbl1bdHlwZV1bem9uZV0pOworCQl9CisJfQorCisJcmV0dXJuIHRy dWU7Cit9CisKK3N0YXRpYyBib29sIGZpbGxfZXZpY3RhYmxlKHN0cnVjdCBscnV2ZWMgKmxydXZl YykKK3sKKwllbnVtIGxydV9saXN0IGxydTsKKwlpbnQgcmVtYWluaW5nID0gTUFYX0xSVV9CQVRD SDsKKworCWZvcl9lYWNoX2V2aWN0YWJsZV9scnUobHJ1KSB7CisJCWludCB0eXBlID0gaXNfZmls ZV9scnUobHJ1KTsKKwkJYm9vbCBhY3RpdmUgPSBpc19hY3RpdmVfbHJ1KGxydSk7CisJCXN0cnVj dCBsaXN0X2hlYWQgKmhlYWQgPSAmbHJ1dmVjLT5saXN0c1tscnVdOworCisJCXdoaWxlICghbGlz dF9lbXB0eShoZWFkKSkgeworCQkJYm9vbCBzdWNjZXNzOworCQkJc3RydWN0IGZvbGlvICpmb2xp byA9IGxydV90b19mb2xpbyhoZWFkKTsKKworCQkJVk1fQlVHX09OX0ZPTElPKGZvbGlvX3Rlc3Rf dW5ldmljdGFibGUoZm9saW8pLCBmb2xpbyk7CisJCQlWTV9CVUdfT05fRk9MSU8oZm9saW9fdGVz dF9hY3RpdmUoZm9saW8pICE9IGFjdGl2ZSwgZm9saW8pOworCQkJVk1fQlVHX09OX0ZPTElPKGZv bGlvX2lzX2ZpbGVfbHJ1KGZvbGlvKSAhPSB0eXBlLCBmb2xpbyk7CisJCQlWTV9CVUdfT05fRk9M SU8oZm9saW9fbHJ1X2dlbihmb2xpbykgPCBNQVhfTlJfR0VOUywgZm9saW8pOworCisJCQlscnV2 ZWNfZGVsX2ZvbGlvKGxydXZlYywgZm9saW8pOworCQkJc3VjY2VzcyA9IGxydV9nZW5fYWRkX2Zv bGlvKGxydXZlYywgZm9saW8sIGZhbHNlKTsKKwkJCVZNX0JVR19PTighc3VjY2Vzcyk7CisKKwkJ CWlmICghLS1yZW1haW5pbmcpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQorCisJcmV0dXJu IHRydWU7Cit9CisKK3N0YXRpYyBib29sIGRyYWluX2V2aWN0YWJsZShzdHJ1Y3QgbHJ1dmVjICps cnV2ZWMpCit7CisJaW50IGdlbiwgdHlwZSwgem9uZTsKKwlpbnQgcmVtYWluaW5nID0gTUFYX0xS VV9CQVRDSDsKKworCWZvcl9lYWNoX2dlbl90eXBlX3pvbmUoZ2VuLCB0eXBlLCB6b25lKSB7CisJ CXN0cnVjdCBsaXN0X2hlYWQgKmhlYWQgPSAmbHJ1dmVjLT5scnVnZW4ubGlzdHNbZ2VuXVt0eXBl XVt6b25lXTsKKworCQl3aGlsZSAoIWxpc3RfZW1wdHkoaGVhZCkpIHsKKwkJCWJvb2wgc3VjY2Vz czsKKwkJCXN0cnVjdCBmb2xpbyAqZm9saW8gPSBscnVfdG9fZm9saW8oaGVhZCk7CisKKwkJCVZN X0JVR19PTl9GT0xJTyhmb2xpb190ZXN0X3VuZXZpY3RhYmxlKGZvbGlvKSwgZm9saW8pOworCQkJ Vk1fQlVHX09OX0ZPTElPKGZvbGlvX3Rlc3RfYWN0aXZlKGZvbGlvKSwgZm9saW8pOworCQkJVk1f QlVHX09OX0ZPTElPKGZvbGlvX2lzX2ZpbGVfbHJ1KGZvbGlvKSAhPSB0eXBlLCBmb2xpbyk7CisJ CQlWTV9CVUdfT05fRk9MSU8oZm9saW9fem9uZW51bShmb2xpbykgIT0gem9uZSwgZm9saW8pOwor CisJCQlzdWNjZXNzID0gbHJ1X2dlbl9kZWxfZm9saW8obHJ1dmVjLCBmb2xpbywgZmFsc2UpOwor CQkJVk1fQlVHX09OKCFzdWNjZXNzKTsKKwkJCWxydXZlY19hZGRfZm9saW8obHJ1dmVjLCBmb2xp byk7CisKKwkJCWlmICghLS1yZW1haW5pbmcpCisJCQkJcmV0dXJuIGZhbHNlOworCQl9CisJfQor CisJcmV0dXJuIHRydWU7Cit9CisKK3N0YXRpYyB2b2lkIGxydV9nZW5fY2hhbmdlX3N0YXRlKGJv b2wgZW5hYmxlKQoreworCXN0YXRpYyBERUZJTkVfTVVURVgoc3RhdGVfbXV0ZXgpOworCisJc3Ry dWN0IG1lbV9jZ3JvdXAgKm1lbWNnOworCisJY2dyb3VwX2xvY2soKTsKKwljcHVzX3JlYWRfbG9j aygpOworCWdldF9vbmxpbmVfbWVtcygpOworCW11dGV4X2xvY2soJnN0YXRlX211dGV4KTsKKwor CWlmIChlbmFibGUgPT0gbHJ1X2dlbl9lbmFibGVkKCkpCisJCWdvdG8gdW5sb2NrOworCisJaWYg KGVuYWJsZSkKKwkJc3RhdGljX2JyYW5jaF9lbmFibGVfY3B1c2xvY2tlZCgmbHJ1X2dlbl9jYXBz W0xSVV9HRU5fQ09SRV0pOworCWVsc2UKKwkJc3RhdGljX2JyYW5jaF9kaXNhYmxlX2NwdXNsb2Nr ZWQoJmxydV9nZW5fY2Fwc1tMUlVfR0VOX0NPUkVdKTsKKworCW1lbWNnID0gbWVtX2Nncm91cF9p dGVyKE5VTEwsIE5VTEwsIE5VTEwpOworCWRvIHsKKwkJaW50IG5pZDsKKworCQlmb3JfZWFjaF9u b2RlKG5pZCkgeworCQkJc3RydWN0IGxydXZlYyAqbHJ1dmVjID0gZ2V0X2xydXZlYyhtZW1jZywg bmlkKTsKKworCQkJaWYgKCFscnV2ZWMpCisJCQkJY29udGludWU7CisKKwkJCXNwaW5fbG9ja19p cnEoJmxydXZlYy0+bHJ1X2xvY2spOworCisJCQlWTV9CVUdfT04oIXNlcV9pc192YWxpZChscnV2 ZWMpKTsKKwkJCVZNX0JVR19PTighc3RhdGVfaXNfdmFsaWQobHJ1dmVjKSk7CisKKwkJCWxydXZl Yy0+bHJ1Z2VuLmVuYWJsZWQgPSBlbmFibGU7CisKKwkJCXdoaWxlICghKGVuYWJsZSA/IGZpbGxf ZXZpY3RhYmxlKGxydXZlYykgOiBkcmFpbl9ldmljdGFibGUobHJ1dmVjKSkpIHsKKwkJCQlzcGlu X3VubG9ja19pcnEoJmxydXZlYy0+bHJ1X2xvY2spOworCQkJCWNvbmRfcmVzY2hlZCgpOworCQkJ CXNwaW5fbG9ja19pcnEoJmxydXZlYy0+bHJ1X2xvY2spOworCQkJfQorCisJCQlzcGluX3VubG9j a19pcnEoJmxydXZlYy0+bHJ1X2xvY2spOworCQl9CisKKwkJY29uZF9yZXNjaGVkKCk7CisJfSB3 aGlsZSAoKG1lbWNnID0gbWVtX2Nncm91cF9pdGVyKE5VTEwsIG1lbWNnLCBOVUxMKSkpOwordW5s b2NrOgorCW11dGV4X3VubG9jaygmc3RhdGVfbXV0ZXgpOworCXB1dF9vbmxpbmVfbWVtcygpOwor CWNwdXNfcmVhZF91bmxvY2soKTsKKwljZ3JvdXBfdW5sb2NrKCk7Cit9CisKKy8qKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioKKyAqICAgICAgICAgICAgICAgICAgICAgICAgICBzeXNmcyBpbnRlcmZhY2UK KyAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKiovCisKK3N0YXRpYyBzc2l6ZV90IHNob3dfZW5hYmxlKHN0 cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1 ZikKK3sKKwl1bnNpZ25lZCBpbnQgY2FwcyA9IDA7CisKKwlpZiAoZ2V0X2NhcChMUlVfR0VOX0NP UkUpKQorCQljYXBzIHw9IEJJVChMUlVfR0VOX0NPUkUpOworCisJaWYgKGFyY2hfaGFzX2h3X3B0 ZV95b3VuZygpICYmIGdldF9jYXAoTFJVX0dFTl9NTV9XQUxLKSkKKwkJY2FwcyB8PSBCSVQoTFJV X0dFTl9NTV9XQUxLKTsKKworCWlmIChJU19FTkFCTEVEKENPTkZJR19BUkNIX0hBU19OT05MRUFG X1BNRF9ZT1VORykgJiYgZ2V0X2NhcChMUlVfR0VOX05PTkxFQUZfWU9VTkcpKQorCQljYXBzIHw9 IEJJVChMUlVfR0VOX05PTkxFQUZfWU9VTkcpOworCisJcmV0dXJuIHNucHJpbnRmKGJ1ZiwgUEFH RV9TSVpFLCAiMHglMDR4XG4iLCBjYXBzKTsKK30KKworc3RhdGljIHNzaXplX3Qgc3RvcmVfZW5h YmxlKHN0cnVjdCBrb2JqZWN0ICprb2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsCisJ CQkgICAgY29uc3QgY2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCWludCBpOworCXVuc2lnbmVk IGludCBjYXBzOworCisJaWYgKHRvbG93ZXIoKmJ1ZikgPT0gJ24nKQorCQljYXBzID0gMDsKKwll bHNlIGlmICh0b2xvd2VyKCpidWYpID09ICd5JykKKwkJY2FwcyA9IC0xOworCWVsc2UgaWYgKGtz dHJ0b3VpbnQoYnVmLCAwLCAmY2FwcykpCisJCXJldHVybiAtRUlOVkFMOworCisJZm9yIChpID0g MDsgaSA8IE5SX0xSVV9HRU5fQ0FQUzsgaSsrKSB7CisJCWJvb2wgZW5hYmxlID0gY2FwcyAmIEJJ VChpKTsKKworCQlpZiAoaSA9PSBMUlVfR0VOX0NPUkUpCisJCQlscnVfZ2VuX2NoYW5nZV9zdGF0 ZShlbmFibGUpOworCQllbHNlIGlmIChlbmFibGUpCisJCQlzdGF0aWNfYnJhbmNoX2VuYWJsZSgm bHJ1X2dlbl9jYXBzW2ldKTsKKwkJZWxzZQorCQkJc3RhdGljX2JyYW5jaF9kaXNhYmxlKCZscnVf Z2VuX2NhcHNbaV0pOworCX0KKworCXJldHVybiBsZW47Cit9CisKK3N0YXRpYyBzdHJ1Y3Qga29i al9hdHRyaWJ1dGUgbHJ1X2dlbl9lbmFibGVkX2F0dHIgPSBfX0FUVFIoCisJZW5hYmxlZCwgMDY0 NCwgc2hvd19lbmFibGUsIHN0b3JlX2VuYWJsZQorKTsKKworc3RhdGljIHN0cnVjdCBhdHRyaWJ1 dGUgKmxydV9nZW5fYXR0cnNbXSA9IHsKKwkmbHJ1X2dlbl9lbmFibGVkX2F0dHIuYXR0ciwKKwlO VUxMCit9OworCitzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBscnVfZ2VuX2F0dHJfZ3Jv dXAgPSB7CisJLm5hbWUgPSAibHJ1X2dlbiIsCisJLmF0dHJzID0gbHJ1X2dlbl9hdHRycywKK307 CisKIC8qKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioKICAqICAgICAgICAgICAgICAgICAgICAgICAgICBp bml0aWFsaXphdGlvbgogICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KQEAgLTQ5MjAsNiArNTE0NCw3 IEBAIHZvaWQgbHJ1X2dlbl9pbml0X2xydXZlYyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMpCiAJc3Ry dWN0IGxydV9nZW5fc3RydWN0ICpscnVnZW4gPSAmbHJ1dmVjLT5scnVnZW47CiAKIAlscnVnZW4t Pm1heF9zZXEgPSBNSU5fTlJfR0VOUyArIDE7CisJbHJ1Z2VuLT5lbmFibGVkID0gbHJ1X2dlbl9l bmFibGVkKCk7CiAKIAlmb3JfZWFjaF9nZW5fdHlwZV96b25lKGdlbiwgdHlwZSwgem9uZSkKIAkJ SU5JVF9MSVNUX0hFQUQoJmxydWdlbi0+bGlzdHNbZ2VuXVt0eXBlXVt6b25lXSk7CkBAIC00OTYw LDYgKzUxODUsOSBAQCBzdGF0aWMgaW50IF9faW5pdCBpbml0X2xydV9nZW4odm9pZCkKIAlCVUlM RF9CVUdfT04oQklUKExSVV9HRU5fV0lEVEgpIDw9IE1BWF9OUl9HRU5TKTsKIAlCVUlMRF9CVUdf T04oc2l6ZW9mKE1NX1NUQVRfQ09ERVMpICE9IE5SX01NX1NUQVRTICsgMSk7CiAKKwlpZiAoc3lz ZnNfY3JlYXRlX2dyb3VwKG1tX2tvYmosICZscnVfZ2VuX2F0dHJfZ3JvdXApKQorCQlwcl9lcnIo ImxydV9nZW46IGZhaWxlZCB0byBjcmVhdGUgc3lzZnMgZ3JvdXBcbiIpOworCiAJcmV0dXJuIDA7 CiB9OwogbGF0ZV9pbml0Y2FsbChpbml0X2xydV9nZW4pOwotLSAKMi4zNS4xLjEwOTQuZzdjN2Q5 MDJhN2MtZ29vZwoKCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19f X19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBsaXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMu aW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5mcmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZv L2xpbnV4LWFybS1rZXJuZWwK