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 4065BC433F5 for ; Wed, 18 May 2022 01:48:08 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S234082AbiERBsG (ORCPT ); Tue, 17 May 2022 21:48:06 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:58084 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S232176AbiERBrU (ORCPT ); Tue, 17 May 2022 21:47:20 -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 5D49354BF3 for ; Tue, 17 May 2022 18:47:10 -0700 (PDT) Received: by mail-yb1-xb49.google.com with SMTP id o7-20020a256b47000000b0064ddc3bea70so699172ybm.4 for ; Tue, 17 May 2022 18:47:10 -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=rNx9Wnnb2Q40MxJ2AB9/JnqJGMPM8zlMbTCpT3dj1BA=; b=f6Wu5/emDRNm3TYtxoLVModE1v2Mx1PvCfEpBOqsq/XlyHn9/UOOs77nvwwPtFVJq3 qrFUkNi5NBLe/pBIYKRo2sd6wPItxq8wQFVlYmzUCfvI7M4regAPS6cdxxH6GbcyzC7s pKvcQC7KEQEotcCZ+1xkSH/D3SFaay9M2qrf6cUg4Gv0sWPkUyv6sWJH6O/1xx1wc7xX 2wyH2dzmstBlBSK58XeKDFzZo/5XZ5e62feVsIhlFHehK8hd1JPDsPNJ9nzl/MZ070WZ 9tiMBh18sOlIL8wH0W8wwikED9KXhFQkcZQxa6EH8aBNEeV+I1y+qJTYRmHLKtvRGLGZ WDlQ== 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=rNx9Wnnb2Q40MxJ2AB9/JnqJGMPM8zlMbTCpT3dj1BA=; b=0RQ2/Xgd+tkN/YE6mwwMmVuwNTJT+BLzPzXfi74xRRrqKhjywFff2jwqfDrA83spZq nJblH2KKvRLZJhNfPVKWTzWpHgNzm35ycCgJUhY8Q0DQiggVjNCWVH2OwKYjxeGsg2To edqeLQKCGcBcMXGUiEdHc2yLIm8Fo1DOlbaG7KvMbNUt1L0EVTkv97yBgzLpgN52gsFS M/RBcsv06mqdcKw9aTdVPayNBkrI4JtjaifHSoVMLFu7b3A7rS+3VacFuzsUKncJRDQT d3qBfHpHlTYXFoPLz4H3OXBOuNAey8Mni7SmiXxBuRmGrCbTwDS7RDft2ELBVP6BA5Bo Yenw== X-Gm-Message-State: AOAM532MTSyuUstySHwROs8Ib8+UlOF65N2FTnqOVBwtmySx38+bK4h8 VgIofGSKRdyjMicFimWdmgg5oh1Gahk= X-Google-Smtp-Source: ABdhPJw/GVYSFwqTPa9IB5eZEw8fBz/qkDDmWwgcQxKWC3IhU7UZHsf9NiWmIU8OqkuOn+EV5gSLDXe4G+Q= X-Received: from yuzhao.bld.corp.google.com ([2620:15c:183:200:f7bc:90c9:d86e:4ea8]) (user=yuzhao job=sendgmr) by 2002:a81:990f:0:b0:2f8:c347:d11a with SMTP id q15-20020a81990f000000b002f8c347d11amr28245783ywg.507.1652838429715; Tue, 17 May 2022 18:47:09 -0700 (PDT) Date: Tue, 17 May 2022 19:46:30 -0600 In-Reply-To: <20220518014632.922072-1-yuzhao@google.com> Message-Id: <20220518014632.922072-12-yuzhao@google.com> Mime-Version: 1.0 References: <20220518014632.922072-1-yuzhao@google.com> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog Subject: [PATCH v11 11/14] mm: multi-gen LRU: thrashing prevention From: Yu Zhao To: Andrew Morton , linux-mm@kvack.org 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, 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 Add /sys/kernel/mm/lru_gen/min_ttl_ms for thrashing prevention, as requested by many desktop users [1]. When set to value N, it prevents the working set of N milliseconds from getting evicted. The OOM killer is triggered if this working set cannot be kept in memory. Based on the average human detectable lag (~100ms), N=3D1000 usually eliminates intolerable lags due to thrashing. Larger values like N=3D3000 make lags less noticeable at the risk of premature OOM kills. Compared with the size-based approach, e.g., [2], this time-based approach has the following advantages: 1. It is easier to configure because it is agnostic to applications and memory sizes. 2. It is more reliable because it is directly wired to the OOM killer. [1] https://lore.kernel.org/r/Ydza%2FzXKY9ATRoh6@google.com/ [2] https://lore.kernel.org/r/20101028191523.GA14972@google.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/mmzone.h | 2 ++ mm/vmscan.c | 68 +++++++++++++++++++++++++++++++++++++++--- 2 files changed, 66 insertions(+), 4 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 372a7f5a6829..b2e8869be7cf 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -421,6 +421,8 @@ struct lru_gen_struct { unsigned long max_seq; /* the eviction increments the oldest generation numbers */ unsigned long min_seq[ANON_AND_FILE]; + /* the birth time of each generation in jiffies */ + unsigned long timestamps[MAX_NR_GENS]; /* the multi-gen LRU lists */ struct list_head lists[MAX_NR_GENS][ANON_AND_FILE][MAX_NR_ZONES]; /* the sizes of the above lists */ diff --git a/mm/vmscan.c b/mm/vmscan.c index 09e2c3e6f2be..823c55e17e64 100644 --- a/mm/vmscan.c +++ b/mm/vmscan.c @@ -4159,6 +4159,7 @@ static void inc_max_seq(struct lruvec *lruvec, bool c= an_swap) for (type =3D 0; type < ANON_AND_FILE; type++) reset_ctrl_pos(lruvec, type, false); =20 + WRITE_ONCE(lrugen->timestamps[next], jiffies); /* make sure preceding modifications appear */ smp_store_release(&lrugen->max_seq, lrugen->max_seq + 1); =20 @@ -4281,7 +4282,8 @@ static long get_nr_evictable(struct lruvec *lruvec, u= nsigned long max_seq, return total > 0 ? total : 0; } =20 -static void age_lruvec(struct lruvec *lruvec, struct scan_control *sc) +static bool age_lruvec(struct lruvec *lruvec, struct scan_control *sc, + unsigned long min_ttl) { bool need_aging; long nr_to_scan; @@ -4292,14 +4294,22 @@ static void age_lruvec(struct lruvec *lruvec, struc= t scan_control *sc) =20 VM_WARN_ON_ONCE(sc->memcg_low_reclaim); =20 + if (min_ttl) { + int gen =3D lru_gen_from_seq(min_seq[LRU_GEN_FILE]); + unsigned long birth =3D READ_ONCE(lruvec->lrugen.timestamps[gen]); + + if (time_is_after_jiffies(birth + min_ttl)) + return false; + } + mem_cgroup_calculate_protection(NULL, memcg); =20 if (mem_cgroup_below_min(memcg)) - return; + return false; =20 nr_to_scan =3D get_nr_evictable(lruvec, max_seq, min_seq, swappiness, &ne= ed_aging); if (!nr_to_scan) - return; + return false; =20 nr_to_scan >>=3D sc->priority; =20 @@ -4308,11 +4318,18 @@ static void age_lruvec(struct lruvec *lruvec, struc= t scan_control *sc) =20 if (nr_to_scan && need_aging) try_to_inc_max_seq(lruvec, max_seq, sc, swappiness); + + return true; } =20 +/* to protect the working set of the last N jiffies */ +static unsigned long lru_gen_min_ttl __read_mostly; + static void lru_gen_age_node(struct pglist_data *pgdat, struct scan_contro= l *sc) { struct mem_cgroup *memcg; + bool success =3D false; + unsigned long min_ttl =3D READ_ONCE(lru_gen_min_ttl); =20 VM_WARN_ON_ONCE(!current_is_kswapd()); =20 @@ -4338,12 +4355,28 @@ static void lru_gen_age_node(struct pglist_data *pg= dat, struct scan_control *sc) do { struct lruvec *lruvec =3D mem_cgroup_lruvec(memcg, pgdat); =20 - age_lruvec(lruvec, sc); + if (age_lruvec(lruvec, sc, min_ttl)) + success =3D true; =20 cond_resched(); } while ((memcg =3D mem_cgroup_iter(NULL, memcg, NULL))); =20 current->reclaim_state->mm_walk =3D NULL; + + /* + * The main goal is to OOM kill if every generation from all memcgs is + * younger than min_ttl. However, another theoretical possibility is all + * memcgs are either below min or empty. + */ + if (!success && !sc->order && mutex_trylock(&oom_lock)) { + struct oom_control oc =3D { + .gfp_mask =3D sc->gfp_mask, + }; + + out_of_memory(&oc); + + mutex_unlock(&oom_lock); + } } =20 /* @@ -5062,6 +5095,28 @@ static void lru_gen_change_state(bool enable) * sysfs interface *************************************************************************= *****/ =20 +static ssize_t show_min_ttl(struct kobject *kobj, struct kobj_attribute *a= ttr, char *buf) +{ + return sprintf(buf, "%u\n", jiffies_to_msecs(READ_ONCE(lru_gen_min_ttl)))= ; +} + +static ssize_t store_min_ttl(struct kobject *kobj, struct kobj_attribute *= attr, + const char *buf, size_t len) +{ + unsigned int msecs; + + if (kstrtouint(buf, 0, &msecs)) + return -EINVAL; + + WRITE_ONCE(lru_gen_min_ttl, msecs_to_jiffies(msecs)); + + return len; +} + +static struct kobj_attribute lru_gen_min_ttl_attr =3D __ATTR( + min_ttl_ms, 0644, show_min_ttl, store_min_ttl +); + static ssize_t show_enable(struct kobject *kobj, struct kobj_attribute *at= tr, char *buf) { unsigned int caps =3D 0; @@ -5110,6 +5165,7 @@ static struct kobj_attribute lru_gen_enabled_attr =3D= __ATTR( ); =20 static struct attribute *lru_gen_attrs[] =3D { + &lru_gen_min_ttl_attr.attr, &lru_gen_enabled_attr.attr, NULL }; @@ -5125,12 +5181,16 @@ static struct attribute_group lru_gen_attr_group = =3D { =20 void lru_gen_init_lruvec(struct lruvec *lruvec) { + int i; int gen, type, zone; 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 (i =3D 0; i <=3D MIN_NR_GENS + 1; i++) + lrugen->timestamps[i] =3D jiffies; + for_each_gen_type_zone(gen, type, zone) INIT_LIST_HEAD(&lrugen->lists[gen][type][zone]); =20 --=20 2.36.0.550.gb090851708-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 BF04DC433EF for ; Wed, 18 May 2022 02:09:33 +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=mbBDaYOolIWa8mHQnn2TDrL54upM/JTLHvstpiZgYtM=; b=zMxibAqerxZ+d/c5c53L+FzWRm wZSDCoXmg4QwsxLgUQ3HS15NIORE8mFQtNyc2HdsfW8t1U53NJbV6nt1ASNPJ1fGhp4wEpKTW0IuT HT1EHeXanHyi2/sPlykzCyGoziZEdesbjKBoFjb6vkgA/IxW/SxUjOUItM/FF54CGC8AefPHsmn1C edEIgi7vWHe7xfrpW/7wO7QFgqyiPrqr6ROe6POcJ5b+c8Mh4UUpZxxWjp2unlIkECVsDmpXs47V3 ssEMfU11NqZRv1G+1txvVTU63vHdVAmrjvNd8Imoh//GUNip1HY/1LBKilFJLJcYrs8g6o7r9eUin ALq8aGWQ==; Received: from localhost ([::1] helo=bombadil.infradead.org) by bombadil.infradead.org with esmtp (Exim 4.94.2 #2 (Red Hat Linux)) id 1nr96v-00GfpC-7c; Wed, 18 May 2022 02:08:25 +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 1nr96c-00GfmE-Rq for linux-arm-kernel@bombadil.infradead.org; Wed, 18 May 2022 02:08:07 +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=rNx9Wnnb2Q40MxJ2AB9/JnqJGMPM8zlMbTCpT3dj1BA=; b=GCgSdjsG8golLrti2MeYQ2v933 P+R0KyvP6zDnrbXCWprZIOBOLuw3aT+C5dZOkZJ3T3+bPxy6z3nPGtoK1NbpLzMEdpmzcHcebIvoj idMiBVXWy84gcXxK2tFkDuOBoP7UtRzhsHqkt7cHJAvhNqbVRJV61q8T+TFQLmF0CFNsSmDNWSJpI VlUgInX/3p55naC2cYDJJDMqsJQDfTBU7Bb4mWR6gRDVtNycKs3zSZt6u3JkyV8q9W9Ecxs5LLYT9 eCXlbWaRo/bSV1D270OYnVU7H+MZlsJxwsiOBVPVxwRAuS5LmYAyuXP/31254a0TBVEpC682VVbCV D97qia3g==; 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 1nr8mO-00BKvr-Id for linux-arm-kernel@lists.infradead.org; Wed, 18 May 2022 01:47:15 +0000 Received: by mail-yw1-x114a.google.com with SMTP id 00721157ae682-2ff37db94e8so7950117b3.16 for ; Tue, 17 May 2022 18:47:11 -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=rNx9Wnnb2Q40MxJ2AB9/JnqJGMPM8zlMbTCpT3dj1BA=; b=f6Wu5/emDRNm3TYtxoLVModE1v2Mx1PvCfEpBOqsq/XlyHn9/UOOs77nvwwPtFVJq3 qrFUkNi5NBLe/pBIYKRo2sd6wPItxq8wQFVlYmzUCfvI7M4regAPS6cdxxH6GbcyzC7s pKvcQC7KEQEotcCZ+1xkSH/D3SFaay9M2qrf6cUg4Gv0sWPkUyv6sWJH6O/1xx1wc7xX 2wyH2dzmstBlBSK58XeKDFzZo/5XZ5e62feVsIhlFHehK8hd1JPDsPNJ9nzl/MZ070WZ 9tiMBh18sOlIL8wH0W8wwikED9KXhFQkcZQxa6EH8aBNEeV+I1y+qJTYRmHLKtvRGLGZ WDlQ== 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=rNx9Wnnb2Q40MxJ2AB9/JnqJGMPM8zlMbTCpT3dj1BA=; b=436aSw8n/jFfyvUb9TsAnbglBxfGbfcVu4s3nZsjDvVUGnFQVgdq2LV+jzw8/nGiJJ nBwWVwsdotQHxYoVHm7KWs6rwQPW4HJUHCWEyr25/tqnAjb17MAnerNl0heNocOdn7J9 x2UY+Buvegl+9wGcEncDUtvZvmhtmcfWAV/oeMcNPSg2Mo/J3REuAOhqhnNgvNJwKqe8 RExCRsSXolTEnaKODzfbZHIOvFqfKEPUOW41upLGOEGP+F8j4yvCKdGmB/qJ0yY2LVme OnvDf0uRlUS5Hewfpt2R30IYlxCOdx84zdyBYixpjk13p6kkQNZNC3nd7egqyeQ+TWpk 1R/w== X-Gm-Message-State: AOAM5302zQo+RTBUBJJDOjP5AtyN2yFV6nGjmJDQf4fpWqOsFJGuoXaf fKlygA1MLkPIeyainmSL1XaavmbF8Hg= X-Google-Smtp-Source: ABdhPJw/GVYSFwqTPa9IB5eZEw8fBz/qkDDmWwgcQxKWC3IhU7UZHsf9NiWmIU8OqkuOn+EV5gSLDXe4G+Q= X-Received: from yuzhao.bld.corp.google.com ([2620:15c:183:200:f7bc:90c9:d86e:4ea8]) (user=yuzhao job=sendgmr) by 2002:a81:990f:0:b0:2f8:c347:d11a with SMTP id q15-20020a81990f000000b002f8c347d11amr28245783ywg.507.1652838429715; Tue, 17 May 2022 18:47:09 -0700 (PDT) Date: Tue, 17 May 2022 19:46:30 -0600 In-Reply-To: <20220518014632.922072-1-yuzhao@google.com> Message-Id: <20220518014632.922072-12-yuzhao@google.com> Mime-Version: 1.0 References: <20220518014632.922072-1-yuzhao@google.com> X-Mailer: git-send-email 2.36.0.550.gb090851708-goog Subject: [PATCH v11 11/14] mm: multi-gen LRU: thrashing prevention From: Yu Zhao To: Andrew Morton , linux-mm@kvack.org 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, 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-20220518_024712_660670_004A0427 X-CRM114-Status: GOOD ( 17.52 ) 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 QWRkIC9zeXMva2VybmVsL21tL2xydV9nZW4vbWluX3R0bF9tcyBmb3IgdGhyYXNoaW5nIHByZXZl bnRpb24sIGFzCnJlcXVlc3RlZCBieSBtYW55IGRlc2t0b3AgdXNlcnMgWzFdLgoKV2hlbiBzZXQg dG8gdmFsdWUgTiwgaXQgcHJldmVudHMgdGhlIHdvcmtpbmcgc2V0IG9mIE4gbWlsbGlzZWNvbmRz CmZyb20gZ2V0dGluZyBldmljdGVkLiBUaGUgT09NIGtpbGxlciBpcyB0cmlnZ2VyZWQgaWYgdGhp cyB3b3JraW5nIHNldApjYW5ub3QgYmUga2VwdCBpbiBtZW1vcnkuIEJhc2VkIG9uIHRoZSBhdmVy YWdlIGh1bWFuIGRldGVjdGFibGUgbGFnCih+MTAwbXMpLCBOPTEwMDAgdXN1YWxseSBlbGltaW5h dGVzIGludG9sZXJhYmxlIGxhZ3MgZHVlIHRvIHRocmFzaGluZy4KTGFyZ2VyIHZhbHVlcyBsaWtl IE49MzAwMCBtYWtlIGxhZ3MgbGVzcyBub3RpY2VhYmxlIGF0IHRoZSByaXNrIG9mCnByZW1hdHVy ZSBPT00ga2lsbHMuCgpDb21wYXJlZCB3aXRoIHRoZSBzaXplLWJhc2VkIGFwcHJvYWNoLCBlLmcu LCBbMl0sIHRoaXMgdGltZS1iYXNlZAphcHByb2FjaCBoYXMgdGhlIGZvbGxvd2luZyBhZHZhbnRh Z2VzOgoxLiBJdCBpcyBlYXNpZXIgdG8gY29uZmlndXJlIGJlY2F1c2UgaXQgaXMgYWdub3N0aWMg dG8gYXBwbGljYXRpb25zCiAgIGFuZCBtZW1vcnkgc2l6ZXMuCjIuIEl0IGlzIG1vcmUgcmVsaWFi bGUgYmVjYXVzZSBpdCBpcyBkaXJlY3RseSB3aXJlZCB0byB0aGUgT09NIGtpbGxlci4KClsxXSBo dHRwczovL2xvcmUua2VybmVsLm9yZy9yL1lkemElMkZ6WEtZOUFUUm9oNkBnb29nbGUuY29tLwpb Ml0gaHR0cHM6Ly9sb3JlLmtlcm5lbC5vcmcvci8yMDEwMTAyODE5MTUyMy5HQTE0OTcyQGdvb2ds ZS5jb20vCgpTaWduZWQtb2ZmLWJ5OiBZdSBaaGFvIDx5dXpoYW9AZ29vZ2xlLmNvbT4KQWNrZWQt Ynk6IEJyaWFuIEdlZmZvbiA8YmdlZmZvbkBnb29nbGUuY29tPgpBY2tlZC1ieTogSmFuIEFsZXhh bmRlciBTdGVmZmVucyAoaGVmdGlnKSA8aGVmdGlnQGFyY2hsaW51eC5vcmc+CkFja2VkLWJ5OiBP bGVrc2FuZHIgTmF0YWxlbmtvIDxvbGVrc2FuZHJAbmF0YWxlbmtvLm5hbWU+CkFja2VkLWJ5OiBT dGV2ZW4gQmFycmV0dCA8c3RldmVuQGxpcXVvcml4Lm5ldD4KQWNrZWQtYnk6IFN1bGVpbWFuIFNv dWhsYWwgPHN1bGVpbWFuQGdvb2dsZS5jb20+ClRlc3RlZC1ieTogRGFuaWVsIEJ5cm5lIDxkamJ5 cm5lQG10dS5lZHU+ClRlc3RlZC1ieTogRG9uYWxkIENhcnIgPGRAY2hhb3MtcmVpbnMuY29tPgpU ZXN0ZWQtYnk6IEhvbGdlciBIb2Zmc3TDpHR0ZSA8aG9sZ2VyQGFwcGxpZWQtYXN5bmNocm9ueS5j b20+ClRlc3RlZC1ieTogS29uc3RhbnRpbiBLaGFybGFtb3YgPEhpLUFuZ2VsQHlhbmRleC5ydT4K VGVzdGVkLWJ5OiBTaHVhbmcgWmhhaSA8c3poYWkyQGNzLnJvY2hlc3Rlci5lZHU+ClRlc3RlZC1i eTogU29maWEgVHJpbmggPHNvZmlhLnRyaW5oQGVkaS53b3Jrcz4KVGVzdGVkLWJ5OiBWYWliaGF2 IEphaW4gPHZhaWJoYXZAbGludXguaWJtLmNvbT4KLS0tCiBpbmNsdWRlL2xpbnV4L21tem9uZS5o IHwgIDIgKysKIG1tL3Ztc2Nhbi5jICAgICAgICAgICAgfCA2OCArKysrKysrKysrKysrKysrKysr KysrKysrKysrKysrKysrKysrKystLS0KIDIgZmlsZXMgY2hhbmdlZCwgNjYgaW5zZXJ0aW9ucygr KSwgNCBkZWxldGlvbnMoLSkKCmRpZmYgLS1naXQgYS9pbmNsdWRlL2xpbnV4L21tem9uZS5oIGIv aW5jbHVkZS9saW51eC9tbXpvbmUuaAppbmRleCAzNzJhN2Y1YTY4MjkuLmIyZTg4NjliZTdjZiAx MDA2NDQKLS0tIGEvaW5jbHVkZS9saW51eC9tbXpvbmUuaAorKysgYi9pbmNsdWRlL2xpbnV4L21t em9uZS5oCkBAIC00MjEsNiArNDIxLDggQEAgc3RydWN0IGxydV9nZW5fc3RydWN0IHsKIAl1bnNp Z25lZCBsb25nIG1heF9zZXE7CiAJLyogdGhlIGV2aWN0aW9uIGluY3JlbWVudHMgdGhlIG9sZGVz dCBnZW5lcmF0aW9uIG51bWJlcnMgKi8KIAl1bnNpZ25lZCBsb25nIG1pbl9zZXFbQU5PTl9BTkRf RklMRV07CisJLyogdGhlIGJpcnRoIHRpbWUgb2YgZWFjaCBnZW5lcmF0aW9uIGluIGppZmZpZXMg Ki8KKwl1bnNpZ25lZCBsb25nIHRpbWVzdGFtcHNbTUFYX05SX0dFTlNdOwogCS8qIHRoZSBtdWx0 aS1nZW4gTFJVIGxpc3RzICovCiAJc3RydWN0IGxpc3RfaGVhZCBsaXN0c1tNQVhfTlJfR0VOU11b QU5PTl9BTkRfRklMRV1bTUFYX05SX1pPTkVTXTsKIAkvKiB0aGUgc2l6ZXMgb2YgdGhlIGFib3Zl IGxpc3RzICovCmRpZmYgLS1naXQgYS9tbS92bXNjYW4uYyBiL21tL3Ztc2Nhbi5jCmluZGV4IDA5 ZTJjM2U2ZjJiZS4uODIzYzU1ZTE3ZTY0IDEwMDY0NAotLS0gYS9tbS92bXNjYW4uYworKysgYi9t bS92bXNjYW4uYwpAQCAtNDE1OSw2ICs0MTU5LDcgQEAgc3RhdGljIHZvaWQgaW5jX21heF9zZXEo c3RydWN0IGxydXZlYyAqbHJ1dmVjLCBib29sIGNhbl9zd2FwKQogCWZvciAodHlwZSA9IDA7IHR5 cGUgPCBBTk9OX0FORF9GSUxFOyB0eXBlKyspCiAJCXJlc2V0X2N0cmxfcG9zKGxydXZlYywgdHlw ZSwgZmFsc2UpOwogCisJV1JJVEVfT05DRShscnVnZW4tPnRpbWVzdGFtcHNbbmV4dF0sIGppZmZp ZXMpOwogCS8qIG1ha2Ugc3VyZSBwcmVjZWRpbmcgbW9kaWZpY2F0aW9ucyBhcHBlYXIgKi8KIAlz bXBfc3RvcmVfcmVsZWFzZSgmbHJ1Z2VuLT5tYXhfc2VxLCBscnVnZW4tPm1heF9zZXEgKyAxKTsK IApAQCAtNDI4MSw3ICs0MjgyLDggQEAgc3RhdGljIGxvbmcgZ2V0X25yX2V2aWN0YWJsZShzdHJ1 Y3QgbHJ1dmVjICpscnV2ZWMsIHVuc2lnbmVkIGxvbmcgbWF4X3NlcSwKIAlyZXR1cm4gdG90YWwg PiAwID8gdG90YWwgOiAwOwogfQogCi1zdGF0aWMgdm9pZCBhZ2VfbHJ1dmVjKHN0cnVjdCBscnV2 ZWMgKmxydXZlYywgc3RydWN0IHNjYW5fY29udHJvbCAqc2MpCitzdGF0aWMgYm9vbCBhZ2VfbHJ1 dmVjKHN0cnVjdCBscnV2ZWMgKmxydXZlYywgc3RydWN0IHNjYW5fY29udHJvbCAqc2MsCisJCSAg ICAgICB1bnNpZ25lZCBsb25nIG1pbl90dGwpCiB7CiAJYm9vbCBuZWVkX2FnaW5nOwogCWxvbmcg bnJfdG9fc2NhbjsKQEAgLTQyOTIsMTQgKzQyOTQsMjIgQEAgc3RhdGljIHZvaWQgYWdlX2xydXZl YyhzdHJ1Y3QgbHJ1dmVjICpscnV2ZWMsIHN0cnVjdCBzY2FuX2NvbnRyb2wgKnNjKQogCiAJVk1f V0FSTl9PTl9PTkNFKHNjLT5tZW1jZ19sb3dfcmVjbGFpbSk7CiAKKwlpZiAobWluX3R0bCkgewor CQlpbnQgZ2VuID0gbHJ1X2dlbl9mcm9tX3NlcShtaW5fc2VxW0xSVV9HRU5fRklMRV0pOworCQl1 bnNpZ25lZCBsb25nIGJpcnRoID0gUkVBRF9PTkNFKGxydXZlYy0+bHJ1Z2VuLnRpbWVzdGFtcHNb Z2VuXSk7CisKKwkJaWYgKHRpbWVfaXNfYWZ0ZXJfamlmZmllcyhiaXJ0aCArIG1pbl90dGwpKQor CQkJcmV0dXJuIGZhbHNlOworCX0KKwogCW1lbV9jZ3JvdXBfY2FsY3VsYXRlX3Byb3RlY3Rpb24o TlVMTCwgbWVtY2cpOwogCiAJaWYgKG1lbV9jZ3JvdXBfYmVsb3dfbWluKG1lbWNnKSkKLQkJcmV0 dXJuOworCQlyZXR1cm4gZmFsc2U7CiAKIAlucl90b19zY2FuID0gZ2V0X25yX2V2aWN0YWJsZShs cnV2ZWMsIG1heF9zZXEsIG1pbl9zZXEsIHN3YXBwaW5lc3MsICZuZWVkX2FnaW5nKTsKIAlpZiAo IW5yX3RvX3NjYW4pCi0JCXJldHVybjsKKwkJcmV0dXJuIGZhbHNlOwogCiAJbnJfdG9fc2NhbiA+ Pj0gc2MtPnByaW9yaXR5OwogCkBAIC00MzA4LDExICs0MzE4LDE4IEBAIHN0YXRpYyB2b2lkIGFn ZV9scnV2ZWMoc3RydWN0IGxydXZlYyAqbHJ1dmVjLCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykK IAogCWlmIChucl90b19zY2FuICYmIG5lZWRfYWdpbmcpCiAJCXRyeV90b19pbmNfbWF4X3NlcShs cnV2ZWMsIG1heF9zZXEsIHNjLCBzd2FwcGluZXNzKTsKKworCXJldHVybiB0cnVlOwogfQogCisv KiB0byBwcm90ZWN0IHRoZSB3b3JraW5nIHNldCBvZiB0aGUgbGFzdCBOIGppZmZpZXMgKi8KK3N0 YXRpYyB1bnNpZ25lZCBsb25nIGxydV9nZW5fbWluX3R0bCBfX3JlYWRfbW9zdGx5OworCiBzdGF0 aWMgdm9pZCBscnVfZ2VuX2FnZV9ub2RlKHN0cnVjdCBwZ2xpc3RfZGF0YSAqcGdkYXQsIHN0cnVj dCBzY2FuX2NvbnRyb2wgKnNjKQogewogCXN0cnVjdCBtZW1fY2dyb3VwICptZW1jZzsKKwlib29s IHN1Y2Nlc3MgPSBmYWxzZTsKKwl1bnNpZ25lZCBsb25nIG1pbl90dGwgPSBSRUFEX09OQ0UobHJ1 X2dlbl9taW5fdHRsKTsKIAogCVZNX1dBUk5fT05fT05DRSghY3VycmVudF9pc19rc3dhcGQoKSk7 CiAKQEAgLTQzMzgsMTIgKzQzNTUsMjggQEAgc3RhdGljIHZvaWQgbHJ1X2dlbl9hZ2Vfbm9kZShz dHJ1Y3QgcGdsaXN0X2RhdGEgKnBnZGF0LCBzdHJ1Y3Qgc2Nhbl9jb250cm9sICpzYykKIAlkbyB7 CiAJCXN0cnVjdCBscnV2ZWMgKmxydXZlYyA9IG1lbV9jZ3JvdXBfbHJ1dmVjKG1lbWNnLCBwZ2Rh dCk7CiAKLQkJYWdlX2xydXZlYyhscnV2ZWMsIHNjKTsKKwkJaWYgKGFnZV9scnV2ZWMobHJ1dmVj LCBzYywgbWluX3R0bCkpCisJCQlzdWNjZXNzID0gdHJ1ZTsKIAogCQljb25kX3Jlc2NoZWQoKTsK IAl9IHdoaWxlICgobWVtY2cgPSBtZW1fY2dyb3VwX2l0ZXIoTlVMTCwgbWVtY2csIE5VTEwpKSk7 CiAKIAljdXJyZW50LT5yZWNsYWltX3N0YXRlLT5tbV93YWxrID0gTlVMTDsKKworCS8qCisJICog VGhlIG1haW4gZ29hbCBpcyB0byBPT00ga2lsbCBpZiBldmVyeSBnZW5lcmF0aW9uIGZyb20gYWxs IG1lbWNncyBpcworCSAqIHlvdW5nZXIgdGhhbiBtaW5fdHRsLiBIb3dldmVyLCBhbm90aGVyIHRo ZW9yZXRpY2FsIHBvc3NpYmlsaXR5IGlzIGFsbAorCSAqIG1lbWNncyBhcmUgZWl0aGVyIGJlbG93 IG1pbiBvciBlbXB0eS4KKwkgKi8KKwlpZiAoIXN1Y2Nlc3MgJiYgIXNjLT5vcmRlciAmJiBtdXRl eF90cnlsb2NrKCZvb21fbG9jaykpIHsKKwkJc3RydWN0IG9vbV9jb250cm9sIG9jID0geworCQkJ LmdmcF9tYXNrID0gc2MtPmdmcF9tYXNrLAorCQl9OworCisJCW91dF9vZl9tZW1vcnkoJm9jKTsK KworCQltdXRleF91bmxvY2soJm9vbV9sb2NrKTsKKwl9CiB9CiAKIC8qCkBAIC01MDYyLDYgKzUw OTUsMjggQEAgc3RhdGljIHZvaWQgbHJ1X2dlbl9jaGFuZ2Vfc3RhdGUoYm9vbCBlbmFibGUpCiAg KiAgICAgICAgICAgICAgICAgICAgICAgICAgc3lzZnMgaW50ZXJmYWNlCiAgKioqKioqKioqKioq KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioq KioqKioqKioqLwogCitzdGF0aWMgc3NpemVfdCBzaG93X21pbl90dGwoc3RydWN0IGtvYmplY3Qg KmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwgY2hhciAqYnVmKQoreworCXJldHVy biBzcHJpbnRmKGJ1ZiwgIiV1XG4iLCBqaWZmaWVzX3RvX21zZWNzKFJFQURfT05DRShscnVfZ2Vu X21pbl90dGwpKSk7Cit9CisKK3N0YXRpYyBzc2l6ZV90IHN0b3JlX21pbl90dGwoc3RydWN0IGtv YmplY3QgKmtvYmosIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSAqYXR0ciwKKwkJCSAgICAgY29uc3Qg Y2hhciAqYnVmLCBzaXplX3QgbGVuKQoreworCXVuc2lnbmVkIGludCBtc2VjczsKKworCWlmIChr c3RydG91aW50KGJ1ZiwgMCwgJm1zZWNzKSkKKwkJcmV0dXJuIC1FSU5WQUw7CisKKwlXUklURV9P TkNFKGxydV9nZW5fbWluX3R0bCwgbXNlY3NfdG9famlmZmllcyhtc2VjcykpOworCisJcmV0dXJu IGxlbjsKK30KKworc3RhdGljIHN0cnVjdCBrb2JqX2F0dHJpYnV0ZSBscnVfZ2VuX21pbl90dGxf YXR0ciA9IF9fQVRUUigKKwltaW5fdHRsX21zLCAwNjQ0LCBzaG93X21pbl90dGwsIHN0b3JlX21p bl90dGwKKyk7CisKIHN0YXRpYyBzc2l6ZV90IHNob3dfZW5hYmxlKHN0cnVjdCBrb2JqZWN0ICpr b2JqLCBzdHJ1Y3Qga29ial9hdHRyaWJ1dGUgKmF0dHIsIGNoYXIgKmJ1ZikKIHsKIAl1bnNpZ25l ZCBpbnQgY2FwcyA9IDA7CkBAIC01MTEwLDYgKzUxNjUsNyBAQCBzdGF0aWMgc3RydWN0IGtvYmpf YXR0cmlidXRlIGxydV9nZW5fZW5hYmxlZF9hdHRyID0gX19BVFRSKAogKTsKIAogc3RhdGljIHN0 cnVjdCBhdHRyaWJ1dGUgKmxydV9nZW5fYXR0cnNbXSA9IHsKKwkmbHJ1X2dlbl9taW5fdHRsX2F0 dHIuYXR0ciwKIAkmbHJ1X2dlbl9lbmFibGVkX2F0dHIuYXR0ciwKIAlOVUxMCiB9OwpAQCAtNTEy NSwxMiArNTE4MSwxNiBAQCBzdGF0aWMgc3RydWN0IGF0dHJpYnV0ZV9ncm91cCBscnVfZ2VuX2F0 dHJfZ3JvdXAgPSB7CiAKIHZvaWQgbHJ1X2dlbl9pbml0X2xydXZlYyhzdHJ1Y3QgbHJ1dmVjICps cnV2ZWMpCiB7CisJaW50IGk7CiAJaW50IGdlbiwgdHlwZSwgem9uZTsKIAlzdHJ1Y3QgbHJ1X2dl bl9zdHJ1Y3QgKmxydWdlbiA9ICZscnV2ZWMtPmxydWdlbjsKIAogCWxydWdlbi0+bWF4X3NlcSA9 IE1JTl9OUl9HRU5TICsgMTsKIAlscnVnZW4tPmVuYWJsZWQgPSBscnVfZ2VuX2VuYWJsZWQoKTsK IAorCWZvciAoaSA9IDA7IGkgPD0gTUlOX05SX0dFTlMgKyAxOyBpKyspCisJCWxydWdlbi0+dGlt ZXN0YW1wc1tpXSA9IGppZmZpZXM7CisKIAlmb3JfZWFjaF9nZW5fdHlwZV96b25lKGdlbiwgdHlw ZSwgem9uZSkKIAkJSU5JVF9MSVNUX0hFQUQoJmxydWdlbi0+bGlzdHNbZ2VuXVt0eXBlXVt6b25l XSk7CiAKLS0gCjIuMzYuMC41NTAuZ2IwOTA4NTE3MDgtZ29vZwoKCl9fX19fX19fX19fX19fX19f X19fX19fX19fX19fX19fX19fX19fX19fX19fX19fCmxpbnV4LWFybS1rZXJuZWwgbWFpbGluZyBs aXN0CmxpbnV4LWFybS1rZXJuZWxAbGlzdHMuaW5mcmFkZWFkLm9yZwpodHRwOi8vbGlzdHMuaW5m cmFkZWFkLm9yZy9tYWlsbWFuL2xpc3RpbmZvL2xpbnV4LWFybS1rZXJuZWwK