Received: by 2002:a25:4158:0:0:0:0:0 with SMTP id o85csp789880yba; Wed, 3 Apr 2019 20:31:35 -0700 (PDT) X-Google-Smtp-Source: APXvYqyS7OHA/nnSVEzcuIDD5BUbbdrLmrkLaY2x99lnh4fzBDSt1CUAPNyFwKNvGHh9PTjBXYi5 X-Received: by 2002:a62:1d0d:: with SMTP id d13mr3376150pfd.96.1554348695117; Wed, 03 Apr 2019 20:31:35 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1554348695; cv=none; d=google.com; s=arc-20160816; b=xjOxvVw9t1AwGoD2uRFatZ2x/YJJLw6T07ePE2mrbYB2cMlsIsUSrSNAmkKyOEaMa5 KrUvIIBRiXHbrt6ucLiWQV5C6V6bWZUnM8y9seS39hYClmkRXdh0rnxQLf78aBfD/pQw rDc9BZ/l3Il1njFI148hU4C1w0Kim+mRf2EZVXjsldVhPby1QRwzlwzWANz9rfMahsCU LEmFcBltL5xTdXVDS5cLQ/pg9rmNxE/Flm92dqKslJ3L+lwNQuSXncmDkP5mwWH9O0/H uY7BoA5onBqq7PnAAXAJ0PmZ6nxJFB/kb1fwMmj6aubeaJkXtwX90k19DsyTbXqxA1jU RBSQ== 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=lv8NVbJO6cxJt5xlEdH0XCLVCT+ImQmsAWGyClGMj7s=; b=t6vbbt43/RqUJeAt798QTtlK87TTVb76WmfGlay6ErqM1nzhbMRb3Nq+FWLCzk3A24 /UwBFBIrxw62l5rMewE0sE1lU6IG8yG0r9mif3SIuHmzA/8B9NfKkI22yD3qqtnjOrgj YCLISMCJRMBtwuGtWKSPejCH/1kLzyJRSBNdTxy7MrmBKq/ncdfwjJJ9ERY3Fgsen/5/ 974Se/FV4hQnYC2l5FjUymqLEhbGu4Eux58EIob+l9f5wkj/UOzbrEkaXgD4TeKwKMVi QvLN+V+NRjl+XJFKHi+rPui7KyyBzbI8Q9v28nj5UfLtseFxbQaoRUYnMJYq9iztwFaI vGnA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=Bs+UaaYK; 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 h20si8652953pgv.352.2019.04.03.20.31.19; Wed, 03 Apr 2019 20:31:35 -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=Bs+UaaYK; 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 S1726544AbfDDDao (ORCPT + 99 others); Wed, 3 Apr 2019 23:30:44 -0400 Received: from mail-pf1-f194.google.com ([209.85.210.194]:33465 "EHLO mail-pf1-f194.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726218AbfDDDao (ORCPT ); Wed, 3 Apr 2019 23:30:44 -0400 Received: by mail-pf1-f194.google.com with SMTP id i19so630897pfd.0 for ; Wed, 03 Apr 2019 20:30:43 -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=lv8NVbJO6cxJt5xlEdH0XCLVCT+ImQmsAWGyClGMj7s=; b=Bs+UaaYK7meC5Cxn0BfLUhKq2cxLzN/IxzdWFfI5ouoUAsAeWY/0ic8yvAyF4Z3FP5 i43xuSQd3ClJH05R4RJxnYS0ER2iOFW6gWgjtzGILMCcuO3Jl0mEYYBMMZbd9crz0Fkk j38WPKQwMtWfl1wqCKRJjmrvUdCRueIi6qFRze4qBGMFlO/Bom4h49eUFkFp0fr0qPqb jkiZEFj9FfdqmzlC/1Mqaie5zpbQSC9zoKpOZVuffBuR3bElTFJTcbViqaiGqH/ph6Vw Zm5F6E0AFOF/fSie8TBulqSyiCP1ObxhGBEjD1cZ1DtdNAvnsrKPFQpL5gW4FV3Ir+wW v4dw== 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=lv8NVbJO6cxJt5xlEdH0XCLVCT+ImQmsAWGyClGMj7s=; b=X1Gmt5D2XM34K2TghGzoOe99qT7GQbpomp71ob9y1w+ARCvCAjFRxoLJkvapFl9T0d seC4U6w4VVY8W40uNtXPJWMhS6vrAPbfoxlFQtl+dkvmLJ6URY4RSQwe4xW7zqwyGaEu jPQoHbF6CBa3Wfa8q/EaYm2UgT3OqZH3bY/D1v3ayOHMJcwKYTHDBOIDrtQZrdHaMrzW 4tmzq1cNzDquon/16j4r4Oplo9SK9nBxbviVCtYNtC6PdMonhXpN5z6m9dKDRIwasjng PkxLxct1hM+PK29mL9kL7U0Zbzg7gDAAdpdW6tov5LjloVFSn6i3P/IlCf2Bfp7D+hHE j3qA== X-Gm-Message-State: APjAAAXZeW6ju4N2b1b1LsgGsPBV9sn95hH2s3nAfTGMywzPU7+C5kEA YJfFWaTgiQIfhOp8mIMPXgY= X-Received: by 2002:a63:6a42:: with SMTP id f63mr3345989pgc.207.1554348643029; Wed, 03 Apr 2019 20:30:43 -0700 (PDT) Received: from bj03382pcu.spreadtrum.com ([117.18.48.82]) by smtp.gmail.com with ESMTPSA id j4sm27324017pfn.132.2019.04.03.20.30.34 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Wed, 03 Apr 2019 20:30:42 -0700 (PDT) From: Zhaoyang Huang To: Andrew Morton , Vlastimil Babka , Pavel Tatashin , Joonsoo Kim , David Rientjes , Zhaoyang Huang , 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 11:30:17 +0800 Message-Id: <1554348617-12897-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 as eviction of other files will be affect a lot on current cache. We introduce the timestamp into the workingset's entry and refault ratio to measure the file page's activity. It helps to decrease the affection of other files(average refault ratio can reflect the view of whole system 's memory). 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