From nobody Tue Apr 7 03:34:20 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 9D629C433FE for ; Tue, 11 Oct 2022 02:22:12 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229768AbiJKCWK (ORCPT ); Mon, 10 Oct 2022 22:22:10 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:48946 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229729AbiJKCWE (ORCPT ); Mon, 10 Oct 2022 22:22:04 -0400 Received: from mail-pl1-x641.google.com (mail-pl1-x641.google.com [IPv6:2607:f8b0:4864:20::641]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E1A2B5C379 for ; Mon, 10 Oct 2022 19:22:03 -0700 (PDT) Received: by mail-pl1-x641.google.com with SMTP id h10so11940716plb.2 for ; Mon, 10 Oct 2022 19:22:03 -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:subject:date :message-id:reply-to; bh=jsbh45Fv58HEehSJMVvF1reAzOnYH1CPjnbjNiOuTbI=; b=lgOVYuFLApBB99lxB0wJ+xs6iHGx1lEt2NfNrp2YK62xBG7cGjYeVl9kKELJ/qMHMn Zyd1vrv+Pck4AGaEvT974cU36a/3WWkDBHnuCTXvw1bc04EmlKd0Em5eipe+qGAEyUaU LF2Fn5nE/nb7YoHhIKt0V+cWuj0RHTf4QLYA0QG0VPhZnW8IKCAS8UCah3FqahzOxcG7 Ul5miU01nXsNlaIoyvq9ItU767ag1L+LNKPvPXixm6iPHOOSv5fl7pBcXW3nZUysG+IZ v5tV7aCmWU34KlM0txj6ud6e/MUyrd0QHdt4fi49yFsR/gC0GEzRYKXyVR47/GJsAc+p cLEQ== 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 :subject:date:message-id:reply-to; bh=jsbh45Fv58HEehSJMVvF1reAzOnYH1CPjnbjNiOuTbI=; b=Wo2hhvo6ZjRynIgdq1ecMhhrWiuVLit/o/Jgjgwi/H5y8Yha9917qyKso5sB8iMLKK vZIdwpr7wbC7K2EBqVzaiUKgjZwP4KI0iI2rUYaTrshw42h9I2JOMwVwFs8Fnw40viQD uD6PxV9leB0nWFyJLBVvbX/iwnUvmELwfZfq8ujSlwHzLgGDRTUhR2vwfdmR9oFF2gtW ZiUmrPo/CEdS1xZOkKFJPAhTazwgbnFKL4uvaUJxUsv6EBwz/rgeweycIUCWPCovpIOs qEKUIa7ekxYPIIoAj+ggqsx8PeMgTK1Kw6adtrIb1R5wke2MI0utKkkFEzvmA6frXdQe 9TqA== X-Gm-Message-State: ACrzQf2a91LiIX0TBhbNqsdX3WDzveRaZ9gI61jZLPuZQ3mh/c0ZAz10 tub8Qxj5p4iRv/j+dePMexpL0l9gJ60= X-Google-Smtp-Source: AMsMyM7JW36aWaS0bLlTDqSb2ZhzhL4vqsQD6p3KYfBeOqc7tFwXhZjgSDiBMKko8MCBq+bCt5qKKA== X-Received: by 2002:a17:902:f0d4:b0:17f:72bd:74f3 with SMTP id v20-20020a170902f0d400b0017f72bd74f3mr22495074pla.109.1665454923480; Mon, 10 Oct 2022 19:22:03 -0700 (PDT) Received: from localhost.localdomain ([193.203.214.57]) by smtp.gmail.com with ESMTPSA id l24-20020a17090aaa9800b0020d51aefb82sm94655pjq.19.2022.10.10.19.22.01 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Oct 2022 19:22:03 -0700 (PDT) From: xu.xin.sc@gmail.com X-Google-Original-From: xu.xin16@zte.com.cn To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, xu xin , Claudio Imbrenda , David Hildenbrand , Xuexin Jiang , Xiaokai Ran , Yang Yang Subject: [PATCH v3 1/5] ksm: abstract the function try_to_get_old_rmap_item Date: Tue, 11 Oct 2022 02:21:50 +0000 Message-Id: <20221011022150.322212-1-xu.xin16@zte.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221011022006.322158-1-xu.xin16@zte.com.cn> References: <20221011022006.322158-1-xu.xin16@zte.com.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: xu xin A new function try_to_get_old_rmap_item is abstracted from get_next_rmap_item. This function will be reused by the subsequent patches about counting ksm_zero_pages. The patch improves the readability and reusability of KSM code. Signed-off-by: xu xin Cc: Claudio Imbrenda Cc: David Hildenbrand Cc: Xuexin Jiang Cc: Xiaokai Ran Cc: Yang Yang --- mm/ksm.c | 25 +++++++++++++++++++------ 1 file changed, 19 insertions(+), 6 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index c19fcca9bc03..13c60f1071d8 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -2187,23 +2187,36 @@ static void cmp_and_merge_page(struct page *page, s= truct ksm_rmap_item *rmap_ite } } =20 -static struct ksm_rmap_item *get_next_rmap_item(struct ksm_mm_slot *mm_slo= t, - struct ksm_rmap_item **rmap_list, - unsigned long addr) +static struct ksm_rmap_item *try_to_get_old_rmap_item(unsigned long addr, + struct ksm_rmap_item **rmap_list) { - struct ksm_rmap_item *rmap_item; - while (*rmap_list) { - rmap_item =3D *rmap_list; + struct ksm_rmap_item *rmap_item =3D *rmap_list; if ((rmap_item->address & PAGE_MASK) =3D=3D addr) return rmap_item; if (rmap_item->address > addr) break; *rmap_list =3D rmap_item->rmap_list; + /* Running here indicates it's vma has been UNMERGEABLE */ remove_rmap_item_from_tree(rmap_item); free_rmap_item(rmap_item); } =20 + return NULL; +} + +static struct ksm_rmap_item *get_next_rmap_item(struct ksm_mm_slot *mm_slo= t, + struct ksm_rmap_item **rmap_list, + unsigned long addr) +{ + struct ksm_rmap_item *rmap_item; + + /* lookup if we have a old rmap_item matching the addr*/ + rmap_item =3D try_to_get_old_rmap_item(addr, rmap_list); + if (rmap_item) + return rmap_item; + + /* Need to allocate a new rmap_item */ rmap_item =3D alloc_rmap_item(); if (rmap_item) { /* It has already been zeroed */ --=20 2.25.1 From nobody Tue Apr 7 03:34:20 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id B28B6C433F5 for ; Tue, 11 Oct 2022 02:22:30 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229490AbiJKCW3 (ORCPT ); Mon, 10 Oct 2022 22:22:29 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49198 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229773AbiJKCW0 (ORCPT ); Mon, 10 Oct 2022 22:22:26 -0400 Received: from mail-pj1-x1044.google.com (mail-pj1-x1044.google.com [IPv6:2607:f8b0:4864:20::1044]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id EFA3982D0B for ; Mon, 10 Oct 2022 19:22:21 -0700 (PDT) Received: by mail-pj1-x1044.google.com with SMTP id n18-20020a17090ade9200b0020b0012097cso603566pjv.0 for ; Mon, 10 Oct 2022 19:22:21 -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:subject:date :message-id:reply-to; bh=vzxRXZh2ZpCVU2bpLGiMFKwYjl0iDSX4se2xXGC6hk8=; b=g7/Dln2aP/rzIlJVDCOcKO2ExXMwc8oou+gp2lMkgFtPAxQbvBbSN+cy93oOMBZb2/ lXHlCMKPHw/Q5eRk8hfkejD4HPR0jeernWPy60zNRCTE9f+AGO/IgXblNhFliN5OjkLj G6z8xHdrdVmTdaiJ9TTn13VZvpLsVDoPymx8pukFFllSW41BqsrckdeW4cFyn7ey+JU3 tB5tDXQRLUiZiXFuVHcNVwFLOn6wHm928qtqHTugVb8BFWby7Td7nHO0d/2/4DYD9FZ0 IpQHrV4b+AQ8d5d8Tu5g3lYVM2M86t34Qfow2FFlQv42bteYGNhttdm5IlyAkY7aZsTe 3vTg== 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 :subject:date:message-id:reply-to; bh=vzxRXZh2ZpCVU2bpLGiMFKwYjl0iDSX4se2xXGC6hk8=; b=VwGq1Y2UjSyc94HrrM1MAHK8kRDIJM2wPzK0v33IEiciUQdooYAscKDjLha3BjJ6Xs SqNHYQ6QVjFGAX3JIJ7/+eJhvDyz5sLSyhjO7PixSDSJ1TI56fjGgMkDhOo6gCU8OzLl gXdq8pxrDvHaKaqd60pzITvHYnMMAmw6GaVAP54e+1vRC4SOWTT1b8HhzgVTj3nYAzDE 8QM9VrqhI9/cLIzQZbMb29VNNT4PhI2+ghg2dfDNWvW/gD7lLMnUn2V7S6LFyGj2k5Vf wgUqvIhsVHtfHJvM4zsOFcRnWesglfqph00fQYU3aCdyBUzVLrMzYlUEuPkGZ5wc31Vb QqyQ== X-Gm-Message-State: ACrzQf0c2k3bPfkQdNAelztUh/cJSUlQc0bugLUFNOhkhWxrwtCz9x/H SVjrNsEaM/U22/x/Ix3Tx3Q= X-Google-Smtp-Source: AMsMyM5V2AUbwC+A+kA+F0EbjGWUOHq5622wQRFWFgaeIPP22fPizocpRdqCp0xJv97gVKZ073kb+A== X-Received: by 2002:a17:902:c40f:b0:17f:6737:9527 with SMTP id k15-20020a170902c40f00b0017f67379527mr21820578plk.19.1665454941170; Mon, 10 Oct 2022 19:22:21 -0700 (PDT) Received: from localhost.localdomain ([193.203.214.57]) by smtp.gmail.com with ESMTPSA id n6-20020a17090a2bc600b0020a8e908dc8sm9363286pje.4.2022.10.10.19.22.18 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Oct 2022 19:22:20 -0700 (PDT) From: xu.xin.sc@gmail.com X-Google-Original-From: xu.xin16@zte.com.cn To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, xu xin , David Hildenbrand , Claudio Imbrenda , Xuexin Jiang , Xiaokai Ran , Yang Yang Subject: [PATCH v3 2/5] ksm: support unsharing zero pages placed by KSM Date: Tue, 11 Oct 2022 02:22:15 +0000 Message-Id: <20221011022215.322269-1-xu.xin16@zte.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221011022006.322158-1-xu.xin16@zte.com.cn> References: <20221011022006.322158-1-xu.xin16@zte.com.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: xu xin use_zero_pages may be very useful, not just because of cache colouring as described in doc, but also because use_zero_pages can accelerate merging empty pages when there are plenty of empty pages (full of zeros) as the time of page-by-page comparisons (unstable_tree_search_insert) is saved. But when enabling use_zero_pages, madvise(addr, len, MADV_UNMERGEABLE) and other ways (like write 2 to /sys/kernel/mm/ksm/run) to trigger unsharing will *not* unshare the shared zeropage as placed by KSM (which may be against the MADV_UNMERGEABLE documentation at least). To not blindly unshare all shared zero_pages in applicable VMAs, the patch introduces a dedicated flag ZERO_PAGE_FLAG to mark the rmap_items of those shared zero_pages. and guarantee that these rmap_items will be not freed during the time of zero_pages not being writing, so we can only unshare the *KSM-placed* zero_pages. The patch will not degrade the performance of use_zero_pages as it doesn't change the way of merging empty pages in use_zero_pages's feature. Fixes: e86c59b1b12d ("mm/ksm: improve deduplication of zero pages with colo= uring") Reported-by: David Hildenbrand Cc: Claudio Imbrenda Cc: Xuexin Jiang Signed-off-by: xu xin Co-developed-by: Xiaokai Ran Signed-off-by: Xiaokai Ran Co-developed-by: Yang Yang Signed-off-by: Yang Yang Signed-off-by: xu xin --- mm/ksm.c | 136 ++++++++++++++++++++++++++++++++++++++++++------------- 1 file changed, 105 insertions(+), 31 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index 13c60f1071d8..e351d7b6d15e 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -213,6 +213,7 @@ struct ksm_rmap_item { #define SEQNR_MASK 0x0ff /* low bits of unstable tree seqnr */ #define UNSTABLE_FLAG 0x100 /* is a node of the unstable tree */ #define STABLE_FLAG 0x200 /* is listed from the stable tree */ +#define ZERO_PAGE_FLAG 0x400 /* is zero page placed by KSM */ =20 /* The stable and unstable tree heads */ static struct rb_root one_stable_tree[1] =3D { RB_ROOT }; @@ -381,14 +382,6 @@ static inline struct ksm_rmap_item *alloc_rmap_item(vo= id) return rmap_item; } =20 -static inline void free_rmap_item(struct ksm_rmap_item *rmap_item) -{ - ksm_rmap_items--; - rmap_item->mm->ksm_rmap_items--; - rmap_item->mm =3D NULL; /* debug safety */ - kmem_cache_free(rmap_item_cache, rmap_item); -} - static inline struct ksm_stable_node *alloc_stable_node(void) { /* @@ -420,7 +413,8 @@ static inline bool ksm_test_exit(struct mm_struct *mm) } =20 /* - * We use break_ksm to break COW on a ksm page: it's a stripped down + * We use break_ksm to break COW on a ksm page or KSM-placed zero page (on= ly + * happen when enabling use_zero_pages): it's a stripped down * * if (get_user_pages(addr, 1, FOLL_WRITE, &page, NULL) =3D=3D 1) * put_page(page); @@ -434,7 +428,8 @@ static inline bool ksm_test_exit(struct mm_struct *mm) * of the process that owns 'vma'. We also do not want to enforce * protection keys here anyway. */ -static int break_ksm(struct vm_area_struct *vma, unsigned long addr) +static int break_ksm(struct vm_area_struct *vma, unsigned long addr, + bool ksm_check_bypass) { struct page *page; vm_fault_t ret =3D 0; @@ -449,6 +444,16 @@ static int break_ksm(struct vm_area_struct *vma, unsig= ned long addr) ret =3D handle_mm_fault(vma, addr, FAULT_FLAG_WRITE | FAULT_FLAG_REMOTE, NULL); + else if (ksm_check_bypass && is_zero_pfn(page_to_pfn(page))) { + /* + * Although it's not ksm page, it's zero page as placed by + * KSM use_zero_page, so we should unshare it when + * ksm_check_bypass is true. + */ + ret =3D handle_mm_fault(vma, addr, + FAULT_FLAG_WRITE | FAULT_FLAG_REMOTE, + NULL); + } else ret =3D VM_FAULT_WRITE; put_page(page); @@ -496,6 +501,11 @@ static struct vm_area_struct *find_mergeable_vma(struc= t mm_struct *mm, return vma; } =20 +/* + * Note: Don't call break_cow() in the context protected by + * mmap_read_lock(), which may cause dead lock because inside + * break_cow mmap_read_lock exists. + */ static void break_cow(struct ksm_rmap_item *rmap_item) { struct mm_struct *mm =3D rmap_item->mm; @@ -511,10 +521,35 @@ static void break_cow(struct ksm_rmap_item *rmap_item) mmap_read_lock(mm); vma =3D find_mergeable_vma(mm, addr); if (vma) - break_ksm(vma, addr); + break_ksm(vma, addr, false); mmap_read_unlock(mm); } =20 +/* Only called when rmap_item->address is with ZERO_PAGE_FLAG */ +static inline int unshare_zero_pages(struct ksm_rmap_item *rmap_item) +{ + struct mm_struct *mm =3D rmap_item->mm; + struct vm_area_struct *vma; + unsigned long addr =3D rmap_item->address; + int err =3D -EFAULT; + + vma =3D vma_lookup(mm, addr); + if (vma) + err =3D break_ksm(vma, addr, true); + + return err; +} + +static inline void free_rmap_item(struct ksm_rmap_item *rmap_item) +{ + if (rmap_item->address & ZERO_PAGE_FLAG) + unshare_zero_pages(rmap_item); + ksm_rmap_items--; + rmap_item->mm->ksm_rmap_items--; + rmap_item->mm =3D NULL; /* debug safety */ + kmem_cache_free(rmap_item_cache, rmap_item); +} + static struct page *get_mergeable_page(struct ksm_rmap_item *rmap_item) { struct mm_struct *mm =3D rmap_item->mm; @@ -825,7 +860,7 @@ static int unmerge_ksm_pages(struct vm_area_struct *vma, if (signal_pending(current)) err =3D -ERESTARTSYS; else - err =3D break_ksm(vma, addr); + err =3D break_ksm(vma, addr, false); } return err; } @@ -2017,6 +2052,36 @@ static void stable_tree_append(struct ksm_rmap_item = *rmap_item, rmap_item->mm->ksm_merging_pages++; } =20 +static int try_to_merge_with_kernel_zero_page(struct mm_struct *mm, + struct ksm_rmap_item *rmap_item, + struct page *page) +{ + int err =3D 0; + + if (!(rmap_item->address & ZERO_PAGE_FLAG)) { + struct vm_area_struct *vma; + + mmap_read_lock(mm); + vma =3D find_mergeable_vma(mm, rmap_item->address); + if (vma) { + err =3D try_to_merge_one_page(vma, page, + ZERO_PAGE(rmap_item->address)); + } else { + /* If the vma is out of date, we do not need to continue. */ + err =3D 0; + } + mmap_read_unlock(mm); + /* + * In case of failure, the page was not really empty, so we + * need to continue. Otherwise we're done. + */ + if (!err) + rmap_item->address |=3D ZERO_PAGE_FLAG; + } + + return err; +} + /* * cmp_and_merge_page - first see if page can be merged into the stable tr= ee; * if not, compare checksum to previous and if it's the same, see if page = can @@ -2101,29 +2166,21 @@ static void cmp_and_merge_page(struct page *page, s= truct ksm_rmap_item *rmap_ite * Same checksum as an empty page. We attempt to merge it with the * appropriate zero page if the user enabled this via sysfs. */ - if (ksm_use_zero_pages && (checksum =3D=3D zero_checksum)) { - struct vm_area_struct *vma; - - mmap_read_lock(mm); - vma =3D find_mergeable_vma(mm, rmap_item->address); - if (vma) { - err =3D try_to_merge_one_page(vma, page, - ZERO_PAGE(rmap_item->address)); - } else { + if (ksm_use_zero_pages) { + if (checksum =3D=3D zero_checksum) { + /* If success, just return. Otherwise, continue */ + if (!try_to_merge_with_kernel_zero_page(mm, rmap_item, page)) + return; + } else if (rmap_item->address & ZERO_PAGE_FLAG) { /* - * If the vma is out of date, we do not need to - * continue. + * The page now is not kernel zero page (COW happens to it) + * but the flag of its rmap_item is still zero-page, so need + * to reset the flag and update the corresponding count. */ - err =3D 0; + rmap_item->address &=3D PAGE_MASK; } - mmap_read_unlock(mm); - /* - * In case of failure, the page was not really empty, so we - * need to continue. Otherwise we're done. - */ - if (!err) - return; } + tree_rmap_item =3D unstable_tree_search_insert(rmap_item, page, &tree_page); if (tree_rmap_item) { @@ -2337,6 +2394,23 @@ static struct ksm_rmap_item *scan_get_next_rmap_item= (struct page **page) mmap_read_unlock(mm); return rmap_item; } + /* + * Because we want to monitor ksm zero pages which is + * non-anonymous, we must try to return the rmap_items + * of those kernel zero pages which replaces its + * original anonymous empty page due to use_zero_pages's + * feature. + */ + if (is_zero_pfn(page_to_pfn(*page))) { + rmap_item =3D try_to_get_old_rmap_item(ksm_scan.address, + ksm_scan.rmap_list); + if (rmap_item && (rmap_item->address & ZERO_PAGE_FLAG)) { + ksm_scan.rmap_list =3D &rmap_item->rmap_list; + ksm_scan.address +=3D PAGE_SIZE; + mmap_read_unlock(mm); + return rmap_item; + } + } next_page: put_page(*page); ksm_scan.address +=3D PAGE_SIZE; --=20 2.25.1 From nobody Tue Apr 7 03:34:20 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 2BDA0C433F5 for ; Tue, 11 Oct 2022 02:22:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229778AbiJKCWm (ORCPT ); Mon, 10 Oct 2022 22:22:42 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49592 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229773AbiJKCWj (ORCPT ); Mon, 10 Oct 2022 22:22:39 -0400 Received: from mail-pg1-x541.google.com (mail-pg1-x541.google.com [IPv6:2607:f8b0:4864:20::541]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id E643182745 for ; Mon, 10 Oct 2022 19:22:36 -0700 (PDT) Received: by mail-pg1-x541.google.com with SMTP id l6so2149694pgu.7 for ; Mon, 10 Oct 2022 19:22:36 -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:subject:date :message-id:reply-to; bh=jBGBO38UtGSWwXVp7Ms/n5NhA5Pd+Mi6T8z7EXrrTqE=; b=NQwP6y9bldduXueh4GTe05alGLYH2cXxs6iR6vqImjtYM+ijwRDNkiUFqRfINXVKnc lPNsjMlrdYCD/aQbcS+3J5F6ov+nKAIyIz8fHQnOMnJMVayFdHpk+dUzr0/ShM/aQ4zQ PIYCeXOqyA6j/JdcmzrfsfvNdk95wsVOFdb0rARM1VmPokMffWAPbzgNsgUTBRSW3iQI TGQJmqYdZd5YOSMSmSsSCgLgXogoXIY0JmT/e/olVLdSk5Suu0uIkOGokMlh+UnvnvLC WjzAbxhTg04rIwWiOQcOLB4kfxGpAL7tYhAK4fjuIiOODSi2rgBDazceiLPQFN5OD7rP VPSA== 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 :subject:date:message-id:reply-to; bh=jBGBO38UtGSWwXVp7Ms/n5NhA5Pd+Mi6T8z7EXrrTqE=; b=Ez4+yOyKiP4Z33QtLYZ/VBi04vzWhMdWnJoCTFvC/w9vnYv9jAQuZi1FyEma0d1z3T KOw+HRtHwapIqN5mBQjBY1NVTkXydFFIfXrMm4jXCpaSoK/I3LSHqEDXk2jzYsUSWvx+ R9wF40do5/wBAFdiYmoWol6c7B4cw46LB0lOXlKFvX1oepKzEBOBs7ekcaw90nJ7anCP f61ATc+hnvG46eXumtePk/8HESBFnq0ksUOAE+FDg/D4yia3PxFVPwbX/hLMCZVxWZZc 32WgN1xP8Jb7YNF/8DeRNBBnaNvCZg222f4ZZn632HyHz5wRwgtvjy06TBB7Xo7UYJxq fjCQ== X-Gm-Message-State: ACrzQf2YWeY4a5vdM1/ixhYYhvF/Q88FUXun47JA2JMVfZCecCQkYguY taeXlv2k+fowrJ3CqMhWPo0RJacA0n4= X-Google-Smtp-Source: AMsMyM4HJO1bRVw+FEpT/jpF8AW/W1KC5CylFOLFTiM7r3HksmwbDm+KaSDXGiVpS8apzQDl8EckZQ== X-Received: by 2002:a05:6a00:2291:b0:563:9d0d:62ae with SMTP id f17-20020a056a00229100b005639d0d62aemr3557524pfe.17.1665454956397; Mon, 10 Oct 2022 19:22:36 -0700 (PDT) Received: from localhost.localdomain ([193.203.214.57]) by smtp.gmail.com with ESMTPSA id m15-20020a17090a158f00b0020d6fc00072sm69660pja.9.2022.10.10.19.22.34 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Oct 2022 19:22:35 -0700 (PDT) From: xu.xin.sc@gmail.com X-Google-Original-From: xu.xin16@zte.com.cn To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, xu xin , Claudio Imbrenda , David Hildenbrand , Xuexin Jiang , Xiaokai Ran , Yang Yang Subject: [PATCH v3 3/5] ksm: count all zero pages placed by KSM Date: Tue, 11 Oct 2022 02:22:30 +0000 Message-Id: <20221011022230.322323-1-xu.xin16@zte.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221011022006.322158-1-xu.xin16@zte.com.cn> References: <20221011022006.322158-1-xu.xin16@zte.com.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: xu xin As pages_sharing and pages_shared don't include the number of zero pages merged by KSM, we cannot know how many pages are zero pages placed by KSM when enabling use_zero_pages, which leads to KSM not being transparent with all actual merged pages by KSM. In the early days of use_zero_pages, zero-pages was unable to get unshared by the ways like MADV_UNMERGEABLE so it's hard to count how many times one of those zeropages was then unmerged. But now, unsharing KSM-placed zero page accurately has been achieved, so we can easily count both how many times a page full of zeroes was merged with zero-page and how many times one of those pages was then unmerged. and so, it helps to estimate memory demands when each and every shared page could get unshared. So we add zero_pages_sharing under /sys/kernel/mm/ksm/ to show the number of all zero pages placed by KSM. Cc: Claudio Imbrenda Cc: David Hildenbrand Cc: Xuexin Jiang Cc: Xiaokai Ran Cc: Yang Yang Signed-off-by: xu xin --- mm/ksm.c | 22 +++++++++++++++++++--- 1 file changed, 19 insertions(+), 3 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index e351d7b6d15e..2970a7062db6 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -275,6 +275,9 @@ static unsigned int zero_checksum __read_mostly; /* Whether to merge empty (zeroed) pages with actual zero pages */ static bool ksm_use_zero_pages __read_mostly; =20 +/* The number of zero pages placed by KSM use_zero_pages */ +static unsigned long ksm_zero_pages_sharing; + #ifdef CONFIG_NUMA /* Zeroed when merging across nodes is not allowed */ static unsigned int ksm_merge_across_nodes =3D 1; @@ -542,8 +545,10 @@ static inline int unshare_zero_pages(struct ksm_rmap_i= tem *rmap_item) =20 static inline void free_rmap_item(struct ksm_rmap_item *rmap_item) { - if (rmap_item->address & ZERO_PAGE_FLAG) - unshare_zero_pages(rmap_item); + if (rmap_item->address & ZERO_PAGE_FLAG) { + if (!unshare_zero_pages(rmap_item)) + ksm_zero_pages_sharing--; + } ksm_rmap_items--; rmap_item->mm->ksm_rmap_items--; rmap_item->mm =3D NULL; /* debug safety */ @@ -2075,8 +2080,10 @@ static int try_to_merge_with_kernel_zero_page(struct= mm_struct *mm, * In case of failure, the page was not really empty, so we * need to continue. Otherwise we're done. */ - if (!err) + if (!err) { rmap_item->address |=3D ZERO_PAGE_FLAG; + ksm_zero_pages_sharing++; + } } =20 return err; @@ -2178,6 +2185,7 @@ static void cmp_and_merge_page(struct page *page, str= uct ksm_rmap_item *rmap_ite * to reset the flag and update the corresponding count. */ rmap_item->address &=3D PAGE_MASK; + ksm_zero_pages_sharing--; } } =20 @@ -3190,6 +3198,13 @@ static ssize_t pages_volatile_show(struct kobject *k= obj, } KSM_ATTR_RO(pages_volatile); =20 +static ssize_t zero_pages_sharing_show(struct kobject *kobj, + struct kobj_attribute *attr, char *buf) +{ + return sysfs_emit(buf, "%ld\n", ksm_zero_pages_sharing); +} +KSM_ATTR_RO(zero_pages_sharing); + static ssize_t stable_node_dups_show(struct kobject *kobj, struct kobj_attribute *attr, char *buf) { @@ -3250,6 +3265,7 @@ static struct attribute *ksm_attrs[] =3D { &merge_across_nodes_attr.attr, #endif &max_page_sharing_attr.attr, + &zero_pages_sharing_attr.attr, &stable_node_chains_attr.attr, &stable_node_dups_attr.attr, &stable_node_chains_prune_millisecs_attr.attr, --=20 2.25.1 From nobody Tue Apr 7 03:34:20 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 24094C433FE for ; Tue, 11 Oct 2022 02:23:06 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229542AbiJKCXD (ORCPT ); Mon, 10 Oct 2022 22:23:03 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:50448 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229779AbiJKCW6 (ORCPT ); Mon, 10 Oct 2022 22:22:58 -0400 Received: from mail-pj1-x1041.google.com (mail-pj1-x1041.google.com [IPv6:2607:f8b0:4864:20::1041]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id C9534857D8 for ; Mon, 10 Oct 2022 19:22:53 -0700 (PDT) Received: by mail-pj1-x1041.google.com with SMTP id x1-20020a17090ab00100b001fda21bbc90so14647717pjq.3 for ; Mon, 10 Oct 2022 19:22:53 -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:subject:date :message-id:reply-to; bh=0i90jsiDje3OippwaWc7d+5Gj/jeYy2WnHfwavKx1Zc=; b=MbQSbPtXvqYlFl1N+H0dMvFlCM2YQF26s9pH/nam6VIgQ2wFgvKeUspQIecinHRbUs Hj9fALXGL82tlCQZCVhYowBU8NZsqc7tDHR7jptur05LWdJ9IRwsjK4tPmvC9LlYRxNr K87nnfFq8DMfBcx9NkiACVW1/uAcUwQ6zoOmr5pPYeNkV9XHunRzCPT+Tktu/drkcLt6 XD6UV/aXHyM686jv87C2eBwtIvvZHSepGPXufc4227d2Em3NzYVP+7cJX59xpguD/Hpn ZgUtsxjWQ8qqRzFCHaF6RYD3lqNp64V+Kg38o3fnJ1bYiKBjdfaagRf8YzMw9q09zHVm 6pPA== 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 :subject:date:message-id:reply-to; bh=0i90jsiDje3OippwaWc7d+5Gj/jeYy2WnHfwavKx1Zc=; b=xt8B0tsvyeL5HqdT68Rv0r6cGljeRsnvJUdaokE53/111LGRccmuv7MmGXnZTuoXOo fcYYzd2Azqr/0Jr0HLdfQawC8D5O1qwwLAXE3CMUVakGnG8K1g/a/tRh5dApGVoOFyCg tFL68WvZLNCbqIA/MKjJff0PaWRBbYhtWAKRJg3kMd9Wi4SnfRi2/yDngBahxl1vvjVg kg0NqVsHYvLFd4v0IuwOsFf4pEi8w+RoBrptRhM0s9GQhL/cGR4dGY/z6Qoyfh1az5hk f3RN2a0EWGNmCKTxu76FoWsJNws4QNF3eE8v+eAP+GNJNJbvxLa7MvOJ0fkizcpeup3n rjYw== X-Gm-Message-State: ACrzQf1i1AoNLsa8Kk+lalsNtZdGBth+4mYPXWwza0rKa8R34QWGYPxA fMPqNun+DwZ67QOoQffXsr8= X-Google-Smtp-Source: AMsMyM4z5grjzv3Vvk1EW21MJh3qJtZLK69EMl0iS6JtR43bWHIz9+nVBnfZX/qCphFVvPIBr6OMSw== X-Received: by 2002:a17:902:dad1:b0:183:243c:d0d0 with SMTP id q17-20020a170902dad100b00183243cd0d0mr4632808plx.157.1665454972670; Mon, 10 Oct 2022 19:22:52 -0700 (PDT) Received: from localhost.localdomain ([193.203.214.57]) by smtp.gmail.com with ESMTPSA id e2-20020aa798c2000000b005631a40a00bsm4423241pfm.139.2022.10.10.19.22.50 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Oct 2022 19:22:52 -0700 (PDT) From: xu.xin.sc@gmail.com X-Google-Original-From: xu.xin16@zte.com.cn To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, xu xin , Claudio Imbrenda , David Hildenbrand , Xuexin Jiang , Xiaokai Ran , Yang Yang Subject: [PATCH v3 4/5] ksm: count zero pages for each process Date: Tue, 11 Oct 2022 02:22:46 +0000 Message-Id: <20221011022246.322377-1-xu.xin16@zte.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221011022006.322158-1-xu.xin16@zte.com.cn> References: <20221011022006.322158-1-xu.xin16@zte.com.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: xu xin As the number of ksm zero pages is not included in ksm_merging_pages per process when enabling use_zero_pages, it's unclear of how many actual pages are merged by KSM. To let users accurately estimate their memory demands when unsharing KSM zero-pages, it's necessary to show KSM zero- pages per process. since unsharing zero pages placed by KSM accurately is achieved, then tracking empty pages merging and unmerging is not a difficult thing any longer. Since we already have /proc//ksm_stat, just add the information of zero_pages_sharing in it. Cc: Claudio Imbrenda Cc: David Hildenbrand Cc: Xuexin Jiang Cc: Xiaokai Ran Cc: Yang Yang Signed-off-by: xu xin --- fs/proc/base.c | 1 + include/linux/mm_types.h | 7 ++++++- mm/ksm.c | 6 +++++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/fs/proc/base.c b/fs/proc/base.c index 9e479d7d202b..ac9ebe972be0 100644 --- a/fs/proc/base.c +++ b/fs/proc/base.c @@ -3207,6 +3207,7 @@ static int proc_pid_ksm_stat(struct seq_file *m, stru= ct pid_namespace *ns, mm =3D get_task_mm(task); if (mm) { seq_printf(m, "ksm_rmap_items %lu\n", mm->ksm_rmap_items); + seq_printf(m, "zero_pages_sharing %lu\n", mm->ksm_zero_pages_sharing); mmput(mm); } =20 diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h index 500e536796ca..78a4ee264645 100644 --- a/include/linux/mm_types.h +++ b/include/linux/mm_types.h @@ -691,7 +691,7 @@ struct mm_struct { #ifdef CONFIG_KSM /* * Represent how many pages of this process are involved in KSM - * merging. + * merging (not including ksm_zero_pages_sharing). */ unsigned long ksm_merging_pages; /* @@ -699,6 +699,11 @@ struct mm_struct { * including merged and not merged. */ unsigned long ksm_rmap_items; + /* + * Represent how many empty pages are merged with kernel zero + * pages when enabling KSM use_zero_pages. + */ + unsigned long ksm_zero_pages_sharing; #endif #ifdef CONFIG_LRU_GEN struct { diff --git a/mm/ksm.c b/mm/ksm.c index 2970a7062db6..c049a95afc26 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -546,8 +546,10 @@ static inline int unshare_zero_pages(struct ksm_rmap_i= tem *rmap_item) static inline void free_rmap_item(struct ksm_rmap_item *rmap_item) { if (rmap_item->address & ZERO_PAGE_FLAG) { - if (!unshare_zero_pages(rmap_item)) + if (!unshare_zero_pages(rmap_item)) { ksm_zero_pages_sharing--; + rmap_item->mm->ksm_zero_pages_sharing--; + } } ksm_rmap_items--; rmap_item->mm->ksm_rmap_items--; @@ -2083,6 +2085,7 @@ static int try_to_merge_with_kernel_zero_page(struct = mm_struct *mm, if (!err) { rmap_item->address |=3D ZERO_PAGE_FLAG; ksm_zero_pages_sharing++; + rmap_item->mm->ksm_zero_pages_sharing++; } } =20 @@ -2186,6 +2189,7 @@ static void cmp_and_merge_page(struct page *page, str= uct ksm_rmap_item *rmap_ite */ rmap_item->address &=3D PAGE_MASK; ksm_zero_pages_sharing--; + rmap_item->mm->ksm_zero_pages_sharing--; } } =20 --=20 2.25.1 From nobody Tue Apr 7 03:34:20 2026 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 vger.kernel.org (vger.kernel.org [23.128.96.18]) by smtp.lore.kernel.org (Postfix) with ESMTP id 1887AC433F5 for ; Tue, 11 Oct 2022 02:23:43 +0000 (UTC) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S229773AbiJKCXl (ORCPT ); Mon, 10 Oct 2022 22:23:41 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:51294 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S229477AbiJKCXj (ORCPT ); Mon, 10 Oct 2022 22:23:39 -0400 Received: from mail-pl1-x642.google.com (mail-pl1-x642.google.com [IPv6:2607:f8b0:4864:20::642]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id 804127DF54 for ; Mon, 10 Oct 2022 19:23:38 -0700 (PDT) Received: by mail-pl1-x642.google.com with SMTP id c24so11949269plo.3 for ; Mon, 10 Oct 2022 19:23:38 -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:subject:date :message-id:reply-to; bh=pA2L/FNaj7e7+kUZGmo87Y5GGtuU8PgqF9oHvyd5XJ0=; b=aOVAgCTFUk3B94yRy18snaZHgtEeSUJykJ0ot+Ljr1hdS5x9wwPdboGW7YMhvDAbRJ ZwvfxbttriYA3H2esaRMMKmVQ0oj9gP02KjMIUTv8viD6oOBtwmpwO/Zmz+LYVUu0dA9 +sF6lCBmK1N0DRiU09vUW/bOP4i8SB9FupMR+m1BQzVXU8kxf29K79Wl1HZWJHmgeKZx oDZWo8snoo2zIPjyDZX96GeLSt4KLsiT/ffMlszxDQI61qJ/iHY8p1guKTIdUMpXoBJa XDqHWaFPlvXmZ2BxY/Iq+yDHZPbPWeLWzwuIc5DzGIUKzmMXwRSjZsNVwgxcB3f6B7Of YUFw== 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 :subject:date:message-id:reply-to; bh=pA2L/FNaj7e7+kUZGmo87Y5GGtuU8PgqF9oHvyd5XJ0=; b=UgrHte1rqe60IVVftMGDg0u+hrDCJVJo6l5bcBePjhuP8sijcwIdrhNBMJATATjjXr Z4qOJpqF799tT79eg6cGoJQuof0d7MifFBzw95YGwsqaYXiMQ6UYQ05oLFY/1qIcioSm nVkMn7tISEYqlbxY9U7lbVHmU5pudY9ToeE3rP93+dv7CaP56zcaHpHFJ0g3jg28pZfy xbxAC6eMcpPGCsuO/BAK+ocURH7X29kfxW6UXXJpojofCPZqGP9juAVpoOrXfSYulxhB sr7XVIHfRx9vuzPHNo+1PwnLpLxJyoTJqABQWfhWeI4GWX5uOYjwp4NidBDO8A5KDnfj s4zw== X-Gm-Message-State: ACrzQf1q0k1DF1mti39SLpBq6VU2YkbRVxkaq/qIWQq2qhB6X6kwVevD YOCz5WuXHNoRhTN8mmtw8pU= X-Google-Smtp-Source: AMsMyM6Fv/99kgTYy5VGB7ccfHNOf0+TN7/WFuO0wEJREVgxfoyTXj54YlueWcfwwlxOs9NAHq3MQQ== X-Received: by 2002:a17:90a:ac11:b0:20b:10d2:e837 with SMTP id o17-20020a17090aac1100b0020b10d2e837mr24508899pjq.165.1665455018060; Mon, 10 Oct 2022 19:23:38 -0700 (PDT) Received: from localhost.localdomain ([193.203.214.57]) by smtp.gmail.com with ESMTPSA id h2-20020a63f902000000b00438834b14a1sm6801151pgi.80.2022.10.10.19.23.35 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Mon, 10 Oct 2022 19:23:37 -0700 (PDT) From: xu.xin.sc@gmail.com X-Google-Original-From: xu.xin16@zte.com.cn To: akpm@linux-foundation.org Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, xu xin , Xiaokai Ran , Yang Yang , Jiang Xuexin , Claudio Imbrenda , David Hildenbrand Subject: [PATCH v3 5/5] ksm: add zero_pages_sharing documentation Date: Tue, 11 Oct 2022 02:23:32 +0000 Message-Id: <20221011022332.322435-1-xu.xin16@zte.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20221011022006.322158-1-xu.xin16@zte.com.cn> References: <20221011022006.322158-1-xu.xin16@zte.com.cn> MIME-Version: 1.0 Content-Transfer-Encoding: quoted-printable Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Type: text/plain; charset="utf-8" From: xu xin When enabling use_zero_pages, pages_sharing cannot represent how much memory saved indeed. zero_pages_sharing + pages_sharing does. add the description of zero_pages_sharing. Cc: Xiaokai Ran Cc: Yang Yang Cc: Jiang Xuexin Cc: Claudio Imbrenda Cc: David Hildenbrand Signed-off-by: xu xin --- Documentation/admin-guide/mm/ksm.rst | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/Documentation/admin-guide/mm/ksm.rst b/Documentation/admin-gui= de/mm/ksm.rst index fb6ba2002a4b..484665aa7418 100644 --- a/Documentation/admin-guide/mm/ksm.rst +++ b/Documentation/admin-guide/mm/ksm.rst @@ -162,7 +162,7 @@ The effectiveness of KSM and MADV_MERGEABLE is shown in= ``/sys/kernel/mm/ksm/``: pages_shared how many shared pages are being used pages_sharing - how many more sites are sharing them i.e. how much saved + how many more sites are sharing them pages_unshared how many pages unique but repeatedly checked for merging pages_volatile @@ -173,6 +173,14 @@ stable_node_chains the number of KSM pages that hit the ``max_page_sharing`` limit stable_node_dups number of duplicated KSM pages +zero_pages_sharing + how many empty pages are sharing kernel zero page(s) instead of + with each other as it would happen normally. Only effective when + enabling ``use_zero_pages`` knob. + +If ``use_zero_pages`` is 0, only ``pages_sharing`` can represents how +much saved. Otherwise, ``pages_sharing`` + ``zero_pages_sharing`` +represents how much saved actually. =20 A high ratio of ``pages_sharing`` to ``pages_shared`` indicates good sharing, but a high ratio of ``pages_unshared`` to ``pages_sharing`` --=20 2.25.1