Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp740195yba; Wed, 3 Apr 2019 19:04:30 -0700 (PDT) X-Google-Smtp-Source: APXvYqwJHG3lijKn3qiOrHrqpb5SfNTSntoiDV5l4rBkVYHT2SgLqGYoDNgb68k8Y2T0wh43M9bi X-Received: by 2002:a63:7117:: with SMTP id m23mr2966973pgc.271.1554343470552; Wed, 03 Apr 2019 19:04:30 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554343470; cv=none; d=google.com; s=arc-20160816; b=mb/EGW4NBCBJndUbAK+DIBhHT0b6XwMfCNtLWdhBUAloSi0ON5VJDQgMawtdX6mR74 4BDsYGLBCrKreHWcmCpghrJpuVwaF19RL3S7rknZntDh9n0bQJVxITRR166FsYM0qbIj AtkImsGhxt+8nGIinr2rOjFqXG3Go8hzqhz7z0Y0+YZQs9Lem1zlQGG6Fx+vW8HwrBWo zJAIBx9jUYx9aLIrxiscePLWAOjvzhs/P+/IkaGEi8qLPHxfZZ53nks33QGVO55TXmUy sI5/yD5Mc+pM50DZeIL3dhVI+FXuMIAfzlBWc0x0pMGW4N1MowbMNfmpVLpSyChrWo2T fJaw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:message-id:date:subject:to:from :dkim-signature; bh=OFrH6yUQs4lhopvXqwVEFAjv4sQz8EJS3WfpjR4cwWs=; b=STT2Sbzy6g6nc1BMEhZC3ebxiNlU72yWOGSoYxAPEY6/iIuBbKAbR76XO9sN8jMcG1 GpT2Xoz2gjxW49nt8kJnrvgYZ5y0kD3FxxU77iLMe73ZRGodtizTNea8PzzuD0KybrBK R46ivw/bNampvx3okiKWiHYmgSLKWH15NBatUtzVUwrsHGvcS73VfF3G6P2C64t/dxKz 0bgcicW89Irx6OhnOeRaDZ5KN5T4v21An169YcafwArACyQh3qDy/55HVcHer4fBdmmy mLzREABCC/ocYQQQ0Gf/1AvkdQdO9pHEECwZQnOuNTiz6XNLq5kkxx9jikMLexjkZwwx WU1w== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=StRH5oW7; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id f17si4502364pgd.243.2019.04.03.19.04.15; Wed, 03 Apr 2019 19:04:30 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=StRH5oW7; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=QUARANTINE dis=NONE) header.from=gmail.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726637AbfDDCDb (ORCPT + 99 others); Wed, 3 Apr 2019 22:03:31 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:41142 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726167AbfDDCDb (ORCPT ); Wed, 3 Apr 2019 22:03:31 -0400 Received: by mail-pf1-f194.google.com with SMTP id 188so510988pfd.8 for ; Wed, 03 Apr 2019 19:03:31 -0700 (PDT) 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-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:subject:date:message-id; bh=OFrH6yUQs4lhopvXqwVEFAjv4sQz8EJS3WfpjR4cwWs=; b=OaE88uQuKaMfA4/HDduS/87CK6ZJTi0K2Y7MZpfmqbnwMIrgx6mU3Xo//Lzqjnis/7 ehexfs20ZvDELrZryf5b0crUHpKn852FMujPjAmA/Xy/mud9c06gETl+oeXEvYb07k9r 5gBgHjThRjHzjHJ6eqG7IVCwSe6fYWlFMD00c7Nxxfd9xIwQRBE3eooiQFDxCF2eM8+o aiS4SStyLa3sDQ/GGcvmrRQn0FVph4S0tdYrFDPKyK9KOw+Q7JEIwoFUD2yEx7MtcQV3 NAcPdTALJuB6CghlOe/VW1+flHseC3HQvhnHHozZPSXTIORh6sOtYbT6DIehGDXFOGC7 l+pg== X-Gm-Message-State: APjAAAVcwY4fuEFNKVpCK+Xj5x6JWyqGBZBSxgzNDMEyrOWUVE55etYT 7cQCY74cXx1IGIVq++UXdTY= 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 Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org 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; -- 1.9.1