From mboxrd@z Thu Jan 1 00:00:00 1970 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 5A036C7EE23 for ; Tue, 23 May 2023 09:48:06 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id 9C2FF900003; Tue, 23 May 2023 05:48:05 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id 973F7900002; Tue, 23 May 2023 05:48:05 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id 81450900003; Tue, 23 May 2023 05:48:05 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0013.hostedemail.com [216.40.44.13]) by kanga.kvack.org (Postfix) with ESMTP id 737CE900002 for ; Tue, 23 May 2023 05:48:05 -0400 (EDT) Received: from smtpin06.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay04.hostedemail.com (Postfix) with ESMTP id 422381A06C3 for ; Tue, 23 May 2023 09:48:05 +0000 (UTC) X-FDA: 80821043730.06.44C37F1 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by imf28.hostedemail.com (Postfix) with ESMTP id 16EF5C0010 for ; Tue, 23 May 2023 09:48:02 +0000 (UTC) Authentication-Results: imf28.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=ZABCqJ3k; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf28.hostedemail.com: domain of david@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1684835283; 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-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references:dkim-signature; bh=wTozs52NGQBBt66G2VZ78itBAYBuBwd2qy/f5JHxcgg=; b=RzkOIEnh8wTXOloPJqtJgh4pfBGznXo746FiKM6G64XMhlqz+UG1w8pIzIVGpnSVk6hwc2 SZkF1aAjWP3R9cWGn/FRhBTSzPFntZj7rOaWcKZvZsigVymqa4ZrL5enaAQODRoAuHhCb5 ZNYdJIFoG8pccHJ7CUDrlVVL0ExqTk0= ARC-Authentication-Results: i=1; imf28.hostedemail.com; dkim=pass header.d=redhat.com header.s=mimecast20190719 header.b=ZABCqJ3k; dmarc=pass (policy=none) header.from=redhat.com; spf=pass (imf28.hostedemail.com: domain of david@redhat.com designates 170.10.133.124 as permitted sender) smtp.mailfrom=david@redhat.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1684835283; a=rsa-sha256; cv=none; b=tIkg1zfSIl9WA8o8t8KWdgy2fVkKlWx5Dzy9rb7PSz6p6566K5M1eXjpFp77UPAu92PTsj /nLcLgFTwT5eAbCWnuTycLC0h/jQVzJhfS6IdEgJSqEvb2w76MiJAQnBcuswd2ZA4MU93X YUgMX5Hr+E2IRLDjZIfIVD/ne/4FUm4= DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1684835282; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=wTozs52NGQBBt66G2VZ78itBAYBuBwd2qy/f5JHxcgg=; b=ZABCqJ3kmwmXSVlz1xqstCZYpX7vXyozyZNu4i+h6ScvwLcyLDpWOMSiufBpolhzzLl9RS j73uFESqGl+HEAwAxwxi99WShqSdQVz3IHpx47OeM2QpwlX771eI7tK0xnmWB1VtdoPPSA 5u+sqEt387LlcFTuQ90VSKsKXG5/eJ0= Received: from mail-wr1-f72.google.com (mail-wr1-f72.google.com [209.85.221.72]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.3, cipher=TLS_AES_256_GCM_SHA384) id us-mta-400-TBVzxU_nPgqMny1fV5RaGg-1; Tue, 23 May 2023 05:47:58 -0400 X-MC-Unique: TBVzxU_nPgqMny1fV5RaGg-1 Received: by mail-wr1-f72.google.com with SMTP id ffacd0b85a97d-30793c16c78so4580215f8f.3 for ; Tue, 23 May 2023 02:47:58 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20221208; t=1684835277; x=1687427277; h=content-transfer-encoding:in-reply-to:organization:from:references :cc:to:content-language:subject:user-agent:mime-version:date :message-id:x-gm-message-state:from:to:cc:subject:date:message-id :reply-to; bh=wTozs52NGQBBt66G2VZ78itBAYBuBwd2qy/f5JHxcgg=; b=GU/qItIKlGjJ1P/fiAfSaVyb+rU3pYgreNfr7Fwb61nHAyAClAa7Zuth9unLBHw2Ld qNHISsGAoxA0/ODHhpYc76iza1k3PDMVCKxxOp85Fc76lcRnuiLzQRFAXc4rF1m1Y5so vZS7l2drxlDfMpBcempNZpVePnWDuk8KuBf8pB4bCFpwKD1sERVBFnLXJZriJtAAnE+U y03DnbJC7W7iokjFCAJTkGFPL1+iZDRdqEkdqgSuRJg2UHWCY4Yu6r9ixEvKWqiRXAeF dGM3+eQRR0bgAIkcjbjjtUKG/0YPoknSKsSYNB/x0aoPQrswWNIH6BN06ArAt3cW2w9A eXww== X-Gm-Message-State: AC+VfDy2C3u3b5WBp1DhaeRUzaQHxtveXTXMxKmd1zD9aCGg4pt4IfFd bfobJmFIm03/VgAtAwmYa9VWFwSpcE2FmpR66CHg/0CG7RjFmMq31TpOZn265tJuFbgD81axibm xbKSzYm8haGk= X-Received: by 2002:adf:fd07:0:b0:309:3b27:9baa with SMTP id e7-20020adffd07000000b003093b279baamr9962695wrr.52.1684835277605; Tue, 23 May 2023 02:47:57 -0700 (PDT) X-Google-Smtp-Source: ACHHUZ6Cg0L8GaoEx5zA4nxlysT18P5TkZ7gbabyWFIRjsDKmtvzHzyuCCKmuqWSgjFyU8zQbfpTuA== X-Received: by 2002:adf:fd07:0:b0:309:3b27:9baa with SMTP id e7-20020adffd07000000b003093b279baamr9962677wrr.52.1684835277243; Tue, 23 May 2023 02:47:57 -0700 (PDT) Received: from ?IPV6:2003:cb:c74c:b400:5c8b:a0b2:f57e:e1cd? (p200300cbc74cb4005c8ba0b2f57ee1cd.dip0.t-ipconnect.de. [2003:cb:c74c:b400:5c8b:a0b2:f57e:e1cd]) by smtp.gmail.com with ESMTPSA id d16-20020a5d5390000000b00301a351a8d6sm10588479wrv.84.2023.05.23.02.47.56 (version=TLS1_3 cipher=TLS_AES_128_GCM_SHA256 bits=128/128); Tue, 23 May 2023 02:47:56 -0700 (PDT) Message-ID: <401a535a-0393-fc7c-66b0-832c061283c7@redhat.com> Date: Tue, 23 May 2023 11:47:55 +0200 MIME-Version: 1.0 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:102.0) Gecko/20100101 Thunderbird/102.10.0 Subject: Re: [PATCH v8 2/6] ksm: count all zero pages placed by KSM To: Yang Yang , akpm@linux-foundation.org Cc: imbrenda@linux.ibm.com, jiang.xuexin@zte.com.cn, linux-kernel@vger.kernel.org, linux-mm@kvack.org, ran.xiaokai@zte.com.cn, xu.xin.sc@gmail.com, xu.xin16@zte.com.cn References: <202305221842587200002@zte.com.cn> <20230522105229.4066-1-yang.yang29@zte.com.cn> From: David Hildenbrand Organization: Red Hat In-Reply-To: <20230522105229.4066-1-yang.yang29@zte.com.cn> X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com Content-Language: en-US Content-Type: text/plain; charset=UTF-8; format=flowed Content-Transfer-Encoding: 7bit X-Rspamd-Queue-Id: 16EF5C0010 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: ksg8wnxro57rjqjg5euyebcedxdpwsdp X-HE-Tag: 1684835282-412336 X-HE-Meta: U2FsdGVkX18JVeBrUMn5XIzQJ6Iotlj1msJTnqI8kUvMPX8W05srrI0x+h3ORse258MVr5MlHzzRuosGo1RTd96KPrRJxzr69TSclYN6d8ynp8lQP1tEBeUYJ3UJLO6rfXpX+nxDlWlFZBpYyKmXaytzaff8yI3HTn9qMa4eIrlxv580a1TY2U/G3Nydvh0Lbll/2HJ+gzxJy10D3XuYeiuidY5ZYs3VniqgKRhF5+CeEgGR1ypbPg3+VkTd++RFKz+G9UxZ1eqTAcMZ12rppke7A3Te52JRA8RYGovAP12zp/w31UlOdnNL0ve+ag2ETDcE/ttOXMMDpd8izb8njw5xcfMEby3ktx5Pdi/2vC/Ogu2pt2xpd6631TQwa+2ZhMTKqnrzYYY9VXrlTxuZIo/f9zTPfGrfjiuQcaHt8ohdTX5IP9t8ZK+B+raJZccqLg4gciqj3+TwjBiTFp9z6zDkTIPtKYspaWsw5nmU+v9LsVrey2NPOVoe9E66wNVqcAkdDZIOEteB21XtuVZBWybOcZf07Nm3K8G14xMQUQcbvU33xFKH9Kep1RmTnQyFNNNakAcHOd5Ds72H0fdhtgSsnU9/ynpyIwnZTweaTkOcAzAhyeNB0fF1/hRXMDX5ugb+ULHakUB0i+fQBbLKpVRMYkVqQKQNsrUYDF2HLInGWgfPrmcv72A9Xm/i3cUz91eZhNF+pewkX52vzJqlwQJdgxuiE5+dBA4ZPRyt0/vwyPBJJHNBgmHih8ojOYPP7iA8J3idUn90/9Wvb+C9dm9+H2qM6hLLfGomAh7gVisx7A0UvKgMc9tY0gW3jIKYmE02+j8qzGo9zbMFLzd9M5iUwUZui4f1bJ8nTq+AoO18YbSXv8Q7axEipVp8v4tk3el6H8Tk6tNDyrz34iczOyHbayqZHKHUkHVluz9h3Agn6j7CeDfrQhsvYWLw0m1QXheLRwwwF3RLknL8PUq rSQGqFfE aogs6OkDYg33sVfiTGVPbl1jlQCkaQCE2sAV7cjsPNC7kRMvtDluXBiNRiB+7OB+XujvXl6e3nllDCbMaPtVEc0Hsd2tq4R5MBs+lGuEAnvrzl3/VNrkIyLURjXOEfEpgXFibY+U99NXllWp61CPINjgjCu0/sbygFJI6ZonurPeBIoCXu6IBFfq/XWTelfVCfyfIUW6ICXHlRsCARF7YqWjpri6ya56qlbXH/kpZNQlFuOqKsXm9gJ+TTWpK09fH4NwfrA04bS+ZrEta/dRyP2RD9j3xByu2biBnamc4ld7t4aswQ0dRTp7ZfVNIi9qbeQUW/pDkZLk1gGQy02ulkwuN+hqFyf0DrhniSVZhMSeldJaqbuBFW7OUKjT90BF423CBmcoHjyPrt3tasw2+c4eY8KAcFPQO1GWZakO3bTM3XUiOQ/9iWAjchl2cKd/bx6hU62kBiHsmtalb8xm4l9t8adNtORTy4HbbMqk2z2RDdmhiGYLMTFnDu30ntpDv6o6yaG1xV3QxOmaTpAFECR6CgtV5OmP3mC3ZI1zYtPz627U1RXj4F1vtqA== 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: On 22.05.23 12:52, Yang Yang wrote: > 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 ksm_zero_pages under /sys/kernel/mm/ksm/ to show the number > of all zero pages placed by KSM. > > v7->v8: > Handle the case when khugepaged replaces a shared zeropage by a THP. > > Signed-off-by: xu xin > Suggested-by: David Hildenbrand > Cc: Claudio Imbrenda > Cc: Xuexin Jiang > Reviewed-by: Xiaokai Ran > Reviewed-by: Yang Yang > --- > include/linux/ksm.h | 17 +++++++++++++++++ > mm/khugepaged.c | 3 +++ > mm/ksm.c | 12 ++++++++++++ > mm/memory.c | 7 ++++++- > 4 files changed, 38 insertions(+), 1 deletion(-) > > diff --git a/include/linux/ksm.h b/include/linux/ksm.h > index 7989200cdbb7..1adcae0205e3 100644 > --- a/include/linux/ksm.h > +++ b/include/linux/ksm.h > @@ -29,6 +29,16 @@ void __ksm_exit(struct mm_struct *mm); > /* use pte_mkdirty to track a KSM-placed zero page */ > #define set_pte_ksm_zero(pte) pte_mkdirty(pte_mkspecial(pte)) > #define is_ksm_zero_pte(pte) (is_zero_pfn(pte_pfn(pte)) && pte_dirty(pte)) > +extern unsigned long ksm_zero_pages; > +static inline void inc_ksm_zero_pages(void) > +{ > + ksm_zero_pages++; > +} > + No need to export the inc, just inline this. > +static inline void dec_ksm_zero_pages(void) > +{ > + ksm_zero_pages--; > +} > > static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm) > { > @@ -100,6 +110,13 @@ static inline void ksm_exit(struct mm_struct *mm) > > #define set_pte_ksm_zero(pte) pte_mkspecial(pte) > #define is_ksm_zero_pte(pte) 0 > +static inline void inc_ksm_zero_pages(void) > +{ > +} > + > +static inline void dec_ksm_zero_pages(void) > +{ > +} > > #ifdef CONFIG_MEMORY_FAILURE > static inline void collect_procs_ksm(struct page *page, > diff --git a/mm/khugepaged.c b/mm/khugepaged.c > index 6b9d39d65b73..ba0d077b6951 100644 > --- a/mm/khugepaged.c > +++ b/mm/khugepaged.c > @@ -19,6 +19,7 @@ > #include > #include > #include > +#include > > #include > #include > @@ -711,6 +712,8 @@ static void __collapse_huge_page_copy_succeeded(pte_t *pte, > spin_lock(ptl); > ptep_clear(vma->vm_mm, address, _pte); > spin_unlock(ptl); > + if (is_ksm_zero_pte(pteval)) > + dec_ksm_zero_pages(); > } > } else { > src_page = pte_page(pteval); > diff --git a/mm/ksm.c b/mm/ksm.c > index 9962f5962afd..2ca7e8860faa 100644 > --- a/mm/ksm.c > +++ b/mm/ksm.c > @@ -278,6 +278,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; > > +/* The number of zero pages which is placed by KSM */ > +unsigned long ksm_zero_pages; > + > #ifdef CONFIG_NUMA > /* Zeroed when merging across nodes is not allowed */ > static unsigned int ksm_merge_across_nodes = 1; > @@ -1223,6 +1226,7 @@ static int replace_page(struct vm_area_struct *vma, struct page *page, > } else { > newpte = set_pte_ksm_zero(pfn_pte(page_to_pfn(kpage), > vma->vm_page_prot)); > + inc_ksm_zero_pages(); > /* > * We're replacing an anonymous page with a zero page, which is > * not anonymous. We need to do proper accounting otherwise we > @@ -3350,6 +3354,13 @@ static ssize_t pages_volatile_show(struct kobject *kobj, > } > KSM_ATTR_RO(pages_volatile); > > +static ssize_t ksm_zero_pages_show(struct kobject *kobj, > + struct kobj_attribute *attr, char *buf) > +{ > + return sysfs_emit(buf, "%ld\n", ksm_zero_pages); > +} > +KSM_ATTR_RO(ksm_zero_pages); > + > static ssize_t general_profit_show(struct kobject *kobj, > struct kobj_attribute *attr, char *buf) > { > @@ -3417,6 +3428,7 @@ static struct attribute *ksm_attrs[] = { > &pages_sharing_attr.attr, > &pages_unshared_attr.attr, > &pages_volatile_attr.attr, > + &ksm_zero_pages_attr.attr, > &full_scans_attr.attr, > #ifdef CONFIG_NUMA > &merge_across_nodes_attr.attr, > diff --git a/mm/memory.c b/mm/memory.c > index 8358f3b853f2..058b416adf24 100644 > --- a/mm/memory.c > +++ b/mm/memory.c > @@ -1415,8 +1415,11 @@ static unsigned long zap_pte_range(struct mmu_gather *tlb, > tlb_remove_tlb_entry(tlb, pte, addr); > zap_install_uffd_wp_if_needed(vma, addr, pte, details, > ptent); > - if (unlikely(!page)) > + if (unlikely(!page)) { > + if (is_ksm_zero_pte(ptent)) > + dec_ksm_zero_pages(); > continue; > + } > > delay_rmap = 0; > if (!PageAnon(page)) { > @@ -3120,6 +3123,8 @@ static vm_fault_t wp_page_copy(struct vm_fault *vmf) > inc_mm_counter(mm, MM_ANONPAGES); > } > } else { > + if (is_ksm_zero_pte(vmf->orig_pte)) > + dec_ksm_zero_pages(); > inc_mm_counter(mm, MM_ANONPAGES); > } > flush_cache_page(vma, vmf->address, pte_pfn(vmf->orig_pte)); Can we maybe avoid exporting the dec semantics and rather add a callback to KSM? Ideally, we'd even distill that down to a single call, and handle the details in ksm.h. Maybe simply: ksm_notify_unmap_zero_page(vmf->orig_pte); and then just have in ksm.h static inline void ksm_notify_unmap_zero_page(pte_t pte) { if (is_ksm_zero_pte(pte)) ksm_zero_pages--; } -- Thanks, David / dhildenb