Received: by 2002:a05:6a10:9848:0:0:0:0 with SMTP id x8csp4214814pxf; Tue, 30 Mar 2021 02:07:57 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwno0oKn081DEaAgCcBGhW8PZcfwWBdRsPI2PNbWmvb2WT3VrZEIAGcyY6jJfLN0l405nTj X-Received: by 2002:a17:906:1444:: with SMTP id q4mr32476258ejc.343.1617095277575; Tue, 30 Mar 2021 02:07:57 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1617095277; cv=none; d=google.com; s=arc-20160816; b=xc1MNw0Y0Ip6pu0yGqosXauol3kSBd3oDlFILEDtDgDLOcgvo2l97BxdXtkzph6708 EUv2VR6R2Gg0/RUh4Ho76+k/3aAPGH3PLfc5Bm9yxmucfNJx65DCguYKaklkQb8FVz9Y tIq0JPTAG0okDLcpX+D2C5IMjkKIuCqHavZ4r1UeCWAhtFaG0MWnQi0PYmi3+974tp42 zg0N7+QiULKXW07jenqYKy+sahOGij3m3QKSDxzgKmjPoda2k9orneH+QDz3jytXrKfU ZYFnVrRN6OhEh/L71dTMBfHH/wwCEPW5Zao8fzvilA9wMH6NYPRPzApmOjF8y7rygwUt RcNQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:references:in-reply-to:message-id:date:subject :cc:to:from:dkim-signature; bh=vtrB2rInnYxF3AJo1SMSTjvnEEdxxHaUc0AwFdrdGNE=; b=gJGkpuaZ0DoMqrVz3OiQcVrb9hTO1vmCRaA4IpvlN8et2Vs2nSslWJPt24zNdeRH6R 04NpVKFr35EtO0wzNXw9m6E53NNBOORX0cw+DeHjcWsWvosbaPxL8Uowyps6oF1u9T56 UlaufJJLdLRLHT633PtaujUuWMzzRUSlTqA2IiHo11imEShVEZjfaHtQIa8VgxY1dUYb SeUH5LRZ7h8sb31yE6KE6c2BGtJg4Y4sUQM/XdsqaNmTeqzG4Y1+w2IWmjQ5JofdOZZs 6pbva+QZ+ecy07Nhp8/TKy/kxLXyz6GhInUbJlBQ6ga/SxpHIZIWY2Kr3Dcb1bZs/MOC loTA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=evZWZqmS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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. [23.128.96.18]) by mx.google.com with ESMTP id h6si14072826ejt.184.2021.03.30.02.07.34; Tue, 30 Mar 2021 02:07:57 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; dkim=pass header.i=@gmail.com header.s=20161025 header.b=evZWZqmS; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 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 S231760AbhC3JGU (ORCPT + 99 others); Tue, 30 Mar 2021 05:06:20 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:59928 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S231589AbhC3JGF (ORCPT ); Tue, 30 Mar 2021 05:06:05 -0400 Received: from mail-qk1-x734.google.com (mail-qk1-x734.google.com [IPv6:2607:f8b0:4864:20::734]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E150FC061762; Tue, 30 Mar 2021 02:06:04 -0700 (PDT) Received: by mail-qk1-x734.google.com with SMTP id y18so15115728qky.11; Tue, 30 Mar 2021 02:06:04 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=vtrB2rInnYxF3AJo1SMSTjvnEEdxxHaUc0AwFdrdGNE=; b=evZWZqmSjckcOkyb55NBlPjtqljYC/5fxELm84zqIY/s1hcvvU09G7lVLK3kqSUytN 5ONvyF6WLT6uRvVM3Q4rfy6C2hyT8CSxH7f6tmJw48Qcpzlhznj2GWfmlhHTB1O+nM75 Ll7zs7VA0FzLECPkgDZW0OrkPx7QC/lQujvv0Y8f7H7Db1AUAsHgyKh3HTdlQ0zoC1o9 6rKpEYjPEA4V5Ncc06Yh8yrR6bHcGM1dBJ77KXf408Gi7PQNvWUl6girP7ZJcrar+ulZ dNmTkUEune/bJZCIPdOInfw6Fkj13LBfBpfX/v9fasZzPmx9hRWKdASl2XcF3zL7SaDm js5Q== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=vtrB2rInnYxF3AJo1SMSTjvnEEdxxHaUc0AwFdrdGNE=; b=SDjY9gT7j+9yjZsHK73kRZpbVlrYZBibbvHzO4cFQ/bvELmXG851M4jaQIWjh9dsEp z6xmwrKkKfP1DaPHR/bPv5rXOwlfhaZUAHoEtIpRyxENpAPz5WvwvCD2KlZtgZGKMjts Lz7n3w5V2t2BcKVZwpsKP35TLQ+ncSM4s9pgpukemi1Kmz96/2+HZeWa8/QvbpRnnKGi yf/Y5Er3I5ZS+IyxvPwiQTpnZI10s1AublgzcNidSH12si8K3ircF8KqqmqYb3Zr6OV5 lzou+bGEzC5v90SfQ5dTEbmnfpZ2xPKoBLAoB4bdUY/SEQX/FcfNffKOHK3bjeRrLCLy ucyQ== X-Gm-Message-State: AOAM532TyN+Wy5KqiwsTyzKXU8sVeOJ5w6LTSOhigTkX8ozl2EDnfhys pZO5f78vKxC0VTMWXUugGQI= X-Received: by 2002:ae9:ef89:: with SMTP id d131mr28601002qkg.214.1617095164092; Tue, 30 Mar 2021 02:06:04 -0700 (PDT) Received: from localhost.localdomain (ec2-35-169-212-159.compute-1.amazonaws.com. [35.169.212.159]) by smtp.gmail.com with ESMTPSA id 8sm14630011qkc.32.2021.03.30.02.06.03 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Mar 2021 02:06:03 -0700 (PDT) From: sj38.park@gmail.com To: akpm@linux-foundation.org Cc: SeongJae Park , Jonathan.Cameron@Huawei.com, acme@kernel.org, alexander.shishkin@linux.intel.com, amit@kernel.org, benh@kernel.crashing.org, brendanhiggins@google.com, corbet@lwn.net, david@redhat.com, dwmw@amazon.com, elver@google.com, fan.du@intel.com, foersleo@amazon.de, greg@kroah.com, gthelen@google.com, guoju.fgj@alibaba-inc.com, mgorman@suse.de, minchan@kernel.org, mingo@redhat.com, namhyung@kernel.org, peterz@infradead.org, riel@surriel.com, rientjes@google.com, rostedt@goodmis.org, rppt@kernel.org, shakeelb@google.com, shuah@kernel.org, sj38.park@gmail.com, snu@amazon.de, vbabka@suse.cz, vdavydov.dev@gmail.com, zgf574564920@gmail.com, linux-damon@amazon.com, linux-mm@kvack.org, linux-doc@vger.kernel.org, linux-kernel@vger.kernel.org Subject: [PATCH v26 04/13] mm/idle_page_tracking: Make PG_idle reusable Date: Tue, 30 Mar 2021 09:05:28 +0000 Message-Id: <20210330090537.12143-5-sj38.park@gmail.com> X-Mailer: git-send-email 2.17.1 In-Reply-To: <20210330090537.12143-1-sj38.park@gmail.com> References: <20210330090537.12143-1-sj38.park@gmail.com> Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org From: SeongJae Park PG_idle and PG_young allow the two PTE Accessed bit users, Idle Page Tracking and the reclaim logic concurrently work while don't interfere each other. That is, when they need to clear the Accessed bit, they set PG_young to represent the previous state of the bit, respectively. And when they need to read the bit, if the bit is cleared, they further read the PG_young to know whether the other has cleared the bit meanwhile or not. We could add another page flag and extend the mechanism to use the flag if we need to add another concurrent PTE Accessed bit user subsystem. However, the space is limited. Meanwhile, if the new subsystem is mutually exclusive with IDLE_PAGE_TRACKING or interfering with it is not a real problem, it would be ok to simply reuse the PG_idle flag. However, it's impossible because the flags are dependent on IDLE_PAGE_TRACKING. To allow such reuse of the flags, this commit separates the PG_young and PG_idle flag logic from IDLE_PAGE_TRACKING and introduces new kernel config, 'PAGE_IDLE_FLAG'. Hence, a new subsystem would be able to reuse PG_idle without depending on IDLE_PAGE_TRACKING. In the next commit, DAMON's reference implementation of the virtual memory address space monitoring primitives will use it. Signed-off-by: SeongJae Park Reviewed-by: Shakeel Butt --- include/linux/page-flags.h | 4 ++-- include/linux/page_ext.h | 2 +- include/linux/page_idle.h | 6 +++--- include/trace/events/mmflags.h | 2 +- mm/Kconfig | 8 ++++++++ mm/page_ext.c | 12 +++++++++++- mm/page_idle.c | 10 ---------- 7 files changed, 26 insertions(+), 18 deletions(-) diff --git a/include/linux/page-flags.h b/include/linux/page-flags.h index 04a34c08e0a6..6be2c1e2fb48 100644 --- a/include/linux/page-flags.h +++ b/include/linux/page-flags.h @@ -131,7 +131,7 @@ enum pageflags { #ifdef CONFIG_MEMORY_FAILURE PG_hwpoison, /* hardware poisoned page. Don't touch */ #endif -#if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT) +#if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT) PG_young, PG_idle, #endif @@ -436,7 +436,7 @@ PAGEFLAG_FALSE(HWPoison) #define __PG_HWPOISON 0 #endif -#if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT) +#if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT) TESTPAGEFLAG(Young, young, PF_ANY) SETPAGEFLAG(Young, young, PF_ANY) TESTCLEARFLAG(Young, young, PF_ANY) diff --git a/include/linux/page_ext.h b/include/linux/page_ext.h index aff81ba31bd8..fabb2e1e087f 100644 --- a/include/linux/page_ext.h +++ b/include/linux/page_ext.h @@ -19,7 +19,7 @@ struct page_ext_operations { enum page_ext_flags { PAGE_EXT_OWNER, PAGE_EXT_OWNER_ALLOCATED, -#if defined(CONFIG_IDLE_PAGE_TRACKING) && !defined(CONFIG_64BIT) +#if defined(CONFIG_PAGE_IDLE_FLAG) && !defined(CONFIG_64BIT) PAGE_EXT_YOUNG, PAGE_EXT_IDLE, #endif diff --git a/include/linux/page_idle.h b/include/linux/page_idle.h index 1e894d34bdce..d8a6aecf99cb 100644 --- a/include/linux/page_idle.h +++ b/include/linux/page_idle.h @@ -6,7 +6,7 @@ #include #include -#ifdef CONFIG_IDLE_PAGE_TRACKING +#ifdef CONFIG_PAGE_IDLE_FLAG #ifdef CONFIG_64BIT static inline bool page_is_young(struct page *page) @@ -106,7 +106,7 @@ static inline void clear_page_idle(struct page *page) } #endif /* CONFIG_64BIT */ -#else /* !CONFIG_IDLE_PAGE_TRACKING */ +#else /* !CONFIG_PAGE_IDLE_FLAG */ static inline bool page_is_young(struct page *page) { @@ -135,6 +135,6 @@ static inline void clear_page_idle(struct page *page) { } -#endif /* CONFIG_IDLE_PAGE_TRACKING */ +#endif /* CONFIG_PAGE_IDLE_FLAG */ #endif /* _LINUX_MM_PAGE_IDLE_H */ diff --git a/include/trace/events/mmflags.h b/include/trace/events/mmflags.h index 629c7a0eaff2..ea434bbc2d2b 100644 --- a/include/trace/events/mmflags.h +++ b/include/trace/events/mmflags.h @@ -73,7 +73,7 @@ #define IF_HAVE_PG_HWPOISON(flag,string) #endif -#if defined(CONFIG_IDLE_PAGE_TRACKING) && defined(CONFIG_64BIT) +#if defined(CONFIG_PAGE_IDLE_FLAG) && defined(CONFIG_64BIT) #define IF_HAVE_PG_IDLE(flag,string) ,{1UL << flag, string} #else #define IF_HAVE_PG_IDLE(flag,string) diff --git a/mm/Kconfig b/mm/Kconfig index 43d50f93789d..f35fcaefa225 100644 --- a/mm/Kconfig +++ b/mm/Kconfig @@ -765,10 +765,18 @@ config DEFERRED_STRUCT_PAGE_INIT lifetime of the system until these kthreads finish the initialisation. +config PAGE_IDLE_FLAG + bool "Add PG_idle and PG_young flags" + help + This feature adds PG_idle and PG_young flags in 'struct page'. PTE + Accessed bit writers can set the state of the bit in the flags to let + other PTE Accessed bit readers don't disturbed. + config IDLE_PAGE_TRACKING bool "Enable idle page tracking" depends on SYSFS && MMU select PAGE_EXTENSION if !64BIT + select PAGE_IDLE_FLAG help This feature allows to estimate the amount of user pages that have not been touched during a given period of time. This information can diff --git a/mm/page_ext.c b/mm/page_ext.c index df6f74aac8e1..8e59da0f4367 100644 --- a/mm/page_ext.c +++ b/mm/page_ext.c @@ -58,11 +58,21 @@ * can utilize this callback to initialize the state of it correctly. */ +#if defined(CONFIG_PAGE_IDLE_FLAG) && !defined(CONFIG_64BIT) +static bool need_page_idle(void) +{ + return true; +} +struct page_ext_operations page_idle_ops = { + .need = need_page_idle, +}; +#endif + static struct page_ext_operations *page_ext_ops[] = { #ifdef CONFIG_PAGE_OWNER &page_owner_ops, #endif -#if defined(CONFIG_IDLE_PAGE_TRACKING) && !defined(CONFIG_64BIT) +#if defined(CONFIG_PAGE_IDLE_FLAG) && !defined(CONFIG_64BIT) &page_idle_ops, #endif }; diff --git a/mm/page_idle.c b/mm/page_idle.c index 64e5344a992c..edead6a8a5f9 100644 --- a/mm/page_idle.c +++ b/mm/page_idle.c @@ -207,16 +207,6 @@ static const struct attribute_group page_idle_attr_group = { .name = "page_idle", }; -#ifndef CONFIG_64BIT -static bool need_page_idle(void) -{ - return true; -} -struct page_ext_operations page_idle_ops = { - .need = need_page_idle, -}; -#endif - static int __init page_idle_init(void) { int err; -- 2.17.1