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 434A6C27C4F for ; Fri, 21 Jun 2024 07:55:14 +0000 (UTC) Received: by kanga.kvack.org (Postfix) id C3B9E6B012A; Fri, 21 Jun 2024 03:55:13 -0400 (EDT) Received: by kanga.kvack.org (Postfix, from userid 40) id BC4B16B0132; Fri, 21 Jun 2024 03:55:13 -0400 (EDT) X-Delivered-To: int-list-linux-mm@kvack.org Received: by kanga.kvack.org (Postfix, from userid 63042) id A170B6B0134; Fri, 21 Jun 2024 03:55:13 -0400 (EDT) X-Delivered-To: linux-mm@kvack.org Received: from relay.hostedemail.com (smtprelay0010.hostedemail.com [216.40.44.10]) by kanga.kvack.org (Postfix) with ESMTP id 76B506B012A for ; Fri, 21 Jun 2024 03:55:13 -0400 (EDT) Received: from smtpin10.hostedemail.com (a10.router.float.18 [10.200.18.1]) by unirelay01.hostedemail.com (Postfix) with ESMTP id 2B7301C194E for ; Fri, 21 Jun 2024 07:55:13 +0000 (UTC) X-FDA: 82254135306.10.0AA95CA Received: from out-174.mta0.migadu.com (out-174.mta0.migadu.com [91.218.175.174]) by imf08.hostedemail.com (Postfix) with ESMTP id E049B160014 for ; Fri, 21 Jun 2024 07:55:10 +0000 (UTC) Authentication-Results: imf08.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b="Mfzx4/5U"; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf08.hostedemail.com: domain of chengming.zhou@linux.dev designates 91.218.175.174 as permitted sender) smtp.mailfrom=chengming.zhou@linux.dev ARC-Seal: i=1; s=arc-20220608; d=hostedemail.com; t=1718956503; a=rsa-sha256; cv=none; b=XGTj5fO0hrvuIgEHLwNhi7IEvb8SqzX8Zg2xaCHsTtmKO7wW7tFfSvWMmQVljJrhYWkTzi 4KU35zWRZDvnXmLdKaCbzuJmKZrdcxRUbECxenq1p3cAY03WGqpfJc+RHPOqKhIzDjO0pc 4eJy8JxoDIda0NjrL22YAOwR7erXwbM= ARC-Authentication-Results: i=1; imf08.hostedemail.com; dkim=pass header.d=linux.dev header.s=key1 header.b="Mfzx4/5U"; dmarc=pass (policy=none) header.from=linux.dev; spf=pass (imf08.hostedemail.com: domain of chengming.zhou@linux.dev designates 91.218.175.174 as permitted sender) smtp.mailfrom=chengming.zhou@linux.dev ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=hostedemail.com; s=arc-20220608; t=1718956503; 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=cj0RSXpfKb2TCjjea56ybQ9iCdzPc+7EtlYBpcmbVzc=; b=vMHfpNA0bjKgjrnYHV0sDABjuvWoK2efw1O89S9Aof95vwtvZHmRn7oonAg6Ygtm2WP5/0 RNO8V6noKWKE1yGl7j+8D9aTuR/PUwPTECAUQbSSlkW9BzQbPk+tBbCMn7FcBOTvy8QXmy sY9IQj47BNRToCQEY21qk+3927pK6lw= X-Envelope-To: david@redhat.com DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=linux.dev; s=key1; t=1718956509; 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=cj0RSXpfKb2TCjjea56ybQ9iCdzPc+7EtlYBpcmbVzc=; b=Mfzx4/5UkS4NcNG3exq4rh84KtS2OLmQAWPu7S7npdQtUGhQ/0Sbc21MlcdaIMZPVTwjMD ae2xHB0aTBiqDZZiONUhHFm/5RbR4jEIxq+9BDmuPoMzSoxYN+Dx1iX5S9/F7uyiQm/qLv AjVuWvtAwVyDuDnkwUXGouq15SeK+fU= X-Envelope-To: linux-kernel@vger.kernel.org X-Envelope-To: akpm@linux-foundation.org X-Envelope-To: hughd@google.com X-Envelope-To: chengming.zhou@linux.dev X-Envelope-To: zhouchengming@bytedance.com X-Envelope-To: linux-mm@kvack.org X-Envelope-To: aarcange@redhat.com X-Envelope-To: shr@devkernel.io X-Report-Abuse: Please report any abuse attempt to abuse@migadu.com and include these headers. From: Chengming Zhou Date: Fri, 21 Jun 2024 15:54:29 +0800 Subject: [PATCH v2 1/3] mm/ksm: refactor out try_to_merge_with_zero_page() MIME-Version: 1.0 Content-Type: text/plain; charset="utf-8" Content-Transfer-Encoding: 7bit Message-Id: <20240621-b4-ksm-scan-optimize-v2-1-1c328aa9e30b@linux.dev> References: <20240621-b4-ksm-scan-optimize-v2-0-1c328aa9e30b@linux.dev> In-Reply-To: <20240621-b4-ksm-scan-optimize-v2-0-1c328aa9e30b@linux.dev> To: Andrew Morton , david@redhat.com, aarcange@redhat.com, hughd@google.com, shr@devkernel.io Cc: linux-mm@kvack.org, linux-kernel@vger.kernel.org, zhouchengming@bytedance.com, Chengming Zhou X-Developer-Signature: v=1; a=ed25519-sha256; t=1718956503; l=3224; i=chengming.zhou@linux.dev; s=20240617; h=from:subject:message-id; bh=XgUEfBzhfRP/ORf+1yxH34MeMyVcyA4uQSa5dx7WhmQ=; b=MeI/7pIXiWUSInmK68RxchUNLgqfVLCS2dSmEoaOE6psxVMHnvFbf/CCP6m1r9tkrbULcrm3S jcdjyQiAELQCDtQuG372QdBsbsz+DlLVK2VBPccqx3FDGVC5Ymv55y3 X-Developer-Key: i=chengming.zhou@linux.dev; a=ed25519; pk=/XPhIutBo+zyUeQyf4Ni5JYk/PEIWxIeUQqy2DYjmhI= X-Migadu-Flow: FLOW_OUT X-Rspamd-Queue-Id: E049B160014 X-Rspam-User: X-Rspamd-Server: rspam05 X-Stat-Signature: itny9ozay8r7uonqxmw1igz3to4iqnkh X-HE-Tag: 1718956510-984510 X-HE-Meta: U2FsdGVkX1/k7WAP6syEXfvDA+jEz9yurjqgCl1UivJGPojO59qQmEQzDdxL364A6ssWyaEAdTRwmixTQEft7GhTsV0mq1wiEzXg3mtAdrtWIYs5+ckS/BRimjYjzhYUOHKi0LWkZ1ig3QrAfrjbStLdWRElFLvD7lGTtrU3TL1H+Ud3ZusAW8opIzsSYz2Vgg5myFG7Z7CjMiAwOfKF82Xo+nM8EHkp8agw/cLBr2E5noIV7A/gbgv59iZFgop1f9E+kUPvmM4u4v9Zd687QglaRQpFw+MAmIkiETBkfAvybFL2f2Og9BM7ijsCUvdiTO6vI62rGc72yhKxPiSZ9H4cWEZFiPSfyKmYA6vQZKufsGDl9M+QmSxYnN8dyaxNa63aYlGDb/aOzbBTGbCmKthDONSP6lv3SidE0L0zznz2pgSp4bgt17+kEuHOntaor76Mc61N54N9JPkA5/PKEGl/5B/zFysV05rfxuhAIEqjcc6nlj9t2rf7UVu7vFzyHkHzt9k0rLKdxbFYG/Y7UcngMPfoT7fwbdZ8dyoA2BXptcqq/Na4JbvnQHmeWrDAVAb55LK8xHAjmk4E1Ym+EaF+B5FnpGVGe0rpwlAYwrEWvqc9aVRoW9KXpIjNdwwpmlmEIsA+hf3Q1yGWGGhOT07J+88FMExRpnkaDvlogNQtHbchWIOaJFxPfuI/0FSb5d9tNJfjoRe8v8yZ9djtr9KF6SpkOVTy0bS95FWLqratVvJDSqf2PKs0L5yHgm7tl944mKqNGgDQdBVQ+g0g8Ywi7FafKeISPj2UugXylrpLRlSXPirHcciVpsITYWF+4DAMuWRtVeJBzA7fX3nGAapNHk09pOSUzwJW5Qiq6k8ahqv17+Z0gMO/0PI2SnFOB3ym7uueod3+PWa5LBhIfhNKRMcI+14NG2AtIHdCoDKuMnG/fTUYYNJPUc7lJpOhpRYudCUerE5v/TFIz4V 9gYiUy1w vXbBn9UGIWT6WYAvHWqQXla8tUcVs8gmk/EUv2XS4sPzoDlP3IXBcZseRu+q6EEdjR49w7MlhWhsj7NCuOiLd+CBYvmpIX9GKDxlFyRd23hZZWDWFx/Sxis2TJoGy9YLqkFWXN5NQHW6r7xeo2qpuJMgcxfvJPQPW5zKaof1GbixGtSWWLQOY7ZLhXYIjSxW+xy7TVbqPvNTyPSYjN8mUVq7VdY+si8iYe/3/ 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: In preparation for later changes, refactor out a new function called try_to_merge_with_zero_page(), which tries to merge with zero page. Signed-off-by: Chengming Zhou --- mm/ksm.c | 70 ++++++++++++++++++++++++++++++++++++---------------------------- 1 file changed, 40 insertions(+), 30 deletions(-) diff --git a/mm/ksm.c b/mm/ksm.c index 34c4820e0d3d..1427abd18627 100644 --- a/mm/ksm.c +++ b/mm/ksm.c @@ -1531,6 +1531,44 @@ static int try_to_merge_one_page(struct vm_area_struct *vma, return err; } +/* + * This function returns 0 if the pages were merged or if they are + * no longer merging candidates (e.g., VMA stale), -EFAULT otherwise. + */ +static int try_to_merge_with_zero_page(struct ksm_rmap_item *rmap_item, + struct page *page) +{ + struct mm_struct *mm = rmap_item->mm; + int err = -EFAULT; + + /* + * 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 && (rmap_item->oldchecksum == zero_checksum)) { + struct vm_area_struct *vma; + + mmap_read_lock(mm); + vma = find_mergeable_vma(mm, rmap_item->address); + if (vma) { + err = try_to_merge_one_page(vma, page, + ZERO_PAGE(rmap_item->address)); + trace_ksm_merge_one_page( + page_to_pfn(ZERO_PAGE(rmap_item->address)), + rmap_item, mm, err); + } else { + /* + * If the vma is out of date, we do not need to + * continue. + */ + err = 0; + } + mmap_read_unlock(mm); + } + + return err; +} + /* * try_to_merge_with_ksm_page - like try_to_merge_two_pages, * but no new kernel page is allocated: kpage must already be a ksm page. @@ -2306,7 +2344,6 @@ static void stable_tree_append(struct ksm_rmap_item *rmap_item, */ static void cmp_and_merge_page(struct page *page, struct ksm_rmap_item *rmap_item) { - struct mm_struct *mm = rmap_item->mm; struct ksm_rmap_item *tree_rmap_item; struct page *tree_page = NULL; struct ksm_stable_node *stable_node; @@ -2375,36 +2412,9 @@ static void cmp_and_merge_page(struct page *page, struct ksm_rmap_item *rmap_ite return; } - /* - * 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 == zero_checksum)) { - struct vm_area_struct *vma; + if (!try_to_merge_with_zero_page(rmap_item, page)) + return; - mmap_read_lock(mm); - vma = find_mergeable_vma(mm, rmap_item->address); - if (vma) { - err = try_to_merge_one_page(vma, page, - ZERO_PAGE(rmap_item->address)); - trace_ksm_merge_one_page( - page_to_pfn(ZERO_PAGE(rmap_item->address)), - rmap_item, mm, err); - } else { - /* - * If the vma is out of date, we do not need to - * continue. - */ - err = 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) - return; - } tree_rmap_item = unstable_tree_search_insert(rmap_item, page, &tree_page); if (tree_rmap_item) { -- 2.45.2