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 948BAC25B10 for ; Mon, 13 May 2024 06:00:40 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id CC7746B00E1; Mon, 13 May 2024 02:00:39 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id C4F896B00EF; Mon, 13 May 2024 02:00:39 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id AC9EA6B026D; Mon, 13 May 2024 02:00:39 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0014.hostedemail.com [216.40.44.14]) by kanga.kvack.org (Postfix) with ESMTP id 8EF7A6B00E1 for ; Mon, 13 May 2024 02:00:39 -0400 (EDT) Received: from smtpin05.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay05.hostedemail.com (Postfix) with ESMTP id 1492340CCE for ; Mon, 13 May 2024 06:00:39 +0000 (UTC) X-FDA: 82112323398.05.AD9C5FA Received: from mail-pf1-f195.google.com (mail-pf1-f195.google.com [209.85.210.195]) by imf12.hostedemail.com (Postfix) with ESMTP id 7BFCC40026 for ; Mon, 13 May 2024 06:00:35 +0000 (UTC) Authentication-Results: imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Gq8wt1DR; spf=pass (imf12.hostedemail.com: domain of xu.xin.sc@gmail.com designates 209.85.210.195 as permitted sender) smtp.mailfrom=xu.xin.sc@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1715580035; 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=A+UWE13EKJKc2jsx12DqNcqiTCBkf/xDYNgDW2I4NGM=; b=BWhk3LjB87jswl1kv3JkFY8Li+UISV+59VQtekAUdoOGW4i7KCOxIV33mgri9PnkJ5jrUR 4exQMvMctNdnCUn3gmOQRDH/XmS0pInZSZ0xnXjsTL+6phAVWuy5eUMmEWHtJxZ/BZo+bW 9xbydT09IF5uEk2wmqDaUbn4cih4bEs= ARC-Authentication-Results: i=1; imf12.hostedemail.com; dkim=pass header.d=gmail.com header.s=20230601 header.b=Gq8wt1DR; spf=pass (imf12.hostedemail.com: domain of xu.xin.sc@gmail.com designates 209.85.210.195 as permitted sender) smtp.mailfrom=xu.xin.sc@gmail.com; dmarc=pass (policy=none) header.from=gmail.com ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1715580035; a=rsa-sha256; cv=none; b=nRHvu3HlwAIDHTWnwJTA+Y/3iLrlsYGl2N+EpDXcaAIwNIuRBze1kHaD1GyMAetHiEOghd JUuCc7yCghx/ZOG12UJgUHHTLa0RPNeA/O97bVC0H2M2fIFp7EfhB1jlAWnmskK+iM9fuV iTu8nfm3MPc+BZR0ciEomPOEzya8324= Received: by mail-pf1-f195.google.com with SMTP id d2e1a72fcca58-6f45f1179c3so3691045b3a.3 for ; Sun, 12 May 2024 23:00:35 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20230601; t=1715580034; x=1716184834; darn=kvack.org; 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=A+UWE13EKJKc2jsx12DqNcqiTCBkf/xDYNgDW2I4NGM=; b=Gq8wt1DRWzQ+B+lAB1VYiePxazPPSnnw9BL7ZpelaaUIiGl9AS+JFyKlvSDyqYZpaB vBGqjXzBtjHa+h75X0YWi57PMON6JEnzUBh1M7OjpzkmbJI1G8LAmjeTXVTA4blDktL8 ZuAXR5157elRG5m/1JSp8mXVj+H/qg9rU1unEB/yU4Hri7BdzEtouMCKayWdAVCgUHwM b/0q++fNZ98qcDUwDfUwWW4ZpxtX2Ha9jo1NHmaYsDlP6ucT93gyZAkpKVvgM7oJ9xy7 UAyZZy3S5cs4DMp+Tatz8bD4dytLEbj545k+vkPb2tBUEax1Yo+AkWt6NW816BOFWG2u sAMw== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20230601; t=1715580034; x=1716184834; 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=A+UWE13EKJKc2jsx12DqNcqiTCBkf/xDYNgDW2I4NGM=; b=aLRM4B/BAUccWus2gZRPSoUEzJ+nKdspUaCAUAa4FFPxmxGOvEekJEgRhzoVOWyRUg rbLnYku4Dp5DeIuHwBcqUX3Z5cM3ruEWKbsdKWbXW0sGqo7fzRx8NLCefsvdobzxi75s xccVDqgHkmHd+FWPxL6jGRwvvTcsD18hSPdl6u80OqMdbU96gHdB6di9qVd4oHl7yikL AUSSR8DkrAJ7V2yZaLeXL3uWt8WzkSDk5GjC3zcc8M4HmZRZErrpr+QX/VUorislsYI0 Idfm2mD0Sw2syj4+/TB8sK/IyrbUMl24hLnKE6nTWXhM6plD2BsF7tYX2OO0u8S9tgts woUg== X-Forwarded-Encrypted: i=1; AJvYcCWCPLzaxgJqkeAeRTLIRRYZakwaQzbL++R88Qjwl6Bg+2WA/Ux9rgIiWV55CrkfhYvIANmEowSFquDZbMiEFL1U6ic= X-Gm-Message-State: AOJu0Yz7c2iSV+w/Q5YLoOhGN/e4qeOA/DMZbteq7Mnf8R8lCq9fcNOr gKuK4m/NswxRJMAbjMvLbx+pNu0ejsEZ9bZcOeqlsnok+3sfIRWf X-Google-Smtp-Source: AGHT+IFgXfG6zZft0seFQcj/0hGAntlM5b4QIRh98rM7ciwNpamlMxzfQnNQCIrlaVzeReaaX3tY9A== X-Received: by 2002:a05:6a20:12d4:b0:1a5:6a85:8ce9 with SMTP id adf61e73a8af0-1afde0a8da9mr9520068637.12.1715580034317; Sun, 12 May 2024 23:00:34 -0700 (PDT) Received: from localhost.localdomain ([193.203.214.57]) by smtp.gmail.com with ESMTPSA id 98e67ed59e1d1-2b67105649fsm7106812a91.6.2024.05.12.23.00.32 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Sun, 12 May 2024 23:00:33 -0700 (PDT) From: xu xin X-Google-Original-From: xu xin To: chengming.zhou@linux.dev Cc: aarcange@redhat.com, akpm@linux-foundation.org, david@redhat.com, hughd@google.com, linux-kernel@vger.kernel.org, linux-mm@kvack.org, shr@devkernel.io, xu.xin16@zte.com.cn, zhouchengming@bytedance.com, si.hao@zte.com.cn Subject: Re: [PATCH v2 2/2] mm/ksm: fix ksm_zero_pages accounting Date: Mon, 13 May 2024 06:00:29 +0000 Message-Id: <20240513060029.651050-1-xu.xin16@zte.com.cn> X-Mailer: git-send-email 2.25.1 In-Reply-To: <20240513-b4-ksm-counters-v2-2-f2520183a8ca@linux.dev> References: <20240513-b4-ksm-counters-v2-2-f2520183a8ca@linux.dev> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Rspamd-Server: rspam05 X-Rspamd-Queue-Id: 7BFCC40026 X-Stat-Signature: ppys8jha7ie3953sxtej1tyfkn38p5nt X-Rspam-User: X-HE-Tag: 1715580035-910470 X-HE-Meta: U2FsdGVkX1+fWJfA3vdStm57QyFQZ+ctPU8Hr306jLro4MfwQkeaPpuTFf8OHOiLVkkG4WKaH/tx7S0WpEm0B8B5ury9jfA7KdL4CCce7qj/RDDLRDoOtQ8zfo1pxGBVkqWnr7JQWdUqnhCHAikKoGjrsClRf+W/X0zMZyTryanmnSGCpRX9aVYL157JtXjOrcPcaG4ykWgMRl4hNMSybwqA3qd+p7govtaH0fPjOATbySOzfLBwV2VSIU1pFlLXfrBNLv6qhWgkoFkLjUudGhsKvk454aL1oTgSR+cOokzkw0umXidS3JydU0UeAwfMMNrGACcOrGFjzYKgp1j4OH4qaLwHhYC5/42EkmZFJpjVElwX8ercf1+UIOTN8iWgMwzWlynuvg9Ltw2bXPoyQADNirCzbUVrlabDH2uq5dScoQsMihgzvoY3pNrULVrLpOa1snV6qHVxsLzde5K5/b0YhGtrkUV+UXWqTzDbihkG3u2DCe28xhAsFtOdNBVa/Njdjf1oYb3yJT4lw9HAXWhWDpTxRfeUo7BNM3NYoak2y4YAM2IXX4L+z/jcKLEDHb1LLLTiScdlOLhVu9gCPEIjrte9vmS0vSVt1r5CUPYQHwWAqnI3U7twGOSHEb8uF1f4qOrg/i/ka0dNUj0uw8dCfWntCFiSx0e29vs4N8eB9nzuvZAwH39hIiKjWOm8Sx94AYIaAavRjC8tUw3EBsWJxlTQWQ5heF+rn9+xXdX2q82D7b2d47pdwhclXiqilUs/k0+4mKwjlA2nb3IOADUvDSjKkE6Ft6y25rBlsAQq/v8kc6rbasd8dQhCPo8I7Uroqt1++R2Gits9UrqDraR6twiSRgQmb9F1HTbWUraKSmRUpyk3kUzZh7mUK77bnAbz1X8mHMFAEOfbqosFY5U/qndVBdw20pVacb9fvrEtQIh8LcEyefEQCTorJnR7/SBpvCFNz3aCy89dkq4 3r3iUbgP gichAwHK0dabxnthzoj52LatJaeEuLfoxkzt32ys55RfDaDtGABwxwiDj19Smn4/6t4ILRYZbYl158YsPmPf6ep3P9JvNLxJEy4KfP4Hu635/zXOU2HW57EhCk01GkoB4/l55WMZuwAG8HDjaADl2aSnkVYcDlHVNRCyHzfM8ErHUsY7YDIwz/zCfRXHxjGSTq2oInpncrAwbEAX98EWk4tj8s6Tj6TeCx2Eak3nqFGWglFBT2IYyYX/Nf13apJabpqoUsHkMIhi4fC+FT2qzY8oAVJFK99vvnYzfwSx73cDdjZjEYOe81WVcaSKtbi5SyAidmFvkej9UPnuqK6un6QdUd80bZdhrA2J58pkV2Z4MWP8XnfYb3B9/Zxyl+jGPC6wnZ+qLcmwc9sU04o3zTc+NkE/TuM1/tjTGRKSwztTSM1fH09VYXWkC4B5SU5aDi8dG3ISEK7DoqdYjC+qFUSHQkE596Fkdk2/BrGlbQDfVnrk= 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: List-Subscribe: List-Unsubscribe: > We normally ksm_zero_pages++ in ksmd when page is merged with zero page, > but ksm_zero_pages-- is done from page tables side, which can't protected > by the ksmd mutex. "cant protected" -> "can't be protected". But It's better to say "where there is no any accessing protection of ksm_zero_pages" because ksmd mutex is to protect the flag of ksm_run, not to protect the counters of KSM. Anyway, The following code looks OK to me. > > So we can read very exceptional value of ksm_zero_pages in rare cases, > such as -1, which is very confusing to users. > > Fix it by changing to use atomic_long_t, and the same case with the > mm->ksm_zero_pages. > > Fixes: e2942062e01d ("ksm: count all zero pages placed by KSM") > Fixes: 6080d19f0704 ("ksm: add ksm zero pages for each process") > Acked-by: David Hildenbrand > Signed-off-by: Chengming Zhou > --- > fs/proc/base.c | 2 +- > include/linux/ksm.h | 17 ++++++++++++++--- > include/linux/mm_types.h | 2 +- > mm/ksm.c | 11 +++++------ > 4 files changed, 21 insertions(+), 11 deletions(-) > > diff --git a/fs/proc/base.c b/fs/proc/base.c > index 18550c071d71..72a1acd03675 100644 > --- a/fs/proc/base.c > +++ b/fs/proc/base.c > @@ -3214,7 +3214,7 @@ static int proc_pid_ksm_stat(struct seq_file *m, struct pid_namespace *ns, > mm = get_task_mm(task); > if (mm) { > seq_printf(m, "ksm_rmap_items %lu\n", mm->ksm_rmap_items); > - seq_printf(m, "ksm_zero_pages %lu\n", mm->ksm_zero_pages); > + seq_printf(m, "ksm_zero_pages %ld\n", mm_ksm_zero_pages(mm)); > seq_printf(m, "ksm_merging_pages %lu\n", mm->ksm_merging_pages); > seq_printf(m, "ksm_process_profit %ld\n", ksm_process_profit(mm)); > mmput(mm); > diff --git a/include/linux/ksm.h b/include/linux/ksm.h > index 52c63a9c5a9c..11690dacd986 100644 > --- a/include/linux/ksm.h > +++ b/include/linux/ksm.h > @@ -33,16 +33,27 @@ void __ksm_exit(struct mm_struct *mm); > */ > #define is_ksm_zero_pte(pte) (is_zero_pfn(pte_pfn(pte)) && pte_dirty(pte)) > > -extern unsigned long ksm_zero_pages; > +extern atomic_long_t ksm_zero_pages; > + > +static inline void ksm_map_zero_page(struct mm_struct *mm) > +{ > + atomic_long_inc(&ksm_zero_pages); > + atomic_long_inc(&mm->ksm_zero_pages); > +} > > static inline void ksm_might_unmap_zero_page(struct mm_struct *mm, pte_t pte) > { > if (is_ksm_zero_pte(pte)) { > - ksm_zero_pages--; > - mm->ksm_zero_pages--; > + atomic_long_dec(&ksm_zero_pages); > + atomic_long_dec(&mm->ksm_zero_pages); > } > } > > +static inline long mm_ksm_zero_pages(struct mm_struct *mm) > +{ > + return atomic_long_read(&mm->ksm_zero_pages); > +} > + > static inline int ksm_fork(struct mm_struct *mm, struct mm_struct *oldmm) > { > if (test_bit(MMF_VM_MERGEABLE, &oldmm->flags)) > diff --git a/include/linux/mm_types.h b/include/linux/mm_types.h > index 24323c7d0bd4..af3a0256fa93 100644 > --- a/include/linux/mm_types.h > +++ b/include/linux/mm_types.h > @@ -985,7 +985,7 @@ struct mm_struct { > * Represent how many empty pages are merged with kernel zero > * pages when enabling KSM use_zero_pages. > */ > - unsigned long ksm_zero_pages; > + atomic_long_t ksm_zero_pages; > #endif /* CONFIG_KSM */ > #ifdef CONFIG_LRU_GEN_WALKS_MMU > struct { > diff --git a/mm/ksm.c b/mm/ksm.c > index 0f9c491552ff..6f461411d070 100644 > --- a/mm/ksm.c > +++ b/mm/ksm.c > @@ -296,7 +296,7 @@ static bool ksm_use_zero_pages __read_mostly; > static bool ksm_smart_scan = true; > > /* The number of zero pages which is placed by KSM */ > -unsigned long ksm_zero_pages; > +atomic_long_t ksm_zero_pages = ATOMIC_LONG_INIT(0); > > /* The number of pages that have been skipped due to "smart scanning" */ > static unsigned long ksm_pages_skipped; > @@ -1429,8 +1429,7 @@ static int replace_page(struct vm_area_struct *vma, struct page *page, > * the dirty bit in zero page's PTE is set. > */ > newpte = pte_mkdirty(pte_mkspecial(pfn_pte(page_to_pfn(kpage), vma->vm_page_prot))); > - ksm_zero_pages++; > - mm->ksm_zero_pages++; > + ksm_map_zero_page(mm); > /* > * We're replacing an anonymous page with a zero page, which is > * not anonymous. We need to do proper accounting otherwise we > @@ -3373,7 +3372,7 @@ static void wait_while_offlining(void) > #ifdef CONFIG_PROC_FS > long ksm_process_profit(struct mm_struct *mm) > { > - return (long)(mm->ksm_merging_pages + mm->ksm_zero_pages) * PAGE_SIZE - > + return (long)(mm->ksm_merging_pages + mm_ksm_zero_pages(mm)) * PAGE_SIZE - > mm->ksm_rmap_items * sizeof(struct ksm_rmap_item); > } > #endif /* CONFIG_PROC_FS */ > @@ -3662,7 +3661,7 @@ KSM_ATTR_RO(pages_skipped); > 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); > + return sysfs_emit(buf, "%ld\n", atomic_long_read(&ksm_zero_pages)); > } > KSM_ATTR_RO(ksm_zero_pages); > > @@ -3671,7 +3670,7 @@ static ssize_t general_profit_show(struct kobject *kobj, > { > long general_profit; > > - general_profit = (ksm_pages_sharing + ksm_zero_pages) * PAGE_SIZE - > + general_profit = (ksm_pages_sharing + atomic_long_read(&ksm_zero_pages)) * PAGE_SIZE - > ksm_rmap_items * sizeof(struct ksm_rmap_item); > > return sysfs_emit(buf, "%ld\n", general_profit); > > -- > 2.45.0 >