From patchwork Thu Apr 4 02:01:43 2019 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Zhaoyang Huang X-Patchwork-Id: 10884787 Return-Path: Received: from mail.wl.linuxfoundation.org (pdx-wl-mail.web.codeaurora.org [172.30.200.125]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 105F817E9 for ; Thu, 4 Apr 2019 02:03:35 +0000 (UTC) Received: from mail.wl.linuxfoundation.org (localhost [127.0.0.1]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id EF3FC288E4 for ; Thu, 4 Apr 2019 02:03:34 +0000 (UTC) Received: by mail.wl.linuxfoundation.org (Postfix, from userid 486) id E354328928; Thu, 4 Apr 2019 02:03:34 +0000 (UTC) X-Spam-Checker-Version: SpamAssassin 3.3.1 (2010-03-16) on pdx-wl-mail.web.codeaurora.org X-Spam-Level: X-Spam-Status: No, score=-3.0 required=2.0 tests=BAYES_00,DKIM_SIGNED, DKIM_VALID,DKIM_VALID_AU,FREEMAIL_FROM,MAILING_LIST_MULTI,RCVD_IN_DNSWL_NONE autolearn=ham version=3.3.1 Received: from kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by mail.wl.linuxfoundation.org (Postfix) with ESMTP id 24ACB288E4 for ; Thu, 4 Apr 2019 02:03:34 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 44D536B000A; Wed, 3 Apr 2019 22:03:33 -0400 (EDT) Delivered-To: linux-mm-outgoing@kvack.org Received: by kanga.kvack.org (Postfix, from userid 40) id 3FACB6B0294; Wed, 3 Apr 2019 22:03:33 -0400 (EDT) X-Original-To: int-list-linux-mm@kvack.org X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 2EA666B0295; Wed, 3 Apr 2019 22:03:33 -0400 (EDT) X-Original-To: linux-mm@kvack.org X-Delivered-To: linux-mm@kvack.org Received: from mail-pf1-f200.google.com (mail-pf1-f200.google.com [209.85.210.200]) by kanga.kvack.org (Postfix) with ESMTP id EAB496B000A for ; Wed, 3 Apr 2019 22:03:32 -0400 (EDT) Received: by mail-pf1-f200.google.com with SMTP id j1so700545pff.1 for ; Wed, 03 Apr 2019 19:03:32 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:dkim-signature:from:to:subject:date:message-id; bh=OFrH6yUQs4lhopvXqwVEFAjv4sQz8EJS3WfpjR4cwWs=; b=p4wTbkNWlAkGe8INGKWVkOGomEL/2V1Dwc4+cd2Vbz+WFyqUMTDRVeRYAIpVO+SPa+ sqK/9ZlyrA0DsZXvwx+OWWs9eyRYne4leVsufZx7iStRZIUq9Xu1AfXr+GrN0dQSh6e2 uI3qd7u9KwnO4I3sx7d6nOtZbcDcqfFPjDEjBojIX1TTSt8WXzGn15MCG7nYaAkmlfRq 4OrF/9fQjpoqEhZOGZzRk/FQEH9NSm2qK0R2JP5YumyQCZxSTvw6udQYETQqXroiRAq0 LRpCz+KIz1q1WGyghm3l9Pv2l5Jo5p5qTwGEvetrfcjORxBgVloZdXcxvyeYKfiySml+ 8Neg== X-Gm-Message-State: APjAAAW8PaYxXay+3mG6lv2BbWK7a/1BkGnYYDazu1GF4+yBCkan6ffL O4N+T2bzBhTm9k7z/P49mlXW4VQPwbHZbWR93H5GAYK3G7NgbaSgsUyy0I4Wrb1I5+4qZfH/qFj l3v50CyfSlDWFqxgMz19X2oTyhKMCXLiUXWrtssI7FAV/QPfpbUEqOOJI23rDgsuR/A== X-Received: by 2002:a63:d706:: with SMTP id d6mr3027129pgg.367.1554343412308; Wed, 03 Apr 2019 19:03:32 -0700 (PDT) X-Received: by 2002:a63:d706:: with SMTP id d6mr3027020pgg.367.1554343410925; Wed, 03 Apr 2019 19:03:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554343410; cv=none; d=google.com; s=arc-20160816; b=yZTy3MAlSCPEJUCRH5lK/WQT12LUcSJZ5K+YIs6gCMKrfJzkqv3AnSCI/dL2lN6T6+ 6AXVlWkIVRp4HEdvKztaVHPlbZRXktXkbllpEkdreq7iH+AUXl2Ba01cjFKrZZn7wey+ yTzlj6T+Cg+lYPg3sVfI3DQ3jZ7lCZatF4yjTTy3/yLKeKthJjjSwlrlGD/BJvrmq2PZ eoZMqRJ1KzBTszQ4XwI3pj2X0cc4kZVQnALCfYnBVdWiJaM7IWDqvph+XnWqqLD5pJhO L9ki8yN8uA5Mug+bgNL1wHKzQJMcKr9sP9ShXBPi/1RJPkvAcc/LZw7XqUTh1Gt4YmYC U3ng== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=message-id:date:subject:to:from:dkim-signature; bh=OFrH6yUQs4lhopvXqwVEFAjv4sQz8EJS3WfpjR4cwWs=; b=fOvwH0etkGiseXQFFoyqS832A/EbBhSfz/M3wGtphf2PKVhpUUcvPjealQCDr/kE3h lGjmL1WUbV5HK2W7b+ymyJ4IhPlBs/YFPvxpeYZhEi3JjLdXkOq8iO5iJUAw7V3HfqYV y3pGYFbJGfM7b1kJcRoVzH7bDH790bR4Ydg9NisA959UKXXF7FiRYTnYRg5rr7bQ+vb1 RcB5xEK9hZrW6gnajqH4OqVChCbTRGVxwQ3dbhRH7ywW3cQ1gwdxxU0PRN8lWV/FI2xv vucnlmXIS60xHry0ASLMKdMVe/ENAzD0vP1gG+OQSenf2rzkj98V1VhmIqvaICHPq0To Ew4w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=StRH5oW7; spf=pass (google.com: domain of huangzhaoyang@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=huangzhaoyang@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: from mail-sor-f65.google.com (mail-sor-f65.google.com. [209.85.220.65]) by mx.google.com with SMTPS id r5sor15245332pgr.42.2019.04.03.19.03.30 for (Google Transport Security); Wed, 03 Apr 2019 19:03:30 -0700 (PDT) Received-SPF: pass (google.com: domain of huangzhaoyang@gmail.com designates 209.85.220.65 as permitted sender) client-ip=209.85.220.65; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=StRH5oW7; spf=pass (google.com: domain of huangzhaoyang@gmail.com designates 209.85.220.65 as permitted sender) smtp.mailfrom=huangzhaoyang@gmail.com; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:subject:date:message-id; bh=OFrH6yUQs4lhopvXqwVEFAjv4sQz8EJS3WfpjR4cwWs=; b=StRH5oW7ol0qJacNcLUKg6mElxHwgHClJj3sVgqC5ElSoLQoEqlICWkYPdE8xcDLMr wmS9qErF3MFwEqd3sWtltmY2GkToAzT0L3rM+aLGqZYT1fCSZPJvCTgnMeEkiWT8Rcr/ uzgScX2JvC8+w9EGaTnDLTbeMXeim9QCIvfB0HmTwkWfuW7JPFLfFanMV40HLjJs8uUr +KTfpyzIIdaCyN8DhWxKT5d7DaWQaXq+UrOFoSeZP2A/HyCDZK48VV0La4US8Qc7sUXf atCp4Hr03GEtEBmWkCuWIps1fCHksW2ElDeh5yj27jFKlFcst9ahbChzTefOxGm1yrz/ XBBw== X-Google-Smtp-Source: APXvYqyYj7scXs4rbtSWVf5ySYOl11Xmr38bvaJJ86L2IVxr/FPYntWmAhcWF90zhcyX4IACstd3ZA== X-Received: by 2002:a65:64d3:: with SMTP id t19mr3058941pgv.57.1554343410596; Wed, 03 Apr 2019 19:03:30 -0700 (PDT) Received: from bj03382pcu.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id e4sm20065805pgd.32.2019.04.03.19.02.35 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 03 Apr 2019 19:03:29 -0700 (PDT) From: Zhaoyang Huang To: Andrew Morton , Vlastimil Babka , Pavel Tatashin , Joonsoo Kim , David Rientjes , Roman Gushchin , Jeff Layton , Matthew Wilcox , linux-mm@kvack.org, linux-kernel@vger.kernel.org Subject: [PATCH] mm:workingset use real time to judge activity of the file page Date: Thu, 4 Apr 2019 10:01:43 +0800 Message-Id: <1554343303-11880-1-git-send-email-huangzhaoyang@gmail.com> X-Mailer: git-send-email 1.7.9.5 X-Bogosity: Ham, tests=bogofilter, spamicity=0.000000, version=1.2.4 Sender: owner-linux-mm@kvack.org Precedence: bulk X-Loop: owner-majordomo@kvack.org List-ID: X-Virus-Scanned: ClamAV using ClamSMTP From: Zhaoyang Huang In previous implementation, the number of refault pages is used for judging the refault period of each page, which is not precised. We introduce the timestamp into the workingset's entry to measure the file page's activity. The patch is tested on an Android system, which can be described as comparing the launch time of an application between a huge memory consumption. The result is launch time decrease 50% and the page fault during the test decrease 80%. Signed-off-by: Zhaoyang Huang --- include/linux/mmzone.h | 2 ++ mm/workingset.c | 24 +++++++++++++++++------- 2 files changed, 19 insertions(+), 7 deletions(-) diff --git a/include/linux/mmzone.h b/include/linux/mmzone.h index 32699b2..c38ba0a 100644 --- a/include/linux/mmzone.h +++ b/include/linux/mmzone.h @@ -240,6 +240,8 @@ struct lruvec { atomic_long_t inactive_age; /* Refaults at the time of last reclaim cycle */ unsigned long refaults; + atomic_long_t refaults_ratio; + atomic_long_t prev_fault; #ifdef CONFIG_MEMCG struct pglist_data *pgdat; #endif diff --git a/mm/workingset.c b/mm/workingset.c index 40ee02c..6361853 100644 --- a/mm/workingset.c +++ b/mm/workingset.c @@ -159,7 +159,7 @@ NODES_SHIFT + \ MEM_CGROUP_ID_SHIFT) #define EVICTION_MASK (~0UL >> EVICTION_SHIFT) - +#define EVICTION_JIFFIES (BITS_PER_LONG >> 3) /* * Eviction timestamps need to be able to cover the full range of * actionable refaults. However, bits are tight in the radix tree @@ -175,18 +175,22 @@ static void *pack_shadow(int memcgid, pg_data_t *pgdat, unsigned long eviction) eviction >>= bucket_order; eviction = (eviction << MEM_CGROUP_ID_SHIFT) | memcgid; eviction = (eviction << NODES_SHIFT) | pgdat->node_id; + eviction = (eviction << EVICTION_JIFFIES) | (jiffies >> EVICTION_JIFFIES); eviction = (eviction << RADIX_TREE_EXCEPTIONAL_SHIFT); return (void *)(eviction | RADIX_TREE_EXCEPTIONAL_ENTRY); } static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat, - unsigned long *evictionp) + unsigned long *evictionp, unsigned long *prev_jiffp) { unsigned long entry = (unsigned long)shadow; int memcgid, nid; + unsigned long prev_jiff; entry >>= RADIX_TREE_EXCEPTIONAL_SHIFT; + entry >>= EVICTION_JIFFIES; + prev_jiff = (entry & ((1UL << EVICTION_JIFFIES) - 1)) << EVICTION_JIFFIES; nid = entry & ((1UL << NODES_SHIFT) - 1); entry >>= NODES_SHIFT; memcgid = entry & ((1UL << MEM_CGROUP_ID_SHIFT) - 1); @@ -195,6 +199,7 @@ static void unpack_shadow(void *shadow, int *memcgidp, pg_data_t **pgdat, *memcgidp = memcgid; *pgdat = NODE_DATA(nid); *evictionp = entry << bucket_order; + *prev_jiffp = prev_jiff; } /** @@ -242,8 +247,12 @@ bool workingset_refault(void *shadow) unsigned long refault; struct pglist_data *pgdat; int memcgid; + unsigned long refault_ratio; + unsigned long prev_jiff; + unsigned long avg_refault_time; + unsigned long refault_time; - unpack_shadow(shadow, &memcgid, &pgdat, &eviction); + unpack_shadow(shadow, &memcgid, &pgdat, &eviction, &prev_jiff); rcu_read_lock(); /* @@ -288,10 +297,11 @@ bool workingset_refault(void *shadow) * list is not a problem. */ refault_distance = (refault - eviction) & EVICTION_MASK; - inc_lruvec_state(lruvec, WORKINGSET_REFAULT); - - if (refault_distance <= active_file) { + lruvec->refaults_ratio = atomic_long_read(&lruvec->inactive_age) / jiffies; + refault_time = jiffies - prev_jiff; + avg_refault_time = refault_distance / lruvec->refaults_ratio; + if (refault_time <= avg_refault_time) { inc_lruvec_state(lruvec, WORKINGSET_ACTIVATE); rcu_read_unlock(); return true; @@ -521,7 +531,7 @@ static int __init workingset_init(void) * some more pages at runtime, so keep working with up to * double the initial memory by using totalram_pages as-is. */ - timestamp_bits = BITS_PER_LONG - EVICTION_SHIFT; + timestamp_bits = BITS_PER_LONG - EVICTION_SHIFT - EVICTION_JIFFIES; max_order = fls_long(totalram_pages - 1); if (max_order > timestamp_bits) bucket_order = max_order - timestamp_bits;