From patchwork Tue Aug 30 14:38:38 2022 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: CGEL X-Patchwork-Id: 12959425 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 kanga.kvack.org (kanga.kvack.org [205.233.56.17]) by smtp.lore.kernel.org (Postfix) with ESMTP id D16EDECAAA1 for ; Tue, 30 Aug 2022 14:38:50 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 6FE366B0074; Tue, 30 Aug 2022 10:38:50 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 6AE0F6B0075; Tue, 30 Aug 2022 10:38:50 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 54F6B6B0078; Tue, 30 Aug 2022 10:38:50 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0015.hostedemail.com [216.40.44.15]) by kanga.kvack.org (Postfix) with ESMTP id 477386B0074 for ; Tue, 30 Aug 2022 10:38:50 -0400 (EDT) Received: from smtpin11.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id EC02C1A0346 for ; Tue, 30 Aug 2022 14:38:49 +0000 (UTC) X-FDA: 79856515578.11.633F679 Received: from mail-pj1-f44.google.com (mail-pj1-f44.google.com [209.85.216.44]) by imf07.hostedemail.com (Postfix) with ESMTP id 77E3140017 for ; Tue, 30 Aug 2022 14:38:49 +0000 (UTC) Received: by mail-pj1-f44.google.com with SMTP id n65-20020a17090a5ac700b001fbb4fad865so12050161pji.1 for ; Tue, 30 Aug 2022 07:38:49 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:from:to:cc; bh=+WWXeCfdm+lqRyWFtrO2ZMX5GRcuZpyATp0YkUKDlZs=; b=L22XTCwb3gBWEdWMOqBCzNgfGrbHsi8YbXB+0Zg/f8vi5w3xLaOS8pKKnylF7FoAk/ XbHCedKSpnhO1YGTRVLo0cYAb0vzdYhwzItm9/MlohEeq15jwNG2YFxC35nnEwhL1fZ1 5Ous3kzthMx4hs+a2FaHL8KX1Dbo7MbC5R3k03e7NrOZ7PeXcqMaSiLcB0yKOFEOs9hZ uWQItefPfH3J9vUNfg0EVbAdDTB+0MOlzUhGL9QHm6T8xv644UbCO/OFsdL1tXFGeAtl KWEtqESP29K76dx2yGGM1fnixLHa2NbAHgdIbQ55RY8P6ZcZpPHyacq0oXJ9mYdt9t0w Nmig== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:mime-version:references:in-reply-to :message-id:date:subject:cc:to:from:x-gm-message-state:from:to:cc; bh=+WWXeCfdm+lqRyWFtrO2ZMX5GRcuZpyATp0YkUKDlZs=; b=ZZnqwVWEeSDAeci8Kg+8rMS5xIRwlaujDL1G0C/KlSCzwhwGtd7zNQatOAt6974XFc 8N2PUE3IZjSBf8KDv0/D/KgKofEUBczSCX+HEPJOQ/hRKwDGgCSiKJxLtIBM9XwlYV6v f2IxPvTAOtIMhNjmEKrRTsFNPS8HdmdiBvSlGdW/VlFVnwXBhgcjNg/N0Ke2DS1lhk94 6ILQIjHCIG5nwRBopAPbZV50UUQWjFAFVC0zxAerj/nZQWiYAbeM1IlZpCNH9ntUbZ6h svLswf/ndS0NbOGbu9Zr4sKhLJc/FfMYHos1AL5idls5O9RDZEeS2/sRODAW8VF6pbh/ tvnw== X-Gm-Message-State: ACgBeo1hmmBXialyuUTtF37B2G3YWnbcJUO3kkdXme6ZXYp6eo+aBf09 GC1M7ZS9CWG+0WfpP7us5Ys= X-Google-Smtp-Source: AA6agR75QeEcSlzOeQFOnHGWqP9a4dvLA8n1Q2//O7MSaKlP82AAk3IMN3Szxv8UR9wQv0uMWnAZuw== X-Received: by 2002:a17:902:e94e:b0:16d:12b6:b9fe with SMTP id b14-20020a170902e94e00b0016d12b6b9femr21156102pll.152.1661870328579; Tue, 30 Aug 2022 07:38:48 -0700 (PDT) Received: from localhost.localdomain ([193.203.214.57]) by smtp.gmail.com with ESMTPSA id q11-20020a170903204b00b001708b189c4asm9669206pla.137.2022.08.30.07.38.46 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Tue, 30 Aug 2022 07:38:48 -0700 (PDT) From: xu xin X-Google-Original-From: xu xin To: akpm@linux-foundation.org, adobriyan@gmail.com, willy@infradead.org Cc: bagasdotme@gmail.com, hughd@google.com, linux-kernel@vger.kernel.org, linux-fsdevel@vger.kernel.org, linux-mm@kvack.org, xu xin , Xiaokai Ran , Yang Yang , CGEL ZTE Subject: [PATCH v5 1/2] ksm: count allocated ksm rmap_items for each process Date: Tue, 30 Aug 2022 14:38:38 +0000 Message-Id: <20220830143838.299758-1-xu.xin16@zte.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20220830143731.299702-1-xu.xin16@zte.com.cn> References: <20220830143731.299702-1-xu.xin16@zte.com.cn> MIME-Version: 1.0 ARC-Authentication-Results: i=1; imf07.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=L22XTCwb; spf=pass (imf07.hostedemail.com: domain of cgel.zte@gmail.com designates 209.85.216.44 as permitted sender) smtp.mailfrom=cgel.zte@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1661870329; a=rsa-sha256; cv=none; b=PcT6haqqVCPEer6fq1qx4zhajYTNa3D7UNRmnON2S7FMp9v3GCXl4T3UQkzzVSwFt5R9iv mi2Tk/naM3waeFVzBE4qLPyzFMO1H1zGNXNhneM+VvVuZSjvGrD8YWrDplk6G8Sn1F1Tg8 RcKabHFjqxWm/eA9D/bY4Lm0bOxCPQM= ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1661870329; h=from:from:sender:reply-to:subject:subject:date:date: message-id:message-id:to:to:cc:cc:mime-version:mime-version: content-type:content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=+WWXeCfdm+lqRyWFtrO2ZMX5GRcuZpyATp0YkUKDlZs=; b=1cfoWRxkE+tvMQSynrh9mlHMAiRwGH0HMxnVIa9mxeQiJ4Cy+Yv/9NszsLFAssgb1DHFgo AdhmUUxkJGsXOmPIoQbBx9qHpjsUwXNZcZgKIfPDFFUXvv/T3UWTCbDwnKdzDGTIwWWRa7 D6f9YsSYkKUaDUCuw5cmxP5YB5n0ZLY= X-Stat-Signature: jejxsdz17ujd3wybmaxe1u6ijkobzpgw X-Rspamd-Queue-Id: 77E3140017 Authentication-Results: imf07.hostedemail.com; dkim=pass header.d=gmail.com header.s=20210112 header.b=L22XTCwb; spf=pass (imf07.hostedemail.com: domain of cgel.zte@gmail.com designates 209.85.216.44 as permitted sender) smtp.mailfrom=cgel.zte@gmail.com; dmarc=pass (policy=none) header.from=gmail.com X-Rspam-User: X-Rspamd-Server: rspam11 X-HE-Tag: 1661870329-808248 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: KSM can save memory by merging identical pages, but also can consume additional memory, because it needs to generate rmap_items to save each scanned page's brief rmap information. Some of these pages may be merged, but some may not be abled to be merged after being checked several times, which are unprofitable memory consumed. The information about whether KSM save memory or consume memory in system-wide range can be determined by the comprehensive calculation of pages_sharing, pages_shared, pages_unshared and pages_volatile. A simple approximate calculation: profit =~ pages_sharing * sizeof(page) - (all_rmap_items) * sizeof(rmap_item); where all_rmap_items equals to the sum of pages_sharing, pages_shared, pages_unshared and pages_volatile. But we cannot calculate this kind of ksm profit inner single-process wide because the information of ksm rmap_item's number of a process is lacked. For user applications, if this kind of information could be obtained, it helps upper users know how beneficial the ksm-policy (like madvise) they are using brings, and then optimize their app code. For example, one application madvise 1000 pages as MERGEABLE, while only a few pages are really merged, then it's not cost-efficient. So we add a new interface /proc//ksm_stat for each process in which the value of ksm_rmap_itmes is only shown now and so more values can be added in future. So similarly, we can calculate the ksm profit approximately for a single process by: profit =~ ksm_merging_pages * sizeof(page) - ksm_rmap_items * sizeof(rmap_item); where ksm_merging_pages is shown at /proc//ksm_merging_pages, and ksm_rmap_items is shown in /proc//ksm_stat. Signed-off-by: xu xin Reviewed-by: Xiaokai Ran Reviewed-by: Yang Yang Signed-off-by: CGEL ZTE --- fs/proc/base.c | 15 +++++++++++++++ include/linux/mm_types.h | 5 +++++ mm/ksm.c | 2 ++ 3 files changed, 22 insertions(+) diff --git a/fs/proc/base.c b/fs/proc/base.c index 4ead8cf654e4..c66ac538eda4 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -3199,6 +3199,19 @@ static int proc_pid_ksm_merging_pages(struct seq_file *m, struct pid_namespace * return 0; } +static int proc_pid_ksm_stat(struct seq_file *m, struct pid_namespace *ns, + struct pid *pid, struct task_struct *task) +{ + struct mm_struct *mm; + + mm = get_task_mm(task); + if (mm) { + seq_printf(m, "ksm_rmap_items %lu\n", mm->ksm_rmap_items); + mmput(mm); + } + + return 0; +} #endif /* CONFIG_KSM */ #ifdef CONFIG_STACKLEAK_METRICS @@ -3334,6 +3347,7 @@ static const struct pid_entry tgid_base_stuff[] = { #endif #ifdef CONFIG_KSM ONE("ksm_merging_pages", S_IRUSR, proc_pid_ksm_merging_pages), + ONE("ksm_stat", S_IRUSR, proc_pid_ksm_stat), #endif }; @@ -3671,6 +3685,7 @@ static const struct pid_entry tid_base_stuff[] = { #endif #ifdef CONFIG_KSM ONE("ksm_merging_pages", S_IRUSR, proc_pid_ksm_merging_pages), + ONE("ksm_stat", S_IRUSR, proc_pid_ksm_stat), #endif }; diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index fb53717d571c..bd0993d20a20 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -656,6 +656,11 @@ struct mm_struct { * merging. */ unsigned long ksm_merging_pages; + /* + * Represent how many pages are checked for ksm merging + * including merged and not merged. + */ + unsigned long ksm_rmap_items; #endif #ifdef CONFIG_LRU_GEN struct { diff --git a/mm/ksm.c b/mm/ksm.c index e34cc21d5556..0c76b3e004b7 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -387,6 +387,7 @@ static inline struct rmap_item *alloc_rmap_item(void) static inline void free_rmap_item(struct rmap_item *rmap_item) { ksm_rmap_items--; + rmap_item->mm->ksm_rmap_items--; rmap_item->mm = NULL; /* debug safety */ kmem_cache_free(rmap_item_cache, rmap_item); } @@ -2234,6 +2235,7 @@ static struct rmap_item *get_next_rmap_item(struct mm_slot *mm_slot, if (rmap_item) { /* It has already been zeroed */ rmap_item->mm = mm_slot->mm; + rmap_item->mm->ksm_rmap_items++; rmap_item->address = addr; rmap_item->rmap_list = *rmap_list; *rmap_list = rmap_item;